diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BazelRuleAnalysisThreadContext.java b/src/main/java/com/google/devtools/build/lib/analysis/BazelRuleAnalysisThreadContext.java index 21767620d49135..ff214d1ab79e57 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/BazelRuleAnalysisThreadContext.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/BazelRuleAnalysisThreadContext.java @@ -14,8 +14,8 @@ package com.google.devtools.build.lib.analysis; +import com.google.devtools.build.lib.cmdline.BazelStarlarkContext; import com.google.devtools.build.lib.cmdline.Label; -import com.google.devtools.build.lib.packages.BazelStarlarkContext; import com.google.errorprone.annotations.CanIgnoreReturnValue; import javax.annotation.Nullable; import net.starlark.java.eval.EvalException; @@ -33,7 +33,7 @@ public class BazelRuleAnalysisThreadContext extends BazelStarlarkContext { * @param ruleContext is the {@link RuleContext} of the rule for analysis of a rule or aspect */ public BazelRuleAnalysisThreadContext(RuleContext ruleContext) { - super(Phase.ANALYSIS); + super(Phase.ANALYSIS, ruleContext.getAnalysisEnvironment()::getMainRepoMapping); this.ruleContext = ruleContext; } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java b/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java index 77c39d9f1800f0..fd66a756039879 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java @@ -37,8 +37,8 @@ import com.google.devtools.build.lib.cmdline.RepositoryMapping; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.EventHandler; -import com.google.devtools.build.lib.packages.BazelStarlarkContext; -import com.google.devtools.build.lib.packages.BazelStarlarkContext.Phase; +import com.google.devtools.build.lib.cmdline.BazelStarlarkContext; +import com.google.devtools.build.lib.cmdline.BazelStarlarkContext.Phase; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleTransitionData; import com.google.devtools.build.lib.packages.StructImpl; @@ -552,7 +552,7 @@ public ImmutableMap> evaluate( // Create a new {@link BazelStarlarkContext} for the new thread. We need to // create a new context every time because {@link BazelStarlarkContext}s // should be confined to a single thread. - new BazelStarlarkContext(Phase.ANALYSIS).storeInThread(thread); + new BazelStarlarkContext(Phase.ANALYSIS, /* mainRepoMapping= */ null).storeInThread(thread); result = Starlark.fastcall( diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleClassFunctions.java index 89d68af5108081..9eeb2d26b0eeea 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleClassFunctions.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleClassFunctions.java @@ -64,7 +64,7 @@ import com.google.devtools.build.lib.packages.Attribute.StarlarkComputedDefaultTemplate; import com.google.devtools.build.lib.packages.AttributeTransitionData; import com.google.devtools.build.lib.packages.AttributeValueSource; -import com.google.devtools.build.lib.packages.BazelStarlarkContext; +import com.google.devtools.build.lib.cmdline.BazelStarlarkContext; import com.google.devtools.build.lib.packages.BuildSetting; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.BuiltinRestriction; diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java index 93c1046c98d2b6..f7fa1be8c70b57 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java @@ -34,6 +34,8 @@ import com.google.devtools.build.lib.bazel.repository.downloader.DownloadManager; import com.google.devtools.build.lib.bazel.repository.starlark.StarlarkRepositoryModule.RepositoryRuleFunction; import com.google.devtools.build.lib.cmdline.BazelModuleContext; +import com.google.devtools.build.lib.cmdline.BazelStarlarkContext; +import com.google.devtools.build.lib.cmdline.BazelStarlarkContext.Phase; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelConstants; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; @@ -132,6 +134,12 @@ public SkyValue compute(SkyKey skyKey, Environment env) if (starlarkSemantics == null) { return null; } + RepositoryMappingValue mainRepoMappingValue = + (RepositoryMappingValue) + env.getValue(RepositoryMappingValue.KEY_FOR_ROOT_MODULE_WITHOUT_WORKSPACE_REPOS); + if (mainRepoMappingValue == null) { + return null; + } ModuleExtensionId extensionId = (ModuleExtensionId) skyKey.argument(); SingleExtensionUsagesValue usagesValue = @@ -182,7 +190,12 @@ public SkyValue compute(SkyKey skyKey, Environment env) // Run that extension! env.getListener().post(ModuleExtensionEvaluationProgress.ongoing(extensionId, "starting")); RunModuleExtensionResult moduleExtensionResult = - extension.run(env, usagesValue, starlarkSemantics, extensionId); + extension.run( + env, + usagesValue, + starlarkSemantics, + extensionId, + mainRepoMappingValue.getRepositoryMapping()); if (moduleExtensionResult == null) { return null; } @@ -525,7 +538,8 @@ RunModuleExtensionResult run( Environment env, SingleExtensionUsagesValue usagesValue, StarlarkSemantics starlarkSemantics, - ModuleExtensionId extensionId) + ModuleExtensionId extensionId, + RepositoryMapping repositoryMapping) throws InterruptedException, SingleExtensionEvalFunctionException; } @@ -677,7 +691,8 @@ public RunModuleExtensionResult run( Environment env, SingleExtensionUsagesValue usagesValue, StarlarkSemantics starlarkSemantics, - ModuleExtensionId extensionId) + ModuleExtensionId extensionId, + RepositoryMapping mainRepositoryMapping) throws InterruptedException, SingleExtensionEvalFunctionException { var generatedRepoSpecs = ImmutableMap.builderWithExpectedSize(repos.size()); // Instantiate the repos one by one. @@ -846,7 +861,8 @@ public RunModuleExtensionResult run( Environment env, SingleExtensionUsagesValue usagesValue, StarlarkSemantics starlarkSemantics, - ModuleExtensionId extensionId) + ModuleExtensionId extensionId, + RepositoryMapping mainRepositoryMapping) throws InterruptedException, SingleExtensionEvalFunctionException { ModuleExtensionEvalStarlarkThreadContext threadContext = new ModuleExtensionEvalStarlarkThreadContext( @@ -870,6 +886,8 @@ public RunModuleExtensionResult run( thread.setPrintHandler(Event.makeDebugPrintHandler(env.getListener())); moduleContext = createContext(env, usagesValue, starlarkSemantics, extensionId); threadContext.storeInThread(thread); + new BazelStarlarkContext(Phase.WORKSPACE, () -> mainRepositoryMapping) + .storeInThread(thread); // This is used by the `Label()` constructor in Starlark, to record any attempts to resolve // apparent repo names to canonical repo names. See #20721 for why this is necessary. thread.setThreadLocal(Label.RepoMappingRecorder.class, repoMappingRecorder); diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD index bbc23ef10fe95f..ec879778d6d0b1 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/BUILD @@ -46,6 +46,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/skyframe:directory_tree_digest_value", "//src/main/java/com/google/devtools/build/lib/skyframe:ignored_package_prefixes_value", "//src/main/java/com/google/devtools/build/lib/skyframe:precomputed_value", + "//src/main/java/com/google/devtools/build/lib/skyframe:repository_mapping_value", "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository", "//src/main/java/com/google/devtools/build/lib/util", "//src/main/java/com/google/devtools/build/lib/util:string", diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java index 63545a9f3e0fa9..8cfa984c43c13d 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryFunction.java @@ -25,11 +25,12 @@ import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.bazel.repository.RepositoryResolvedEvent; import com.google.devtools.build.lib.bazel.repository.downloader.DownloadManager; +import com.google.devtools.build.lib.cmdline.BazelStarlarkContext; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelConstants; +import com.google.devtools.build.lib.cmdline.RepositoryMapping; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.events.Event; -import com.google.devtools.build.lib.packages.BazelStarlarkContext; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; @@ -46,6 +47,7 @@ import com.google.devtools.build.lib.runtime.RepositoryRemoteExecutor; import com.google.devtools.build.lib.skyframe.IgnoredPackagePrefixesValue; import com.google.devtools.build.lib.skyframe.PrecomputedValue; +import com.google.devtools.build.lib.skyframe.RepositoryMappingValue; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; @@ -242,6 +244,20 @@ private RepositoryDirectoryValue.Builder fetchInternal( return null; } + boolean enableBzlmod = starlarkSemantics.getBool(BuildLanguageOptions.ENABLE_BZLMOD); + RepositoryMapping mainRepoMapping; + if (enableBzlmod || !isWorkspaceRepo(rule)) { + var mainRepoMappingValue = + (RepositoryMappingValue) + env.getValue(RepositoryMappingValue.KEY_FOR_ROOT_MODULE_WITHOUT_WORKSPACE_REPOS); + if (mainRepoMappingValue == null) { + return null; + } + mainRepoMapping = mainRepoMappingValue.getRepositoryMapping(); + } else { + mainRepoMapping = rule.getPackage().getRepositoryMapping(); + } + IgnoredPackagePrefixesValue ignoredPackagesValue = (IgnoredPackagePrefixesValue) env.getValue(IgnoredPackagePrefixesValue.key()); if (env.valuesMissing()) { @@ -264,7 +280,8 @@ private RepositoryDirectoryValue.Builder fetchInternal( thread.setThreadLocal(Label.RepoMappingRecorder.class, repoMappingRecorder); } - new BazelStarlarkContext(BazelStarlarkContext.Phase.LOADING).storeInThread(thread); // "fetch" + new BazelStarlarkContext(BazelStarlarkContext.Phase.LOADING, () -> mainRepoMapping) + .storeInThread(thread); // "fetch" StarlarkRepositoryContext starlarkRepositoryContext = new StarlarkRepositoryContext( diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryModule.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryModule.java index 4c43f17b824358..237d2164971131 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryModule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryModule.java @@ -33,7 +33,7 @@ import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.packages.Attribute; import com.google.devtools.build.lib.packages.AttributeValueSource; -import com.google.devtools.build.lib.packages.BazelStarlarkContext; +import com.google.devtools.build.lib.cmdline.BazelStarlarkContext; import com.google.devtools.build.lib.packages.BzlInitThreadContext; import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.lib.packages.RuleClass; diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/BUILD b/src/main/java/com/google/devtools/build/lib/cmdline/BUILD index 89ab67d81d099f..87ab69d0557309 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/BUILD +++ b/src/main/java/com/google/devtools/build/lib/cmdline/BUILD @@ -17,6 +17,7 @@ java_library( srcs = [ "BazelCompileContext.java", "BazelModuleContext.java", + "BazelStarlarkContext.java", "Label.java", "LabelCodec.java", "LabelConstants.java", diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/BazelModuleContext.java b/src/main/java/com/google/devtools/build/lib/cmdline/BazelModuleContext.java index 8c136c43dddf13..2fa9e1c6fb1634 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/BazelModuleContext.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/BazelModuleContext.java @@ -44,13 +44,6 @@ public abstract class BazelModuleContext { /** The repository mapping applicable to the repo where the .bzl file is located in. */ public abstract RepositoryMapping repoMapping(); - /** - * The repository mapping applicable to the main repository. This is purely meant to support - * {@link Label#debugPrint}. - */ - @Nullable - public abstract RepositoryMapping mainRepoMapping(); - /** Returns the name of the module's .bzl file, as provided to the parser. */ public abstract String filename(); @@ -167,12 +160,11 @@ public static BazelModuleContext ofInnermostBzlOrFail(StarlarkThread thread, Str public static BazelModuleContext create( Label label, RepositoryMapping repoMapping, - @Nullable RepositoryMapping mainRepoMapping, String filename, ImmutableList loads, byte[] bzlTransitiveDigest) { return new AutoValue_BazelModuleContext( - label, repoMapping, mainRepoMapping, filename, loads, bzlTransitiveDigest); + label, repoMapping, filename, loads, bzlTransitiveDigest); } public final Label.PackageContext packageContext() { diff --git a/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java b/src/main/java/com/google/devtools/build/lib/cmdline/BazelStarlarkContext.java similarity index 90% rename from src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java rename to src/main/java/com/google/devtools/build/lib/cmdline/BazelStarlarkContext.java index 325628b4c408a3..d9dcd10fa583ed 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/BazelStarlarkContext.java @@ -11,9 +11,11 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -package com.google.devtools.build.lib.packages; +package com.google.devtools.build.lib.cmdline; import com.google.common.base.Preconditions; +import com.google.devtools.build.lib.supplier.InterruptibleSupplier; +import javax.annotation.Nullable; import net.starlark.java.eval.EvalException; import net.starlark.java.eval.Starlark; import net.starlark.java.eval.StarlarkThread; @@ -94,12 +96,15 @@ public void storeInThread(StarlarkThread thread) { // TODO(b/236456122): Eliminate Phase, migrate analysisRuleLabel to a separate context class. private final Phase phase; + @Nullable private final InterruptibleSupplier mainRepoMappingSupplier; /** * @param phase the phase to which this Starlark thread belongs */ - public BazelStarlarkContext(Phase phase) { + public BazelStarlarkContext( + Phase phase, @Nullable InterruptibleSupplier mainRepoMappingSupplier) { this.phase = Preconditions.checkNotNull(phase); + this.mainRepoMappingSupplier = mainRepoMappingSupplier; } /** Returns the phase associated with this context. */ @@ -107,6 +112,15 @@ public Phase getPhase() { return phase; } + /** + * The repository mapping applicable to the main repository. This is purely meant to support + * {@link Label#debugPrint}. + */ + @Nullable + public RepositoryMapping getMainRepoMapping() throws InterruptedException { + return mainRepoMappingSupplier == null ? null : mainRepoMappingSupplier.get(); + } + @Override public String getContextForUncheckedException() { return phase.toString(); diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java index 962f468888e8ce..5a819c743bebc6 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java @@ -661,7 +661,13 @@ public void repr(Printer printer) { @Override public void debugPrint(Printer printer, StarlarkThread thread) { - printer.append(getDisplayForm(BazelModuleContext.ofInnermostBzlOrThrow(thread).mainRepoMapping())); + RepositoryMapping mainRepoMapping; + try { + mainRepoMapping = BazelStarlarkContext.fromOrFail(thread).getMainRepoMapping(); + } catch (EvalException | InterruptedException e) { + mainRepoMapping = null; + } + printer.append(getDisplayForm(mainRepoMapping)); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/packages/BuildGlobals.java b/src/main/java/com/google/devtools/build/lib/packages/BuildGlobals.java index 2ae17ab4924e3c..eda38a5761e8c1 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/BuildGlobals.java +++ b/src/main/java/com/google/devtools/build/lib/packages/BuildGlobals.java @@ -15,6 +15,7 @@ import com.google.devtools.build.docgen.annot.GlobalMethods; import com.google.devtools.build.docgen.annot.GlobalMethods.Environment; +import com.google.devtools.build.lib.cmdline.BazelStarlarkContext; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; import com.google.devtools.build.lib.packages.TargetDefinitionContext.NameConflictException; diff --git a/src/main/java/com/google/devtools/build/lib/packages/BzlInitThreadContext.java b/src/main/java/com/google/devtools/build/lib/packages/BzlInitThreadContext.java index 757f74278c442e..571a62c6eba233 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/BzlInitThreadContext.java +++ b/src/main/java/com/google/devtools/build/lib/packages/BzlInitThreadContext.java @@ -16,7 +16,9 @@ import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; +import com.google.devtools.build.lib.cmdline.BazelStarlarkContext; import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.cmdline.RepositoryMapping; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.errorprone.annotations.CanIgnoreReturnValue; import java.util.Optional; @@ -57,15 +59,16 @@ public final class BzlInitThreadContext extends BazelStarlarkContext * @param networkAllowlistForTests an allowlist for rule classes created by this thread * @param fragmentNameToClass a map from configuration fragment name to configuration fragment * class, such as "apple" to AppleConfiguration.class - * @param symbolGenerator symbol generator for this context + * @param mainRepoMapping the repository mapping of the main repository */ public BzlInitThreadContext( Label bzlFile, byte[] transitiveDigest, RepositoryName toolsRepository, Optional