diff options
author | 2017-06-30 23:11:34 +0200 | |
---|---|---|
committer | 2017-07-03 09:06:48 +0200 | |
commit | 57f5396fe0d86c840e24f5d72b09cb624c7acfee (patch) | |
tree | 341fc9452f03369e14fd33bc329e05eb77ab1f98 /src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java | |
parent | 1d33858eac03c4474e75085c849c554b57c491a0 (diff) |
Add new flag defining an environment group for automatic cpu-based environment
detection.
PiperOrigin-RevId: 160686932
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java index e6e5e72302..32490cda8e 100644 --- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java +++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java @@ -18,6 +18,7 @@ import com.google.common.base.Joiner; import com.google.common.base.Stopwatch; import com.google.common.base.Throwables; import com.google.common.base.Verify; +import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.BuildFailedException; import com.google.devtools.build.lib.actions.TestExecException; import com.google.devtools.build.lib.analysis.AnalysisPhaseCompleteEvent; @@ -38,6 +39,7 @@ import com.google.devtools.build.lib.analysis.config.BuildOptions; import com.google.devtools.build.lib.analysis.config.DefaultsPackage; import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException; import com.google.devtools.build.lib.analysis.constraints.ConstraintSemantics; +import com.google.devtools.build.lib.analysis.constraints.ConstraintSemantics.EnvironmentLookupException; import com.google.devtools.build.lib.analysis.constraints.EnvironmentCollection; import com.google.devtools.build.lib.analysis.constraints.SupportedEnvironmentsProvider; import com.google.devtools.build.lib.buildtool.BuildRequest.BuildRequestOptions; @@ -51,6 +53,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.OutputFilter; import com.google.devtools.build.lib.events.Reporter; +import com.google.devtools.build.lib.packages.EnvironmentGroup; import com.google.devtools.build.lib.packages.InputFile; import com.google.devtools.build.lib.packages.License; import com.google.devtools.build.lib.packages.License.DistributionType; @@ -73,10 +76,12 @@ import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.lib.util.RegexFilter; import com.google.devtools.common.options.OptionsParsingException; import java.util.Collection; +import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.logging.Logger; import java.util.regex.Pattern; +import javax.annotation.Nullable; /** * Provides the bulk of the implementation of the 'blaze build' command. @@ -300,13 +305,30 @@ public final class BuildTool { if (config == null) { // TODO(bazel-team): support file targets (they should apply package-default constraints). continue; - } else if (!config.enforceConstraints() || config.getTargetEnvironments().isEmpty()) { + } else if (!config.enforceConstraints()) { + continue; + } + + List<Label> targetEnvironments = config.getTargetEnvironments(); + if (targetEnvironments.isEmpty()) { + try { + targetEnvironments = + autoConfigureTargetEnvironments( + packageManager, config, config.getAutoCpuEnvironmentGroup()); + } catch (NoSuchPackageException + | NoSuchTargetException + | ConstraintSemantics.EnvironmentLookupException e) { + throw new ViewCreationFailedException("invalid target environment", e); + } + } + + if (targetEnvironments.isEmpty()) { continue; } // Parse and collect this configuration's environments. EnvironmentCollection.Builder builder = new EnvironmentCollection.Builder(); - for (Label envLabel : config.getTargetEnvironments()) { + for (Label envLabel : targetEnvironments) { try { Target env = packageManager.getLoadedTarget(envLabel); builder.put(ConstraintSemantics.getEnvironmentGroup(env), envLabel); @@ -341,6 +363,29 @@ public final class BuildTool { } } + private static List<Label> autoConfigureTargetEnvironments( + LoadedPackageProvider packageManager, + BuildConfiguration config, + @Nullable Label environmentGroupLabel) + throws InterruptedException, NoSuchTargetException, NoSuchPackageException, + EnvironmentLookupException { + if (environmentGroupLabel == null) { + return ImmutableList.of(); + } + + EnvironmentGroup environmentGroup = + (EnvironmentGroup) packageManager.getLoadedTarget(environmentGroupLabel); + + ImmutableList.Builder<Label> targetEnvironments = new ImmutableList.Builder<>(); + for (Label environmentLabel : environmentGroup.getEnvironments()) { + if (environmentLabel.getName().equals(config.getCpu())) { + targetEnvironments.add(environmentLabel); + } + } + + return targetEnvironments.build(); + } + private void reportExceptionError(Exception e) { if (e.getMessage() != null) { getReporter().handle(Event.error(e.getMessage())); |