diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java index c7a068b5a1..277552a353 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java @@ -68,7 +68,6 @@ import com.google.devtools.common.options.Option; import com.google.devtools.common.options.OptionsBase; import com.google.devtools.common.options.OptionsParsingException; import com.google.devtools.common.options.TriState; - import java.io.Serializable; import java.lang.reflect.Field; import java.util.ArrayList; @@ -85,7 +84,6 @@ import java.util.Objects; import java.util.Queue; import java.util.Set; import java.util.TreeMap; - import javax.annotation.Nullable; /** @@ -165,13 +163,6 @@ public final class BuildConfiguration { return implicitLabels; } - /* - * Returns the command-line "Make" variable overrides. - */ - public ImmutableMap<String, String> getCommandLineDefines() { - return ImmutableMap.of(); - } - /** * Returns a fragment of the output directory name for this configuration. The output * directory for the whole configuration contains all the short names by all fragments. @@ -451,6 +442,16 @@ public final class BuildConfiguration { return cpu; } + @Option( + name = "define", + converter = Converters.AssignmentConverter.class, + defaultValue = "", + category = "semantics", + allowMultiple = true, + help = "Each --define option specifies an assignment for a build variable." + ) + public List<Map.Entry<String, String>> commandLineBuildVariables; + @Option(name = "cpu", defaultValue = "null", category = "semantics", @@ -862,6 +863,7 @@ public final class BuildConfiguration { host.compilationMode = CompilationMode.OPT; host.isHost = true; host.useDynamicConfigurations = useDynamicConfigurations; + host.commandLineBuildVariables = commandLineBuildVariables; host.enforceConstraints = enforceConstraints; if (fallback) { @@ -1041,6 +1043,7 @@ public final class BuildConfiguration { private final String platformName; private final ImmutableMap<String, String> testEnvironment; + private final ImmutableMap<String, String> commandLineBuildVariables; /** * Helper container for {@link #transitiveOptionsMap} below. @@ -1203,6 +1206,15 @@ public final class BuildConfiguration { this.testEnvironment = ImmutableMap.copyOf(testEnv); + // We can't use an ImmutableMap.Builder here; we need the ability to add entries with keys that + // are already in the map so that the same define can be specified on the command line twice, + // and ImmutableMap.Builder does not support that. + Map<String, String> commandLineDefinesBuilder = new TreeMap<>(); + for (Map.Entry<String, String> define : options.commandLineBuildVariables) { + commandLineDefinesBuilder.put(define.getKey(), define.getValue()); + } + commandLineBuildVariables = ImmutableMap.copyOf(commandLineDefinesBuilder); + this.mnemonic = buildMnemonic(); String outputDirName = (options.outputDirectoryName != null) ? options.outputDirectoryName : mnemonic; @@ -2057,9 +2069,7 @@ public final class BuildConfiguration { public Map<String, String> getMakeEnvironment() { Map<String, String> makeEnvironment = new HashMap<>(); makeEnvironment.putAll(globalMakeEnv); - for (Fragment fragment : fragments.values()) { - makeEnvironment.putAll(fragment.getCommandLineDefines()); - } + makeEnvironment.putAll(commandLineBuildVariables); return ImmutableMap.copyOf(makeEnvironment); } @@ -2068,12 +2078,8 @@ public final class BuildConfiguration { * (Fragments, in particular the Google C++ support, can set variables through the * command line.) */ - public Map<String, String> getCommandLineDefines() { - ImmutableMap.Builder<String, String> builder = ImmutableMap.builder(); - for (Fragment fragment : fragments.values()) { - builder.putAll(fragment.getCommandLineDefines()); - } - return builder.build(); + public Map<String, String> getCommandLineBuildVariables() { + return commandLineBuildVariables; } /** |