aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
diff options
context:
space:
mode:
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.java42
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;
}
/**