diff --git a/src/main/java/com/google/devtools/build/lib/packages/AutoloadSymbols.java b/src/main/java/com/google/devtools/build/lib/packages/AutoloadSymbols.java index f15af962f86ec4..2ed71795212dda 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/AutoloadSymbols.java +++ b/src/main/java/com/google/devtools/build/lib/packages/AutoloadSymbols.java @@ -36,6 +36,7 @@ import java.util.Objects; import java.util.Set; import java.util.function.Predicate; +import java.util.stream.Stream; import javax.annotation.Nullable; import net.starlark.java.eval.Starlark; import net.starlark.java.eval.StarlarkSemantics; @@ -99,6 +100,25 @@ public AutoloadSymbols(RuleClassProvider ruleClassProvider, StarlarkSemantics se return; } + // Expand symbols given with @rules_foo + symbolConfiguration = + symbolConfiguration.stream() + .flatMap( + flag -> { + String prefix = ""; + String flagWithoutPrefix = flag; + if (flag.startsWith("+") || flag.startsWith("-")) { + prefix = flag.substring(0, 1); + flagWithoutPrefix = flag.substring(1); + } + if (flagWithoutPrefix.startsWith("@")) { + return getAllSymbols(flagWithoutPrefix, prefix).stream(); + } else { + return Stream.of(flag); + } + }) + .collect(toImmutableList()); + // Validates the inputs Set uniqueSymbols = new HashSet<>(); for (String symbol : symbolConfiguration) { @@ -286,6 +306,13 @@ private static ImmutableList filterSymbols( .collect(toImmutableList()); } + private ImmutableList getAllSymbols(String repository, String prefix) { + return AUTOLOAD_CONFIG.entrySet().stream() + .filter(entry -> entry.getValue().getLoadLabel().startsWith(repository + "//")) + .map(entry -> prefix + entry.getKey()) + .collect(toImmutableList()); + } + private static Map convertNativeStructToMap(StarlarkInfo struct) { LinkedHashMap destr = new LinkedHashMap<>(); for (String field : struct.getFieldNames()) { diff --git a/src/main/java/com/google/devtools/build/lib/packages/semantics/BuildLanguageOptions.java b/src/main/java/com/google/devtools/build/lib/packages/semantics/BuildLanguageOptions.java index 34a2c1f5d51d39..064ab99cdc4767 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/semantics/BuildLanguageOptions.java +++ b/src/main/java/com/google/devtools/build/lib/packages/semantics/BuildLanguageOptions.java @@ -133,7 +133,9 @@ public final class BuildLanguageOptions extends OptionsBase { + "If a symbol is not named in this flag then it continues to work as normal -- no" + " autoloading is done, nor is the Bazel-defined version suppressed. For" + " configuration see" - + " https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/packages/AutoloadSymbols.java") + + " https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/packages/AutoloadSymbols.java" + + " As a shortcut also whole repository may be used, for example +@rules_python will" + + " autoload all Python rules.") public List incompatibleAutoloadExternally; @Option( diff --git a/src/test/shell/integration/load_removed_symbols_test.sh b/src/test/shell/integration/load_removed_symbols_test.sh index 230a6ca2951165..ba2e070180ac0b 100755 --- a/src/test/shell/integration/load_removed_symbols_test.sh +++ b/src/test/shell/integration/load_removed_symbols_test.sh @@ -402,4 +402,16 @@ EOF } +function test_whole_repo_flag() { + setup_module_dot_bazel + + cat > BUILD << EOF +py_library( + name = 'py_library', +) +EOF + bazel query --incompatible_autoload_externally=+@rules_python ':py_library' --output=build >&$TEST_log 2>&1 || fail "build failed" +} + + run_suite "load_removed_symbols"