diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build')
-rw-r--r-- | src/main/java/com/google/devtools/build/docgen/templates/attributes/common/testonly.html | 6 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java | 26 |
2 files changed, 26 insertions, 6 deletions
diff --git a/src/main/java/com/google/devtools/build/docgen/templates/attributes/common/testonly.html b/src/main/java/com/google/devtools/build/docgen/templates/attributes/common/testonly.html index ed26e6198f..8d3efe9b94 100644 --- a/src/main/java/com/google/devtools/build/docgen/templates/attributes/common/testonly.html +++ b/src/main/java/com/google/devtools/build/docgen/templates/attributes/common/testonly.html @@ -16,12 +16,6 @@ are <code>testonly</code> by default. </p> <p> -By virtue of -<a href="${link package.default_testonly}"><code>default_testonly</code></a>, -targets under <code>javatests</code> are <code>testonly</code> by default. -</p> - -<p> This attribute is intended to mean that the target should not be contained in binaries that are released to production. </p> diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java index 0fae32d39c..44d194dedd 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java @@ -77,6 +77,7 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.ideinfo.AndroidStudioInfoAspect; import com.google.devtools.build.lib.ideinfo.BazelAndroidStudioInfoSemantics; import com.google.devtools.build.lib.packages.Attribute; +import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper; import com.google.devtools.build.lib.packages.PackageGroup; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.Target; @@ -153,6 +154,7 @@ 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.syntax.Type; import com.google.devtools.build.lib.util.ResourceFileLoader; import java.io.IOException; @@ -188,6 +190,7 @@ public class BazelRuleClassProvider { public void validate(RuleContext.Builder context, ConfiguredTarget prerequisite, Attribute attribute) { validateDirectPrerequisiteVisibility(context, prerequisite, attribute.getName()); + validateDirectPrerequisiteForTestOnly(context, prerequisite); DeprecationValidator.validateDirectPrerequisiteForDeprecation( context, context.getRule(), prerequisite, context.forAspect()); } @@ -236,6 +239,29 @@ public class BazelRuleClassProvider { + "(they are only allowed in the visibility attribute)"); } } + + private void validateDirectPrerequisiteForTestOnly( + RuleContext.Builder context, ConfiguredTarget prerequisite) { + Rule rule = context.getRule(); + Target prerequisiteTarget = prerequisite.getTarget(); + Label prerequisiteLabel = prerequisiteTarget.getLabel(); + String thisPackage = rule.getLabel().getPackageName(); + + if (isTestOnlyRule(prerequisiteTarget) && !isTestOnlyRule(rule)) { + String message = "non-test target '" + rule.getLabel() + "' depends on testonly target '" + + prerequisiteLabel + "' and doesn't have testonly attribute set"; + if (thisPackage.startsWith("experimental/")) { + context.ruleWarning(message); + } else { + context.ruleError(message); + } + } + } + + private static boolean isTestOnlyRule(Target target) { + return (target instanceof Rule) + && (NonconfigurableAttributeMapper.of((Rule) target)).get("testonly", Type.BOOLEAN); + } } public static void setup(ConfiguredRuleClassProvider.Builder builder) { |