Roll forward config_setting visibility enforcement behind a flag.
This was rolled back in https://github.com/bazelbuild/bazel/commit/36d228bd792f4332c7486c4e5f9c78e4b55f4b06
because of depot breakages.
This version adds incompatible flags to safely introduce enforcement.
See https://github.com/bazelbuild/bazel/issues/12932 and
https://github.com/bazelbuild/bazel/issues/12933 for flag settings.
*** Original change description ***
Roll back https://github.com/bazelbuild/bazel/pull/12877.
***
Fixes #12669.
RELNOTES: enforce config_setting visibility. See https://github.com/bazelbuild/bazel/issues/12932 for details.
PiperOrigin-RevId: 354930807
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index 9dfef7e..946cde7 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -46,6 +46,7 @@
import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoKey;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.ConfigConditions;
import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
import com.google.devtools.build.lib.analysis.config.CoreOptions;
import com.google.devtools.build.lib.analysis.config.CoreOptions.IncludeConfigFragmentsEnum;
@@ -80,6 +81,7 @@
import com.google.devtools.build.lib.packages.Info;
import com.google.devtools.build.lib.packages.InputFile;
import com.google.devtools.build.lib.packages.OutputFile;
+import com.google.devtools.build.lib.packages.Package.ConfigSettingVisibilityPolicy;
import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
import com.google.devtools.build.lib.packages.RawAttributeMapper;
import com.google.devtools.build.lib.packages.RequiredProviders;
@@ -1766,7 +1768,7 @@
private final PrerequisiteValidator prerequisiteValidator;
private final RuleErrorConsumer reporter;
private OrderedSetMultimap<Attribute, ConfiguredTargetAndData> prerequisiteMap;
- private ImmutableMap<Label, ConfigMatchingProvider> configConditions = ImmutableMap.of();
+ private ConfigConditions configConditions;
private String toolsRepository;
private StarlarkSemantics starlarkSemantics;
private Mutability mutability;
@@ -1815,11 +1817,21 @@
Preconditions.checkNotNull(visibility);
Preconditions.checkNotNull(constraintSemantics);
AttributeMap attributes =
- ConfiguredAttributeMapper.of(target.getAssociatedRule(), configConditions);
+ ConfiguredAttributeMapper.of(target.getAssociatedRule(), configConditions.asProviders());
checkAttributesNonEmpty(attributes);
ListMultimap<String, ConfiguredTargetAndData> targetMap = createTargetMap();
+ // This conditionally checks visibility on config_setting rules based on
+ // --config_setting_visibility_policy. This should be removed as soon as it's deemed safe
+ // to unconditionally check visibility. See https://github.com/bazelbuild/bazel/issues/12669.
+ if (target.getPackage().getConfigSettingVisibilityPolicy()
+ != ConfigSettingVisibilityPolicy.LEGACY_OFF) {
+ Attribute configSettingAttr = attributes.getAttributeDefinition("$config_dependencies");
+ for (ConfiguredTargetAndData condition : configConditions.asConfiguredTargets().values()) {
+ validateDirectPrerequisite(configSettingAttr, condition);
+ }
+ }
ListMultimap<String, ConfiguredFilesetEntry> filesetEntryMap =
- createFilesetEntryMap(target.getAssociatedRule(), configConditions);
+ createFilesetEntryMap(target.getAssociatedRule(), configConditions.asProviders());
if (rawExecProperties == null) {
if (!attributes.has(RuleClass.EXEC_PROPERTIES, Type.STRING_DICT)) {
rawExecProperties = ImmutableMap.of();
@@ -1833,7 +1845,7 @@
attributes,
targetMap,
filesetEntryMap,
- configConditions,
+ configConditions.asProviders(),
universalFragments,
getRuleClassNameForLogging(),
actionOwnerSymbol,
@@ -1908,11 +1920,10 @@
}
/**
- * Sets the configuration conditions needed to determine which paths to follow for this
- * rule's configurable attributes.
+ * Sets the configuration conditions needed to determine which paths to follow for this rule's
+ * configurable attributes.
*/
- public Builder setConfigConditions(
- ImmutableMap<Label, ConfigMatchingProvider> configConditions) {
+ public Builder setConfigConditions(ConfigConditions configConditions) {
this.configConditions = Preconditions.checkNotNull(configConditions);
return this;
}