Add incompatible flag to forbid loading the native Java rules.
RELNOTES: --incompatible_load_java_rules_from_bzl was added to forbid loading the native java rules directly. See more on tracking issue #8746
PiperOrigin-RevId: 255600811
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
index b3dc555..4b0c3b3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
@@ -75,6 +75,7 @@
@Override
public ConfiguredTarget create(RuleContext ruleContext)
throws InterruptedException, RuleErrorException, ActionConflictException {
+ JavaCommon.checkRuleLoadedThroughMacro(ruleContext);
final JavaCommon common = new JavaCommon(ruleContext, semantics);
DeployArchiveBuilder deployArchiveBuilder = new DeployArchiveBuilder(semantics, ruleContext);
Runfiles.Builder runfilesBuilder =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
index 4d0cf73..0ec0995 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
@@ -41,6 +41,7 @@
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.packages.BuildType;
+import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.packages.TargetUtils;
import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
@@ -351,6 +352,33 @@
}
}
+ public static void checkRuleLoadedThroughMacro(RuleContext ruleContext)
+ throws RuleErrorException {
+ if (!ruleContext.getFragment(JavaConfiguration.class).loadJavaRulesFromBzl()) {
+ return;
+ }
+
+ if (!hasValidTag(ruleContext) || !ruleContext.getRule().wasCreatedByMacro()) {
+ registerMigrationRuleError(ruleContext);
+ }
+ }
+
+ private static boolean hasValidTag(RuleContext ruleContext) {
+ return ruleContext
+ .attributes()
+ .get("tags", Type.STRING_LIST)
+ .contains("__JAVA_RULES_MIGRATION_DO_NOT_USE_WILL_BREAK__");
+ }
+
+ private static void registerMigrationRuleError(RuleContext ruleContext)
+ throws RuleErrorException {
+ ruleContext.ruleError(
+ "The native Java rules are deprecated. Please load "
+ + ruleContext.getRule().getRuleClass()
+ + " from the rules_java repository."
+ + " See http://github.com/bazelbuild/rules_java.");
+ }
+
/**
* Returns transitive Java native libraries.
*
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java
index 6fac9a7..37598fe 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java
@@ -179,6 +179,7 @@
private final ImmutableList<Label> pluginList;
private final boolean requireJavaToolchainHeaderCompilerDirect;
private final boolean disallowResourceJars;
+ private final boolean loadJavaRulesFromBzl;
private final boolean disallowLegacyJavaToolchainFlags;
// TODO(dmarting): remove once we have a proper solution for #2539
@@ -217,6 +218,7 @@
this.jplPropagateCcLinkParamsStore = javaOptions.jplPropagateCcLinkParamsStore;
this.isJlplStrictDepsEnforced = javaOptions.isJlplStrictDepsEnforced;
this.disallowResourceJars = javaOptions.disallowResourceJars;
+ this.loadJavaRulesFromBzl = javaOptions.loadJavaRulesFromBzl;
this.addTestSupportToCompileTimeDeps = javaOptions.addTestSupportToCompileTimeDeps;
ImmutableList.Builder<Label> translationsBuilder = ImmutableList.builder();
@@ -501,4 +503,8 @@
public boolean disallowResourceJars() {
return disallowResourceJars;
}
+
+ public boolean loadJavaRulesFromBzl() {
+ return loadJavaRulesFromBzl;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
index d0322f8..7e39c09 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
@@ -46,6 +46,7 @@
@Override
public ConfiguredTarget create(RuleContext ruleContext)
throws InterruptedException, RuleErrorException, ActionConflictException {
+ JavaCommon.checkRuleLoadedThroughMacro(ruleContext);
ImmutableList<Artifact> srcJars = ImmutableList.of();
ImmutableList<Artifact> jars = collectJars(ruleContext);
Artifact srcJar = ruleContext.getPrerequisiteArtifact("srcjar", Mode.TARGET);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
index dc85bdb..ecdb68c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
@@ -39,6 +39,7 @@
@Override
public ConfiguredTarget create(RuleContext ruleContext)
throws InterruptedException, RuleErrorException, ActionConflictException {
+ JavaCommon.checkRuleLoadedThroughMacro(ruleContext);
JavaCommon common = new JavaCommon(ruleContext, semantics);
return init(
ruleContext,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java
index bd600a8..0e48f75 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java
@@ -623,6 +623,20 @@
"Disables the resource_jars attribute; use java_import and deps or runtime_deps instead.")
public boolean disallowResourceJars;
+ @Option(
+ name = "incompatible_load_java_rules_from_bzl",
+ defaultValue = "false",
+ documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+ effectTags = {OptionEffectTag.LOADING_AND_ANALYSIS},
+ metadataTags = {
+ OptionMetadataTag.INCOMPATIBLE_CHANGE,
+ OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES
+ },
+ help =
+ "If enabled, direct usage of the native Java rules is disabled. Please use "
+ + "the Starlark rules instead https://github.com/bazelbuild/rules_java")
+ public boolean loadJavaRulesFromBzl;
+
Label defaultJavaBase() {
return Label.parseAbsoluteUnchecked(DEFAULT_JAVABASE);
}
@@ -683,6 +697,7 @@
host.requireJavaToolchainHeaderCompilerDirect = requireJavaToolchainHeaderCompilerDirect;
host.disallowResourceJars = disallowResourceJars;
+ host.loadJavaRulesFromBzl = loadJavaRulesFromBzl;
// Save host options for further use.
host.hostJavaBase = hostJavaBase;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPackageConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPackageConfiguration.java
index ca0a367..429c5d5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPackageConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPackageConfiguration.java
@@ -36,6 +36,7 @@
@Override
public ConfiguredTarget create(RuleContext ruleContext)
throws InterruptedException, RuleErrorException, ActionConflictException {
+ JavaCommon.checkRuleLoadedThroughMacro(ruleContext);
ImmutableList<PackageSpecificationProvider> packages =
ImmutableList.copyOf(
ruleContext.getPrerequisites(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPackageConfigurationRule.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPackageConfigurationRule.java
index 51bc4bf..e45beb7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPackageConfigurationRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPackageConfigurationRule.java
@@ -23,6 +23,7 @@
import com.google.devtools.build.lib.analysis.PackageSpecificationProvider;
import com.google.devtools.build.lib.analysis.RuleDefinition;
import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
+import com.google.devtools.build.lib.analysis.config.ConfigAwareRuleClassBuilder;
import com.google.devtools.build.lib.analysis.config.HostTransition;
import com.google.devtools.build.lib.packages.RuleClass;
import com.google.devtools.build.lib.syntax.Type;
@@ -33,7 +34,10 @@
@Override
public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment environment) {
- return builder
+ return ConfigAwareRuleClassBuilder.of(builder)
+ .requiresHostConfigurationFragments(JavaConfiguration.class)
+ .originalBuilder()
+ .requiresConfigurationFragments(JavaConfiguration.class)
/* <!-- #BLAZE_RULE(java_package_configuration).ATTRIBUTE(packages) -->
The set of <code><a href="${link package_group}">package_group</a></code>s
the configuration should be applied to.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPlugin.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPlugin.java
index 8666032..58da84f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPlugin.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPlugin.java
@@ -30,6 +30,7 @@
@Override
public final ConfiguredTarget create(RuleContext ruleContext)
throws InterruptedException, RuleErrorException, ActionConflictException {
+ JavaCommon.checkRuleLoadedThroughMacro(ruleContext);
return new JavaLibrary(semantics)
.init(
ruleContext,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java
index e996dbd..6925ef7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java
@@ -44,6 +44,7 @@
@Override
public ConfiguredTarget create(RuleContext ruleContext)
throws InterruptedException, RuleErrorException, ActionConflictException {
+ JavaCommon.checkRuleLoadedThroughMacro(ruleContext);
NestedSetBuilder<Artifact> filesBuilder = NestedSetBuilder.stableOrder();
filesBuilder.addTransitive(PrerequisiteArtifacts.nestedSet(ruleContext, "srcs", Mode.TARGET));
PathFragment javaHome = defaultJavaHome(ruleContext.getLabel());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeRule.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeRule.java
index ffe910d..f15fb9b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeRule.java
@@ -24,6 +24,7 @@
import com.google.devtools.build.lib.analysis.RuleDefinition;
import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
import com.google.devtools.build.lib.analysis.TemplateVariableInfo;
+import com.google.devtools.build.lib.analysis.config.ConfigAwareRuleClassBuilder;
import com.google.devtools.build.lib.packages.RuleClass;
import com.google.devtools.build.lib.util.FileTypeSet;
@@ -31,7 +32,10 @@
public final class JavaRuntimeRule implements RuleDefinition {
@Override
public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment env) {
- return builder
+ return ConfigAwareRuleClassBuilder.of(builder)
+ .requiresHostConfigurationFragments(JavaConfiguration.class)
+ .originalBuilder()
+ .requiresConfigurationFragments(JavaConfiguration.class)
.advertiseProvider(TemplateVariableInfo.class)
/* <!-- #BLAZE_RULE(java_runtime).ATTRIBUTE(srcs) -->
All files in the runtime.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java
index 0139169..a9e14ab 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java
@@ -53,6 +53,7 @@
@Override
public ConfiguredTarget create(RuleContext ruleContext)
throws InterruptedException, RuleErrorException, ActionConflictException {
+ JavaCommon.checkRuleLoadedThroughMacro(ruleContext);
ImmutableList<String> javacopts = getJavacOpts(ruleContext);
NestedSet<Artifact> bootclasspath =
PrerequisiteArtifacts.nestedSet(ruleContext, "bootclasspath", Mode.HOST);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
index e765f1b..64edf43 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
@@ -33,6 +33,7 @@
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.rules.java.JavaCommon;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
import com.google.devtools.build.lib.rules.java.JavaConfiguration;
import com.google.devtools.build.lib.rules.java.JavaInfo;
@@ -50,6 +51,7 @@
@Override
public ConfiguredTarget create(final RuleContext ruleContext)
throws InterruptedException, RuleErrorException, ActionConflictException {
+ JavaCommon.checkRuleLoadedThroughMacro(ruleContext);
Iterable<JavaProtoLibraryAspectProvider> javaProtoLibraryAspectProviders =
ruleContext.getPrerequisites("deps", Mode.TARGET, JavaProtoLibraryAspectProvider.class);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java
index e36f3f9..b33a91b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java
@@ -30,6 +30,7 @@
import com.google.devtools.build.lib.analysis.Runfiles;
import com.google.devtools.build.lib.analysis.RunfilesProvider;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.rules.java.JavaCommon;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
import com.google.devtools.build.lib.rules.java.JavaConfiguration;
import com.google.devtools.build.lib.rules.java.JavaInfo;
@@ -46,6 +47,8 @@
public ConfiguredTarget create(final RuleContext ruleContext)
throws InterruptedException, RuleErrorException, ActionConflictException {
+ JavaCommon.checkRuleLoadedThroughMacro(ruleContext);
+
if (ruleContext.getFragment(JavaConfiguration.class).isDisallowStrictDepsForJpl()
&& ruleContext.attributes().has("strict_deps")
&& ruleContext.attributes().isAttributeValueExplicitlySpecified("strict_deps")) {