Skip to content

Commit 5ca89d4

Browse files
fmeumcopybara-github
authored andcommitted
Always check $config_dependencies visibility at use
All dependencies for `select` expressions are collected in an implicit `$config_dependencies` attribute. Even with `--incompatible_visibility_private_attributes_at_definition`, visibility for this attribute is now checked relative to the use rather than the definition of the rule. Fixes #19126 Closes #19139. PiperOrigin-RevId: 553830083 Change-Id: Ic4af0f5ad9a0c627c973cd5ce88dd1e1bf51474e
1 parent 3b6f805 commit 5ca89d4

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

src/main/java/com/google/devtools/build/lib/analysis/CommonPrerequisiteValidator.java

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper;
2727
import com.google.devtools.build.lib.packages.RawAttributeMapper;
2828
import com.google.devtools.build.lib.packages.Rule;
29+
import com.google.devtools.build.lib.packages.RuleClass;
2930
import com.google.devtools.build.lib.packages.Type;
3031
import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
3132
import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
@@ -103,6 +104,7 @@ private void validateDirectPrerequisiteVisibility(
103104

104105
if (!toolCheckAtDefinition
105106
|| !attribute.isImplicit()
107+
|| attribute.getName().equals(RuleClass.CONFIG_SETTING_DEPS_ATTRIBUTE)
106108
|| rule.getRuleClassObject().getRuleDefinitionEnvironmentLabel() == null) {
107109
// Default check: The attribute must be visible from the target.
108110
if (!context.isVisible(prerequisite.getConfiguredTarget())) {

src/test/java/com/google/devtools/build/lib/analysis/VisibilityTest.java

+36
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,42 @@ public void testDataVisibilityPrivateCheckPrivateAtUse() throws Exception {
166166
assertThrows(ViewCreationFailedException.class, () -> update("//use:world"));
167167
}
168168

169+
@Test
170+
public void testConfigSettingVisibilityAlwaysCheckedAtUse() throws Exception {
171+
scratch.file(
172+
"BUILD",
173+
"load('//build_defs:defs.bzl', 'my_rule')",
174+
"my_rule(",
175+
" name = 'my_target',",
176+
" value = select({",
177+
" '//config_setting:my_setting': 'foo',",
178+
" '//conditions:default': 'bar',",
179+
" }),",
180+
")");
181+
scratch.file("build_defs/BUILD");
182+
scratch.file(
183+
"build_defs/defs.bzl",
184+
"def _my_rule_impl(ctx):",
185+
" pass",
186+
"my_rule = rule(",
187+
" implementation = _my_rule_impl,",
188+
" attrs = {",
189+
" 'value': attr.string(mandatory = True),",
190+
" },",
191+
")");
192+
scratch.file(
193+
"config_setting/BUILD",
194+
"config_setting(",
195+
" name = 'my_setting',",
196+
" values = {'cpu': 'does_not_matter'},",
197+
" visibility = ['//:__pkg__'],",
198+
")");
199+
useConfiguration("--incompatible_visibility_private_attributes_at_definition");
200+
201+
update("//:my_target");
202+
assertThat(hasErrors(getConfiguredTarget("//:my_target"))).isFalse();
203+
}
204+
169205
void setupFilesScenario(String wantRead) throws Exception {
170206
scratch.file("src/source.txt", "source");
171207
scratch.file("src/BUILD", "exports_files(['source.txt'], visibility=['//pkg:__pkg__'])");

0 commit comments

Comments
 (0)