diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/LockFileModuleExtension.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/LockFileModuleExtension.java index 6293f0a67689cc..bc66c01b06a822 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/LockFileModuleExtension.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/LockFileModuleExtension.java @@ -20,6 +20,7 @@ import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.events.ExtendedEventHandler.Postable; import com.google.devtools.build.lib.rules.repository.RepoRecordedInput; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.ryanharter.auto.value.gson.GenerateTypeAdapter; import java.util.Optional; @@ -93,6 +94,7 @@ public abstract Builder setRecordedRepoMappingEntries( * A {@link LockFileModuleExtension} together with its {@link ModuleExtensionEvalFactors}, * comprising a single lockfile entry for a certain extension. */ + @AutoCodec public record WithFactors( ModuleExtensionEvalFactors extensionFactors, LockFileModuleExtension moduleExtension) {} } 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 e4339a6eac624e..3a76545de819ec 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 @@ -113,7 +113,8 @@ public RepositoryMapping withAdditionalMappings(Map addi * repo of the given additional mappings is ignored. */ public RepositoryMapping withAdditionalMappings(RepositoryMapping additionalMappings) { - return withAdditionalMappings(additionalMappings.entries()); + return withAdditionalMappings( + (additionalMappings == null) ? ImmutableMap.of() : additionalMappings.entries()); } /** 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 064ab99cdc4767..9c518ed3d7ec3c 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 @@ -263,7 +263,7 @@ public final class BuildLanguageOptions extends OptionsBase { @Option( name = "enable_workspace", - defaultValue = "true", + defaultValue = "false", documentationCategory = OptionDocumentationCategory.STARLARK_SEMANTICS, effectTags = OptionEffectTag.LOADING_AND_ANALYSIS, help = @@ -914,7 +914,7 @@ public StarlarkSemantics toStarlarkSemantics() { "-experimental_enable_first_class_macros"; public static final String EXPERIMENTAL_ENABLE_SCL_DIALECT = "-experimental_enable_scl_dialect"; public static final String ENABLE_BZLMOD = "+enable_bzlmod"; - public static final String ENABLE_WORKSPACE = "+enable_workspace"; + public static final String ENABLE_WORKSPACE = "-enable_workspace"; public static final String EXPERIMENTAL_ISOLATED_EXTENSION_USAGES = "-experimental_isolated_extension_usages"; public static final String EXPERIMENTAL_GOOGLE_LEGACY_API = "-experimental_google_legacy_api"; diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java index 6dd6a1d6e46b95..62942bf7f5941b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java @@ -37,6 +37,11 @@ public boolean isLocal(Rule rule) { return true; } + @Override + protected void setupRepoRootBeforeFetching(Path repoRoot) throws RepositoryFunctionException { + // Repo setup is already handled in RepositoryDelegatorFunction.symlinkRepoRoot + } + @Override public RepositoryDirectoryValue.Builder fetch( Rule rule, diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java index 0c8a22c3e08469..51eaa6b0ce2ebc 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java @@ -51,6 +51,7 @@ import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.Root; import com.google.devtools.build.lib.vfs.RootedPath; +import com.google.devtools.build.lib.vfs.Symlinks; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyFunctionException.Transience; import com.google.devtools.build.skyframe.SkyKey; @@ -486,7 +487,6 @@ private RepositoryDirectoryValue setupOverride( PathFragment sourcePath, Environment env, Path repoRoot, RepositoryName repoName) throws RepositoryFunctionException, InterruptedException { DigestWriter.clearMarkerFile(directories, repoName); - RepositoryFunction.setupRepoRoot(repoRoot); RepositoryDirectoryValue.Builder directoryValue = symlinkRepoRoot( directories, @@ -509,8 +509,15 @@ public static RepositoryDirectoryValue.Builder symlinkRepoRoot( String userDefinedPath, Environment env) throws RepositoryFunctionException, InterruptedException { + if (source.isDirectory(Symlinks.NOFOLLOW)) { + try { + source.deleteTree(); + } catch (IOException e) { + throw new RepositoryFunctionException(e, Transience.TRANSIENT); + } + } try { - source.createSymbolicLink(destination); + FileSystemUtils.ensureSymbolicLink(source, destination); } catch (IOException e) { throw new RepositoryFunctionException( new IOException( diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryMappingValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryMappingValue.java index 39b319ffb8c594..4d1fd3c2ce4a3b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryMappingValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryMappingValue.java @@ -144,9 +144,9 @@ public abstract static class Key implements SkyKey { * Whether the root module should see repos defined in WORKSPACE. This only takes effect when * {@link #repoName} is the main repo. */ - abstract boolean rootModuleShouldSeeWorkspaceRepos(); + public abstract boolean rootModuleShouldSeeWorkspaceRepos(); - static Key create(RepositoryName repoName, boolean rootModuleShouldSeeWorkspaceRepos) { + public static Key create(RepositoryName repoName, boolean rootModuleShouldSeeWorkspaceRepos) { return interner.intern( new AutoValue_RepositoryMappingValue_Key(repoName, rootModuleShouldSeeWorkspaceRepos)); } diff --git a/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl b/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl index 19f6259b4d1ce5..d7a17aa1373e31 100644 --- a/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl +++ b/src/main/starlark/builtins_bzl/common/cc/cc_helper.bzl @@ -178,7 +178,7 @@ def _get_dynamic_library_for_runtime_or_none(library, linking_statically): return library.dynamic_library -_CPP_TOOLCHAIN_TYPE = "@" + objc_semantics.get_repo() + "//tools/cpp:toolchain_type" +_CPP_TOOLCHAIN_TYPE = "@@" + objc_semantics.get_repo() + "//tools/cpp:toolchain_type" def _find_cpp_toolchain(ctx, *, mandatory = True): """ diff --git a/src/test/java/com/google/devtools/build/lib/analysis/DeprecationValidatorTest.java b/src/test/java/com/google/devtools/build/lib/analysis/DeprecationValidatorTest.java index f0dcf5ef02e491..39f1dcd09cddb7 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/DeprecationValidatorTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/DeprecationValidatorTest.java @@ -15,8 +15,6 @@ package com.google.devtools.build.lib.analysis; import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; -import java.io.OutputStream; -import java.nio.charset.StandardCharsets; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -84,35 +82,35 @@ public void deprecationWarningForDifferentPackage() throws Exception { @Test public void deprecationWarningForSamePackageInDifferentRepository() throws Exception { - try (OutputStream output = scratch.resolve("WORKSPACE").getOutputStream(/* append= */ true)) { - output.write( - "\nlocal_repository(name = 'r', path = '/r')\n".getBytes(StandardCharsets.UTF_8)); - } - scratch.file("/r/WORKSPACE", "workspace(name = 'r')"); + scratch.appendFile( + "MODULE.bazel", + "bazel_dep(name = 'r')", + "local_path_override(module_name = 'r', path = '/r')"); + scratch.file("/r/MODULE.bazel", "module(name = 'r')"); scratch.file("/r/a/BUILD", "filegroup(name='b', deprecation='deprecation warning printed')"); invalidatePackages(); checkWarning( "a", "a", - "target '//a:a' depends on deprecated target '@@r//a:b': deprecation warning printed", + "target '//a:a' depends on deprecated target '@@r+//a:b': deprecation warning printed", "filegroup(name='a', srcs=['@r//a:b'])"); } @Test public void deprecationWarningForJavatestsCompanionOfJavaPackageInDifferentRepository() throws Exception { - try (OutputStream output = scratch.resolve("WORKSPACE").getOutputStream(/* append= */ true)) { - output.write( - "\nlocal_repository(name = 'r', path = '/r')\n".getBytes(StandardCharsets.UTF_8)); - } - scratch.file("/r/WORKSPACE", "workspace(name = 'r')"); + scratch.appendFile( + "MODULE.bazel", + "bazel_dep(name = 'r')", + "local_path_override(module_name = 'r', path = '/r')"); + scratch.file("/r/MODULE.bazel", "module(name = 'r')"); scratch.file( "/r/java/a/BUILD", "filegroup(name='b', deprecation='deprecation warning printed')"); invalidatePackages(); checkWarning( "javatests/a", "a", - "target '//javatests/a:a' depends on deprecated target '@@r//java/a:b': " + "target '//javatests/a:a' depends on deprecated target '@@r+//java/a:b': " + "deprecation warning printed", "filegroup(name='a', srcs=['@r//java/a:b'])"); } diff --git a/src/test/java/com/google/devtools/build/lib/analysis/LocationExpanderIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/analysis/LocationExpanderIntegrationTest.java index 3f5ceffc1f3f7a..1088683cec0a8c 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/LocationExpanderIntegrationTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/LocationExpanderIntegrationTest.java @@ -170,8 +170,7 @@ public void otherPathExpansion() throws Exception { srcs = [":foo"], ) """); - - FileSystemUtils.appendIsoLatin1(scratch.resolve("WORKSPACE"), "workspace(name='workspace')"); + scratch.overwriteFile("MODULE.bazel", "module(name='workspace')"); // Invalidate WORKSPACE to pick up the name. getSkyframeExecutor() .invalidateFilesUnderPathForTesting( @@ -209,8 +208,10 @@ public void otherPathExternalExpansionLegacyExternalRunfiles() throws Exception scratch.file( "expansion/BUILD", "sh_library(name='lib', srcs=['@r//p:foo'])"); - FileSystemUtils.appendIsoLatin1( - scratch.resolve("WORKSPACE"), "local_repository(name='r', path='/r')"); + scratch.appendFile( + "MODULE.bazel", + "bazel_dep(name = 'r')", + "local_path_override(module_name = 'r', path = '/r')"); // Invalidate WORKSPACE so @r can be resolved. getSkyframeExecutor() @@ -218,30 +219,32 @@ public void otherPathExternalExpansionLegacyExternalRunfiles() throws Exception reporter, ModifiedFileSet.EVERYTHING_MODIFIED, Root.fromPath(rootDirectory)); FileSystemUtils.createDirectoryAndParents(scratch.resolve("/foo/bar")); - scratch.file("/r/WORKSPACE", "workspace(name = 'r')"); + scratch.file("/r/MODULE.bazel", "module(name = 'r')"); scratch.file("/r/p/BUILD", "genrule(name='foo', outs=['foo.txt'], cmd='never executed')"); useConfiguration("--legacy_external_runfiles"); LocationExpander expander = makeExpander("//expansion:lib"); assertThat(expander.expand("foo $(execpath @r//p:foo) bar")) - .matches("foo .*-out/.*/external/r/p/foo\\.txt bar"); + .matches("foo .*-out/.*/external/r\\+/p/foo\\.txt bar"); assertThat(expander.expand("foo $(execpaths @r//p:foo) bar")) - .matches("foo .*-out/.*/external/r/p/foo\\.txt bar"); + .matches("foo .*-out/.*/external/r\\+/p/foo\\.txt bar"); assertThat(expander.expand("foo $(rootpath @r//p:foo) bar")) - .matches("foo external/r/p/foo.txt bar"); + .matches("foo external/r\\+/p/foo.txt bar"); assertThat(expander.expand("foo $(rootpaths @r//p:foo) bar")) - .matches("foo external/r/p/foo.txt bar"); + .matches("foo external/r\\+/p/foo.txt bar"); assertThat(expander.expand("foo $(rlocationpath @r//p:foo) bar")) - .isEqualTo("foo r/p/foo.txt bar"); + .isEqualTo("foo r+/p/foo.txt bar"); assertThat(expander.expand("foo $(rlocationpath @r//p:foo) bar")) - .isEqualTo("foo r/p/foo.txt bar"); + .isEqualTo("foo r+/p/foo.txt bar"); } @Test public void otherPathExternalExpansionNoLegacyExternalRunfiles() throws Exception { scratch.file("expansion/BUILD", "sh_library(name='lib', srcs=['@r//p:foo'])"); - FileSystemUtils.appendIsoLatin1( - scratch.resolve("WORKSPACE"), "local_repository(name='r', path='/r')"); + scratch.appendFile( + "MODULE.bazel", + "bazel_dep(name = 'r')", + "local_path_override(module_name = 'r', path = '/r')"); // Invalidate WORKSPACE so @r can be resolved. getSkyframeExecutor() @@ -249,29 +252,33 @@ public void otherPathExternalExpansionNoLegacyExternalRunfiles() throws Exceptio reporter, ModifiedFileSet.EVERYTHING_MODIFIED, Root.fromPath(rootDirectory)); FileSystemUtils.createDirectoryAndParents(scratch.resolve("/foo/bar")); - scratch.file("/r/WORKSPACE", "workspace(name = 'r')"); + scratch.file("/r/MODULE.bazel", "module(name = 'r')"); scratch.file("/r/p/BUILD", "genrule(name='foo', outs=['foo.txt'], cmd='never executed')"); useConfiguration("--nolegacy_external_runfiles"); LocationExpander expander = makeExpander("//expansion:lib"); assertThat(expander.expand("foo $(execpath @r//p:foo) bar")) - .matches("foo .*-out/.*/external/r/p/foo\\.txt bar"); + .matches("foo .*-out/.*/external/r\\+/p/foo\\.txt bar"); assertThat(expander.expand("foo $(execpaths @r//p:foo) bar")) - .matches("foo .*-out/.*/external/r/p/foo\\.txt bar"); - assertThat(expander.expand("foo $(rootpath @r//p:foo) bar")).matches("foo ../r/p/foo.txt bar"); - assertThat(expander.expand("foo $(rootpaths @r//p:foo) bar")).matches("foo ../r/p/foo.txt bar"); + .matches("foo .*-out/.*/external/r\\+/p/foo\\.txt bar"); + assertThat(expander.expand("foo $(rootpath @r//p:foo) bar")) + .matches("foo ../r\\+/p/foo.txt bar"); + assertThat(expander.expand("foo $(rootpaths @r//p:foo) bar")) + .matches("foo ../r\\+/p/foo.txt bar"); assertThat(expander.expand("foo $(rlocationpath @r//p:foo) bar")) - .isEqualTo("foo r/p/foo.txt bar"); + .isEqualTo("foo r+/p/foo.txt bar"); assertThat(expander.expand("foo $(rlocationpath @r//p:foo) bar")) - .isEqualTo("foo r/p/foo.txt bar"); + .isEqualTo("foo r+/p/foo.txt bar"); } @Test public void otherPathExternalExpansionNoLegacyExternalRunfilesSiblingRepositoryLayout() throws Exception { scratch.file("expansion/BUILD", "sh_library(name='lib', srcs=['@r//p:foo'])"); - FileSystemUtils.appendIsoLatin1( - scratch.resolve("WORKSPACE"), "local_repository(name='r', path='/r')"); + scratch.appendFile( + "MODULE.bazel", + "bazel_dep(name = 'r')", + "local_path_override(module_name = 'r', path = '/r')"); // Invalidate WORKSPACE so @r can be resolved. getSkyframeExecutor() @@ -279,22 +286,24 @@ public void otherPathExternalExpansionNoLegacyExternalRunfilesSiblingRepositoryL reporter, ModifiedFileSet.EVERYTHING_MODIFIED, Root.fromPath(rootDirectory)); FileSystemUtils.createDirectoryAndParents(scratch.resolve("/foo/bar")); - scratch.file("/r/WORKSPACE", "workspace(name = 'r')"); + scratch.file("/r/MODULE.bazel", "module(name = 'r')"); scratch.file("/r/p/BUILD", "genrule(name='foo', outs=['foo.txt'], cmd='never executed')"); useConfiguration("--nolegacy_external_runfiles"); setBuildLanguageOptions("--experimental_sibling_repository_layout"); LocationExpander expander = makeExpander("//expansion:lib"); assertThat(expander.expand("foo $(execpath @r//p:foo) bar")) - .matches("foo .*-out/r/.*/p/foo\\.txt bar"); + .matches("foo .*-out/r\\+/.*/p/foo\\.txt bar"); assertThat(expander.expand("foo $(execpaths @r//p:foo) bar")) - .matches("foo .*-out/r/.*/p/foo\\.txt bar"); - assertThat(expander.expand("foo $(rootpath @r//p:foo) bar")).matches("foo ../r/p/foo.txt bar"); - assertThat(expander.expand("foo $(rootpaths @r//p:foo) bar")).matches("foo ../r/p/foo.txt bar"); + .matches("foo .*-out/r\\+/.*/p/foo\\.txt bar"); + assertThat(expander.expand("foo $(rootpath @r//p:foo) bar")) + .matches("foo ../r\\+/p/foo.txt bar"); + assertThat(expander.expand("foo $(rootpaths @r//p:foo) bar")) + .matches("foo ../r\\+/p/foo.txt bar"); assertThat(expander.expand("foo $(rlocationpath @r//p:foo) bar")) - .isEqualTo("foo r/p/foo.txt bar"); + .isEqualTo("foo r+/p/foo.txt bar"); assertThat(expander.expand("foo $(rlocationpaths @r//p:foo) bar")) - .isEqualTo("foo r/p/foo.txt bar"); + .isEqualTo("foo r+/p/foo.txt bar"); } @Test diff --git a/src/test/java/com/google/devtools/build/lib/analysis/RunfilesRepoMappingManifestTest.java b/src/test/java/com/google/devtools/build/lib/analysis/RunfilesRepoMappingManifestTest.java index 79697cf34487f6..6df754991f449a 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/RunfilesRepoMappingManifestTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/RunfilesRepoMappingManifestTest.java @@ -145,12 +145,11 @@ public void diamond() throws Exception { } // Called last as it triggers package invalidation, which requires a valid MODULE.bazel setup. - rewriteWorkspace("workspace(name='aaa_ws')"); + invalidatePackages(); assertThat(getRepoMappingManifestForTarget("//:aaa")) .containsExactly( ",aaa," + getRuleClassProvider().getRunfilesPrefix(), - ",aaa_ws," + getRuleClassProvider().getRunfilesPrefix(), ",bbb,bbb+", "bbb+,bbb,bbb+", "bbb+,ddd,ddd+", @@ -215,11 +214,10 @@ public void runfilesFromToolchain() throws Exception { "tooled_binary(name='tooled')"); // Called last as it triggers package invalidation, which requires a valid MODULE.bazel setup. - rewriteWorkspace("workspace(name='main')"); + invalidatePackages(); assertThat(getRepoMappingManifestForTarget("//:tooled")) .containsExactly( - ",main," + getRuleClassProvider().getRunfilesPrefix(), "bare_rule+,bare_rule,bare_rule+", "tooled_rule+,bare_rule,bare_rule+") .inOrder(); @@ -227,6 +225,7 @@ public void runfilesFromToolchain() throws Exception { @Test public void actionRerunsOnRepoMappingChange_workspaceName() throws Exception { + setBuildLanguageOptions("--enable_workspace"); overwriteWorkspaceFile("workspace(name='aaa_ws')"); scratch.overwriteFile( "MODULE.bazel", 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 bf38cae77bacdb..3a666721ee2569 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 @@ -29,8 +29,10 @@ java_library( "//tools/cpp:cc_toolchain_config_lib.bzl", ], deps = [ + "//src/main/java/com/google/devtools/build/lib:runtime", "//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:repository_module", "//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", 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 d436923d880443..eee6dce564e4c7 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 @@ -25,6 +25,7 @@ import com.google.devtools.build.lib.analysis.ShellConfiguration; import com.google.devtools.build.lib.analysis.util.AbstractMockJavaSupport; import com.google.devtools.build.lib.analysis.util.AnalysisMock; +import com.google.devtools.build.lib.bazel.BazelRepositoryModule; 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; @@ -38,6 +39,7 @@ import com.google.devtools.build.lib.packages.util.MockPythonSupport; import com.google.devtools.build.lib.packages.util.MockToolsConfig; import com.google.devtools.build.lib.rules.repository.RepositoryFunction; +import com.google.devtools.build.lib.runtime.BlazeModule; import com.google.devtools.build.lib.testutil.TestConstants; import com.google.devtools.build.lib.testutil.TestRuleClassProvider; import com.google.devtools.build.lib.vfs.FileSystemUtils; @@ -113,11 +115,9 @@ public ImmutableList getWorkspaceContents(MockToolsConfig config) { public ImmutableList getWorkspaceRepos() { return ImmutableList.of( "android_gmaven_r8", - "bazel_tools", "com_google_protobuf", "local_config_platform", "local_config_xcode", - "platforms", "internal_platforms_do_not_use", "rules_java", "rules_java_builtin", @@ -150,7 +150,17 @@ public void setupMockClient(MockToolsConfig config, List workspaceConten config.create("protobuf_workspace/WORKSPACE"); config.create("protobuf_workspace/MODULE.bazel", "module(name='com_google_protobuf')"); config.overwrite("WORKSPACE", workspaceContents.toArray(new String[0])); - config.overwrite("MODULE.bazel"); + config.overwrite( + "MODULE.bazel", + "register_toolchains('@rules_java//java/toolchains/runtime:all')", + "register_toolchains('@rules_java//java/toolchains/javac:all')", + "register_toolchains('@bazel_tools//tools/cpp:all')", + "register_toolchains('@bazel_tools//tools/jdk:all')", + "register_toolchains('@bazel_tools//tools/android:all')", + // Note this path is created inside the test infrastructure in + // createAndroidBuildContents() below. It may not reflect a real depot path. + "register_toolchains('@bazel_tools//tools/android/dummy_sdk:all')", + "register_toolchains('@bazel_tools//tools/python:autodetecting_toolchain')"); /* 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')"); @@ -162,6 +172,20 @@ public void setupMockClient(MockToolsConfig config, List workspaceConten config.create( "build_bazel_apple_support/MODULE.bazel", "module(name = 'build_bazel_apple_support')"); config.create("embedded_tools/WORKSPACE", "workspace(name = 'bazel_tools')"); + + // TODO: remove after figuring out https://github.com/bazelbuild/bazel/issues/22208 + config.create( + ".bazelignore", + "embedded_tools", + "platforms_workspace", + "local_config_platform_workspace", + "rules_java_workspace", + "protobuf_workspace", + "third_party/bazel_rules/rules_proto", + "build_bazel_apple_support", + "local_config_xcode_workspace", + "third_party/bazel_rules/rules_cc"); + Runfiles runfiles = Runfiles.create(); for (String filename : Arrays.asList("tools/jdk/java_toolchain_alias.bzl", "tools/jdk/java_stub_template.txt")) { @@ -1002,4 +1026,9 @@ public void addExtraRepositoryFunctions( ImmutableMap.Builder repositoryHandlers) { repositoryHandlers.put(LocalConfigPlatformRule.NAME, new LocalConfigPlatformFunction()); } + + @Override + public BlazeModule getBazelRepositoryModule(BlazeDirectories directories) { + return new BazelRepositoryModule(getBuiltinModules(directories)); + } } 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 f47439cd641d78..11db66e2994cb3 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 @@ -47,6 +47,7 @@ import com.google.devtools.build.lib.rules.repository.LocalRepositoryRule; import com.google.devtools.build.lib.rules.repository.RepositoryDelegatorFunction; import com.google.devtools.build.lib.rules.repository.RepositoryFunction; +import com.google.devtools.build.lib.runtime.BlazeModule; import com.google.devtools.build.lib.skyframe.BazelSkyframeExecutorConstants; import com.google.devtools.build.lib.skyframe.ClientEnvironmentFunction; import com.google.devtools.build.lib.skyframe.PrecomputedValue; @@ -225,6 +226,8 @@ public abstract ImmutableMap getBuiltinModules( public abstract void setupPrelude(MockToolsConfig mockToolsConfig) throws IOException; + public abstract BlazeModule getBazelRepositoryModule(BlazeDirectories directories); + /** * Stub class for tests to extend in order to update a small amount of {@link AnalysisMock} * functionality. @@ -321,5 +324,10 @@ public void addExtraRepositoryFunctions( ImmutableMap.Builder repositoryHandlers) { delegate.addExtraRepositoryFunctions(repositoryHandlers); } + + @Override + public BlazeModule getBazelRepositoryModule(BlazeDirectories directories) { + return delegate.getBazelRepositoryModule(directories); + } } } diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java index 93f3fd787ef3ab..9377cd61d87e20 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java @@ -1190,6 +1190,16 @@ public void rewriteWorkspace(String... lines) throws Exception { invalidatePackages(); } + /** + * Rewrites the MODULE.bazel file + * + *

Triggers Skyframe to reinitialize everything. + */ + public void rewriteModuleDotBazel(String... lines) throws Exception { + scratch.overwriteFile("MODULE.bazel", lines); + invalidatePackages(); + } + /** * Create and return a configured scratch rule. * diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java index a3a4f538c141a1..a57dbd9d471b2e 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java @@ -141,9 +141,6 @@ public final void initializeSkyframeExecutor() throws Exception { packageOptions.showLoadingProgress = true; packageOptions.globbingThreads = 7; BuildLanguageOptions options = Options.getDefaults(BuildLanguageOptions.class); - // TODO: enable Bzlmod for this test case - // https://github.com/bazelbuild/bazel/issues/19824 - options.enableBzlmod = false; options.experimentalGoogleLegacyApi = !analysisMock.isThisBazel(); skyframeExecutor.preparePackageLoading( pkgLocator, diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryIntegrationTest.java index bab1a9466a9a0a..618ef8385d0478 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryIntegrationTest.java +++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryIntegrationTest.java @@ -65,7 +65,7 @@ protected void invalidatePackages() throws InterruptedException, AbruptExitExcep @Test public void testStarlarkLocalRepository() throws Exception { // A simple test that recreates local_repository with Starlark. - scratch.file("/repo2/WORKSPACE"); + scratch.file("/repo2/MODULE.bazel", "module(name='repo2')"); scratch.file("/repo2/bar.txt"); scratch.file("/repo2/BUILD", "filegroup(name='bar', srcs=['bar.txt'])"); scratch.file( @@ -82,14 +82,11 @@ def _impl(repository_ctx): """); scratch.file(rootDirectory.getRelative("BUILD").getPathString()); scratch.overwriteFile( - rootDirectory.getRelative("WORKSPACE").getPathString(), - new ImmutableList.Builder() - .addAll(analysisMock.getWorkspaceContents(mockToolsConfig)) - .add("load('//:def.bzl', 'repo')") - .add("repo(name='foo', path='/repo2')") - .build()); + rootDirectory.getRelative("MODULE.bazel").getPathString(), + "repo = use_repo_rule('//:def.bzl', 'repo')", + "repo(name='foo', path='/repo2')"); invalidatePackages(); - getConfiguredTargetAndData("@foo//:bar"); + getConfiguredTargetAndData("@@+_repo_rules+foo//:bar"); } @Test @@ -97,6 +94,7 @@ public void testInstantiationOfUnexportedRepositoryRule() throws Exception { // It is possible to instantiate an unexported repository_rule, // even though it should not be (b/283533234). // This test exercises the heuristic for inferring the name of the rule class. + setBuildLanguageOptions("--enable_workspace"); scratch.file("/repo/WORKSPACE"); scratch.file("/repo/BUILD"); scratch.file( @@ -132,7 +130,7 @@ def f(): @Test public void testfailWithIncompatibleUseCcConfigureFromRulesCcDoesNothing() throws Exception { // A simple test that recreates local_repository with Starlark. - scratch.file("/repo2/WORKSPACE"); + scratch.file("/repo2/MODULE.bazel", "module(name='repo2')"); scratch.file("/repo2/bar.txt"); scratch.file("/repo2/BUILD", "filegroup(name='bar', srcs=['bar.txt'])"); scratch.file( @@ -151,14 +149,11 @@ def _impl(repository_ctx): """); scratch.file(rootDirectory.getRelative("BUILD").getPathString()); scratch.overwriteFile( - rootDirectory.getRelative("WORKSPACE").getPathString(), - new ImmutableList.Builder() - .addAll(analysisMock.getWorkspaceContents(mockToolsConfig)) - .add("load('//:def.bzl', 'repo')") - .add("repo(name='foo', path='/repo2')") - .build()); + rootDirectory.getRelative("MODULE.bazel").getPathString(), + "repo = use_repo_rule('//:def.bzl', 'repo')", + "repo(name='foo', path='/repo2')"); invalidatePackages(); - getConfiguredTargetAndData("@foo//:bar"); + getConfiguredTargetAndData("@@+_repo_rules+foo//:bar"); } @Test @@ -166,7 +161,7 @@ public void testStarlarkSymlinkFileFromRepository() throws Exception { // This test creates a symbolic link BUILD -> bar.txt. scratch.file("/repo2/bar.txt", "filegroup(name='bar', srcs=['foo.txt'])"); scratch.file("/repo2/BUILD"); - scratch.file("/repo2/WORKSPACE"); + scratch.file("/repo2/MODULE.bazel", "module(name='repo2')"); scratch.file( "def.bzl", """ @@ -181,22 +176,20 @@ def _impl(repository_ctx): """); scratch.file(rootDirectory.getRelative("BUILD").getPathString()); scratch.overwriteFile( - rootDirectory.getRelative("WORKSPACE").getPathString(), - new ImmutableList.Builder() - .addAll(analysisMock.getWorkspaceContents(mockToolsConfig)) - .add("local_repository(name='repo2', path='/repo2')") - .add("load('//:def.bzl', 'repo')") - .add("repo(name='foo')") - .build()); + rootDirectory.getRelative("MODULE.bazel").getPathString(), + "bazel_dep(name = 'repo2')", + "local_path_override(module_name = 'repo2', path = '/repo2')", + "repo = use_repo_rule('//:def.bzl', 'repo')", + "repo(name='foo')"); invalidatePackages(); - getConfiguredTargetAndData("@foo//:bar"); + getConfiguredTargetAndData("@@+_repo_rules+foo//:bar"); } @Test public void testStarlarkRepositoryTemplate() throws Exception { scratch.file("/repo2/bar.txt", "filegroup(name='{target}', srcs=['{path}'])"); scratch.file("/repo2/BUILD"); - scratch.file("/repo2/WORKSPACE"); + scratch.file("/repo2/MODULE.bazel", "module(name='repo2')"); scratch.file( "def.bzl", "def _impl(repository_ctx):", @@ -209,19 +202,17 @@ public void testStarlarkRepositoryTemplate() throws Exception { " local=True)"); scratch.file(rootDirectory.getRelative("BUILD").getPathString()); scratch.overwriteFile( - rootDirectory.getRelative("WORKSPACE").getPathString(), - new ImmutableList.Builder() - .addAll(analysisMock.getWorkspaceContents(mockToolsConfig)) - .add("local_repository(name='repo2', path='/repo2')") - .add("load('//:def.bzl', 'repo')") - .add("repo(name='foo')") - .build()); + rootDirectory.getRelative("MODULE.bazel").getPathString(), + "bazel_dep(name = 'repo2')", + "local_path_override(module_name = 'repo2', path = '/repo2')", + "repo = use_repo_rule('//:def.bzl', 'repo')", + "repo(name='foo')"); invalidatePackages(); - ConfiguredTargetAndData target = getConfiguredTargetAndData("@foo//:bar"); + ConfiguredTargetAndData target = getConfiguredTargetAndData("@@+_repo_rules+foo//:bar"); @SuppressWarnings("unchecked") List