aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar tomlu <tomlu@google.com>2017-08-03 03:27:55 +0200
committerGravatar Dmitry Lomov <dslomov@google.com>2017-08-03 12:10:06 +0200
commit781b23a6e161d2d32e0a1d8fd699a7a0bda113a1 (patch)
tree723c807acacadfbeeb381bd58ee93d5a3abf5771
parenta08bb897569f6d8fd5e0459b67d26c3e9ac69a82 (diff)
Compute progress message lazily in spawn action.
Consumers using spawn action builder now have access to handy overloads that behind the scene do a lazy String.format. In 95% of cases progress messages are expressible as 0, 1, or 2 argument String.formats. This saves memory because the format string is constant and shared between all actions, and the captured subjects are usually live on the heap anyway (eg. labels). Skylark still computes its progress messages eagerly. If we want similar savings there I'd have to follow up with a Skylark proposal. PiperOrigin-RevId: 164068816
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java120
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AarGeneratorBuilder.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java181
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java17
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java41
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java54
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java24
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/LibraryRGeneratorActionBuilder.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/RobolectricResourceSymbolsActionBuilder.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java41
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendAction.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendArtifacts.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/extra/ExtraAction.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleAction.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java17
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/DeployArchiveBuilder.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java29
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java41
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileAction.java29
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/OneVersionCheckActionBuilder.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java27
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/SingleJarActionBuilder.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCompileAction.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilder.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/python/PythonUtils.java18
36 files changed, 430 insertions, 284 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
index 3b703af8d6..e578483eb2 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
@@ -55,9 +55,12 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.syntax.SkylarkList;
import com.google.devtools.build.lib.util.Fingerprint;
+import com.google.devtools.build.lib.util.LazyString;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.util.ShellEscaper;
import com.google.devtools.build.lib.vfs.PathFragment;
+import com.google.errorprone.annotations.FormatMethod;
+import com.google.errorprone.annotations.FormatString;
import com.google.protobuf.GeneratedMessage.GeneratedExtension;
import java.nio.charset.Charset;
import java.util.ArrayList;
@@ -93,7 +96,7 @@ public class SpawnAction extends AbstractAction implements ExecutionInfoSpecifie
private final boolean executeUnconditionally;
private final boolean isShellCommand;
- private final String progressMessage;
+ private final CharSequence progressMessage;
private final String mnemonic;
private final ResourceSet resourceSet;
@@ -118,7 +121,7 @@ public class SpawnAction extends AbstractAction implements ExecutionInfoSpecifie
* it may include the names of input and output files, but this is not necessary.
* @param isShellCommand Whether the command line represents a shell command with the given shell
* executable. This is used to give better error messages.
- * @param progressMessage the message printed during the progression of the build
+ * @param progressMessage the message printed during the progression of the build.
* @param mnemonic the mnemonic that is reported in the master log.
*/
public SpawnAction(
@@ -130,7 +133,7 @@ public class SpawnAction extends AbstractAction implements ExecutionInfoSpecifie
CommandLine argv,
boolean isShellCommand,
ActionEnvironment env,
- String progressMessage,
+ CharSequence progressMessage,
String mnemonic) {
this(
owner,
@@ -183,7 +186,7 @@ public class SpawnAction extends AbstractAction implements ExecutionInfoSpecifie
boolean isShellCommand,
ActionEnvironment env,
ImmutableMap<String, String> executionInfo,
- String progressMessage,
+ CharSequence progressMessage,
RunfilesSupplier runfilesSupplier,
String mnemonic,
boolean executeUnconditionally,
@@ -263,7 +266,7 @@ public class SpawnAction extends AbstractAction implements ExecutionInfoSpecifie
try {
internalExecute(actionExecutionContext);
} catch (ExecException e) {
- String failMessage = progressMessage;
+ final String failMessage;
if (isShellCommand()) {
// The possible reasons it could fail are: shell executable not found, shell
// exited non-zero, or shell died from signal. The first is impossible
@@ -274,6 +277,8 @@ public class SpawnAction extends AbstractAction implements ExecutionInfoSpecifie
// 0=shell executable, 1=shell command switch, 2=command
failMessage = "error executing shell command: " + "'"
+ truncate(Iterables.get(argv.arguments(), 2), 200) + "'";
+ } else {
+ failMessage = getRawProgressMessage();
}
throw e.toActionExecutionException(
failMessage, actionExecutionContext.getVerboseFailures(), this);
@@ -364,7 +369,7 @@ public class SpawnAction extends AbstractAction implements ExecutionInfoSpecifie
@Override
protected String getRawProgressMessage() {
if (progressMessage != null) {
- return progressMessage;
+ return progressMessage.toString();
}
return super.getRawProgressMessage();
}
@@ -514,7 +519,7 @@ public class SpawnAction extends AbstractAction implements ExecutionInfoSpecifie
private final IterablesChain.Builder<String> argumentsBuilder = IterablesChain.builder();
private CommandLine commandLine;
- private String progressMessage;
+ private CharSequence progressMessage;
private ParamFileInfo paramFileInfo = null;
private String mnemonic = "Unknown";
protected ExtraActionInfoSupplier<?> extraActionInfoSupplier = null;
@@ -691,7 +696,7 @@ public class SpawnAction extends AbstractAction implements ExecutionInfoSpecifie
boolean isShellCommand,
ActionEnvironment env,
ImmutableMap<String, String> executionInfo,
- String progressMessage,
+ CharSequence progressMessage,
RunfilesSupplier runfilesSupplier,
String mnemonic) {
return new SpawnAction(
@@ -1113,11 +1118,110 @@ public class SpawnAction extends AbstractAction implements ExecutionInfoSpecifie
return this;
}
+ /**
+ * Sets the progress message.
+ *
+ * <p>If you are formatting the string in any way, prefer one of the overloads that do the
+ * formatting lazily. This helps save memory by delaying the construction of the progress
+ * message string.
+ */
public Builder setProgressMessage(String progressMessage) {
this.progressMessage = progressMessage;
return this;
}
+ /**
+ * Sets the progress message. The string is lazily evaluated.
+ *
+ * @param progressMessage The message to display
+ * @param subject Passed to {@link String#format}
+ */
+ @FormatMethod
+ public Builder setProgressMessage(@FormatString String progressMessage, Object subject) {
+ return setProgressMessage(
+ new LazyString() {
+ @Override
+ public String toString() {
+ return String.format(progressMessage, subject);
+ }
+ });
+ }
+
+ /**
+ * Sets the progress message. The string is lazily evaluated.
+ *
+ * @param progressMessage The message to display
+ * @param subject0 Passed to {@link String#format}
+ * @param subject1 Passed to {@link String#format}
+ */
+ @FormatMethod
+ public Builder setProgressMessage(
+ @FormatString String progressMessage, Object subject0, Object subject1) {
+ return setProgressMessage(
+ new LazyString() {
+ @Override
+ public String toString() {
+ return String.format(progressMessage, subject0, subject1);
+ }
+ });
+ }
+
+ /**
+ * Sets the progress message. The string is lazily evaluated.
+ *
+ * @param progressMessage The message to display
+ * @param subject0 Passed to {@link String#format}
+ * @param subject1 Passed to {@link String#format}
+ * @param subject2 Passed to {@link String#format}
+ */
+ @FormatMethod
+ public Builder setProgressMessage(
+ @FormatString String progressMessage, Object subject0, Object subject1, Object subject2) {
+ return setProgressMessage(
+ new LazyString() {
+ @Override
+ public String toString() {
+ return String.format(progressMessage, subject0, subject1, subject2);
+ }
+ });
+ }
+
+ /**
+ * Sets the progress message. The string is lazily evaluated.
+ *
+ * @param progressMessage The message to display
+ * @param subject0 Passed to {@link String#format}
+ * @param subject1 Passed to {@link String#format}
+ * @param subject2 Passed to {@link String#format}
+ * @param subject3 Passed to {@link String#format}
+ */
+ @FormatMethod
+ public Builder setProgressMessage(
+ @FormatString String progressMessage,
+ Object subject0,
+ Object subject1,
+ Object subject2,
+ Object subject3) {
+ return setProgressMessage(
+ new LazyString() {
+ @Override
+ public String toString() {
+ return String.format(progressMessage, subject0, subject1, subject2, subject3);
+ }
+ });
+ }
+
+ /**
+ * Sets a lazily computed progress message.
+ *
+ * <p>When possible, prefer use of one of the overloads that use {@link String#format}. If you
+ * do use this overload, take care not to capture anything expensive.
+ */
+ public Builder setProgressMessage(LazyString progressMessage) {
+ this.progressMessage = progressMessage;
+ return this;
+ }
+
public Builder setMnemonic(String mnemonic) {
Preconditions.checkArgument(
!mnemonic.isEmpty() && CharMatcher.javaLetterOrDigit().matchesAllOf(mnemonic),
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarGeneratorBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarGeneratorBuilder.java
index c311d82f0f..7733909840 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AarGeneratorBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarGeneratorBuilder.java
@@ -132,7 +132,7 @@ public class AarGeneratorBuilder {
.setCommandLine(CommandLine.of(args))
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
- .setProgressMessage("Building AAR package for " + ruleContext.getLabel())
+ .setProgressMessage("Building AAR package for %s", ruleContext.getLabel())
.setMnemonic("AARGenerator")
.build(context));
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
index 202f6507e4..c544889a8e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
@@ -182,7 +182,7 @@ public class AarImport implements RuleConfiguredTargetFactory {
return new SpawnAction.Builder()
.setExecutable(ruleContext.getExecutablePrerequisite("$zipper", Mode.HOST))
.setMnemonic("AarFileExtractor")
- .setProgressMessage("Extracting " + filename + " from " + aar.getFilename())
+ .setProgressMessage("Extracting %s from %s", filename, aar.getFilename())
.addArgument("x")
.addInputArgument(aar)
.addArgument("-d")
@@ -212,7 +212,7 @@ public class AarImport implements RuleConfiguredTargetFactory {
.setExecutable(
ruleContext.getExecutablePrerequisite("$aar_embedded_jars_extractor", Mode.HOST))
.setMnemonic("AarEmbeddedJarsExtractor")
- .setProgressMessage("Extracting classes.jar and libs/*.jar from " + aar.getFilename())
+ .setProgressMessage("Extracting classes.jar and libs/*.jar from %s", aar.getFilename())
.addArgument("--input_aar")
.addInputArgument(aar)
.addArgument("--output_dir")
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
index 48524e84dc..e4b443df0b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java
@@ -608,15 +608,17 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
Artifact incrementalDexManifest =
ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.DEX_MANIFEST);
- ruleContext.registerAction(new SpawnAction.Builder()
- .setMnemonic("AndroidDexManifest")
- .setProgressMessage("Generating incremental installation manifest for "
- + ruleContext.getLabel())
- .setExecutable(
- ruleContext.getExecutablePrerequisite("$build_incremental_dexmanifest", Mode.HOST))
- .addOutputArgument(incrementalDexManifest)
- .addInputArguments(dexingOutput.shardDexZips)
- .useParameterFile(ParameterFileType.UNQUOTED).build(ruleContext));
+ ruleContext.registerAction(
+ new SpawnAction.Builder()
+ .setMnemonic("AndroidDexManifest")
+ .setProgressMessage(
+ "Generating incremental installation manifest for %s", ruleContext.getLabel())
+ .setExecutable(
+ ruleContext.getExecutablePrerequisite("$build_incremental_dexmanifest", Mode.HOST))
+ .addOutputArgument(incrementalDexManifest)
+ .addInputArguments(dexingOutput.shardDexZips)
+ .useParameterFile(ParameterFileType.UNQUOTED)
+ .build(ruleContext));
Artifact stubData = ruleContext.getImplicitOutputArtifact(
AndroidRuleClasses.MOBILE_INSTALL_STUB_APPLICATION_DATA);
@@ -857,24 +859,25 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
Artifact marker, Artifact argsArtifact, Artifact splitMainApk, NestedSet<Artifact> splitApks,
Artifact stubDataFile) {
FilesToRunProvider adb = AndroidSdkProvider.fromRuleContext(ruleContext).getAdb();
- SpawnAction.Builder builder = new SpawnAction.Builder()
- .setExecutable(ruleContext.getExecutablePrerequisite("$incremental_install", Mode.HOST))
- .addTool(adb)
- .executeUnconditionally()
- .setMnemonic("AndroidInstall")
- .setProgressMessage("Installing " + ruleContext.getLabel() + " using split apks")
- .setExecutionInfo(ImmutableMap.of("local", ""))
- .addArgument("--output_marker")
- .addOutputArgument(marker)
- .addArgument("--stub_datafile")
- .addInputArgument(stubDataFile)
- .addArgument("--adb")
- .addArgument(adb.getExecutable().getExecPathString())
- .addTool(adb)
- .addArgument("--flagfile")
- .addInputArgument(argsArtifact)
- .addArgument("--split_main_apk")
- .addInputArgument(splitMainApk);
+ SpawnAction.Builder builder =
+ new SpawnAction.Builder()
+ .setExecutable(ruleContext.getExecutablePrerequisite("$incremental_install", Mode.HOST))
+ .addTool(adb)
+ .executeUnconditionally()
+ .setMnemonic("AndroidInstall")
+ .setProgressMessage("Installing %s using split apks", ruleContext.getLabel())
+ .setExecutionInfo(ImmutableMap.of("local", ""))
+ .addArgument("--output_marker")
+ .addOutputArgument(marker)
+ .addArgument("--stub_datafile")
+ .addInputArgument(stubDataFile)
+ .addArgument("--adb")
+ .addArgument(adb.getExecutable().getExecPathString())
+ .addTool(adb)
+ .addArgument("--flagfile")
+ .addInputArgument(argsArtifact)
+ .addArgument("--split_main_apk")
+ .addInputArgument(splitMainApk);
for (Artifact splitApk : splitApks) {
builder
@@ -890,28 +893,30 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
Artifact dexmanifest, Artifact resourceApk, Artifact apk, NativeLibs nativeLibs,
Artifact stubDataFile) {
FilesToRunProvider adb = AndroidSdkProvider.fromRuleContext(ruleContext).getAdb();
- SpawnAction.Builder builder = new SpawnAction.Builder()
- .setExecutable(ruleContext.getExecutablePrerequisite("$incremental_install", Mode.HOST))
- // We cannot know if the user connected a new device, uninstalled the app from the device
- // or did anything strange to it, so we always run this action.
- .executeUnconditionally()
- .setMnemonic("AndroidInstall")
- .setProgressMessage(
- "Installing " + ruleContext.getLabel() + (incremental ? " incrementally" : ""))
- .setExecutionInfo(ImmutableMap.of("local", ""))
- .addArgument("--output_marker")
- .addOutputArgument(marker)
- .addArgument("--dexmanifest")
- .addInputArgument(dexmanifest)
- .addArgument("--resource_apk")
- .addInputArgument(resourceApk)
- .addArgument("--stub_datafile")
- .addInputArgument(stubDataFile)
- .addArgument("--adb")
- .addArgument(adb.getExecutable().getExecPathString())
- .addTool(adb)
- .addArgument("--flagfile")
- .addInputArgument(argsArtifact);
+ SpawnAction.Builder builder =
+ new SpawnAction.Builder()
+ .setExecutable(ruleContext.getExecutablePrerequisite("$incremental_install", Mode.HOST))
+ // We cannot know if the user connected a new device, uninstalled the app from the
+ // device
+ // or did anything strange to it, so we always run this action.
+ .executeUnconditionally()
+ .setMnemonic("AndroidInstall")
+ .setProgressMessage(
+ "Installing %s%s", ruleContext.getLabel(), (incremental ? " incrementally" : ""))
+ .setExecutionInfo(ImmutableMap.of("local", ""))
+ .addArgument("--output_marker")
+ .addOutputArgument(marker)
+ .addArgument("--dexmanifest")
+ .addInputArgument(dexmanifest)
+ .addArgument("--resource_apk")
+ .addInputArgument(resourceApk)
+ .addArgument("--stub_datafile")
+ .addInputArgument(stubDataFile)
+ .addArgument("--adb")
+ .addArgument(adb.getExecutable().getExecPathString())
+ .addTool(adb)
+ .addArgument("--flagfile")
+ .addInputArgument(argsArtifact);
if (!incremental) {
builder
@@ -1334,14 +1339,15 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
.addBeforeEachExecPath("--input_zip", shardDexes)
.addExecPath("--output_zip", classesDex)
.build();
- ruleContext.registerAction(new SpawnAction.Builder()
- .setMnemonic("MergeDexZips")
- .setProgressMessage("Merging dex shards for " + ruleContext.getLabel())
- .setExecutable(ruleContext.getExecutablePrerequisite("$merge_dexzips", Mode.HOST))
- .addInputs(shardDexes)
- .addOutput(classesDex)
- .setCommandLine(mergeCommandLine)
- .build(ruleContext));
+ ruleContext.registerAction(
+ new SpawnAction.Builder()
+ .setMnemonic("MergeDexZips")
+ .setProgressMessage("Merging dex shards for %s", ruleContext.getLabel())
+ .setExecutable(ruleContext.getExecutablePrerequisite("$merge_dexzips", Mode.HOST))
+ .addInputs(shardDexes)
+ .addOutput(classesDex)
+ .setCommandLine(mergeCommandLine)
+ .build(ruleContext));
if (incrementalDexing.contains(AndroidBinaryType.MULTIDEX_SHARDED)) {
// Using the deploy jar for java resources gives better "bazel mobile-install" performance
// with incremental dexing b/c bazel can create the "incremental" and "split resource"
@@ -1426,16 +1432,17 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
Artifact classesDex,
@Nullable Artifact mainDexList,
Collection<String> dexopts) {
- SpawnAction.Builder dexmerger = new SpawnAction.Builder()
- .setExecutable(ruleContext.getExecutablePrerequisite("$dexmerger", Mode.HOST))
- .addArgument("--input")
- .addInputArgument(inputJar)
- .addArgument("--output")
- .addOutputArgument(classesDex)
- .addArguments(DexArchiveAspect.mergerDexopts(ruleContext, dexopts))
- .addArgument("--multidex=" + multidexStrategy)
- .setMnemonic("DexMerger")
- .setProgressMessage("Assembling dex files into " + classesDex.prettyPrint());
+ SpawnAction.Builder dexmerger =
+ new SpawnAction.Builder()
+ .setExecutable(ruleContext.getExecutablePrerequisite("$dexmerger", Mode.HOST))
+ .addArgument("--input")
+ .addInputArgument(inputJar)
+ .addArgument("--output")
+ .addOutputArgument(classesDex)
+ .addArguments(DexArchiveAspect.mergerDexopts(ruleContext, dexopts))
+ .addArgument("--multidex=" + multidexStrategy)
+ .setMnemonic("DexMerger")
+ .setProgressMessage("Assembling dex files into %s", classesDex.prettyPrint());
if (mainDexList != null) {
dexmerger.addArgument("--main-dex-list").addInputArgument(mainDexList);
}
@@ -1543,12 +1550,13 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
Artifact javaResourceJar =
ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.JAVA_RESOURCES_JAR);
- SpawnAction.Builder shardAction = new SpawnAction.Builder()
- .setMnemonic("ShardClassesToDex")
- .setProgressMessage("Sharding classes for dexing for " + ruleContext.getLabel())
- .setExecutable(ruleContext.getExecutablePrerequisite("$shuffle_jars", Mode.HOST))
- .addOutputs(shards)
- .addOutput(javaResourceJar);
+ SpawnAction.Builder shardAction =
+ new SpawnAction.Builder()
+ .setMnemonic("ShardClassesToDex")
+ .setProgressMessage("Sharding classes for dexing for %s", ruleContext.getLabel())
+ .setExecutable(ruleContext.getExecutablePrerequisite("$shuffle_jars", Mode.HOST))
+ .addOutputs(shards)
+ .addOutput(javaResourceJar);
CustomCommandLine.Builder shardCommandLine = CustomCommandLine.builder()
.addBeforeEachExecPath("--output_jar", shards)
@@ -1650,7 +1658,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
.addOutputArgument(outputZip)
.addArgument("--include_prefixes")
.addArgument("classes")
- .setProgressMessage("Trimming " + inputZip.getExecPath().getBaseName())
+ .setProgressMessage("Trimming %s", inputZip.getExecPath().getBaseName())
.setMnemonic("TrimDexZip")
.build(ruleContext));
}
@@ -1730,18 +1738,19 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
.getManifest();
Artifact splitResources = getDxArtifact(ruleContext, "split_" + splitName + ".ap_");
AndroidSdkProvider sdk = AndroidSdkProvider.fromRuleContext(ruleContext);
- ruleContext.registerAction(new SpawnAction.Builder()
- .setExecutable(sdk.getAapt())
- .setMnemonic("AaptSplitResourceApk")
- .setProgressMessage("Generating resource apk for split " + splitName)
- .addArgument("package")
- .addArgument("-F")
- .addOutputArgument(splitResources)
- .addArgument("-M")
- .addInputArgument(splitManifest)
- .addArgument("-I")
- .addInputArgument(sdk.getAndroidJar())
- .build(ruleContext));
+ ruleContext.registerAction(
+ new SpawnAction.Builder()
+ .setExecutable(sdk.getAapt())
+ .setMnemonic("AaptSplitResourceApk")
+ .setProgressMessage("Generating resource apk for split %s", splitName)
+ .addArgument("package")
+ .addArgument("-F")
+ .addOutputArgument(splitResources)
+ .addArgument("-M")
+ .addInputArgument(splitManifest)
+ .addArgument("-I")
+ .addInputArgument(sdk.getAndroidJar())
+ .build(ruleContext));
return splitResources;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
index 85788a826f..96d6acea15 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
@@ -218,14 +218,15 @@ public class AndroidCommon {
args.add("--output=" + classesDex.getExecPathString());
args.add(jarToDex.getExecPathString());
- SpawnAction.Builder builder = new SpawnAction.Builder()
- .setExecutable(AndroidSdkProvider.fromRuleContext(ruleContext).getDx())
- .addInput(jarToDex)
- .addOutput(classesDex)
- .addArguments(args)
- .setProgressMessage("Converting " + jarToDex.getExecPathString() + " to dex format")
- .setMnemonic("AndroidDexer")
- .setResources(ResourceSet.createWithRamCpuIo(4096.0, 5.0, 0.0));
+ SpawnAction.Builder builder =
+ new SpawnAction.Builder()
+ .setExecutable(AndroidSdkProvider.fromRuleContext(ruleContext).getDx())
+ .addInput(jarToDex)
+ .addOutput(classesDex)
+ .addArguments(args)
+ .setProgressMessage("Converting %s to dex format", jarToDex.getExecPathString())
+ .setMnemonic("AndroidDexer")
+ .setResources(ResourceSet.createWithRamCpuIo(4096.0, 5.0, 0.0));
if (mainDexList != null) {
builder.addInput(mainDexList);
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java
index 680931fa68..b2de617bdf 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlHelper.java
@@ -325,25 +325,28 @@ public class AndroidIdlHelper {
.getExecPath()
.getRelative(ruleContext.getUniqueDirectory("_idl"))
.getRelative(basename + "_temp");
- ruleContext.registerAction(new SpawnAction.Builder()
- .addInput(manifestProtoOutput)
- .addInput(classJar)
- .addInputs(generatedIdlJavaFiles)
- .addOutput(idlClassJar)
- .addOutput(idlSourceJar)
- .setExecutable(ruleContext.getExecutablePrerequisite("$idlclass", Mode.HOST))
- .setCommandLine(CustomCommandLine.builder()
- .addExecPath("--manifest_proto", manifestProtoOutput)
- .addExecPath("--class_jar", classJar)
- .addExecPath("--output_class_jar", idlClassJar)
- .addExecPath("--output_source_jar", idlSourceJar)
- .add("--temp_dir").addPath(idlTempDir)
- .addExecPaths(generatedIdlJavaFiles)
- .build())
- .useParameterFile(ParameterFileType.SHELL_QUOTED)
- .setProgressMessage("Building idl jars " + idlClassJar.prettyPrint())
- .setMnemonic("AndroidIdlJars")
- .build(ruleContext));
+ ruleContext.registerAction(
+ new SpawnAction.Builder()
+ .addInput(manifestProtoOutput)
+ .addInput(classJar)
+ .addInputs(generatedIdlJavaFiles)
+ .addOutput(idlClassJar)
+ .addOutput(idlSourceJar)
+ .setExecutable(ruleContext.getExecutablePrerequisite("$idlclass", Mode.HOST))
+ .setCommandLine(
+ CustomCommandLine.builder()
+ .addExecPath("--manifest_proto", manifestProtoOutput)
+ .addExecPath("--class_jar", classJar)
+ .addExecPath("--output_class_jar", idlClassJar)
+ .addExecPath("--output_source_jar", idlSourceJar)
+ .add("--temp_dir")
+ .addPath(idlTempDir)
+ .addExecPaths(generatedIdlJavaFiles)
+ .build())
+ .useParameterFile(ParameterFileType.SHELL_QUOTED)
+ .setProgressMessage("Building idl jars %s", idlClassJar.prettyPrint())
+ .setMnemonic("AndroidIdlJars")
+ .build(ruleContext));
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java
index 5b63f24af6..d5ba575068 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceMergingActionBuilder.java
@@ -191,7 +191,7 @@ public class AndroidResourceMergingActionBuilder {
.setCommandLine(builder.build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
- .setProgressMessage("Merging Android resources for " + ruleContext.getLabel())
+ .setProgressMessage("Merging Android resources for %s", ruleContext.getLabel())
.setMnemonic("AndroidResourceMerger")
.build(context));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java
index 3861856655..2ff46cd9d7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceParsingActionBuilder.java
@@ -150,7 +150,7 @@ public class AndroidResourceParsingActionBuilder {
.setCommandLine(builder.build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
- .setProgressMessage("Parsing Android resources for " + ruleContext.getLabel())
+ .setProgressMessage("Parsing Android resources for %s", ruleContext.getLabel())
.setMnemonic("AndroidResourceParser")
.build(context));
@@ -185,7 +185,7 @@ public class AndroidResourceParsingActionBuilder {
.setCommandLine(flatFileBuilder.build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
- .setProgressMessage("Compiling Android resources for " + ruleContext.getLabel())
+ .setProgressMessage("Compiling Android resources for %s", ruleContext.getLabel())
.setMnemonic("AndroidResourceCompiler")
.build(context));
return resourceContainer
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java
index e91c94d26a..0b00e35201 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourceValidatorActionBuilder.java
@@ -193,7 +193,7 @@ public class AndroidResourceValidatorActionBuilder {
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
.setProgressMessage(
- "Linking static android resource library for " + ruleContext.getLabel())
+ "Linking static android resource library for %s", ruleContext.getLabel())
.setMnemonic("AndroidResourceLink")
.build(context));
@@ -262,7 +262,7 @@ public class AndroidResourceValidatorActionBuilder {
.setCommandLine(builder.build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
- .setProgressMessage("Validating Android resources for " + ruleContext.getLabel())
+ .setProgressMessage("Validating Android resources for %s", ruleContext.getLabel())
.setMnemonic("AndroidResourceValidator")
.build(context));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java
index 5113ff5cb9..fa12915c6a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesProcessorBuilder.java
@@ -296,7 +296,7 @@ public class AndroidResourcesProcessorBuilder {
.setCommandLine(builder.build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
- .setProgressMessage("Processing Android resources for " + ruleContext.getLabel())
+ .setProgressMessage("Processing Android resources for %s", ruleContext.getLabel())
.setMnemonic("AndroidAapt2")
.build(context));
@@ -341,7 +341,7 @@ public class AndroidResourcesProcessorBuilder {
.setCommandLine(builder.build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
- .setProgressMessage("Processing Android resources for " + ruleContext.getLabel())
+ .setProgressMessage("Processing Android resources for %s", ruleContext.getLabel())
.setMnemonic("AaptPackage")
.build(context));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java
index 038974b993..078f558f8e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java
@@ -304,7 +304,7 @@ public class ApkActionsBuilder {
new SpawnAction.Builder()
.setExecutable(resourceExtractor)
.setMnemonic("ResourceExtractor")
- .setProgressMessage("Extracting Java resources from deploy jar for " + apkName)
+ .setProgressMessage("Extracting Java resources from deploy jar for %s", apkName)
.addInputArgument(javaResourceZip)
.addOutputArgument(extractedJavaResourceZip)
.build(ruleContext));
@@ -365,16 +365,17 @@ public class ApkActionsBuilder {
/** Uses the zipalign tool to align the zip boundaries for uncompressed resources by 4 bytes. */
private void zipalignApk(RuleContext ruleContext, Artifact inputApk, Artifact zipAlignedApk) {
- ruleContext.registerAction(new SpawnAction.Builder()
- .addInput(inputApk)
- .addOutput(zipAlignedApk)
- .setExecutable(AndroidSdkProvider.fromRuleContext(ruleContext).getZipalign())
- .addArgument("4")
- .addInputArgument(inputApk)
- .addOutputArgument(zipAlignedApk)
- .setProgressMessage("Zipaligning " + apkName)
- .setMnemonic("AndroidZipAlign")
- .build(ruleContext));
+ ruleContext.registerAction(
+ new SpawnAction.Builder()
+ .addInput(inputApk)
+ .addOutput(zipAlignedApk)
+ .setExecutable(AndroidSdkProvider.fromRuleContext(ruleContext).getZipalign())
+ .addArgument("4")
+ .addInputArgument(inputApk)
+ .addOutputArgument(zipAlignedApk)
+ .setProgressMessage("Zipaligning %s", apkName)
+ .setMnemonic("AndroidZipAlign")
+ .build(ruleContext));
}
/**
@@ -386,21 +387,22 @@ public class ApkActionsBuilder {
RuleContext ruleContext, Artifact unsignedApk, Artifact signedAndZipalignedApk) {
ApkSigningMethod signingMethod =
ruleContext.getFragment(AndroidConfiguration.class).getApkSigningMethod();
- ruleContext.registerAction(new SpawnAction.Builder()
- .setExecutable(AndroidSdkProvider.fromRuleContext(ruleContext).getApkSigner())
- .setProgressMessage("Signing " + apkName)
- .setMnemonic("ApkSignerTool")
- .addArgument("sign")
- .addArgument("--ks")
- .addInputArgument(signingKey)
- .addArguments("--ks-pass", "pass:android")
- .addArguments("--v1-signing-enabled", Boolean.toString(signingMethod.signV1()))
- .addArguments("--v1-signer-name", "CERT")
- .addArguments("--v2-signing-enabled", Boolean.toString(signingMethod.signV2()))
- .addArgument("--out")
- .addOutputArgument(signedAndZipalignedApk)
- .addInputArgument(unsignedApk)
- .build(ruleContext));
+ ruleContext.registerAction(
+ new SpawnAction.Builder()
+ .setExecutable(AndroidSdkProvider.fromRuleContext(ruleContext).getApkSigner())
+ .setProgressMessage("Signing %s", apkName)
+ .setMnemonic("ApkSignerTool")
+ .addArgument("sign")
+ .addArgument("--ks")
+ .addInputArgument(signingKey)
+ .addArguments("--ks-pass", "pass:android")
+ .addArguments("--v1-signing-enabled", Boolean.toString(signingMethod.signV1()))
+ .addArguments("--v1-signer-name", "CERT")
+ .addArguments("--v2-signing-enabled", Boolean.toString(signingMethod.signV2()))
+ .addArgument("--out")
+ .addOutputArgument(signedAndZipalignedApk)
+ .addInputArgument(unsignedApk)
+ .build(ruleContext));
}
// Adds the appropriate SpawnAction options depending on if SingleJar is a jar or not.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
index ecc18479d7..a40afd09dc 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java
@@ -64,17 +64,19 @@ public final class ApplicationManifest {
// explicitly designated as manifests on the command line
Artifact result = AndroidBinary.getDxArtifact(
ruleContext, "split_" + splitName + "/AndroidManifest.xml");
- SpawnAction.Builder builder = new SpawnAction.Builder()
- .setExecutable(ruleContext.getExecutablePrerequisite("$build_split_manifest", Mode.HOST))
- .setProgressMessage("Creating manifest for split " + splitName)
- .setMnemonic("AndroidBuildSplitManifest")
- .addArgument("--main_manifest")
- .addInputArgument(manifest)
- .addArgument("--split_manifest")
- .addOutputArgument(result)
- .addArgument("--split")
- .addArgument(splitName)
- .addArgument(hasCode ? "--hascode" : "--nohascode");
+ SpawnAction.Builder builder =
+ new SpawnAction.Builder()
+ .setExecutable(
+ ruleContext.getExecutablePrerequisite("$build_split_manifest", Mode.HOST))
+ .setProgressMessage("Creating manifest for split %s", splitName)
+ .setMnemonic("AndroidBuildSplitManifest")
+ .addArgument("--main_manifest")
+ .addInputArgument(manifest)
+ .addArgument("--split_manifest")
+ .addOutputArgument(result)
+ .addArgument("--split")
+ .addArgument(splitName)
+ .addArgument(hasCode ? "--hascode" : "--nohascode");
String overridePackage = manifestValues.get("applicationId");
if (overridePackage != null) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
index 05ed23d909..afad30bafc 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
@@ -397,7 +397,7 @@ public final class DexArchiveAspect extends NativeAspectClass implements Configu
.addTransitiveInputs(classpath)
.addOutput(result)
.setMnemonic("Desugar")
- .setProgressMessage("Desugaring " + jar.prettyPrint() + " for Android")
+ .setProgressMessage("Desugaring %s for Android", jar.prettyPrint())
.build(ruleContext));
return result;
}
@@ -448,7 +448,7 @@ public final class DexArchiveAspect extends NativeAspectClass implements Configu
.setMnemonic("DexBuilder")
.setExecutionInfo(ExecutionRequirements.WORKER_MODE_ENABLED)
.setProgressMessage(
- "Dexing " + jar.prettyPrint() + " with applicable dexopts " + incrementalDexopts);
+ "Dexing %s with applicable dexopts %s", jar.prettyPrint(), incrementalDexopts);
ruleContext.registerAction(dexbuilder.build(ruleContext));
return dexArchive;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/LibraryRGeneratorActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/LibraryRGeneratorActionBuilder.java
index 9dc43aa64a..f0862629d4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/LibraryRGeneratorActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/LibraryRGeneratorActionBuilder.java
@@ -92,7 +92,7 @@ public class LibraryRGeneratorActionBuilder {
.useParameterFile(ParameterFileType.UNQUOTED)
.setCommandLine(builder.build())
.setExecutable(executable)
- .setProgressMessage("Generating Library R Classes: " + ruleContext.getLabel())
+ .setProgressMessage("Generating Library R Classes: %s", ruleContext.getLabel())
.setMnemonic("LibraryRClassGenerator")
.build(ruleContext));
return resourceContainer.toBuilder().setJavaClassJar(rJavaClassJar).build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java
index 00c1a866e3..d9846b3c53 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ManifestMergerActionBuilder.java
@@ -137,7 +137,7 @@ public class ManifestMergerActionBuilder {
.setCommandLine(builder.build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
- .setProgressMessage("Merging manifest for " + ruleContext.getLabel())
+ .setProgressMessage("Merging manifest for %s", ruleContext.getLabel())
.setMnemonic("ManifestMerger")
.build(context));
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java
index 4b9ed82e96..49ef64770c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/RClassGeneratorActionBuilder.java
@@ -124,7 +124,7 @@ public class RClassGeneratorActionBuilder {
.setCommandLine(builder.build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
- .setProgressMessage("Generating R Classes: " + ruleContext.getLabel())
+ .setProgressMessage("Generating R Classes: %s", ruleContext.getLabel())
.setMnemonic("RClassGenerator")
.build(ruleContext));
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java
index e39b1e98a2..4fc305f8d1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceShrinkerActionBuilder.java
@@ -231,7 +231,7 @@ public class ResourceShrinkerActionBuilder {
.setCommandLine(commandLine.build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
- .setProgressMessage("Shrinking resources for " + ruleContext.getLabel())
+ .setProgressMessage("Shrinking resources for %s", ruleContext.getLabel())
.setMnemonic("ResourceShrinker")
.build(ruleContext));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/RobolectricResourceSymbolsActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/RobolectricResourceSymbolsActionBuilder.java
index 20fe4104fd..203d61e000 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/RobolectricResourceSymbolsActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/RobolectricResourceSymbolsActionBuilder.java
@@ -105,7 +105,7 @@ public class RobolectricResourceSymbolsActionBuilder {
.setCommandLine(builder.build())
.setExecutable(
ruleContext.getExecutablePrerequisite("$android_resources_busybox", Mode.HOST))
- .setProgressMessage("Generating R classes for " + ruleContext.getLabel())
+ .setProgressMessage("Generating R classes for %s", ruleContext.getLabel())
.setMnemonic("GenerateRobolectricRClasses")
.build(ruleContext));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
index ef1879c8c2..4908ad85eb 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java
@@ -149,7 +149,7 @@ public class CcToolchain implements RuleConfiguredTargetFactory {
.addArguments(
"-d", rawProfileArtifact.getExecPath().getParentDirectory().getSafePathString())
.setProgressMessage(
- "LLVMUnzipProfileAction: Generating " + rawProfileArtifact.prettyPrint())
+ "LLVMUnzipProfileAction: Generating %s", rawProfileArtifact.prettyPrint())
.setMnemonic("LLVMUnzipProfileAction")
.build(ruleContext));
} else {
@@ -182,7 +182,7 @@ public class CcToolchain implements RuleConfiguredTargetFactory {
.setExecutable(cppConfiguration.getLLVMProfDataExecutable())
.addArguments("merge", "-o", profileArtifact.getExecPathString())
.addArgument(rawProfileArtifact.getExecPathString())
- .setProgressMessage("LLVMProfDataAction: Generating " + profileArtifact.prettyPrint())
+ .setProgressMessage("LLVMProfDataAction: Generating %s", profileArtifact.prettyPrint())
.setMnemonic("LLVMProfDataAction")
.build(ruleContext));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
index f6d8e98893..47d0964d2b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
@@ -606,26 +606,27 @@ public class CppHelper {
*/
public static void createStripAction(RuleContext context, CcToolchainProvider toolchain,
CppConfiguration cppConfiguration, Artifact input, Artifact output) {
- context.registerAction(new SpawnAction.Builder()
- .addInput(input)
- .addTransitiveInputs(toolchain.getStrip())
- .addOutput(output)
- .useDefaultShellEnvironment()
- .setExecutable(cppConfiguration.getStripExecutable())
- .addArguments("-S", "-p", "-o", output.getExecPathString())
- .addArguments("-R", ".gnu.switches.text.quote_paths")
- .addArguments("-R", ".gnu.switches.text.bracket_paths")
- .addArguments("-R", ".gnu.switches.text.system_paths")
- .addArguments("-R", ".gnu.switches.text.cpp_defines")
- .addArguments("-R", ".gnu.switches.text.cpp_includes")
- .addArguments("-R", ".gnu.switches.text.cl_args")
- .addArguments("-R", ".gnu.switches.text.lipo_info")
- .addArguments("-R", ".gnu.switches.text.annotation")
- .addArguments(cppConfiguration.getStripOpts())
- .addArgument(input.getExecPathString())
- .setProgressMessage("Stripping " + output.prettyPrint() + " for " + context.getLabel())
- .setMnemonic("CcStrip")
- .build(context));
+ context.registerAction(
+ new SpawnAction.Builder()
+ .addInput(input)
+ .addTransitiveInputs(toolchain.getStrip())
+ .addOutput(output)
+ .useDefaultShellEnvironment()
+ .setExecutable(cppConfiguration.getStripExecutable())
+ .addArguments("-S", "-p", "-o", output.getExecPathString())
+ .addArguments("-R", ".gnu.switches.text.quote_paths")
+ .addArguments("-R", ".gnu.switches.text.bracket_paths")
+ .addArguments("-R", ".gnu.switches.text.system_paths")
+ .addArguments("-R", ".gnu.switches.text.cpp_defines")
+ .addArguments("-R", ".gnu.switches.text.cpp_includes")
+ .addArguments("-R", ".gnu.switches.text.cl_args")
+ .addArguments("-R", ".gnu.switches.text.lipo_info")
+ .addArguments("-R", ".gnu.switches.text.annotation")
+ .addArguments(cppConfiguration.getStripOpts())
+ .addArgument(input.getExecPathString())
+ .setProgressMessage("Stripping %s for %s", output.prettyPrint(), context.getLabel())
+ .setMnemonic("CcStrip")
+ .build(context));
}
public static void maybeAddStaticLinkMarkerProvider(RuleConfiguredTargetBuilder builder,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendAction.java
index 8b02e5ea3d..d305317c6b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendAction.java
@@ -69,7 +69,7 @@ public final class LtoBackendAction extends SpawnAction {
boolean isShellCommand,
ActionEnvironment env,
Map<String, String> executionInfo,
- String progressMessage,
+ CharSequence progressMessage,
RunfilesSupplier runfilesSupplier,
String mnemonic) {
super(
@@ -211,7 +211,7 @@ public final class LtoBackendAction extends SpawnAction {
boolean isShellCommand,
ActionEnvironment env,
ImmutableMap<String, String> executionInfo,
- String progressMessage,
+ CharSequence progressMessage,
RunfilesSupplier runfilesSupplier,
String mnemonic) {
return new LtoBackendAction(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendArtifacts.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendArtifacts.java
index 5ce2611187..e4a865fc8d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendArtifacts.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoBackendArtifacts.java
@@ -121,7 +121,7 @@ public final class LtoBackendArtifacts {
builder.addOutput(objectFile);
- builder.setProgressMessage("LTO Backend Compile " + objectFile.getFilename());
+ builder.setProgressMessage("LTO Backend Compile %s", objectFile.getFilename());
builder.setMnemonic("CcLtoBackendCompile");
// The command-line doesn't specify the full path to clang++, so we set it in the
diff --git a/src/main/java/com/google/devtools/build/lib/rules/extra/ExtraAction.java b/src/main/java/com/google/devtools/build/lib/rules/extra/ExtraAction.java
index e82a9f1c4c..41ba32c5fd 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/extra/ExtraAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/extra/ExtraAction.java
@@ -70,7 +70,7 @@ public final class ExtraAction extends SpawnAction {
CommandLine argv,
ActionEnvironment env,
Map<String, String> executionInfo,
- String progressMessage,
+ CharSequence progressMessage,
String mnemonic) {
super(
shadowedAction.getOwner(),
diff --git a/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleAction.java b/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleAction.java
index 1d949f0956..65236c93ee 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleAction.java
@@ -46,7 +46,7 @@ public class GenRuleAction extends SpawnAction {
ActionEnvironment env,
ImmutableMap<String, String> executionInfo,
RunfilesSupplier runfilesSupplier,
- String progressMessage) {
+ CharSequence progressMessage) {
super(
owner,
tools,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java b/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java
index 7b66683e4c..44ba56d953 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java
@@ -44,6 +44,7 @@ import com.google.devtools.build.lib.rules.cpp.CcCommon.CcFlagsSupplier;
import com.google.devtools.build.lib.rules.cpp.CppHelper;
import com.google.devtools.build.lib.rules.java.JavaHelper;
import com.google.devtools.build.lib.syntax.Type;
+import com.google.devtools.build.lib.util.LazyString;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.util.List;
import java.util.Map;
@@ -161,10 +162,16 @@ public abstract class GenRuleBase implements RuleConfiguredTargetFactory {
command = resolveCommand(command, ruleContext, resolvedSrcs, filesToBuild);
- String message = ruleContext.attributes().get("message", Type.STRING);
- if (message.isEmpty()) {
- message = "Executing genrule";
- }
+ String messageAttr = ruleContext.attributes().get("message", Type.STRING);
+ String message = messageAttr.isEmpty() ? "Executing genrule" : messageAttr;
+ Label label = ruleContext.getLabel();
+ LazyString progressMessage =
+ new LazyString() {
+ @Override
+ public String toString() {
+ return message + " " + label;
+ }
+ };
Map<String, String> executionInfo = Maps.newLinkedHashMap();
executionInfo.putAll(TargetUtils.getExecutionInfo(ruleContext.getRule()));
@@ -216,7 +223,7 @@ public abstract class GenRuleBase implements RuleConfiguredTargetFactory {
ruleContext.getConfiguration().getActionEnvironment(),
ImmutableMap.copyOf(executionInfo),
new CompositeRunfilesSupplier(commandHelper.getToolsRunfilesSuppliers()),
- message + ' ' + ruleContext.getLabel()));
+ progressMessage));
RunfilesProvider runfilesProvider = RunfilesProvider.withData(
// No runfiles provided if not a data dependency.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/DeployArchiveBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/java/DeployArchiveBuilder.java
index 5aa4340af5..d34b32c30f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/DeployArchiveBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/DeployArchiveBuilder.java
@@ -277,13 +277,10 @@ public class DeployArchiveBuilder {
.addTransitiveInputs(JavaHelper.getHostJavabaseInputs(ruleContext))
.addOutput(outputJar)
.setResources(resourceSet)
- .setJarExecutable(
- JavaCommon.getHostJavaExecutable(ruleContext),
- singlejar,
- jvmArgs)
+ .setJarExecutable(JavaCommon.getHostJavaExecutable(ruleContext), singlejar, jvmArgs)
.setCommandLine(commandLine)
.alwaysUseParameterFile(ParameterFileType.SHELL_QUOTED)
- .setProgressMessage("Building deploy jar " + outputJar.prettyPrint())
+ .setProgressMessage("Building deploy jar %s", outputJar.prettyPrint())
.setMnemonic("JavaDeployJar")
.setExecutionInfo(ExecutionRequirements.WORKER_MODE_ENABLED)
.build(ruleContext));
@@ -296,7 +293,7 @@ public class DeployArchiveBuilder {
.setExecutable(singlejar)
.setCommandLine(commandLine)
.alwaysUseParameterFile(ParameterFileType.SHELL_QUOTED)
- .setProgressMessage("Building deploy jar " + outputJar.prettyPrint())
+ .setProgressMessage("Building deploy jar %s", outputJar.prettyPrint())
.setMnemonic("JavaDeployJar")
.build(ruleContext));
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
index dc2672bfcf..b74b517feb 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java
@@ -470,7 +470,7 @@ public final class JavaCompilationHelper {
.add("--temp_dir")
.addPath(tempDir(genClassJar))
.build())
- .setProgressMessage("Building genclass jar " + genClassJar.prettyPrint())
+ .setProgressMessage("Building genclass jar %s", genClassJar.prettyPrint())
.setMnemonic("JavaSourceJar")
.build(getRuleContext()));
}
@@ -797,19 +797,20 @@ public final class JavaCompilationHelper {
Artifact interfaceJar = getIjarArtifact(ruleContext, inputJar, addPrefix);
FilesToRunProvider ijarTarget = javaToolchain.getIjar();
if (!ruleContext.hasErrors()) {
- ruleContext.registerAction(new SpawnAction.Builder()
- .addInput(inputJar)
- .addOutput(interfaceJar)
- .setExecutable(ijarTarget)
- // On Windows, ijar.exe needs msys-2.0.dll and zlib1.dll in PATH.
- // Use default shell environment so that those can be found.
- // TODO(dslomov): revisit this. If ijar is not msys-dependent, this is not needed.
- .useDefaultShellEnvironment()
- .addArgument(inputJar.getExecPathString())
- .addArgument(interfaceJar.getExecPathString())
- .setProgressMessage("Extracting interface " + ruleContext.getLabel())
- .setMnemonic("JavaIjar")
- .build(ruleContext));
+ ruleContext.registerAction(
+ new SpawnAction.Builder()
+ .addInput(inputJar)
+ .addOutput(interfaceJar)
+ .setExecutable(ijarTarget)
+ // On Windows, ijar.exe needs msys-2.0.dll and zlib1.dll in PATH.
+ // Use default shell environment so that those can be found.
+ // TODO(dslomov): revisit this. If ijar is not msys-dependent, this is not needed.
+ .useDefaultShellEnvironment()
+ .addArgument(inputJar.getExecPathString())
+ .addArgument(interfaceJar.getExecPathString())
+ .setProgressMessage("Extracting interface %s", ruleContext.getLabel())
+ .setMnemonic("JavaIjar")
+ .build(ruleContext));
}
return interfaceJar;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
index 8d551c56ca..a867b0cff7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java
@@ -56,6 +56,7 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadCompatible;
import com.google.devtools.build.lib.rules.java.JavaConfiguration.JavaClasspathMode;
import com.google.devtools.build.lib.skyframe.AspectValue;
+import com.google.devtools.build.lib.util.LazyString;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.util.StringCanonicalizer;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -189,7 +190,7 @@ public final class JavaCompileAction extends SpawnAction {
Map<String, String> executionInfo,
StrictDepsMode strictJavaDeps,
NestedSet<Artifact> compileTimeDependencyArtifacts,
- String progressMessage) {
+ CharSequence progressMessage) {
super(
owner,
tools,
@@ -649,7 +650,7 @@ public final class JavaCompileAction extends SpawnAction {
executionInfo,
strictJavaDeps,
compileTimeDependencyArtifacts,
- buildProgressMessage());
+ getProgressMessage());
}
private CustomCommandLine buildParamFileContents(Collection<String> javacOpts) {
@@ -757,22 +758,32 @@ public final class JavaCompileAction extends SpawnAction {
return result.build();
}
- private String buildProgressMessage() {
- StringBuilder sb = new StringBuilder("Building ");
- sb.append(outputJar.prettyPrint());
- sb.append(" (");
- boolean first = true;
- first = appendCount(sb, first, sourceFiles.size(), "source file");
- first = appendCount(sb, first, sourceJars.size(), "source jar");
- sb.append(")");
- addProcessorNames(sb);
- return sb.toString();
+ private LazyString getProgressMessage() {
+ Artifact outputJar = this.outputJar;
+ int sourceFileCount = sourceFiles.size();
+ int sourceJarCount = sourceJars.size();
+ String annotationProcessorNames = getProcessorNames();
+ return new LazyString() {
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder("Building ");
+ sb.append(outputJar.prettyPrint());
+ sb.append(" (");
+ boolean first = true;
+ first = appendCount(sb, first, sourceFileCount, "source file");
+ first = appendCount(sb, first, sourceJarCount, "source jar");
+ sb.append(")");
+ sb.append(annotationProcessorNames);
+ return sb.toString();
+ }
+ };
}
- private void addProcessorNames(StringBuilder sb) {
+ private String getProcessorNames() {
if (processorNames.isEmpty()) {
- return;
+ return "";
}
+ StringBuilder sb = new StringBuilder();
List<String> shortNames = new ArrayList<>();
for (String name : processorNames) {
// Annotation processor names are qualified class names. Omit the package part for the
@@ -784,7 +795,7 @@ public final class JavaCompileAction extends SpawnAction {
sb.append(" and running annotation processors (");
Joiner.on(", ").appendTo(sb, shortNames);
sb.append(")");
- return;
+ return sb.toString();
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileAction.java
index 04dbd6174f..015261d6f3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileAction.java
@@ -47,6 +47,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.util.Fingerprint;
+import com.google.devtools.build.lib.util.LazyString;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.util.ArrayList;
import java.util.Collection;
@@ -102,7 +103,7 @@ public class JavaHeaderCompileAction extends SpawnAction {
Iterable<Artifact> outputs,
CommandLine directCommandLine,
CommandLine transitiveCommandLine,
- String progressMessage) {
+ CharSequence progressMessage) {
super(
owner,
tools,
@@ -477,21 +478,29 @@ public class JavaHeaderCompileAction extends SpawnAction {
};
}
- private String getProgressMessageWithAnnotationProcessors() {
+ private LazyString getProgressMessageWithAnnotationProcessors() {
List<String> shortNames = new ArrayList<>();
for (String name : processorNames) {
shortNames.add(name.substring(name.lastIndexOf('.') + 1));
}
- return getProgressMessage()
- + " and running annotation processors ("
- + Joiner.on(", ").join(shortNames)
- + ")";
+ String tail = " and running annotation processors (" + Joiner.on(", ").join(shortNames) + ")";
+ return getProgressMessage(tail);
}
- private String getProgressMessage() {
- return String.format(
- "Compiling Java headers %s (%d files)",
- outputJar.prettyPrint(), sourceFiles.size() + sourceJars.size());
+ private LazyString getProgressMessage() {
+ return getProgressMessage("");
+ }
+
+ private LazyString getProgressMessage(String tail) {
+ Artifact outputJar = this.outputJar;
+ int fileCount = sourceFiles.size() + sourceJars.size();
+ return new LazyString() {
+ @Override
+ public String toString() {
+ return String.format(
+ "Compiling Java headers %s (%d files)%s", outputJar.prettyPrint(), fileCount, tail);
+ }
+ };
}
private CustomCommandLine.Builder getBaseArgs(JavaToolchainProvider javaToolchain) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/OneVersionCheckActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/java/OneVersionCheckActionBuilder.java
index 8a577088a3..c4de56da51 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/OneVersionCheckActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/OneVersionCheckActionBuilder.java
@@ -105,7 +105,7 @@ public final class OneVersionCheckActionBuilder {
.setCommandLine(oneVersionArgs)
.alwaysUseParameterFile(ParameterFileType.SHELL_QUOTED)
.setMnemonic("JavaOneVersion")
- .setProgressMessage("Checking for one-version violations in " + ruleContext.getLabel())
+ .setProgressMessage("Checking for one-version violations in %s", ruleContext.getLabel())
.build(ruleContext));
return outputArtifact;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java
index 982b07f35f..8886997892 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/ProguardHelper.java
@@ -472,20 +472,19 @@ public abstract class ProguardHelper {
ruleContext, optMode.name().toLowerCase(), mnemonic + "_optimization_" + i + ".jar");
ruleContext.registerAction(
defaultAction(
- checkNotNull(executable, "couldn't find optimizer %s", optimizer),
- programJar,
- proguardSpecs,
- proguardMapping,
- libraryJars,
- output.getOutputJar(),
- /* proguardOutputMap */ null,
- /* proguardOutputProtoMap */ null,
- /* proguardSeeds */ null,
- /* proguardUsage */ null,
- /* constantStringObfuscatedMapping */ null,
- /* proguardConfigOutput */ null)
- .setProgressMessage(
- "Trimming binary with " + mnemonic + ": Optimization Pass " + i)
+ checkNotNull(executable, "couldn't find optimizer %s", optimizer),
+ programJar,
+ proguardSpecs,
+ proguardMapping,
+ libraryJars,
+ output.getOutputJar(),
+ /* proguardOutputMap */ null,
+ /* proguardOutputProtoMap */ null,
+ /* proguardSeeds */ null,
+ /* proguardUsage */ null,
+ /* constantStringObfuscatedMapping */ null,
+ /* proguardConfigOutput */ null)
+ .setProgressMessage("Trimming binary with %s: Optimization Pass %d", mnemonic, +i)
.setMnemonic(mnemonic)
.addArgument("-runtype OPTIMIZATION")
.addArgument("-laststageoutput")
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/SingleJarActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/java/SingleJarActionBuilder.java
index 578f94b6e4..a610ea0651 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/SingleJarActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/SingleJarActionBuilder.java
@@ -75,7 +75,7 @@ public final class SingleJarActionBuilder {
.addInputs(resourceJars)
.setCommandLine(sourceJarCommandLine(outputJar, resources, resourceJars))
.alwaysUseParameterFile(ParameterFileType.SHELL_QUOTED)
- .setProgressMessage("Building source jar " + outputJar.prettyPrint())
+ .setProgressMessage("Building source jar %s", outputJar.prettyPrint())
.setMnemonic("JavaSourceJar");
ruleContext.registerAction(builder.build(ruleContext));
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCompileAction.java
index ad4db70673..dc8e89d56b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCompileAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCompileAction.java
@@ -116,7 +116,7 @@ public class ObjcCompileAction extends SpawnAction {
boolean isShellCommand,
ActionEnvironment env,
ImmutableMap<String, String> executionInfo,
- String progressMessage,
+ CharSequence progressMessage,
RunfilesSupplier runfilesSupplier,
String mnemonic,
boolean executeUnconditionally,
@@ -442,7 +442,7 @@ public class ObjcCompileAction extends SpawnAction {
boolean isShellCommand,
ActionEnvironment env,
ImmutableMap<String, String> executionInfo,
- String progressMessage,
+ CharSequence progressMessage,
RunfilesSupplier runfilesSupplier,
String mnemonic) {
return new ObjcCompileAction(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java
index a6d32b3a0c..4071bfb214 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java
@@ -479,7 +479,7 @@ public final class ReleaseBundlingSupport {
ObjcRuleClasses.spawnBashOnDarwinActionBuilder(actionCommandLine)
.setEnvironment(ObjcRuleClasses.appleToolchainEnvironment(appleConfiguration, platform))
.setMnemonic("ObjcProcessIpa")
- .setProgressMessage("Processing iOS IPA: " + ruleContext.getLabel())
+ .setProgressMessage("Processing iOS IPA: %s", ruleContext.getLabel())
.disableSandboxing()
.addTransitiveInputs(inputs.build())
.addOutput(processedIpa);
@@ -850,7 +850,7 @@ public final class ReleaseBundlingSupport {
ruleContext.registerAction(
new SpawnAction.Builder()
.setMnemonic("IosBundle")
- .setProgressMessage("Bundling iOS application: " + ruleContext.getLabel())
+ .setProgressMessage("Bundling iOS application: %s", ruleContext.getLabel())
.setExecutable(attributes.bundleMergeExecutable())
.addInputArgument(bundleMergeControlArtifact)
.addTransitiveInputs(bundling.getBundleContentArtifacts())
@@ -974,7 +974,7 @@ public final class ReleaseBundlingSupport {
ObjcRuleClasses.spawnBashOnDarwinActionBuilder(shellCommand)
.setMnemonic("ExtractIosEntitlements")
.disableSandboxing()
- .setProgressMessage("Extracting entitlements: " + ruleContext.getLabel())
+ .setProgressMessage("Extracting entitlements: %s", ruleContext.getLabel())
.addInput(releaseBundling.getProvisioningProfile())
.addOutput(entitlements)
.build(ruleContext));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilder.java
index 035199da4d..d4a3878784 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilder.java
@@ -252,7 +252,7 @@ public class ProtoCompileActionBuilder {
.useDefaultShellEnvironment()
.setExecutable(compilerTarget)
.setCommandLine(createProtoCompilerCommandLine().build())
- .setProgressMessage("Generating " + language + " proto_library " + ruleContext.getLabel())
+ .setProgressMessage("Generating %s proto_library %s", language, ruleContext.getLabel())
.setMnemonic(MNEMONIC);
return result;
@@ -517,7 +517,7 @@ public class ProtoCompileActionBuilder {
ruleLabel,
allowServices,
ruleContext.getFragment(ProtoConfiguration.class).protocOpts()))
- .setProgressMessage("Generating " + flavorName + " proto_library " + ruleContext.getLabel())
+ .setProgressMessage("Generating %s proto_library %s", flavorName, ruleContext.getLabel())
.setMnemonic(MNEMONIC);
return result;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PythonUtils.java b/src/main/java/com/google/devtools/build/lib/rules/python/PythonUtils.java
index ebe030fa41..524ced33d3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PythonUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PythonUtils.java
@@ -23,7 +23,6 @@ import com.google.devtools.build.lib.analysis.Runfiles;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.util.FileType;
import com.google.devtools.build.lib.vfs.PathFragment;
-
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -120,14 +119,15 @@ public final class PythonUtils {
argv.add("--write-unchanged-files");
argv.add(input.getExecPathString());
- ruleContext.registerAction(new SpawnAction.Builder()
- .addInput(input)
- .addOutput(output)
- .setExecutable(py2to3converter)
- .addArguments(argv)
- .setProgressMessage("Converting to Python 3: " + input.prettyPrint())
- .setMnemonic("2to3")
- .build(ruleContext));
+ ruleContext.registerAction(
+ new SpawnAction.Builder()
+ .addInput(input)
+ .addOutput(output)
+ .setExecutable(py2to3converter)
+ .addArguments(argv)
+ .setProgressMessage("Converting to Python 3: %s", input.prettyPrint())
+ .setMnemonic("2to3")
+ .build(ruleContext));
return output;
}
}