Bzlmod: Built-in modules
Currently, repos like `@bazel_tools` are treated with special status in Bzlmod because they're shipped with Bazel and always visible to every other repo. This makes it harder for us to make sure repo references within `@bazel_tools` work correctly, since it doesn't go through repo mapping like everything else (example: `@rules_cc` needs to be written as `@rules_cc.0.0.1`)
This CL converts such repos into special built-in modules, which are always visible to other modules (i.e. treated as implicit dependencies of every other module), and are loaded specially (i.e. as if there is always an implicit non-registry override on them).
Additionally, we change the default value of --xcode_version_config to be an alias in @bazel_tools. This means that we won't need to deal with weird repo names like https://github.com/bazelbuild/bazel/blob/921d79e9d419508f60cc8a96181f38176ff6be03/.bazelrc#L34
Fixes https://github.com/bazelbuild/bazel/issues/14279.
PiperOrigin-RevId: 447963753
diff --git a/src/BUILD b/src/BUILD
index 764ea1b..92bbb55 100644
--- a/src/BUILD
+++ b/src/BUILD
@@ -88,6 +88,7 @@
name = "embedded_tools" + suffix + "_srcs",
srcs = JAVA_TOOLS + [
"BUILD.tools",
+ "MODULE.tools",
"//tools:embedded_tools_srcs",
"//third_party:gpl-srcs",
"//third_party/grpc:embedded_tools_srcs",
diff --git a/src/MODULE.tools b/src/MODULE.tools
new file mode 100644
index 0000000..f699b5e
--- /dev/null
+++ b/src/MODULE.tools
@@ -0,0 +1,20 @@
+module(
+ name = "bazel_tools",
+ toolchains_to_register = [
+ "@local_config_sh//:local_sh_toolchain",
+ ],
+)
+
+bazel_dep(name = "rules_cc", version = "0.0.1")
+bazel_dep(name = "rules_java", version = "5.0.0")
+bazel_dep(name = "rules_proto", version = "4.0.0")
+bazel_dep(name = "rules_python", version = "0.4.0")
+
+bazel_dep(name = "platforms", version = "0.0.4")
+bazel_dep(name = "protobuf", version = "3.19.0", repo_name = "com_google_protobuf")
+
+cc_configure = use_extension("@rules_cc//bzlmod:extensions.bzl", "cc_configure")
+use_repo(cc_configure, "local_config_cc", "local_config_xcode")
+
+sh_configure_extension = use_extension("//tools/sh:sh_configure.bzl", "sh_configure_extension")
+use_repo(sh_configure_extension, "local_config_sh")
diff --git a/src/create_embedded_tools.py b/src/create_embedded_tools.py
index 9574e6e..b4bb92b 100644
--- a/src/create_embedded_tools.py
+++ b/src/create_embedded_tools.py
@@ -28,6 +28,7 @@
from src.create_embedded_tools_lib import is_executable
output_paths = [
+ ('*MODULE.tools', lambda x: 'MODULE.bazel'),
('*tools/jdk/BUILD.tools', lambda x: 'tools/jdk/BUILD'),
('*tools/build_defs/repo/BUILD.repo',
lambda x: 'tools/build_defs/repo/BUILD'),
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/BUILD
index 66d182d..278b192 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/bazel/BUILD
@@ -26,7 +26,9 @@
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
"//src/main/java/com/google/devtools/build/lib/analysis:blaze_directories",
"//src/main/java/com/google/devtools/build/lib/analysis:config/build_configuration",
+ "//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:common",
"//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:registry",
+ "//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:resolution",
"//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:resolution_impl",
"//src/main/java/com/google/devtools/build/lib/bazel/commands",
"//src/main/java/com/google/devtools/build/lib/bazel/repository",
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java b/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java
index ff54a56..3435cc6 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/BazelRepositoryModule.java
@@ -26,10 +26,13 @@
import com.google.devtools.build.lib.analysis.RuleDefinition;
import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
import com.google.devtools.build.lib.bazel.bzlmod.BazelModuleResolutionFunction;
+import com.google.devtools.build.lib.bazel.bzlmod.LocalPathOverride;
import com.google.devtools.build.lib.bazel.bzlmod.ModuleExtensionResolutionFunction;
import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileFunction;
+import com.google.devtools.build.lib.bazel.bzlmod.NonRegistryOverride;
import com.google.devtools.build.lib.bazel.bzlmod.RegistryFactory;
import com.google.devtools.build.lib.bazel.bzlmod.RegistryFactoryImpl;
+import com.google.devtools.build.lib.bazel.bzlmod.RepoSpec;
import com.google.devtools.build.lib.bazel.bzlmod.SingleExtensionEvalFunction;
import com.google.devtools.build.lib.bazel.bzlmod.SingleExtensionUsagesFunction;
import com.google.devtools.build.lib.bazel.commands.FetchCommand;
@@ -228,11 +231,31 @@
singleExtensionEvalFunction =
new SingleExtensionEvalFunction(
runtime.getPackageFactory(), directories, clientEnvironmentSupplier, downloadManager);
+
+ ImmutableMap<String, NonRegistryOverride> builtinModules =
+ ImmutableMap.of(
+ // @bazel_tools is a special repo that we pull from the extracted install dir.
+ "bazel_tools",
+ LocalPathOverride.create(
+ directories.getEmbeddedBinariesRoot().getChild("embedded_tools").getPathString()),
+ // @local_config_platform is currently generated by the native repo rule
+ // local_config_platform
+ // It has to be a special repo for now because:
+ // - It's embedded in local_config_platform.WORKSPACE and depended on by many
+ // toolchains.
+ // - The canonical name "local_config_platform" is hardcoded in Bazel code.
+ // See {@link PlatformOptions}
+ "local_config_platform",
+ (String repoName) ->
+ RepoSpec.builder()
+ .setRuleClassName("local_config_platform")
+ .setAttributes(ImmutableMap.of("name", repoName))
+ .build());
builder
.addSkyFunction(SkyFunctions.REPOSITORY_DIRECTORY, repositoryDelegatorFunction)
.addSkyFunction(
SkyFunctions.MODULE_FILE,
- new ModuleFileFunction(registryFactory, directories.getWorkspace()))
+ new ModuleFileFunction(registryFactory, directories.getWorkspace(), builtinModules))
.addSkyFunction(SkyFunctions.BAZEL_MODULE_RESOLUTION, new BazelModuleResolutionFunction())
.addSkyFunction(SkyFunctions.SINGLE_EXTENSION_EVAL, singleExtensionEvalFunction)
.addSkyFunction(SkyFunctions.SINGLE_EXTENSION_USAGES, new SingleExtensionUsagesFunction())
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunction.java
index b16c20a..00f33d2 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunction.java
@@ -68,10 +68,20 @@
private final RegistryFactory registryFactory;
private final Path workspaceRoot;
+ private final ImmutableMap<String, NonRegistryOverride> builtinModules;
- public ModuleFileFunction(RegistryFactory registryFactory, Path workspaceRoot) {
+ /**
+ * @param builtinModules A list of "built-in" modules that are treated as implicit dependencies of
+ * every other module (including other built-in modules). These modules are defined as
+ * non-registry overrides.
+ */
+ public ModuleFileFunction(
+ RegistryFactory registryFactory,
+ Path workspaceRoot,
+ ImmutableMap<String, NonRegistryOverride> builtinModules) {
this.registryFactory = registryFactory;
this.workspaceRoot = workspaceRoot;
+ this.builtinModules = builtinModules;
}
@Override
@@ -179,7 +189,8 @@
throw errorf(Code.BAD_MODULE, "error parsing MODULE.bazel file for %s", moduleKey);
}
- ModuleFileGlobals moduleFileGlobals = new ModuleFileGlobals(moduleKey, registry, ignoreDevDeps);
+ ModuleFileGlobals moduleFileGlobals =
+ new ModuleFileGlobals(builtinModules, moduleKey, registry, ignoreDevDeps);
try (Mutability mu = Mutability.create("module file", moduleKey)) {
net.starlark.java.eval.Module predeclaredEnv =
getPredeclaredEnv(moduleFileGlobals, starlarkSemantics);
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileGlobals.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileGlobals.java
index ffc1805..9b90671 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileGlobals.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileGlobals.java
@@ -57,9 +57,28 @@
private final Map<String, ModuleOverride> overrides = new HashMap<>();
private final Map<String, RepoNameUsage> repoNameUsages = new HashMap<>();
- public ModuleFileGlobals(ModuleKey key, @Nullable Registry registry, boolean ignoreDevDeps) {
+ public ModuleFileGlobals(
+ ImmutableMap<String, NonRegistryOverride> builtinModules,
+ ModuleKey key,
+ @Nullable Registry registry,
+ boolean ignoreDevDeps) {
module = Module.builder().setKey(key).setRegistry(registry);
this.ignoreDevDeps = ignoreDevDeps;
+ if (ModuleKey.ROOT.equals(key)) {
+ overrides.putAll(builtinModules);
+ }
+ for (String builtinModule : builtinModules.keySet()) {
+ if (key.getName().equals(builtinModule)) {
+ // The built-in module does not depend on itself.
+ continue;
+ }
+ deps.put(builtinModule, ModuleKey.create(builtinModule, Version.EMPTY));
+ try {
+ addRepoNameUsage(builtinModule, "as a built-in dependency", Location.BUILTIN);
+ } catch (EvalException e) {
+ throw new IllegalStateException(e);
+ }
+ }
}
@AutoValue
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleKey.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleKey.java
index 9dd60dc..396468c 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleKey.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleKey.java
@@ -35,7 +35,14 @@
*/
private static final ImmutableMap<String, String> WELL_KNOWN_MODULES =
ImmutableMap.of(
- "com_google_protobuf", "com_google_protobuf", "protobuf", "com_google_protobuf");
+ "com_google_protobuf",
+ "com_google_protobuf",
+ "protobuf",
+ "com_google_protobuf",
+ "bazel_tools",
+ "bazel_tools",
+ "local_config_platform",
+ "local_config_platform");
public static final ModuleKey ROOT = create("", Version.EMPTY);
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/LocalConfigPlatformFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/LocalConfigPlatformFunction.java
index f06530f..7f188bf 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/LocalConfigPlatformFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/LocalConfigPlatformFunction.java
@@ -67,6 +67,7 @@
try {
outputDirectory.createDirectoryAndParents();
RepositoryFunction.writeFile(outputDirectory, "WORKSPACE", workspaceFileContent(name));
+ RepositoryFunction.writeFile(outputDirectory, "MODULE.bazel", moduleFileContent(name));
RepositoryFunction.writeFile(outputDirectory, "BUILD.bazel", buildFileContent(name));
RepositoryFunction.writeFile(
outputDirectory, "constraints.bzl", constraintFileContent(hostCpu, hostOs));
@@ -154,6 +155,17 @@
repositoryName);
}
+ private static String moduleFileContent(String repositoryName) {
+ return format(
+ ImmutableList.of(
+ "# DO NOT EDIT: automatically generated MODULE file for local_config_platform",
+ "module(name = \"%s\")",
+ // Try to keep this updated with the src/MODULE.tools file. (Due to MVS, even if this is
+ // not kept up to date, we'll use the latest version anyhow)
+ "bazel_dep(name = \"platforms\", version = \"0.0.4\")"),
+ repositoryName);
+ }
+
private static String buildFileContent(String repositoryName) {
return format(
ImmutableList.of(
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryMapping.java b/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryMapping.java
index 54d1dca..0a640ae 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryMapping.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/RepositoryMapping.java
@@ -79,12 +79,6 @@
}
public RepositoryName get(RepositoryName repositoryName) {
- // 1. @bazel_tools is a special repo that should be visible to all repositories.
- // 2. @local_config_platform is a special repo that should be visible to all repositories.
- if (repositoryName.equals(RepositoryName.BAZEL_TOOLS)
- || repositoryName.equals(RepositoryName.LOCAL_CONFIG_PLATFORM)) {
- return repositoryName;
- }
// If the owner repo is not present, that means we should fallback to the requested repo name.
if (ownerRepo() == null) {
return repositoryMapping().getOrDefault(repositoryName, repositoryName);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
index 20be2cc..764cfe8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleCommandLineOptions.java
@@ -345,15 +345,14 @@
public List<String> catalystCpus;
@Option(
- name = "xcode_version_config",
- defaultValue = "@local_config_xcode//:host_xcodes",
- converter = LabelConverter.class,
- documentationCategory = OptionDocumentationCategory.TOOLCHAIN,
- effectTags = {OptionEffectTag.LOSES_INCREMENTAL_STATE, OptionEffectTag.LOADING_AND_ANALYSIS},
- help =
- "The label of the xcode_config rule to be used for selecting the Xcode version "
- + "in the build configuration."
- )
+ name = "xcode_version_config",
+ defaultValue = "@bazel_tools//tools/cpp:host_xcodes",
+ converter = LabelConverter.class,
+ documentationCategory = OptionDocumentationCategory.TOOLCHAIN,
+ effectTags = {OptionEffectTag.LOSES_INCREMENTAL_STATE, OptionEffectTag.LOADING_AND_ANALYSIS},
+ help =
+ "The label of the xcode_config rule to be used for selecting the Xcode version "
+ + "in the build configuration.")
public Label xcodeVersionConfig;
@Option(
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BzlmodRepoRuleFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BzlmodRepoRuleFunction.java
index 9fabf89..7fea905 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BzlmodRepoRuleFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BzlmodRepoRuleFunction.java
@@ -26,7 +26,6 @@
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
import com.google.devtools.build.lib.cmdline.RepositoryMapping;
-import com.google.devtools.build.lib.cmdline.RepositoryName;
import com.google.devtools.build.lib.packages.NoSuchPackageException;
import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.lib.packages.PackageFactory;
@@ -82,42 +81,7 @@
String repositoryName = ((BzlmodRepoRuleValue.Key) skyKey).argument();
- // 1. Get repo spec for some special repos
- // Keep this in sync with {@RepositoryMappingFunction}
- // @bazel_tools is a special repo that we pull from the extracted install dir.
- if (repositoryName.equals(RepositoryName.BAZEL_TOOLS.getName())) {
- RepoSpec repoSpec =
- RepoSpec.builder()
- .setRuleClassName("local_repository")
- .setAttributes(
- ImmutableMap.of(
- "name",
- "bazel_tools",
- "path",
- directories
- .getEmbeddedBinariesRoot()
- .getChild("embedded_tools")
- .getPathString()))
- .build();
- return createRuleFromSpec(repoSpec, starlarkSemantics, env);
- }
-
- // @local_config_platform is current generated by the native repo rule local_config_platform
- // It has to be a special repo for now because:
- // - It's embedded in local_config_platform.WORKSPACE and depended on by many toolchains.
- // - It can't be starlarkified yet because we can't access the cpu value in repository_ctx.
- // - The canonical name "local_config_platform" is hardcoded in Bazel code.
- // See {@link PlatformOptions}
- if (repositoryName.equals(RepositoryName.LOCAL_CONFIG_PLATFORM.getName())) {
- RepoSpec repoSpec =
- RepoSpec.builder()
- .setRuleClassName("local_config_platform")
- .setAttributes(ImmutableMap.of("name", "local_config_platform"))
- .build();
- return createRuleFromSpec(repoSpec, starlarkSemantics, env);
- }
-
- // 2. Look for the repo from Bazel module generated repos
+ // Look for the repo from Bazel module generated repos.
try {
Optional<RepoSpec> result = bzlmodRepoRuleHelper.getRepoSpec(env, repositoryName);
if (env.valuesMissing()) {
@@ -130,7 +94,7 @@
throw new BzlmodRepoRuleFunctionException(e, Transience.PERSISTENT);
}
- // 3. Otherwise, look for the repo from module extension evaluation results.
+ // Otherwise, look for the repo from module extension evaluation results.
ModuleExtensionResolutionValue extensionResolution =
(ModuleExtensionResolutionValue) env.getValue(ModuleExtensionResolutionValue.KEY);
if (extensionResolution == null) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryMappingFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryMappingFunction.java
index 57a19d5..4296154 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryMappingFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryMappingFunction.java
@@ -90,22 +90,16 @@
}
// Now try and see if this is a repo generated from a module extension.
- // @bazel_tools and @local_config_platform are loaded most of the time, but we don't want
- // them to always trigger module extension resolution.
- // Keep this in sync with {@BzlmodRepoRuleFunction}
- if (!repositoryName.equals(RepositoryName.BAZEL_TOOLS)
- && !repositoryName.equals(RepositoryName.LOCAL_CONFIG_PLATFORM)) {
- ModuleExtensionResolutionValue moduleExtensionResolutionValue =
- (ModuleExtensionResolutionValue) env.getValue(ModuleExtensionResolutionValue.KEY);
- if (env.valuesMissing()) {
- return null;
- }
- mapping =
- computeForModuleExtensionRepo(
- repositoryName, bazelModuleResolutionValue, moduleExtensionResolutionValue);
- if (mapping.isPresent()) {
- return RepositoryMappingValue.withMapping(mapping.get());
- }
+ ModuleExtensionResolutionValue moduleExtensionResolutionValue =
+ (ModuleExtensionResolutionValue) env.getValue(ModuleExtensionResolutionValue.KEY);
+ if (env.valuesMissing()) {
+ return null;
+ }
+ mapping =
+ computeForModuleExtensionRepo(
+ repositoryName, bazelModuleResolutionValue, moduleExtensionResolutionValue);
+ if (mapping.isPresent()) {
+ return RepositoryMappingValue.withMapping(mapping.get());
}
}
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/BUILD b/src/test/java/com/google/devtools/build/lib/analysis/mock/BUILD
index 13cd133..7c31abf 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/mock/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/BUILD
@@ -27,6 +27,8 @@
],
deps = [
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
+ "//src/main/java/com/google/devtools/build/lib/analysis:blaze_directories",
+ "//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:resolution",
"//src/main/java/com/google/devtools/build/lib/bazel/repository",
"//src/main/java/com/google/devtools/build/lib/bazel/rules",
"//src/main/java/com/google/devtools/build/lib/rules:repository/repository_function",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
index 19a0709..4c375d7 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java
@@ -19,9 +19,12 @@
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.io.MoreFiles;
+import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.ShellConfiguration;
import com.google.devtools.build.lib.analysis.util.AnalysisMock;
+import com.google.devtools.build.lib.bazel.bzlmod.LocalPathOverride;
+import com.google.devtools.build.lib.bazel.bzlmod.NonRegistryOverride;
import com.google.devtools.build.lib.bazel.repository.LocalConfigPlatformFunction;
import com.google.devtools.build.lib.bazel.repository.LocalConfigPlatformRule;
import com.google.devtools.build.lib.bazel.rules.BazelRuleClassProvider;
@@ -115,6 +118,7 @@
config.overwrite("WORKSPACE", workspaceContents.toArray(new String[0]));
/** The rest of platforms is initialized in {@link MockPlatformSupport}. */
config.create("platforms_workspace/WORKSPACE", "workspace(name = 'platforms')");
+ config.create("platforms_workspace/MODULE.bazel", "module(name = 'platforms')");
config.create("embedded_tools/WORKSPACE", "workspace(name = 'bazel_tools')");
Runfiles runfiles = Runfiles.create();
for (String filename : Arrays.asList("tools/jdk/java_toolchain_alias.bzl")) {
@@ -498,6 +502,7 @@
@Override
public void setupMockToolsRepository(MockToolsConfig config) throws IOException {
config.create("embedded_tools/WORKSPACE", "workspace(name = 'bazel_tools')");
+ config.create("embedded_tools/MODULE.bazel", "module(name='bazel_tools')");
config.create("embedded_tools/tools/build_defs/repo/BUILD");
config.create(
"embedded_tools/tools/build_defs/repo/utils.bzl",
@@ -537,6 +542,21 @@
}
@Override
+ protected ImmutableMap<String, NonRegistryOverride> getBuiltinModules(
+ BlazeDirectories directories) {
+ return ImmutableMap.of(
+ "bazel_tools",
+ LocalPathOverride.create(
+ directories.getEmbeddedBinariesRoot().getRelative("embedded_tools").getPathString()),
+ "platforms",
+ LocalPathOverride.create(
+ directories
+ .getEmbeddedBinariesRoot()
+ .getRelative("platforms_workspace")
+ .getPathString()));
+ }
+
+ @Override
public ConfiguredRuleClassProvider createRuleClassProvider() {
return TestRuleClassProvider.getRuleClassProviderWithClearedSuffix();
}
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java
index 155e44d..0313655 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java
@@ -22,6 +22,7 @@
import com.google.devtools.build.lib.bazel.bzlmod.FakeRegistry;
import com.google.devtools.build.lib.bazel.bzlmod.ModuleExtensionResolutionValue;
import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileFunction;
+import com.google.devtools.build.lib.bazel.bzlmod.NonRegistryOverride;
import com.google.devtools.build.lib.bazel.rules.android.AndroidNdkRepositoryFunction;
import com.google.devtools.build.lib.bazel.rules.android.AndroidNdkRepositoryRule;
import com.google.devtools.build.lib.bazel.rules.android.AndroidSdkRepositoryFunction;
@@ -44,8 +45,6 @@
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.skyframe.SkyFunction;
import com.google.devtools.build.skyframe.SkyFunctionName;
-import com.google.devtools.build.skyframe.SkyKey;
-import com.google.devtools.build.skyframe.SkyValue;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;
@@ -139,18 +138,17 @@
ManagedDirectoriesKnowledge.NO_MANAGED_DIRECTORIES,
BazelSkyframeExecutorConstants.EXTERNAL_PACKAGE_HELPER),
SkyFunctions.MODULE_FILE,
- new ModuleFileFunction(FakeRegistry.DEFAULT_FACTORY, directories.getWorkspace()),
+ new ModuleFileFunction(
+ FakeRegistry.DEFAULT_FACTORY,
+ directories.getWorkspace(),
+ getBuiltinModules(directories)),
SkyFunctions.BAZEL_MODULE_RESOLUTION,
new BazelModuleResolutionFunction(),
SkyFunctions.MODULE_EXTENSION_RESOLUTION,
- new SkyFunction() {
- @Override
- public SkyValue compute(SkyKey skyKey, Environment env) {
- // Dummy SkyFunction that returns nothing.
- return ModuleExtensionResolutionValue.create(
- ImmutableMap.of(), ImmutableMap.of(), ImmutableListMultimap.of());
- }
- },
+ // Dummy SkyFunction that returns nothing.
+ (skyKey, env) ->
+ ModuleExtensionResolutionValue.create(
+ ImmutableMap.of(), ImmutableMap.of(), ImmutableListMultimap.of()),
CcSkyframeFdoSupportValue.SKYFUNCTION,
new CcSkyframeFdoSupportFunction(directories));
}
@@ -159,6 +157,10 @@
public abstract void addExtraRepositoryFunctions(
ImmutableMap.Builder<String, RepositoryFunction> repositoryHandlers);
+ /** Returns the built-in modules. */
+ protected abstract ImmutableMap<String, NonRegistryOverride> getBuiltinModules(
+ BlazeDirectories directories);
+
/**
* Stub class for tests to extend in order to update a small amount of {@link AnalysisMock}
* functionality.
@@ -224,6 +226,12 @@
}
@Override
+ protected ImmutableMap<String, NonRegistryOverride> getBuiltinModules(
+ BlazeDirectories directories) {
+ return delegate.getBuiltinModules(directories);
+ }
+
+ @Override
public void addExtraRepositoryFunctions(
ImmutableMap.Builder<String, RepositoryFunction> repositoryHandlers) {
delegate.addExtraRepositoryFunctions(repositoryHandlers);
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleFunctionTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleFunctionTest.java
index 25a2b9e..5909eec 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleFunctionTest.java
@@ -72,10 +72,7 @@
import com.google.devtools.build.skyframe.RecordingDifferencer;
import com.google.devtools.build.skyframe.SequencedRecordingDifferencer;
import com.google.devtools.build.skyframe.SkyFunction;
-import com.google.devtools.build.skyframe.SkyFunctionException;
import com.google.devtools.build.skyframe.SkyFunctionName;
-import com.google.devtools.build.skyframe.SkyKey;
-import com.google.devtools.build.skyframe.SkyValue;
import java.util.concurrent.atomic.AtomicReference;
import net.starlark.java.eval.StarlarkSemantics;
import org.junit.Before;
@@ -173,36 +170,22 @@
pkgFactory, directories, hashFunction, Caffeine.newBuilder().build()))
.put(
SkyFunctions.BAZEL_MODULE_RESOLUTION,
- new SkyFunction() {
- @Override
- public SkyValue compute(SkyKey skyKey, Environment env)
- throws SkyFunctionException {
- // Dummy function that returns a dep graph with just the root module in it.
- return BazelModuleResolutionFunction.createValue(
+ // Dummy function that returns a dep graph with just the root module in it.
+ (skyKey, env) ->
+ BazelModuleResolutionFunction.createValue(
ImmutableMap.of(ModuleKey.ROOT, Module.builder().build()),
- ImmutableMap.of());
- }
- })
+ ImmutableMap.of()))
.put(
SkyFunctions.REPOSITORY_MAPPING,
- new SkyFunction() {
- @Override
- public SkyValue compute(SkyKey skyKey, Environment env) {
- // Dummy function that always falls back.
- return RepositoryMappingValue.withMapping(
- RepositoryMapping.ALWAYS_FALLBACK);
- }
- })
+ // Dummy function that always falls back.
+ (skyKey, env) ->
+ RepositoryMappingValue.withMapping(RepositoryMapping.ALWAYS_FALLBACK))
.put(
SkyFunctions.MODULE_EXTENSION_RESOLUTION,
- new SkyFunction() {
- @Override
- public SkyValue compute(SkyKey skyKey, Environment env) {
- // Dummy function that returns nothing.
- return ModuleExtensionResolutionValue.create(
- ImmutableMap.of(), ImmutableMap.of(), ImmutableListMultimap.of());
- }
- })
+ // Dummy function that returns nothing.
+ (skyKey, env) ->
+ ModuleExtensionResolutionValue.create(
+ ImmutableMap.of(), ImmutableMap.of(), ImmutableListMultimap.of()))
.put(SkyFunctions.CONTAINING_PACKAGE_LOOKUP, new ContainingPackageLookupFunction())
.put(
SkyFunctions.IGNORED_PACKAGE_PREFIXES,
@@ -288,43 +271,6 @@
}
@Test
- public void createRepoRule_bazelTools() throws Exception {
- EvaluationResult<BzlmodRepoRuleValue> result =
- evaluator.evaluate(
- ImmutableList.of(BzlmodRepoRuleValue.key("bazel_tools")), evaluationContext);
- if (result.hasError()) {
- fail(result.getError().toString());
- }
- BzlmodRepoRuleValue bzlmodRepoRuleValue = result.get(BzlmodRepoRuleValue.key("bazel_tools"));
- Rule repoRule = bzlmodRepoRuleValue.getRule();
-
- assertThat(repoRule.getRuleClass()).isEqualTo("local_repository");
- assertThat(repoRule.getName()).isEqualTo("bazel_tools");
- // In the test, the install base is set to rootDirectory, which is "/workspace".
- assertThat(repoRule.getAttr("path", Type.STRING)).isEqualTo("/workspace/embedded_tools");
- }
-
- @Test
- public void createRepoRule_localConfigPlatform() throws Exception {
- // Skip this test in Blaze because local_config_platform is not available.
- if (!AnalysisMock.get().isThisBazel()) {
- return;
- }
- EvaluationResult<BzlmodRepoRuleValue> result =
- evaluator.evaluate(
- ImmutableList.of(BzlmodRepoRuleValue.key("local_config_platform")), evaluationContext);
- if (result.hasError()) {
- fail(result.getError().toString());
- }
- BzlmodRepoRuleValue bzlmodRepoRuleValue =
- result.get(BzlmodRepoRuleValue.key("local_config_platform"));
- Rule repoRule = bzlmodRepoRuleValue.getRule();
-
- assertThat(repoRule.getRuleClass()).isEqualTo("local_config_platform");
- assertThat(repoRule.getName()).isEqualTo("local_config_platform");
- }
-
- @Test
public void createRepoRule_overrides() throws Exception {
EvaluationResult<BzlmodRepoRuleValue> result =
evaluator.evaluate(ImmutableList.of(BzlmodRepoRuleValue.key("A")), evaluationContext);
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleHelperTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleHelperTest.java
index 20bcbdf..f078cd1 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleHelperTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleHelperTest.java
@@ -115,7 +115,7 @@
externalFilesHelper))
.put(
SkyFunctions.MODULE_FILE,
- new ModuleFileFunction(registryFactory, workspaceRoot))
+ new ModuleFileFunction(registryFactory, workspaceRoot, ImmutableMap.of()))
.put(SkyFunctions.BAZEL_MODULE_RESOLUTION, new BazelModuleResolutionFunction())
.put(
GET_REPO_SPEC_BY_NAME_FUNCTION,
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/DiscoveryTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/DiscoveryTest.java
index c3ba369..683b1ec 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/DiscoveryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/DiscoveryTest.java
@@ -114,6 +114,11 @@
@Before
public void setup() throws Exception {
+ setUpWithBuiltinModules(ImmutableMap.of());
+ }
+
+ private void setUpWithBuiltinModules(ImmutableMap<String, NonRegistryOverride> builtinModules)
+ throws Exception {
workspaceRoot = scratch.dir("/ws");
differencer = new SequencedRecordingDifferencer();
evaluationContext =
@@ -164,7 +169,7 @@
.put(DiscoveryValue.FUNCTION_NAME, new DiscoveryFunction())
.put(
SkyFunctions.MODULE_FILE,
- new ModuleFileFunction(registryFactory, workspaceRoot))
+ new ModuleFileFunction(registryFactory, workspaceRoot, builtinModules))
.put(SkyFunctions.PRECOMPUTED, new PrecomputedFunction())
.put(
SkyFunctions.REPOSITORY_DIRECTORY,
@@ -598,4 +603,81 @@
.setKey(createModuleKey("C", ""))
.build());
}
+
+ @Test
+ public void testBuiltinModules_forRoot() throws Exception {
+ ImmutableMap<String, NonRegistryOverride> builtinModules =
+ ImmutableMap.of(
+ "bazel_tools",
+ LocalPathOverride.create(rootDirectory.getRelative("tools").getPathString()),
+ "local_config_platform",
+ LocalPathOverride.create(rootDirectory.getRelative("localplat").getPathString()));
+ setUpWithBuiltinModules(builtinModules);
+ scratch.file(
+ workspaceRoot.getRelative("MODULE.bazel").getPathString(),
+ "bazel_dep(name='foo',version='2.0')");
+ scratch.file(rootDirectory.getRelative("tools/WORKSPACE").getPathString());
+ scratch.file(
+ rootDirectory.getRelative("tools/MODULE.bazel").getPathString(),
+ "module(name='bazel_tools',version='1.0')",
+ "bazel_dep(name='foo',version='1.0')");
+ scratch.file(rootDirectory.getRelative("localplat/WORKSPACE").getPathString());
+ scratch.file(
+ rootDirectory.getRelative("localplat/MODULE.bazel").getPathString(),
+ "module(name='local_config_platform')");
+ FakeRegistry registry =
+ registryFactory
+ .newFakeRegistry("/foo")
+ .addModule(createModuleKey("foo", "1.0"), "module(name='foo', version='1.0')")
+ .addModule(createModuleKey("foo", "2.0"), "module(name='foo', version='2.0')");
+ ModuleFileFunction.REGISTRIES.set(differencer, ImmutableList.of(registry.getUrl()));
+
+ EvaluationResult<DiscoveryValue> result =
+ evaluator.evaluate(ImmutableList.of(DiscoveryValue.KEY), evaluationContext);
+ if (result.hasError()) {
+ fail(result.getError().toString());
+ }
+ DiscoveryValue discoveryValue = result.get(DiscoveryValue.KEY);
+ assertThat(discoveryValue.getDepGraph())
+ .containsExactly(
+ ModuleKey.ROOT,
+ Module.builder()
+ .setKey(ModuleKey.ROOT)
+ .addDep("bazel_tools", createModuleKey("bazel_tools", ""))
+ .addDep("local_config_platform", createModuleKey("local_config_platform", ""))
+ .addDep("foo", createModuleKey("foo", "2.0"))
+ .build(),
+ createModuleKey("bazel_tools", ""),
+ Module.builder()
+ .setName("bazel_tools")
+ .setVersion(Version.parse("1.0"))
+ .setKey(createModuleKey("bazel_tools", ""))
+ .addDep("local_config_platform", createModuleKey("local_config_platform", ""))
+ .addDep("foo", createModuleKey("foo", "1.0"))
+ .build(),
+ createModuleKey("local_config_platform", ""),
+ Module.builder()
+ .setName("local_config_platform")
+ .setKey(createModuleKey("local_config_platform", ""))
+ .addDep("bazel_tools", createModuleKey("bazel_tools", ""))
+ .build(),
+ createModuleKey("foo", "1.0"),
+ Module.builder()
+ .setName("foo")
+ .setVersion(Version.parse("1.0"))
+ .setKey(createModuleKey("foo", "1.0"))
+ .addDep("bazel_tools", createModuleKey("bazel_tools", ""))
+ .addDep("local_config_platform", createModuleKey("local_config_platform", ""))
+ .setRegistry(registry)
+ .build(),
+ createModuleKey("foo", "2.0"),
+ Module.builder()
+ .setName("foo")
+ .setVersion(Version.parse("2.0"))
+ .setKey(createModuleKey("foo", "2.0"))
+ .addDep("bazel_tools", createModuleKey("bazel_tools", ""))
+ .addDep("local_config_platform", createModuleKey("local_config_platform", ""))
+ .setRegistry(registry)
+ .build());
+ }
}
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleExtensionResolutionTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleExtensionResolutionTest.java
index eabc18d..45b4d49 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleExtensionResolutionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleExtensionResolutionTest.java
@@ -168,7 +168,7 @@
externalFilesHelper))
.put(
SkyFunctions.MODULE_FILE,
- new ModuleFileFunction(registryFactory, workspaceRoot))
+ new ModuleFileFunction(registryFactory, workspaceRoot, ImmutableMap.of()))
.put(SkyFunctions.PRECOMPUTED, new PrecomputedFunction())
.put(SkyFunctions.BZL_COMPILE, new BzlCompileFunction(packageFactory, hashFunction))
.put(
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunctionTest.java
index 38b8498..a15de71 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunctionTest.java
@@ -86,6 +86,10 @@
@Before
public void setup() throws Exception {
+ setUpWithBuiltinModules(ImmutableMap.of());
+ }
+
+ private void setUpWithBuiltinModules(ImmutableMap<String, NonRegistryOverride> builtinModules) {
differencer = new SequencedRecordingDifferencer();
evaluationContext =
EvaluationContext.newBuilder().setNumThreads(8).setEventHandler(reporter).build();
@@ -134,7 +138,7 @@
externalFilesHelper))
.put(
SkyFunctions.MODULE_FILE,
- new ModuleFileFunction(registryFactory, rootDirectory))
+ new ModuleFileFunction(registryFactory, rootDirectory, builtinModules))
.put(SkyFunctions.PRECOMPUTED, new PrecomputedFunction())
.put(
SkyFunctions.REPOSITORY_DIRECTORY,
@@ -623,7 +627,7 @@
}
@Test
- public void testModuelFileExecute_syntaxError() throws Exception {
+ public void testModuleFileExecute_syntaxError() throws Exception {
scratch.file(
rootDirectory.getRelative("MODULE.bazel").getPathString(),
"module(name='A',version='0.1',compatibility_level=4)",
@@ -635,7 +639,7 @@
}
@Test
- public void testModuelFileExecute_evalError() throws Exception {
+ public void testModuleFileExecute_evalError() throws Exception {
scratch.file(
rootDirectory.getRelative("MODULE.bazel").getPathString(),
"module(name='A',version='0.1',compatibility_level=\"4\")");
@@ -645,4 +649,74 @@
assertContainsEvent("parameter 'compatibility_level' got value of type 'string', want 'int'");
}
+
+ @Test
+ public void testBuiltinModules_forRoot() throws Exception {
+ ImmutableMap<String, NonRegistryOverride> builtinModules =
+ ImmutableMap.of(
+ "bazel_tools",
+ LocalPathOverride.create("/tools"),
+ "local_config_platform",
+ LocalPathOverride.create("/local_config_platform"));
+ setUpWithBuiltinModules(builtinModules);
+ scratch.file(
+ rootDirectory.getRelative("MODULE.bazel").getPathString(),
+ "bazel_dep(name='foo',version='1.0')");
+ ModuleFileFunction.REGISTRIES.set(differencer, ImmutableList.of());
+
+ SkyKey skyKey = ModuleFileValue.KEY_FOR_ROOT_MODULE;
+ EvaluationResult<RootModuleFileValue> result =
+ evaluator.evaluate(ImmutableList.of(skyKey), evaluationContext);
+ if (result.hasError()) {
+ throw result.getError().getException();
+ }
+ RootModuleFileValue moduleFileValue = result.get(skyKey);
+ assertThat(moduleFileValue.getModule())
+ .isEqualTo(
+ Module.builder()
+ .setKey(ModuleKey.ROOT)
+ .addDep("bazel_tools", createModuleKey("bazel_tools", ""))
+ .addDep("local_config_platform", createModuleKey("local_config_platform", ""))
+ .addDep("foo", createModuleKey("foo", "1.0"))
+ .build());
+ assertThat(moduleFileValue.getOverrides()).containsExactlyEntriesIn(builtinModules);
+ }
+
+ @Test
+ public void testBuiltinModules_forBuiltinModules() throws Exception {
+ ImmutableMap<String, NonRegistryOverride> builtinModules =
+ ImmutableMap.of(
+ "bazel_tools",
+ LocalPathOverride.create(rootDirectory.getRelative("tools").getPathString()),
+ "local_config_platform",
+ LocalPathOverride.create("/local_config_platform"));
+ setUpWithBuiltinModules(builtinModules);
+ scratch.file(
+ rootDirectory.getRelative("MODULE.bazel").getPathString(),
+ "bazel_dep(name='foo',version='1.0')");
+ scratch.file(rootDirectory.getRelative("tools/WORKSPACE").getPathString());
+ scratch.file(
+ rootDirectory.getRelative("tools/MODULE.bazel").getPathString(),
+ "module(name='bazel_tools',version='1.0')",
+ "bazel_dep(name='foo',version='2.0')");
+ ModuleFileFunction.REGISTRIES.set(differencer, ImmutableList.of());
+
+ SkyKey skyKey =
+ ModuleFileValue.key(createModuleKey("bazel_tools", ""), builtinModules.get("bazel_tools"));
+ EvaluationResult<ModuleFileValue> result =
+ evaluator.evaluate(ImmutableList.of(skyKey), evaluationContext);
+ if (result.hasError()) {
+ throw result.getError().getException();
+ }
+ ModuleFileValue moduleFileValue = result.get(skyKey);
+ assertThat(moduleFileValue.getModule())
+ .isEqualTo(
+ Module.builder()
+ .setName("bazel_tools")
+ .setVersion(Version.parse("1.0"))
+ .setKey(createModuleKey("bazel_tools", ""))
+ .addDep("local_config_platform", createModuleKey("local_config_platform", ""))
+ .addDep("foo", createModuleKey("foo", "2.0"))
+ .build());
+ }
}
diff --git a/src/test/java/com/google/devtools/build/lib/cmdline/RepositoryMappingTest.java b/src/test/java/com/google/devtools/build/lib/cmdline/RepositoryMappingTest.java
index e2e8f6c..7108649 100644
--- a/src/test/java/com/google/devtools/build/lib/cmdline/RepositoryMappingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/cmdline/RepositoryMappingTest.java
@@ -45,12 +45,6 @@
.isEqualTo(RepositoryName.create("com_foo_bar_a"));
assertThat(mapping.get(RepositoryName.create("B")))
.isEqualTo(RepositoryName.create("B").toNonVisible("fake_owner_repo"));
-
- // Special repos should still be visible
- assertThat(mapping.get(RepositoryName.create("bazel_tools")))
- .isEqualTo(RepositoryName.create("bazel_tools"));
- assertThat(mapping.get(RepositoryName.create("local_config_platform")))
- .isEqualTo(RepositoryName.create("local_config_platform"));
}
@Test
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
index b3de351..1c4bcc2 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/BazelMockCcSupport.java
@@ -17,6 +17,7 @@
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.util.Crosstool.CcToolchainConfig;
+import com.google.devtools.build.lib.testutil.TestConstants;
import com.google.devtools.build.lib.util.OS;
import java.io.IOException;
@@ -60,6 +61,9 @@
setupCcToolchainConfig(config, getToolchainConfigs());
createParseHeadersAndLayeringCheckWhitelist(config);
createStarlarkLooseHeadersWhitelist(config, "//...");
+ config.append(
+ TestConstants.TOOLS_REPOSITORY_SCRATCH + "tools/cpp/BUILD",
+ "alias(name='host_xcodes',actual='@local_config_xcode//:host_xcodes')");
}
@Override
diff --git a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
index f3d1f15..b0261b5 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
@@ -233,7 +233,9 @@
new IgnoredPackagePrefixesFunction(
/*ignoredPackagePrefixesFile=*/ PathFragment.EMPTY_FRAGMENT))
.put(SkyFunctions.RESOLVED_HASH_VALUES, new ResolvedHashesFunction())
- .put(SkyFunctions.MODULE_FILE, new ModuleFileFunction(registryFactory, rootPath))
+ .put(
+ SkyFunctions.MODULE_FILE,
+ new ModuleFileFunction(registryFactory, rootPath, ImmutableMap.of()))
.put(SkyFunctions.BAZEL_MODULE_RESOLUTION, new BazelModuleResolutionFunction())
.put(
SkyFunctions.MODULE_EXTENSION_RESOLUTION,
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RepositoryMappingFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RepositoryMappingFunctionTest.java
index deeb101..2464de5 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/RepositoryMappingFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/RepositoryMappingFunctionTest.java
@@ -21,7 +21,10 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
import com.google.common.testing.EqualsTester;
+import com.google.devtools.build.lib.analysis.BlazeDirectories;
+import com.google.devtools.build.lib.analysis.util.AnalysisMock;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
import com.google.devtools.build.lib.bazel.bzlmod.BazelModuleResolutionFunction;
import com.google.devtools.build.lib.bazel.bzlmod.FakeRegistry;
@@ -38,6 +41,8 @@
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.lib.vfs.Root;
import com.google.devtools.build.skyframe.EvaluationResult;
+import com.google.devtools.build.skyframe.SkyFunction;
+import com.google.devtools.build.skyframe.SkyFunctionName;
import com.google.devtools.build.skyframe.SkyKey;
import java.io.IOException;
import org.junit.Before;
@@ -77,6 +82,27 @@
getSkyframeExecutor().getDifferencerForTesting(), CheckDirectDepsMode.WARNING);
}
+ @Override
+ protected AnalysisMock getAnalysisMock() {
+ // Make sure we don't have built-in modules affecting the dependency graph.
+ return new AnalysisMock.Delegate(super.getAnalysisMock()) {
+ @Override
+ public ImmutableMap<SkyFunctionName, SkyFunction> getSkyFunctions(
+ BlazeDirectories directories) {
+ return ImmutableMap.<SkyFunctionName, SkyFunction>builder()
+ .putAll(
+ Maps.filterKeys(
+ super.getSkyFunctions(directories),
+ fnName -> !fnName.equals(SkyFunctions.MODULE_FILE)))
+ .put(
+ SkyFunctions.MODULE_FILE,
+ new ModuleFileFunction(
+ FakeRegistry.DEFAULT_FACTORY, directories.getWorkspace(), ImmutableMap.of()))
+ .buildOrThrow();
+ }
+ };
+ }
+
public static RepositoryMappingValue withMappingAllowingFallback(
ImmutableMap<RepositoryName, RepositoryName> repositoryMapping) {
return RepositoryMappingValue.withMapping(
diff --git a/src/test/py/bazel/BUILD b/src/test/py/bazel/BUILD
index 35d2751..626d9b3 100644
--- a/src/test/py/bazel/BUILD
+++ b/src/test/py/bazel/BUILD
@@ -261,6 +261,9 @@
name = "bazel_module_test",
size = "large",
srcs = ["bzlmod/bazel_module_test.py"],
+ tags = [
+ "requires-network",
+ ],
deps = [
":bzlmod_test_utils",
":test_base",
diff --git a/src/test/py/bazel/bzlmod/bazel_module_test.py b/src/test/py/bazel/bzlmod/bazel_module_test.py
index 0268f30..ae3eb95 100644
--- a/src/test/py/bazel/bzlmod/bazel_module_test.py
+++ b/src/test/py/bazel/bzlmod/bazel_module_test.py
@@ -40,11 +40,17 @@
# 'startup --host_jvm_args=-Djava.net.preferIPv6Addresses=true',
'build --experimental_enable_bzlmod',
'build --registry=' + self.main_registry.getURL(),
+ # We need to have BCR here to make sure built-in modules like
+ # bazel_tools can work.
+ 'build --registry=https://registry.bazel.build',
'build --verbose_failures',
])
+ self.ScratchFile('WORKSPACE')
+ # The existence of WORKSPACE.bzlmod prevents WORKSPACE prefixes or suffixes
+ # from being used; this allows us to test built-in modules actually work
+ self.ScratchFile('WORKSPACE.bzlmod')
def writeMainProjectFiles(self):
- self.ScratchFile('WORKSPACE')
self.ScratchFile('A.patch', [
'--- a/a.cc',
'+++ b/a.cc',
@@ -77,7 +83,6 @@
])
def testSimple(self):
- self.ScratchFile('WORKSPACE')
self.ScratchFile('MODULE.bazel', [
'bazel_dep(name = "A", version = "1.0")',
])
@@ -98,7 +103,6 @@
self.assertIn('main function => A@1.0', stdout)
def testSimpleTransitive(self):
- self.ScratchFile('WORKSPACE')
self.ScratchFile('MODULE.bazel', [
'bazel_dep(name = "B", version = "1.0")',
])
@@ -257,7 +261,6 @@
])
self.main_registry.createCcModule(
'A', '1.1-1', patches=[patch_file], patch_strip=1)
- self.ScratchFile('WORKSPACE')
self.ScratchFile('MODULE.bazel', [
'bazel_dep(name = "A", version = "1.1-1")',
])