diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
17 files changed, 131 insertions, 71 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD index 82fc8d6ba6..745623bd4f 100644 --- a/src/main/java/com/google/devtools/build/lib/BUILD +++ b/src/main/java/com/google/devtools/build/lib/BUILD @@ -468,6 +468,7 @@ java_library( ], exclude = [ "analysis/BuildInfo.java", + "analysis/actions/CommandLineItem.java", "analysis/TransitiveInfoProvider.java", "analysis/config/BuildConfigurationOptionDetails.java", "rules/repository/CoreWorkspaceRules.java", @@ -482,6 +483,7 @@ java_library( deps = [ ":build-request-options", "//src/main/java/com/google/devtools/build/lib:base-util", + "//src/main/java/com/google/devtools/build/lib:commandline_item", "//src/main/java/com/google/devtools/build/lib:events", "//src/main/java/com/google/devtools/build/lib:exitcode-external", "//src/main/java/com/google/devtools/build/lib:io", @@ -527,6 +529,11 @@ java_library( ) java_library( + name = "commandline_item", + srcs = ["analysis/actions/CommandLineItem.java"], +) + +java_library( name = "bazel-rules", srcs = glob( [ @@ -973,6 +980,7 @@ java_library( "rules/android/test_suite_property_name.txt", ], deps = [ + ":commandline_item", "//src/main/java/com/google/devtools/build/lib:build-base", "//src/main/java/com/google/devtools/build/lib:events", "//src/main/java/com/google/devtools/build/lib:java-compilation", diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionKeyContext.java b/src/main/java/com/google/devtools/build/lib/actions/ActionKeyContext.java index 6ba29a7655..6378675147 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionKeyContext.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionKeyContext.java @@ -20,22 +20,15 @@ import com.google.devtools.build.lib.util.Fingerprint; /** Contains state that aids in action key computation via {@link AbstractAction#computeKey}. */ public class ActionKeyContext { - private static final class ArtifactNestedSetFingerprintCache - extends NestedSetFingerprintCache<Artifact> { - @Override - protected void addItemFingerprint(Fingerprint fingerprint, Artifact item) { - fingerprint.addPath(item.getExecPath()); - } - } - private final ArtifactNestedSetFingerprintCache artifactNestedSetFingerprintCache = - new ArtifactNestedSetFingerprintCache(); + private final NestedSetFingerprintCache nestedSetFingerprintCache = + new NestedSetFingerprintCache(); - public void addArtifactsToFingerprint(Fingerprint fingerprint, NestedSet<Artifact> artifacts) { - artifactNestedSetFingerprintCache.addNestedSetToFingerprint(fingerprint, artifacts); + public <T> void addNestedSetToFingerprint(Fingerprint fingerprint, NestedSet<T> nestedSet) { + nestedSetFingerprintCache.addNestedSetToFingerprint(fingerprint, nestedSet); } public void clear() { - artifactNestedSetFingerprintCache.clear(); + nestedSetFingerprintCache.clear(); } } diff --git a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java index e371ec1670..d45d16d587 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java +++ b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java @@ -27,6 +27,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Streams; import com.google.devtools.build.lib.actions.ActionAnalysisMetadata.MiddlemanType; +import com.google.devtools.build.lib.analysis.actions.CommandLineItem; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.shell.ShellUtils; @@ -115,7 +116,11 @@ import javax.annotation.Nullable; + "<a href='ctx.html#outputs'>ctx.outputs</a>." ) public class Artifact - implements FileType.HasFileType, ActionInput, SkylarkValue, Comparable<Object> { + implements FileType.HasFileType, + ActionInput, + SkylarkValue, + Comparable<Object>, + CommandLineItem { /** Compares artifact according to their exec paths. Sorts null values first. */ @SuppressWarnings("ReferenceEquality") // "a == b" is an optimization @@ -328,6 +333,11 @@ public class Artifact return getExecPath().filePathForFileTypeMatcher(); } + @Override + public String expandToCommandLine() { + return getExecPathString(); + } + /** * Returns the artifact owner. May be null. */ diff --git a/src/main/java/com/google/devtools/build/lib/actions/BUILD b/src/main/java/com/google/devtools/build/lib/actions/BUILD index 2c3f3abb0e..f936712ffb 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/BUILD +++ b/src/main/java/com/google/devtools/build/lib/actions/BUILD @@ -17,6 +17,7 @@ java_library( "cache/*.java", ]), deps = [ + "//src/main/java/com/google/devtools/build/lib:commandline_item", "//src/main/java/com/google/devtools/build/lib:events", "//src/main/java/com/google/devtools/build/lib:io", "//src/main/java/com/google/devtools/build/lib:packages-internal", diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/CommandLineItem.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/CommandLineItem.java new file mode 100644 index 0000000000..c228226e19 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/CommandLineItem.java @@ -0,0 +1,43 @@ +// Copyright 2018 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// 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.analysis.actions; + +/** An interface for an object that customizes how it is expanded into a command line. */ +public interface CommandLineItem { + /** + * A map function that allows caller customization how a type is expanded into the command line. + */ + interface MapFn<T> { + MapFn<Object> DEFAULT = CommandLineItem::expandToCommandLine; + + String expandToCommandLine(T object); + } + + /** Expands the object into the command line as a string. */ + String expandToCommandLine(); + + /** + * The default method of expanding types. + * + * <p>If the object is a {@link CommandLineItem} we use its {@link + * CommandLineItem#expandToCommandLine} method, else we call {@link Object#toString()}. + */ + static String expandToCommandLine(Object object) { + if (object instanceof CommandLineItem) { + return ((CommandLineItem) object).expandToCommandLine(); + } else { + return object.toString(); + } + } +} diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/CustomCommandLine.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/CustomCommandLine.java index f86d5603fc..a987c99917 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/actions/CustomCommandLine.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/CustomCommandLine.java @@ -42,7 +42,6 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; -import java.util.function.Function; import javax.annotation.Nullable; /** A customizable, serializable class for building memory efficient command lines. */ @@ -77,10 +76,8 @@ public final class CustomCommandLine extends CommandLine { abstract void eval(ImmutableList.Builder<String> builder); } - // TODO(bazel-team): CustomMultiArgv is going to be difficult to expose - // in Skylark. Maybe we can get rid of them by refactoring JavaCompileAction. It also - // raises immutability / serialization issues. - /** Custom Java code producing a List of String arguments. */ + /** Deprecated. Do not use. TODO(b/64841073): Remove this */ + @Deprecated public abstract static class CustomMultiArgv extends StandardArgvFragment { @Override @@ -179,17 +176,17 @@ public final class CustomCommandLine extends CommandLine { } /** Each argument is mapped using the supplied map function */ - public MappedVectorArg<T> mapped(Function<T, String> mapFn) { + public MappedVectorArg<T> mapped(CommandLineItem.MapFn<T> mapFn) { return new MappedVectorArg<>(this, mapFn); } } /** A vector arg that maps some type T to strings. */ - public static class MappedVectorArg<T> extends VectorArg<String> { + static class MappedVectorArg<T> extends VectorArg<String> { private final Iterable<T> values; - private final Function<T, String> mapFn; + private final CommandLineItem.MapFn<T> mapFn; - private MappedVectorArg(SimpleVectorArg<T> other, Function<T, String> mapFn) { + private MappedVectorArg(SimpleVectorArg<T> other, CommandLineItem.MapFn<T> mapFn) { super( other.isNestedSet, other.isEmpty, @@ -263,7 +260,7 @@ public final class CustomCommandLine extends CommandLine { @SuppressWarnings("unchecked") private static void push(List<Object> arguments, VectorArg<?> vectorArg) { final Iterable<?> values; - final Function<?, String> mapFn; + final CommandLineItem.MapFn<?> mapFn; if (vectorArg instanceof SimpleVectorArg) { values = ((SimpleVectorArg) vectorArg).values; mapFn = null; @@ -342,14 +339,12 @@ public final class CustomCommandLine extends CommandLine { mutatedValues.add(arguments.get(argi++)); } } - if (hasMapEach) { - Function<Object, String> mapFn = (Function<Object, String>) arguments.get(argi++); - for (int i = 0; i < count; ++i) { - mutatedValues.set(i, mapFn.apply(mutatedValues.get(i))); - } - } + CommandLineItem.MapFn<Object> mapFn = + hasMapEach + ? (CommandLineItem.MapFn<Object>) arguments.get(argi++) + : CommandLineItem.MapFn.DEFAULT; for (int i = 0; i < count; ++i) { - mutatedValues.set(i, valueToString(mutatedValues.get(i))); + mutatedValues.set(i, mapFn.expandToCommandLine(mutatedValues.get(i))); } if (hasFormatEach) { String formatStr = (String) arguments.get(argi++); @@ -413,7 +408,7 @@ public final class CustomCommandLine extends CommandLine { String formatStr = (String) arguments.get(argi++); Object[] args = new Object[argCount]; for (int i = 0; i < argCount; ++i) { - args[i] = valueToString(arguments.get(argi++)); + args[i] = CommandLineItem.expandToCommandLine(arguments.get(argi++)); } builder.add(String.format(formatStr, args)); return argi; @@ -433,7 +428,7 @@ public final class CustomCommandLine extends CommandLine { public int eval(List<Object> arguments, int argi, ImmutableList.Builder<String> builder) { String before = (String) arguments.get(argi++); Object arg = arguments.get(argi++); - builder.add(before + valueToString(arg)); + builder.add(before + CommandLineItem.expandToCommandLine(arg)); return argi; } } @@ -1074,7 +1069,7 @@ public final class CustomCommandLine extends CommandLine { i = ((ArgvFragment) substitutedArg).eval(arguments, i, builder); } } else { - builder.add(valueToString(substitutedArg)); + builder.add(CommandLineItem.expandToCommandLine(substitutedArg)); } } return builder.build(); @@ -1082,7 +1077,7 @@ public final class CustomCommandLine extends CommandLine { private void evalSimpleVectorArg(Iterable<?> arg, ImmutableList.Builder<String> builder) { for (Object value : arg) { - builder.add(valueToString(value)); + builder.add(CommandLineItem.expandToCommandLine(value)); } } @@ -1101,10 +1096,4 @@ public final class CustomCommandLine extends CommandLine { return arg; } } - - private static String valueToString(Object value) { - return value instanceof Artifact - ? ((Artifact) value).getExecPath().getPathString() - : value.toString(); - } } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java index 7c9d5e249e..e67ff39f09 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java @@ -19,9 +19,9 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Interner; import com.google.common.collect.Lists; -import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.CommandLineExpansionException; import com.google.devtools.build.lib.analysis.actions.CommandLine; +import com.google.devtools.build.lib.analysis.actions.CommandLineItem; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.events.EventHandler; @@ -148,7 +148,7 @@ class SkylarkCustomCommandLine extends CommandLine { mutatedValues.addAll(resultAsList); } for (int i = 0; i < count; ++i) { - mutatedValues.set(i, valueToString(mutatedValues.get(i))); + mutatedValues.set(i, CommandLineItem.expandToCommandLine(mutatedValues.get(i))); } if (hasFormat) { String formatStr = (String) arguments.get(argi++); @@ -291,7 +291,7 @@ class SkylarkCustomCommandLine extends CommandLine { BaseFunction mapFn = (BaseFunction) arguments.get(argi++); object = applyMapFn(mapFn, object, location, skylarkSemantics, eventHandler); } - object = valueToString(object); + object = CommandLineItem.expandToCommandLine(object); if (hasFormat) { String formatStr = (String) arguments.get(argi++); Formatter formatter = new Formatter(formatStr, location); @@ -390,20 +390,12 @@ class SkylarkCustomCommandLine extends CommandLine { } else if (arg instanceof ScalarArg) { argi = ((ScalarArg) arg).eval(arguments, argi, result, skylarkSemantics, eventHandler); } else { - result.add(valueToString(arg)); + result.add(CommandLineItem.expandToCommandLine(arg)); } } return result.build(); } - private static String valueToString(Object value) { - if (value instanceof Artifact) { - Artifact artifact = (Artifact) value; - return artifact.getExecPath().getPathString(); - } - return value.toString(); - } - private static class Formatter { private final String formatStr; @Nullable private final Location location; 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 2883d4277a..5ce3b757be 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/BUILD +++ b/src/main/java/com/google/devtools/build/lib/cmdline/BUILD @@ -18,6 +18,7 @@ java_library( visibility = ["//src:__subpackages__"], deps = [ "//src/main/java/com/google/devtools/build/lib:base-util", + "//src/main/java/com/google/devtools/build/lib:commandline_item", "//src/main/java/com/google/devtools/build/lib:skylarkinterface", "//src/main/java/com/google/devtools/build/lib:util", "//src/main/java/com/google/devtools/build/lib/concurrent", 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 47a7d7bc17..2fbb2a4217 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 @@ -17,6 +17,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ComparisonChain; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Interner; +import com.google.devtools.build.lib.analysis.actions.CommandLineItem; import com.google.devtools.build.lib.cmdline.LabelValidator.BadLabelException; import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; @@ -53,7 +54,8 @@ import javax.annotation.Nullable; ) @Immutable @ThreadSafe -public final class Label implements Comparable<Label>, Serializable, SkylarkValue, SkyKey { +public final class Label + implements Comparable<Label>, Serializable, SkylarkValue, SkyKey, CommandLineItem { public static final PathFragment EXTERNAL_PACKAGE_NAME = PathFragment.create("external"); public static final PathFragment WORKSPACE_FILE_NAME = PathFragment.create("WORKSPACE"); public static final String DEFAULT_REPOSITORY_DIRECTORY = "__main__"; @@ -573,6 +575,11 @@ public final class Label implements Comparable<Label>, Serializable, SkylarkValu printer.append(getCanonicalForm()); } + @Override + public String expandToCommandLine() { + return getCanonicalForm(); + } + /** * Specialization of {@link Arrays#hashCode()} that does not require constructing a 2-element * array. diff --git a/src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD b/src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD index 4de005985c..8e3b861b9d 100644 --- a/src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD +++ b/src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD @@ -40,6 +40,8 @@ java_library( srcs = ["NestedSetFingerprintCache.java"], deps = [ ":nestedset", + "//src/main/java/com/google/devtools/build/lib:commandline_item", "//src/main/java/com/google/devtools/build/lib:util", + "//third_party:guava", ], ) diff --git a/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetFingerprintCache.java b/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetFingerprintCache.java index 8e56d5548a..c19b67e0cd 100644 --- a/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetFingerprintCache.java +++ b/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetFingerprintCache.java @@ -14,16 +14,18 @@ package com.google.devtools.build.lib.collect.nestedset; +import com.google.common.annotations.VisibleForTesting; +import com.google.devtools.build.lib.analysis.actions.CommandLineItem; import com.google.devtools.build.lib.util.Fingerprint; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** Computes fingerprints for nested sets, reusing sub-computations from children. */ -public abstract class NestedSetFingerprintCache<T> { +public class NestedSetFingerprintCache { private static final byte[] EMPTY_SET_BYTES = new byte[] {}; private Map<Object, byte[]> fingerprints = createMap(); - public void addNestedSetToFingerprint(Fingerprint fingerprint, NestedSet<T> nestedSet) { + public <T> void addNestedSetToFingerprint(Fingerprint fingerprint, NestedSet<T> nestedSet) { fingerprint.addInt(nestedSet.getOrder().ordinal()); Object children = nestedSet.rawChildren(); byte[] bytes = getBytes(children); @@ -34,6 +36,7 @@ public abstract class NestedSetFingerprintCache<T> { fingerprints = createMap(); } + @SuppressWarnings("unchecked") private byte[] getBytes(Object children) { byte[] bytes = fingerprints.get(children); if (bytes == null) { @@ -43,7 +46,7 @@ public abstract class NestedSetFingerprintCache<T> { if (child instanceof Object[]) { fingerprint.addBytes(getBytes(child)); } else { - addItemFingerprint(fingerprint, cast(child)); + addToFingerprint(fingerprint, child); } } bytes = fingerprint.digestAndReset(); @@ -55,7 +58,7 @@ public abstract class NestedSetFingerprintCache<T> { } else if (children != NestedSet.EMPTY_CHILDREN) { // Single item Fingerprint fingerprint = new Fingerprint(); - addItemFingerprint(fingerprint, cast(children)); + addToFingerprint(fingerprint, children); bytes = fingerprint.digestAndReset(); } else { // Empty nested set @@ -65,14 +68,12 @@ public abstract class NestedSetFingerprintCache<T> { return bytes; } - @SuppressWarnings("unchecked") - private T cast(Object item) { - return (T) item; + @VisibleForTesting + <T> void addToFingerprint(Fingerprint fingerprint, T object) { + fingerprint.addString(CommandLineItem.expandToCommandLine(object)); } private static Map<Object, byte[]> createMap() { return new ConcurrentHashMap<>(); } - - protected abstract void addItemFingerprint(Fingerprint fingerprint, T item); } 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 14635e626a..6dbab850f3 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 @@ -166,7 +166,8 @@ public class AndroidResourceMergingActionBuilder { NestedSetBuilder<Artifact> inputs = createInputsForBuilder(builder); Preconditions.checkNotNull(primary); - builder.add("--primaryData", RESOURCE_CONTAINER_TO_ARG_FOR_COMPILED.apply(primary)); + builder.add( + "--primaryData", RESOURCE_CONTAINER_TO_ARG_FOR_COMPILED.expandToCommandLine(primary)); inputs.addAll(primary.getArtifacts()); inputs.add(primary.getCompiledSymbols()); @@ -202,7 +203,7 @@ public class AndroidResourceMergingActionBuilder { NestedSetBuilder<Artifact> inputs = createInputsForBuilder(builder); Preconditions.checkNotNull(primary); - builder.add("--primaryData", RESOURCE_CONTAINER_TO_ARG.apply(primary)); + builder.add("--primaryData", RESOURCE_CONTAINER_TO_ARG.expandToCommandLine(primary)); inputs.addAll(primary.getArtifacts()); inputs.add(primary.getSymbols()); 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 80e80ec85e..275af451a8 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 @@ -441,7 +441,7 @@ public class AndroidResourcesProcessorBuilder { List<Artifact> outs, NestedSetBuilder<Artifact> inputs, Builder builder) { // Add data - builder.add("--primaryData", RESOURCE_CONTAINER_TO_ARG.apply(primary)); + builder.add("--primaryData", RESOURCE_CONTAINER_TO_ARG.expandToCommandLine(primary)); inputs.addAll(primary.getArtifacts()); inputs.add(primary.getManifest()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainerConverter.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainerConverter.java index bb1ddc5510..fd9ba71a94 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainerConverter.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceContainerConverter.java @@ -20,6 +20,7 @@ import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterators; +import com.google.devtools.build.lib.analysis.actions.CommandLineItem; 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.rules.android.ResourceContainer.ResourceType; @@ -36,7 +37,7 @@ public class ResourceContainerConverter { return new Builder(); } - interface ToArg extends Function<ResourceContainer, String> { + interface ToArg extends CommandLineItem.MapFn<ResourceContainer> { String listSeparator(); } @@ -128,7 +129,7 @@ public class ResourceContainerConverter { return new ToArg() { @Override - public String apply(ResourceContainer container) { + public String expandToCommandLine(ResourceContainer container) { ImmutableList.Builder<String> cmdPieces = ImmutableList.builder(); if (includeResourceRoots) { cmdPieces.add(convertRoots(container, ResourceType.RESOURCES)); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java index 284be8cd10..7f520dcaaa 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java @@ -1081,11 +1081,11 @@ public class CppCompileAction extends AbstractAction */ f.addPaths(context.getDeclaredIncludeDirs()); f.addPaths(context.getDeclaredIncludeWarnDirs()); - actionKeyContext.addArtifactsToFingerprint(f, context.getDeclaredIncludeSrcs()); + actionKeyContext.addNestedSetToFingerprint(f, context.getDeclaredIncludeSrcs()); f.addInt(0); // mark the boundary between input types - actionKeyContext.addArtifactsToFingerprint(f, getMandatoryInputs()); + actionKeyContext.addNestedSetToFingerprint(f, getMandatoryInputs()); f.addInt(0); - actionKeyContext.addArtifactsToFingerprint(f, prunableInputs); + actionKeyContext.addNestedSetToFingerprint(f, prunableInputs); return f.hexDigestAndReset(); } diff --git a/src/main/java/com/google/devtools/build/lib/vfs/BUILD b/src/main/java/com/google/devtools/build/lib/vfs/BUILD index f6d2eb427b..5eaf3116e2 100644 --- a/src/main/java/com/google/devtools/build/lib/vfs/BUILD +++ b/src/main/java/com/google/devtools/build/lib/vfs/BUILD @@ -19,6 +19,7 @@ java_library( srcs = PATH_FRAGMENT_SOURCES, deps = [ "//src/main/java/com/google/devtools/build/lib:base-util", + "//src/main/java/com/google/devtools/build/lib:commandline_item", "//src/main/java/com/google/devtools/build/lib:filetype", "//src/main/java/com/google/devtools/build/lib:os_util", "//src/main/java/com/google/devtools/build/lib:skylarkinterface", diff --git a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java index 9db3aa3ada..572042a7d7 100644 --- a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java +++ b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.vfs; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.analysis.actions.CommandLineItem; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; @@ -52,7 +53,11 @@ import java.util.Set; @javax.annotation.concurrent.Immutable @ThreadSafe public abstract class PathFragment - implements Comparable<PathFragment>, Serializable, SkylarkPrintable, FileType.HasFileType { + implements Comparable<PathFragment>, + Serializable, + SkylarkPrintable, + FileType.HasFileType, + CommandLineItem { private static final Helper HELPER = OS.getCurrent() == OS.WINDOWS ? WindowsPathFragment.HELPER : UnixPathFragment.HELPER; @@ -762,6 +767,11 @@ public abstract class PathFragment return getBaseName(); } + @Override + public String expandToCommandLine() { + return getPathString(); + } + private static class PathFragmentCodec implements ObjectCodec<PathFragment> { private final ObjectCodec<String> stringCodec = StringCodecs.asciiOptimized(); |