diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BUILD index fc573aec7e7224..ce019c9f958ba9 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BUILD +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BUILD @@ -22,6 +22,7 @@ java_library( deps = [ "//src/main/java/com/google/devtools/build/lib/actions", "//src/main/java/com/google/devtools/build/lib/actions:artifacts", + "//src/main/java/com/google/devtools/build/lib/actions:commandline_item", "//src/main/java/com/google/devtools/build/lib/analysis:actions/custom_command_line", "//src/main/java/com/google/devtools/build/lib/analysis:actions/launcher_file_write_action", "//src/main/java/com/google/devtools/build/lib/analysis:actions/substitution", diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java index 55824a57150b19..0df95f2943b192 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java @@ -20,6 +20,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.CommandLineItem; import com.google.devtools.build.lib.actions.ParamFileInfo; import com.google.devtools.build.lib.actions.ParameterFile; import com.google.devtools.build.lib.analysis.AnalysisUtils; @@ -32,6 +33,7 @@ import com.google.devtools.build.lib.analysis.ShToolchain; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; +import com.google.devtools.build.lib.analysis.actions.CustomCommandLine.VectorArg; import com.google.devtools.build.lib.analysis.actions.LauncherFileWriteAction; import com.google.devtools.build.lib.analysis.actions.LauncherFileWriteAction.LaunchInfo; import com.google.devtools.build.lib.analysis.actions.SpawnAction; @@ -54,6 +56,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.function.Consumer; import java.util.function.Predicate; import javax.annotation.Nullable; @@ -342,6 +345,34 @@ private static String getZipRunfilesPath( return getZipRunfilesPath(PathFragment.create(path), workspaceName, legacyExternalRunfiles); } + private static final class ZipFilePathExpander implements CommandLineItem.MapFn { + private final Artifact executable; + private final Artifact zipFile; + private final PathFragment workspaceName; + private final boolean legacyExternalRunfiles; + + private ZipFilePathExpander( + Artifact executable, + Artifact zipFile, + PathFragment workspaceName, + boolean legacyExternalRunfiles) { + this.executable = executable; + this.zipFile = zipFile; + this.workspaceName = workspaceName; + this.legacyExternalRunfiles = legacyExternalRunfiles; + } + + @Override + public void expandToCommandLine(Artifact artifact, Consumer args) { + if (!artifact.equals(zipFile) && !artifact.equals(executable)) { + args.accept( + getZipRunfilesPath(artifact.getRunfilesPath(), workspaceName, legacyExternalRunfiles) + + "=" + + artifact.getExecPathString()); + } + } + } + private static void createPythonZipAction( RuleContext ruleContext, Artifact executable, @@ -367,12 +398,13 @@ private static void createPythonZipAction( // Read each runfile from execute path, add them into zip file at the right runfiles path. // Filter the executable file, cause we are building it. + argv.addAll( + VectorArg.of(runfilesSupport.getRunfilesArtifacts()) + .mapped( + new ZipFilePathExpander( + executable, zipFile, workspaceName, legacyExternalRunfiles))); for (Artifact artifact : runfilesSupport.getRunfilesArtifacts().toList()) { if (!artifact.equals(executable) && !artifact.equals(zipFile)) { - argv.addDynamicString( - getZipRunfilesPath(artifact.getRunfilesPath(), workspaceName, legacyExternalRunfiles) - + "=" - + artifact.getExecPathString()); inputsBuilder.add(artifact); } }