// Copyright 2014 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.devtools.build.lib.bazel.rules;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.base.Functions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.analysis.BaseRuleClasses;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider.Builder;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider.RuleSet;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.constraints.EnvironmentRule;
import com.google.devtools.build.lib.bazel.rules.BazelToolchainType.BazelToolchainTypeRule;
import com.google.devtools.build.lib.bazel.rules.android.AndroidNdkRepositoryRule;
import com.google.devtools.build.lib.bazel.rules.android.AndroidSdkRepositoryRule;
import com.google.devtools.build.lib.bazel.rules.android.BazelAarImportRule;
import com.google.devtools.build.lib.bazel.rules.android.BazelAndroidBinaryRule;
import com.google.devtools.build.lib.bazel.rules.android.BazelAndroidLibraryRule;
import com.google.devtools.build.lib.bazel.rules.android.BazelAndroidRuleClasses.BazelAndroidToolsDefaultsJarRule;
import com.google.devtools.build.lib.bazel.rules.android.BazelAndroidSemantics;
import com.google.devtools.build.lib.bazel.rules.common.BazelFilegroupRule;
import com.google.devtools.build.lib.bazel.rules.cpp.BazelCcBinaryRule;
import com.google.devtools.build.lib.bazel.rules.cpp.BazelCcIncLibraryRule;
import com.google.devtools.build.lib.bazel.rules.cpp.BazelCcLibraryRule;
import com.google.devtools.build.lib.bazel.rules.cpp.BazelCcTestRule;
import com.google.devtools.build.lib.bazel.rules.cpp.BazelCppRuleClasses;
import com.google.devtools.build.lib.bazel.rules.cpp.BazelCppSemantics;
import com.google.devtools.build.lib.bazel.rules.cpp.proto.BazelCcProtoAspect;
import com.google.devtools.build.lib.bazel.rules.genrule.BazelGenRuleRule;
import com.google.devtools.build.lib.bazel.rules.java.BazelJavaBinaryRule;
import com.google.devtools.build.lib.bazel.rules.java.BazelJavaBuildInfoFactory;
import com.google.devtools.build.lib.bazel.rules.java.BazelJavaImportRule;
import com.google.devtools.build.lib.bazel.rules.java.BazelJavaLibraryRule;
import com.google.devtools.build.lib.bazel.rules.java.BazelJavaPluginRule;
import com.google.devtools.build.lib.bazel.rules.java.BazelJavaRuleClasses;
import com.google.devtools.build.lib.bazel.rules.java.BazelJavaSemantics;
import com.google.devtools.build.lib.bazel.rules.java.BazelJavaTestRule;
import com.google.devtools.build.lib.bazel.rules.java.proto.BazelJavaLiteProtoAspect;
import com.google.devtools.build.lib.bazel.rules.java.proto.BazelJavaLiteProtoLibraryRule;
import com.google.devtools.build.lib.bazel.rules.java.proto.BazelJavaProtoAspect;
import com.google.devtools.build.lib.bazel.rules.java.proto.BazelJavaProtoLibraryRule;
import com.google.devtools.build.lib.bazel.rules.python.BazelPyBinaryRule;
import com.google.devtools.build.lib.bazel.rules.python.BazelPyLibraryRule;
import com.google.devtools.build.lib.bazel.rules.python.BazelPyRuleClasses;
import com.google.devtools.build.lib.bazel.rules.python.BazelPyTestRule;
import com.google.devtools.build.lib.bazel.rules.python.BazelPythonConfiguration;
import com.google.devtools.build.lib.bazel.rules.sh.BazelShBinaryRule;
import com.google.devtools.build.lib.bazel.rules.sh.BazelShLibraryRule;
import com.google.devtools.build.lib.bazel.rules.sh.BazelShRuleClasses;
import com.google.devtools.build.lib.bazel.rules.sh.BazelShTestRule;
import com.google.devtools.build.lib.bazel.rules.workspace.GitRepositoryRule;
import com.google.devtools.build.lib.bazel.rules.workspace.HttpArchiveRule;
import com.google.devtools.build.lib.bazel.rules.workspace.HttpFileRule;
import com.google.devtools.build.lib.bazel.rules.workspace.HttpJarRule;
import com.google.devtools.build.lib.bazel.rules.workspace.MavenJarRule;
import com.google.devtools.build.lib.bazel.rules.workspace.MavenServerRule;
import com.google.devtools.build.lib.bazel.rules.workspace.NewGitRepositoryRule;
import com.google.devtools.build.lib.bazel.rules.workspace.NewHttpArchiveRule;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.ideinfo.AndroidStudioInfoAspect;
import com.google.devtools.build.lib.rules.Alias.AliasRule;
import com.google.devtools.build.lib.rules.android.AarImportBaseRule;
import com.google.devtools.build.lib.rules.android.AndroidBinaryOnlyRule;
import com.google.devtools.build.lib.rules.android.AndroidConfiguration;
import com.google.devtools.build.lib.rules.android.AndroidDeviceRule;
import com.google.devtools.build.lib.rules.android.AndroidLibraryBaseRule;
import com.google.devtools.build.lib.rules.android.AndroidNeverlinkAspect;
import com.google.devtools.build.lib.rules.android.AndroidRuleClasses;
import com.google.devtools.build.lib.rules.android.AndroidSkylarkCommon;
import com.google.devtools.build.lib.rules.android.DexArchiveAspect;
import com.google.devtools.build.lib.rules.apple.AppleCommandLineOptions;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
import com.google.devtools.build.lib.rules.apple.AppleToolchain;
import com.google.devtools.build.lib.rules.apple.XcodeConfigRule;
import com.google.devtools.build.lib.rules.apple.XcodeVersionRule;
import com.google.devtools.build.lib.rules.apple.cpp.AppleCcToolchainRule;
import com.google.devtools.build.lib.rules.apple.swift.SwiftCommandLineOptions;
import com.google.devtools.build.lib.rules.apple.swift.SwiftConfiguration;
import com.google.devtools.build.lib.rules.config.ConfigFeatureFlagConfiguration;
import com.google.devtools.build.lib.rules.config.ConfigRuleClasses;
import com.google.devtools.build.lib.rules.config.ConfigSkylarkCommon;
import com.google.devtools.build.lib.rules.cpp.CcIncLibraryRule;
import com.google.devtools.build.lib.rules.cpp.CcToolchainRule;
import com.google.devtools.build.lib.rules.cpp.CcToolchainSuiteRule;
import com.google.devtools.build.lib.rules.cpp.CppBuildInfo;
import com.google.devtools.build.lib.rules.cpp.CppConfigurationLoader;
import com.google.devtools.build.lib.rules.cpp.CppOptions;
import com.google.devtools.build.lib.rules.cpp.proto.CcProtoAspect;
import com.google.devtools.build.lib.rules.cpp.proto.CcProtoLibraryRule;
import com.google.devtools.build.lib.rules.extra.ActionListenerRule;
import com.google.devtools.build.lib.rules.extra.ExtraActionRule;
import com.google.devtools.build.lib.rules.genquery.GenQueryRule;
import com.google.devtools.build.lib.rules.genrule.GenRuleBaseRule;
import com.google.devtools.build.lib.rules.java.JavaConfigurationLoader;
import com.google.devtools.build.lib.rules.java.JavaImportBaseRule;
import com.google.devtools.build.lib.rules.java.JavaOptions;
import com.google.devtools.build.lib.rules.java.JavaRuntimeRule;
import com.google.devtools.build.lib.rules.java.JavaRuntimeSuiteRule;
import com.google.devtools.build.lib.rules.java.JavaSkylarkCommon;
import com.google.devtools.build.lib.rules.java.JavaToolchainRule;
import com.google.devtools.build.lib.rules.java.JvmConfigurationLoader;
import com.google.devtools.build.lib.rules.java.ProguardLibraryRule;
import com.google.devtools.build.lib.rules.java.proto.JavaProtoSkylarkCommon;
import com.google.devtools.build.lib.rules.objc.AppleBinaryRule;
import com.google.devtools.build.lib.rules.objc.AppleSkylarkCommon;
import com.google.devtools.build.lib.rules.objc.AppleStaticLibraryRule;
import com.google.devtools.build.lib.rules.objc.AppleWatch1ExtensionRule;
import com.google.devtools.build.lib.rules.objc.AppleWatch2ExtensionRule;
import com.google.devtools.build.lib.rules.objc.AppleWatchExtensionBinaryRule;
import com.google.devtools.build.lib.rules.objc.IosApplicationRule;
import com.google.devtools.build.lib.rules.objc.IosDeviceRule;
import com.google.devtools.build.lib.rules.objc.IosExtensionBinaryRule;
import com.google.devtools.build.lib.rules.objc.IosExtensionRule;
import com.google.devtools.build.lib.rules.objc.IosFrameworkBinaryRule;
import com.google.devtools.build.lib.rules.objc.IosFrameworkRule;
import com.google.devtools.build.lib.rules.objc.IosTestRule;
import com.google.devtools.build.lib.rules.objc.J2ObjcAspect;
import com.google.devtools.build.lib.rules.objc.J2ObjcCommandLineOptions;
import com.google.devtools.build.lib.rules.objc.J2ObjcConfiguration;
import com.google.devtools.build.lib.rules.objc.J2ObjcLibraryBaseRule;
import com.google.devtools.build.lib.rules.objc.J2ObjcLibraryRule;
import com.google.devtools.build.lib.rules.objc.ObjcBinaryRule;
import com.google.devtools.build.lib.rules.objc.ObjcBuildInfoFactory;
import com.google.devtools.build.lib.rules.objc.ObjcBundleLibraryRule;
import com.google.devtools.build.lib.rules.objc.ObjcBundleRule;
import com.google.devtools.build.lib.rules.objc.ObjcCommandLineOptions;
import com.google.devtools.build.lib.rules.objc.ObjcConfigurationLoader;
import com.google.devtools.build.lib.rules.objc.ObjcFrameworkRule;
import com.google.devtools.build.lib.rules.objc.ObjcImportRule;
import com.google.devtools.build.lib.rules.objc.ObjcLibraryRule;
import com.google.devtools.build.lib.rules.objc.ObjcProtoAspect;
import com.google.devtools.build.lib.rules.objc.ObjcProtoLibraryRule;
import com.google.devtools.build.lib.rules.objc.ObjcProvider;
import com.google.devtools.build.lib.rules.objc.ObjcRuleClasses;
import com.google.devtools.build.lib.rules.objc.XcTestAppProvider;
import com.google.devtools.build.lib.rules.platform.ConstraintSettingRule;
import com.google.devtools.build.lib.rules.platform.ConstraintValueRule;
import com.google.devtools.build.lib.rules.platform.PlatformCommon;
import com.google.devtools.build.lib.rules.platform.PlatformRule;
import com.google.devtools.build.lib.rules.proto.BazelProtoLibraryRule;
import com.google.devtools.build.lib.rules.proto.ProtoConfiguration;
import com.google.devtools.build.lib.rules.proto.ProtoLangToolchainRule;
import com.google.devtools.build.lib.rules.python.PythonConfigurationLoader;
import com.google.devtools.build.lib.rules.python.PythonOptions;
import com.google.devtools.build.lib.rules.repository.BindRule;
import com.google.devtools.build.lib.rules.repository.LocalRepositoryRule;
import com.google.devtools.build.lib.rules.repository.NewLocalRepositoryRule;
import com.google.devtools.build.lib.rules.repository.WorkspaceBaseRule;
import com.google.devtools.build.lib.rules.test.SkylarkTestingModule;
import com.google.devtools.build.lib.rules.test.TestSuiteRule;
import com.google.devtools.build.lib.util.ResourceFileLoader;
import java.io.IOException;
/** A rule class provider implementing the rules Bazel knows. */
public class BazelRuleClassProvider {
public static final String TOOLS_REPOSITORY = "@bazel_tools";
/** Used by the build encyclopedia generator. */
public static ConfiguredRuleClassProvider create() {
ConfiguredRuleClassProvider.Builder builder = new ConfiguredRuleClassProvider.Builder();
builder.setToolsRepository(TOOLS_REPOSITORY);
setup(builder);
return builder.build();
}
public static void setup(ConfiguredRuleClassProvider.Builder builder) {
for (RuleSet ruleSet : RULE_SETS) {
ruleSet.init(builder);
}
}
public static final RuleSet TOOLCHAIN_RULES =
new RuleSet() {
@Override
public void init(Builder builder) {
builder.addRuleDefinition(new BazelToolchainTypeRule());
builder.addRuleDefinition(new GenRuleBaseRule());
builder.addRuleDefinition(new BazelGenRuleRule());
}
@Override
public ImmutableList<RuleSet> requires() {
return null;
}
};
public static final RuleSet BAZEL_SETUP =
new RuleSet() {
@Override
public void init(Builder builder) {
builder
.setProductName("bazel")
.setConfigurationCollectionFactory(new BazelConfigurationCollection())
.setPrelude("//tools/build_rules:prelude_bazel")
.setRunfilesPrefix(Label.DEFAULT_REPOSITORY_DIRECTORY)
.setPrerequisiteValidator(new BazelPrerequisiteValidator());
builder.setUniversalConfigurationFragment(BazelConfiguration.class);
builder.addConfigurationFragment(new BazelConfiguration.Loader());
builder.addConfigurationOptions(BuildConfiguration.Options.class);
}
@Override
public ImmutableList<RuleSet> requires() {
return ImmutableList.of();
}
};
public static final RuleSet CORE_RULES =
new RuleSet() {
@Override
public void init(Builder builder) {
builder.addRuleDefinition(new BaseRuleClasses.RootRule());
builder.addRuleDefinition(new BaseRuleClasses.BaseRule());
builder.addRuleDefinition(new BaseRuleClasses.RuleBase());
builder.addRuleDefinition(new BaseRuleClasses.BinaryBaseRule());
builder.addRuleDefinition(new BaseRuleClasses.TestBaseRule());
builder.addRuleDefinition(new BaseRuleClasses.ErrorRule());
}
@Override
public ImmutableList<RuleSet> requires() {
return ImmutableList.of();
}
};
public static final RuleSet PLATFORM_RULES =
new RuleSet() {
@Override
public void init(Builder builder) {
builder.addRuleDefinition(new ConstraintSettingRule());
builder.addRuleDefinition(new ConstraintValueRule());
builder.addRuleDefinition(new PlatformRule());
builder.addSkylarkAccessibleTopLevels("platform_common", new PlatformCommon());
}
@Override
public ImmutableList<RuleSet> requires() {
return ImmutableList.of(CORE_RULES);
}
};
public static final RuleSet GENERIC_RULES =
new RuleSet() {
@Override
public void init(Builder builder) {
builder.addRuleDefinition(new EnvironmentRule());
builder.addRuleDefinition(new AliasRule());
builder.addRuleDefinition(new BazelFilegroupRule());
builder.addRuleDefinition(new TestSuiteRule());
builder.addRuleDefinition(new GenQueryRule());
try {
builder.addWorkspaceFilePrefix(
ResourceFileLoader.loadResource(BazelRuleClassProvider.class, "tools.WORKSPACE"));
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
@Override
public ImmutableList<RuleSet> requires() {
return ImmutableList.of(CORE_RULES);
}
};
public static final RuleSet CONFIG_RULES =
new RuleSet() {
@Override
public void init(Builder builder) {
builder.addRuleDefinition(new ConfigRuleClasses.ConfigBaseRule());
builder.addRuleDefinition(new ConfigRuleClasses.ConfigSettingRule());
builder.addConfig(
ConfigFeatureFlagConfiguration.Options.class,
new ConfigFeatureFlagConfiguration.Loader());
builder.addRuleDefinition(new ConfigRuleClasses.ConfigFeatureFlagRule());
builder.addSkylarkAccessibleTopLevels("config_common", new ConfigSkylarkCommon());
}
@Override
public ImmutableList<RuleSet> requires() {
return ImmutableList.of(CORE_RULES);
}
};
public static final RuleSet CORE_WORKSPACE_RULES =
new RuleSet() {
@Override
public void init(Builder builder) {
builder.addRuleDefinition(new BindRule());
builder.addRuleDefinition(new WorkspaceBaseRule());
builder.addRuleDefinition(new LocalRepositoryRule());
}
@Override
public ImmutableList<RuleSet> requires() {
return ImmutableList.of(CORE_RULES);
}
};
public static final RuleSet PROTO_RULES =
new RuleSet() {
@Override
public void init(Builder builder) {
builder.addConfigurationOptions(ProtoConfiguration.Options.class);
builder.addConfigurationFragment(new ProtoConfiguration.Loader());
builder.addRuleDefinition(new BazelProtoLibraryRule());
builder.addRuleDefinition(new ProtoLangToolchainRule());
}
@Override
public ImmutableList<RuleSet> requires() {
return ImmutableList.of(CORE_RULES);
}
};
public static final RuleSet TESTING_SUPPORT =
new RuleSet() {
@Override
public void init(Builder builder) {
builder.addSkylarkAccessibleTopLevels("testing", new SkylarkTestingModule());
}
@Override
public ImmutableList<RuleSet> requires() {
return ImmutableList.of(CORE_RULES);
}
};
public static final RuleSet SH_RULES =
new RuleSet() {
@Override
public void init(Builder builder) {
builder.addRuleDefinition(new BazelShRuleClasses.ShRule());
builder.addRuleDefinition(new BazelShLibraryRule());
builder.addRuleDefinition(new BazelShBinaryRule());
builder.addRuleDefinition(new BazelShTestRule());
}
@Override
public ImmutableList<RuleSet> requires() {
return ImmutableList.of(CORE_RULES);
}
};
public static final RuleSet CPP_RULES =
new RuleSet() {
@Override
public void init(Builder builder) {
builder.addConfig(
CppOptions.class, new CppConfigurationLoader(Functions.<String>identity()));
builder.addBuildInfoFactory(new CppBuildInfo());
builder.addRuleDefinition(new CcToolchainRule());
builder.addRuleDefinition(new CcToolchainSuiteRule());
builder.addRuleDefinition(new CcIncLibraryRule());
builder.addRuleDefinition(new BazelCppRuleClasses.CcLinkingRule());
builder.addRuleDefinition(new BazelCppRuleClasses.CcDeclRule());
builder.addRuleDefinition(new BazelCppRuleClasses.CcBaseRule());
builder.addRuleDefinition(new BazelCppRuleClasses.CcRule());
builder.addRuleDefinition(new BazelCppRuleClasses.CcBinaryBaseRule());
builder.addRuleDefinition(new BazelCcBinaryRule());
builder.addRuleDefinition(new BazelCcTestRule());
builder.addRuleDefinition(new BazelCppRuleClasses.CcLibraryBaseRule());
builder.addRuleDefinition(new BazelCcLibraryRule());
builder.addRuleDefinition(new BazelCcIncLibraryRule());
}
@Override
public ImmutableList<RuleSet> requires() {
return ImmutableList.of(CORE_RULES);
}
};
public static final RuleSet CPP_PROTO_RULES =
new RuleSet() {
@Override
public void init(Builder builder) {
CcProtoAspect ccProtoAspect = new BazelCcProtoAspect(BazelCppSemantics.INSTANCE);
builder.addNativeAspectClass(ccProtoAspect);
builder.addRuleDefinition(new CcProtoLibraryRule(ccProtoAspect));
}
@Override
public ImmutableList<RuleSet> requires() {
return ImmutableList.of(CORE_RULES, CPP_RULES);
}
};
public static final RuleSet JAVA_RULES =
new RuleSet() {
@Override
public void init(Builder builder) {
builder.addConfigurationOptions(JavaOptions.class);
builder.addConfigurationFragment(new JvmConfigurationLoader());
builder.addConfigurationFragment(new JavaConfigurationLoader());
builder.addBuildInfoFactory(new BazelJavaBuildInfoFactory());
builder.addRuleDefinition(new BazelJavaRuleClasses.BaseJavaBinaryRule());
builder.addRuleDefinition(new BazelJavaRuleClasses.IjarBaseRule());
builder.addRuleDefinition(new BazelJavaRuleClasses.JavaBaseRule());
builder.addRuleDefinition(new ProguardLibraryRule());
builder.addRuleDefinition(new JavaImportBaseRule());
builder.addRuleDefinition(new BazelJavaRuleClasses.JavaRule());
builder.addRuleDefinition(new BazelJavaBinaryRule());
builder.addRuleDefinition(new BazelJavaLibraryRule());
builder.addRuleDefinition(new BazelJavaImportRule());
builder.addRuleDefinition(new BazelJavaTestRule());
builder.addRuleDefinition(new BazelJavaPluginRule());
builder.addRuleDefinition(new JavaToolchainRule());
builder.addRuleDefinition(new JavaRuntimeRule());
builder.addRuleDefinition(new JavaRuntimeSuiteRule());
builder.addRuleDefinition(new ExtraActionRule());
builder.addRuleDefinition(new ActionListenerRule());
try {
builder.addWorkspaceFilePrefix(
ResourceFileLoader.loadResource(BazelJavaRuleClasses.class, "jdk.WORKSPACE"));
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
@Override
public ImmutableList<RuleSet> requires() {
return ImmutableList.of(CORE_RULES, CPP_RULES);
}
};
public static final RuleSet JAVA_PROTO_RULES =
new RuleSet() {
@Override
public void init(Builder builder) {
BazelJavaProtoAspect bazelJavaProtoAspect = new BazelJavaProtoAspect();
BazelJavaLiteProtoAspect bazelJavaLiteProtoAspect = new BazelJavaLiteProtoAspect();
builder.addNativeAspectClass(bazelJavaProtoAspect);
builder.addNativeAspectClass(bazelJavaLiteProtoAspect);
builder.addRuleDefinition(new BazelJavaProtoLibraryRule(bazelJavaProtoAspect));
builder.addRuleDefinition(new BazelJavaLiteProtoLibraryRule(bazelJavaLiteProtoAspect));
}
@Override
public ImmutableList<RuleSet> requires() {
return ImmutableList.of(CORE_RULES, JAVA_RULES);
}
};
public static final RuleSet ANDROID_RULES =
new RuleSet() {
@Override
public void init(Builder builder) {
String toolsRepository = checkNotNull(builder.getToolsRepository());
builder.addConfig(AndroidConfiguration.Options.class, new AndroidConfiguration.Loader());
AndroidNeverlinkAspect androidNeverlinkAspect = new AndroidNeverlinkAspect();
DexArchiveAspect dexArchiveAspect = new DexArchiveAspect(toolsRepository);
builder.addNativeAspectClass(androidNeverlinkAspect);
builder.addNativeAspectClass(dexArchiveAspect);
builder.addRuleDefinition(new AndroidRuleClasses.AndroidSdkRule());
builder.addRuleDefinition(new BazelAndroidToolsDefaultsJarRule());
builder.addRuleDefinition(new AndroidRuleClasses.AndroidBaseRule());
builder.addRuleDefinition(new AndroidRuleClasses.AndroidAaptBaseRule());
builder.addRuleDefinition(new AndroidRuleClasses.AndroidResourceSupportRule());
builder.addRuleDefinition(
new AndroidRuleClasses.AndroidBinaryBaseRule(
androidNeverlinkAspect, dexArchiveAspect));
builder.addRuleDefinition(new AndroidBinaryOnlyRule());
builder.addRuleDefinition(new AndroidLibraryBaseRule(androidNeverlinkAspect));
builder.addRuleDefinition(new BazelAndroidLibraryRule());
builder.addRuleDefinition(new BazelAndroidBinaryRule());
builder.addRuleDefinition(new AarImportBaseRule());
builder.addRuleDefinition(new BazelAarImportRule());
builder.addRuleDefinition(new AndroidDeviceRule());
builder.addSkylarkAccessibleTopLevels("android_common", new AndroidSkylarkCommon());
builder.addSkylarkAccessibleTopLevels(
"java_common", new JavaSkylarkCommon(BazelJavaSemantics.INSTANCE));
builder.addSkylarkAccessibleTopLevels("java_proto_common", JavaProtoSkylarkCommon.class);
try {
builder.addWorkspaceFilePrefix(
ResourceFileLoader.loadResource(BazelAndroidSemantics.class, "android.WORKSPACE"));
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
@Override
public ImmutableList<RuleSet> requires() {
return ImmutableList.of(CORE_RULES, CPP_RULES, JAVA_RULES);
}
};
public static final RuleSet PYTHON_RULES =
new RuleSet() {
@Override
public void init(Builder builder) {
builder.addConfig(PythonOptions.class, new PythonConfigurationLoader());
builder.addConfig(
BazelPythonConfiguration.Options.class, new BazelPythonConfiguration.Loader());
builder.addRuleDefinition(new BazelPyRuleClasses.PyBaseRule());
builder.addRuleDefinition(new BazelPyRuleClasses.PyBinaryBaseRule());
builder.addRuleDefinition(new BazelPyLibraryRule());
builder.addRuleDefinition(new BazelPyBinaryRule());
builder.addRuleDefinition(new BazelPyTestRule());
}
@Override
public ImmutableList<RuleSet> requires() {
return ImmutableList.of(CORE_RULES, CPP_RULES);
}
};
public static final RuleSet OBJC_RULES =
new RuleSet() {
@Override
public void init(Builder builder) {
String toolsRepository = checkNotNull(builder.getToolsRepository());
builder.addBuildInfoFactory(new ObjcBuildInfoFactory());
builder.registerSkylarkProvider(
ObjcProvider.OBJC_SKYLARK_PROVIDER_NAME, ObjcProvider.class);
builder.registerSkylarkProvider(
XcTestAppProvider.XCTEST_APP_SKYLARK_PROVIDER_NAME, XcTestAppProvider.class);
builder.addSkylarkAccessibleTopLevels("apple_common", new AppleSkylarkCommon());
builder.addConfig(ObjcCommandLineOptions.class, new ObjcConfigurationLoader());
builder.addConfig(AppleCommandLineOptions.class, new AppleConfiguration.Loader());
builder.addConfig(SwiftCommandLineOptions.class, new SwiftConfiguration.Loader());
// j2objc shouldn't be here!
builder.addConfig(J2ObjcCommandLineOptions.class, new J2ObjcConfiguration.Loader());
// objc_proto_library should go into a separate RuleSet!
// TODO(ulfjack): Depending on objcProtoAspect from here is a layering violation.
ObjcProtoAspect objcProtoAspect = new ObjcProtoAspect();
builder.addNativeAspectClass(objcProtoAspect);
builder.addRuleDefinition(new AppleBinaryRule(objcProtoAspect));
builder.addRuleDefinition(new AppleStaticLibraryRule(objcProtoAspect));
builder.addRuleDefinition(new ObjcProtoLibraryRule(objcProtoAspect));
builder.addRuleDefinition(new AppleCcToolchainRule());
builder.addRuleDefinition(new AppleToolchain.RequiresXcodeConfigRule(toolsRepository));
builder.addRuleDefinition(new AppleWatch1ExtensionRule());
builder.addRuleDefinition(new AppleWatch2ExtensionRule());
builder.addRuleDefinition(new AppleWatchExtensionBinaryRule());
builder.addRuleDefinition(new IosApplicationRule());
builder.addRuleDefinition(new IosDeviceRule());
builder.addRuleDefinition(new IosExtensionBinaryRule());
builder.addRuleDefinition(new IosExtensionRule());
builder.addRuleDefinition(new IosFrameworkBinaryRule());
builder.addRuleDefinition(new IosFrameworkRule());
builder.addRuleDefinition(new IosTestRule());
builder.addRuleDefinition(new ObjcBinaryRule());
builder.addRuleDefinition(new ObjcBundleRule());
builder.addRuleDefinition(new ObjcBundleLibraryRule());
builder.addRuleDefinition(new ObjcFrameworkRule());
builder.addRuleDefinition(new ObjcImportRule());
builder.addRuleDefinition(new ObjcLibraryRule());
builder.addRuleDefinition(new ObjcRuleClasses.CoptsRule());
builder.addRuleDefinition(new ObjcRuleClasses.BundlingRule());
builder.addRuleDefinition(new ObjcRuleClasses.DylibDependingRule(objcProtoAspect));
builder.addRuleDefinition(new ObjcRuleClasses.ReleaseBundlingRule());
builder.addRuleDefinition(new ObjcRuleClasses.SimulatorRule());
builder.addRuleDefinition(new ObjcRuleClasses.CompilingRule());
builder.addRuleDefinition(new ObjcRuleClasses.LinkingRule(objcProtoAspect));
builder.addRuleDefinition(new ObjcRuleClasses.MultiArchPlatformRule());
builder.addRuleDefinition(new ObjcRuleClasses.ResourcesRule());
builder.addRuleDefinition(new ObjcRuleClasses.XcodegenRule());
builder.addRuleDefinition(new ObjcRuleClasses.AlwaysLinkRule());
builder.addRuleDefinition(new ObjcRuleClasses.SdkFrameworksDependerRule());
builder.addRuleDefinition(new ObjcRuleClasses.CompileDependencyRule());
builder.addRuleDefinition(new ObjcRuleClasses.ResourceToolsRule());
builder.addRuleDefinition(new ObjcRuleClasses.XcrunRule());
builder.addRuleDefinition(new ObjcRuleClasses.LibtoolRule());
builder.addRuleDefinition(new ObjcRuleClasses.IpaRule());
builder.addRuleDefinition(new ObjcRuleClasses.ReleaseBundlingToolsRule());
builder.addRuleDefinition(new ObjcRuleClasses.WatchExtensionBundleRule());
builder.addRuleDefinition(new ObjcRuleClasses.WatchApplicationBundleRule());
builder.addRuleDefinition(new ObjcRuleClasses.CrosstoolRule());
builder.addRuleDefinition(new XcodeConfigRule());
builder.addRuleDefinition(new XcodeVersionRule());
}
@Override
public ImmutableList<RuleSet> requires() {
return ImmutableList.of(CORE_RULES, CPP_RULES);
}
};
public static final RuleSet J2OBJC_RULES =
new RuleSet() {
@Override
public void init(Builder builder) {
String toolsRepository = checkNotNull(builder.getToolsRepository());
J2ObjcAspect j2ObjcAspect = new J2ObjcAspect(toolsRepository);
builder.addNativeAspectClass(j2ObjcAspect);
builder.addRuleDefinition(new J2ObjcLibraryBaseRule());
builder.addRuleDefinition(new J2ObjcLibraryRule(j2ObjcAspect));
try {
builder.addWorkspaceFilePrefix(
ResourceFileLoader.loadResource(
BazelRuleClassProvider.class, "objc/j2objc.WORKSPACE"));
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
@Override
public ImmutableList<RuleSet> requires() {
return ImmutableList.of(CORE_RULES, CPP_RULES, JAVA_RULES, OBJC_RULES);
}
};
public static final RuleSet ANDROID_STUDIO_ASPECT =
new RuleSet() {
@Override
public void init(Builder builder) {
AndroidStudioInfoAspect androidStudioInfoAspect = new AndroidStudioInfoAspect();
builder.addNativeAspectClass(androidStudioInfoAspect);
}
@Override
public ImmutableList<RuleSet> requires() {
return ImmutableList.of(CORE_RULES);
}
};
public static final RuleSet VARIOUS_WORKSPACE_RULES =
new RuleSet() {
@Override
public void init(Builder builder) {
// TODO(ulfjack): Split this up by conceptual units.
builder.addRuleDefinition(new GitRepositoryRule());
builder.addRuleDefinition(new HttpArchiveRule());
builder.addRuleDefinition(new HttpJarRule());
builder.addRuleDefinition(new HttpFileRule());
builder.addRuleDefinition(new MavenJarRule());
builder.addRuleDefinition(new MavenServerRule());
builder.addRuleDefinition(new NewHttpArchiveRule());
builder.addRuleDefinition(new NewGitRepositoryRule());
builder.addRuleDefinition(new NewLocalRepositoryRule());
builder.addRuleDefinition(new AndroidSdkRepositoryRule());
builder.addRuleDefinition(new AndroidNdkRepositoryRule());
}
@Override
public ImmutableList<RuleSet> requires() {
return ImmutableList.of(CORE_RULES, CORE_WORKSPACE_RULES);
}
};
private static final ImmutableSet<RuleSet> RULE_SETS =
ImmutableSet.of(
BAZEL_SETUP,
CORE_RULES,
CORE_WORKSPACE_RULES,
GENERIC_RULES,
CONFIG_RULES,
PLATFORM_RULES,
PROTO_RULES,
SH_RULES,
CPP_RULES,
CPP_PROTO_RULES,
JAVA_RULES,
JAVA_PROTO_RULES,
ANDROID_RULES,
PYTHON_RULES,
OBJC_RULES,
J2OBJC_RULES,
ANDROID_STUDIO_ASPECT,
TESTING_SUPPORT,
VARIOUS_WORKSPACE_RULES,
// This rule set is a little special: it needs to depend on every configuration fragment
// that has Make variables, so we put it last.
TOOLCHAIN_RULES);
}