This is a rollback of both https://github.com/bazelbuild/bazel/commit/a038c818f51b619f795dfefacd62fac75e23f1bd and https://github.com/bazelbuild/bazel/commit/6300c7eb70622b55bbc5f73ec1ffe8116d55c9cd
Automated rollback of commit a038c818f51b619f795dfefacd62fac75e23f1bd.
*** Reason for rollback ***
Breaks many projects on GitHub
*** Original change description ***
Remove all code related to //tools/defaults:* package
After disabling in-memory //tools/defaults:* package by option flag in PackageCacheOptions class, all code can be removed.
RELNOTES:none
PiperOrigin-RevId: 209407232
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
index 35562f2..d5c537e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
@@ -32,6 +32,7 @@
import com.google.devtools.build.lib.analysis.config.BuildOptions.OptionsDiff;
import com.google.devtools.build.lib.analysis.config.ComposingRuleTransitionFactory;
import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
+import com.google.devtools.build.lib.analysis.config.DefaultsPackage;
import com.google.devtools.build.lib.analysis.config.FragmentOptions;
import com.google.devtools.build.lib.analysis.constraints.ConstraintSemantics;
import com.google.devtools.build.lib.analysis.skylark.SkylarkModules;
@@ -51,6 +52,7 @@
import com.google.devtools.build.lib.packages.RuleErrorConsumer;
import com.google.devtools.build.lib.packages.RuleTransitionFactory;
import com.google.devtools.build.lib.packages.Target;
+import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.InvocationPolicy;
import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
import com.google.devtools.build.lib.skylarkbuildapi.Bootstrap;
import com.google.devtools.build.lib.skylarkinterface.SkylarkInterfaceUtils;
@@ -761,6 +763,21 @@
}
/**
+ * Returns the defaults package for the default settings.
+ */
+ public String getDefaultsPackageContent(InvocationPolicy invocationPolicy) {
+ return DefaultsPackage.getDefaultsPackageContent(configurationOptions, invocationPolicy);
+ }
+
+ /**
+ * Returns the defaults package for the given options taken from an optionsProvider.
+ */
+ public String getDefaultsPackageContent(OptionsProvider optionsProvider) {
+ return DefaultsPackage.getDefaultsPackageContent(
+ BuildOptions.of(configurationOptions, optionsProvider));
+ }
+
+ /**
* Creates a BuildOptions class for the given options taken from an optionsProvider.
*/
public BuildOptions createBuildOptions(OptionsProvider optionsProvider) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/DefaultsPackage.java b/src/main/java/com/google/devtools/build/lib/analysis/config/DefaultsPackage.java
new file mode 100644
index 0000000..90e74b3
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/DefaultsPackage.java
@@ -0,0 +1,150 @@
+// Copyright 2014 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.config;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
+import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.InvocationPolicy;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A helper class to compute and inject a defaults package into the package cache.
+ *
+ * <p>The <code>//tools/defaults</code> package provides a mechanism let tool locations be specified
+ * over the commandline, without requiring any special support in the rule code. As such, it can be
+ * used in genrule <code>$(location)</code> substitutions.
+ *
+ * <p>It works as follows:
+ *
+ * <ul>
+ * <li>SomeLanguage.createCompileAction will refer to a host-configured target for the compiler by
+ * looking for <code>env.getHostPrerequisiteArtifact("$somelanguage_compiler")</code>.
+ * <li>the attribute <code>$somelanguage_compiler</code> is defined in the {@link RuleDefinition}
+ * subclass for that language.
+ * <li>if the attribute cannot be set on the command-line, its value may be a normal label.
+ * <li>if the attribute can be set on the command-line, its value will be <code>
+ * //tools/defaults:somelanguage_compiler</code>.
+ * <li>in the latter case, the {@link BuildConfiguration.Fragment} subclass will define the option
+ * (with an existing target, eg. <code>//third_party/somelanguage:compiler</code>), and return
+ * the name in its implementation of {@link FragmentOptions#getDefaultsLabels}.
+ * <li>On startup, the rule is wired up with <code>//tools/defaults:somelanguage_compiler</code>.
+ * <li>On starting a build, the <code>//tools/defaults</code> package is synthesized, using the
+ * values as specified on the command-line. The contents of <code>tools/defaults/BUILD</code>
+ * is ignored.
+ * <li>Hence, changes in the command line values for tools are now handled exactly as if they were
+ * changes in a BUILD file.
+ * <li>The file <code>tools/defaults/BUILD</code> must exist, so we create a package in that
+ * location.
+ * <li>The code in {@link DefaultsPackage} can dump the synthesized package as a BUILD file, so
+ * external tooling does not need to understand the intricacies of handling command-line
+ * options.
+ * </ul>
+ *
+ * <p>For built-in rules (as opposed to genrules), late-bound labels provide an alternative method
+ * of depending on command-line values. These work by declaring attribute default values to be
+ * {@link LateBoundDefault} instances, whose <code>resolve(Rule rule, AttributeMap attributes,
+ * FragmentT configuration)</code> method will have access to a {@link BuildConfiguration.Fragment},
+ * which in turn may depend on command line flag values.
+ */
+public final class DefaultsPackage {
+
+ // The template contents are broken into lines such that the resulting file has no more than 80
+ // characters per line.
+ private static final String HEADER = ""
+ + "# DO NOT EDIT THIS FILE!\n"
+ + "#\n"
+ + "# Bazel does not read this file. Instead, it internally replaces the targets in\n"
+ + "# this package with the correct packages as given on the command line.\n"
+ + "#\n"
+ + "# If these options are not given on the command line, Bazel will use the exact\n"
+ + "# same targets as given here."
+ + "\n"
+ + "package(default_visibility = ['//visibility:public'])\n";
+
+ /**
+ * The map from entries to their values.
+ */
+ private ImmutableMap<String, ImmutableSet<Label>> values;
+
+ private DefaultsPackage(BuildOptions buildOptions) {
+ values = buildOptions.getDefaultsLabels();
+ }
+
+ private String labelsToString(Set<Label> labels) {
+ StringBuilder result = new StringBuilder();
+ for (Label label : labels) {
+ if (result.length() != 0) {
+ result.append(", ");
+ }
+ result.append("'").append(label).append("'");
+ }
+ return result.toString();
+ }
+
+ /**
+ * Returns a string of the defaults package with the given settings.
+ */
+ private String getContent() {
+ Preconditions.checkState(!values.isEmpty());
+ StringBuilder result = new StringBuilder(HEADER);
+ for (Map.Entry<String, ImmutableSet<Label>> entry : values.entrySet()) {
+ result
+ .append("filegroup(name = '")
+ .append(entry.getKey().toLowerCase(Locale.US)).append("',\n")
+ .append(" srcs = [")
+ .append(labelsToString(entry.getValue())).append("])\n");
+ }
+
+ return result.toString();
+ }
+
+ /**
+ * Returns the defaults package for the default settings.
+ */
+ public static String getDefaultsPackageContent(
+ Iterable<Class<? extends FragmentOptions>> options, InvocationPolicy invocationPolicy) {
+ return getDefaultsPackageContent(BuildOptions.createDefaults(options, invocationPolicy));
+ }
+
+ /**
+ * Returns the defaults package for the given options.
+ */
+ public static String getDefaultsPackageContent(BuildOptions buildOptions) {
+ return new DefaultsPackage(buildOptions).getContent();
+ }
+
+ public static void parseAndAdd(Set<Label> labels, String optionalLabel) {
+ if (optionalLabel != null) {
+ Label label = parseOptionalLabel(optionalLabel);
+ if (label != null) {
+ labels.add(label);
+ }
+ }
+ }
+
+ public static Label parseOptionalLabel(String value) {
+ try {
+ return Label.parseAbsolute(value, ImmutableMap.of());
+ } catch (LabelSyntaxException e) {
+ // We ignore this exception here - it will cause an error message at a later time.
+ return null;
+ }
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java b/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java
index 43fe429..60fe650 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/commands/FetchCommand.java
@@ -29,6 +29,7 @@
import com.google.devtools.build.lib.query2.engine.ThreadSafeOutputFormatterCallback;
import com.google.devtools.build.lib.runtime.BlazeCommand;
import com.google.devtools.build.lib.runtime.BlazeCommandResult;
+import com.google.devtools.build.lib.runtime.BlazeRuntime;
import com.google.devtools.build.lib.runtime.Command;
import com.google.devtools.build.lib.runtime.CommandEnvironment;
import com.google.devtools.build.lib.runtime.KeepGoingOption;
@@ -61,6 +62,7 @@
@Override
public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
+ BlazeRuntime runtime = env.getRuntime();
if (options.getResidue().isEmpty()) {
env.getReporter().handle(Event.error(String.format(
"missing fetch expression. Type '%s help fetch' for syntax and help",
@@ -69,7 +71,7 @@
}
try {
- env.setupPackageCache(options);
+ env.setupPackageCache(options, runtime.getDefaultsPackageContent());
} catch (InterruptedException e) {
env.getReporter().handle(Event.error("fetch interrupted"));
return BlazeCommandResult.exitCode(ExitCode.INTERRUPTED);
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java b/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
index 6a0d558..1f4cf12 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
@@ -65,7 +65,7 @@
@Override
public BlazeCommandResult exec(CommandEnvironment env, OptionsParsingResult options) {
try {
- env.setupPackageCache(options);
+ env.setupPackageCache(options, env.getRuntime().getDefaultsPackageContent());
SkyframeExecutor skyframeExecutor = env.getSkyframeExecutor();
skyframeExecutor.injectExtraPrecomputedValues(
ImmutableList.of(
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 a45abf3..92fa1b7 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
@@ -24,6 +24,7 @@
import com.google.devtools.build.lib.analysis.BuildView;
import com.google.devtools.build.lib.analysis.ViewCreationFailedException;
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.buildeventstream.BuildEventId;
import com.google.devtools.build.lib.buildtool.PostAnalysisQueryBuildTool.PostAnalysisQueryCommandLineException;
@@ -109,7 +110,7 @@
}
// Sync the package manager before sending the BuildStartingEvent in runLoadingPhase()
try (SilentCloseable c = Profiler.instance().profile("setupPackageCache")) {
- env.setupPackageCache(request);
+ env.setupPackageCache(request, DefaultsPackage.getDefaultsPackageContent(buildOptions));
}
ExecutionTool executionTool = null;
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 423a4a1..43d9846 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
@@ -70,6 +70,8 @@
ImmutableSet.of(
// Used for select
PathFragment.create("conditions"),
+ // dependencies that are a function of the configuration
+ PathFragment.create("tools/defaults"),
// Visibility is labels aren't actually targets
PathFragment.create("visibility"),
// There is only one //external package
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/PackageCacheOptions.java b/src/main/java/com/google/devtools/build/lib/pkgcache/PackageCacheOptions.java
index d0955e6..dc4aa71 100644
--- a/src/main/java/com/google/devtools/build/lib/pkgcache/PackageCacheOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/pkgcache/PackageCacheOptions.java
@@ -27,6 +27,7 @@
import com.google.devtools.common.options.Option;
import com.google.devtools.common.options.OptionDocumentationCategory;
import com.google.devtools.common.options.OptionEffectTag;
+import com.google.devtools.common.options.OptionMetadataTag;
import com.google.devtools.common.options.OptionsBase;
import com.google.devtools.common.options.OptionsParsingException;
import java.util.List;
@@ -150,6 +151,17 @@
)
public boolean checkOutputFiles;
+ @Option(
+ name = "experimental_enable_tools_defaults_package",
+ defaultValue = "true",
+ documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+ effectTags = {OptionEffectTag.AFFECTS_OUTPUTS},
+ metadataTags = {OptionMetadataTag.EXPERIMENTAL},
+ help =
+ "If true, Blaze constructs an in-memory //tools/defaults package based on the command"
+ + " line options. If false, //tools/defaults is resolved as a regular package.")
+ public boolean experimentalInMemoryToolsDefaultsPackage;
+
/**
* A converter from strings containing comma-separated names of packages to lists of strings.
*/
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
index d2d7146..3a7e9b5 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
@@ -153,6 +153,7 @@
private final ProjectFile.Provider projectFileProvider;
@Nullable private final InvocationPolicy moduleInvocationPolicy;
+ private final String defaultsPackageContent;
private final SubscriberExceptionHandler eventBusExceptionHandler;
private final String productName;
private final BuildEventArtifactUploaderFactoryMap buildEventArtifactUploaderFactoryMap;
@@ -202,6 +203,8 @@
this.queryOutputFormatters = queryOutputFormatters;
this.eventBusExceptionHandler = eventBusExceptionHandler;
+ this.defaultsPackageContent =
+ ruleClassProvider.getDefaultsPackageContent(getModuleInvocationPolicy());
CommandNameCache.CommandNameCacheInstance.INSTANCE.setCommandNameCache(
new CommandNameCacheImpl(getCommandMap()));
this.productName = productName;
@@ -584,7 +587,25 @@
}
}
- /** Creates a BuildOptions class for the given options taken from an optionsProvider. */
+ /**
+ * Returns the defaults package for the default settings. Should only be called by commands that
+ * do <i>not</i> process {@link BuildOptions}, since build options can alter the contents of the
+ * defaults package, which will not be reflected here.
+ */
+ public String getDefaultsPackageContent() {
+ return defaultsPackageContent;
+ }
+
+ /**
+ * Returns the defaults package for the given options taken from an optionsProvider.
+ */
+ public String getDefaultsPackageContent(OptionsProvider optionsProvider) {
+ return ruleClassProvider.getDefaultsPackageContent(optionsProvider);
+ }
+
+ /**
+ * Creates a BuildOptions class for the given options taken from an optionsProvider.
+ */
public BuildOptions createBuildOptions(OptionsProvider optionsProvider) {
return ruleClassProvider.createBuildOptions(optionsProvider);
}
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java b/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
index 8d5d7c6..a5e948b 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
@@ -23,6 +23,7 @@
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.SkyframePackageRootResolver;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.DefaultsPackage;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.events.Reporter;
import com.google.devtools.build.lib.packages.NoSuchThingException;
@@ -506,9 +507,15 @@
}
}
- /** Initializes the package cache using the given options, and syncs the package cache. */
- public void setupPackageCache(OptionsProvider options)
- throws InterruptedException, AbruptExitException {
+ /**
+ * Initializes the package cache using the given options, and syncs the package cache. Also
+ * injects a defaults package and the skylark semantics using the options for the {@link
+ * BuildConfiguration}.
+ *
+ * @see DefaultsPackage
+ */
+ public void setupPackageCache(OptionsProvider options,
+ String defaultsPackageContents) throws InterruptedException, AbruptExitException {
getSkyframeExecutor()
.sync(
reporter,
@@ -516,6 +523,7 @@
options.getOptions(SkylarkSemanticsOptions.class),
getOutputBase(),
getWorkingDirectory(),
+ defaultsPackageContents,
getCommandId(),
clientEnv,
timestampGranularityMonitor,
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
index 6a13f20..5e65c97 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoCommand.java
@@ -127,7 +127,8 @@
// In order to be able to answer configuration-specific queries, we need to set up
// the package path. Since info inherits all the build options, all the necessary
// information is available here.
- env.setupPackageCache(optionsParsingResult);
+ env.setupPackageCache(
+ optionsParsingResult, runtime.getDefaultsPackageContent(optionsParsingResult));
env.getSkyframeExecutor()
.setConfigurationFragmentFactories(runtime.getConfigurationFragmentFactories());
// TODO(bazel-team): What if there are multiple configurations? [multi-config]
@@ -231,6 +232,7 @@
new InfoItem.JavaVirtualMachineInfoItem(),
new InfoItem.JavaHomeInfoItem(),
new InfoItem.CharacterEncodingInfoItem(),
+ new InfoItem.DefaultsPackageInfoItem(),
new InfoItem.BuildLanguageInfoItem(),
new InfoItem.DefaultPackagePathInfoItem(commandOptions));
ImmutableMap.Builder<String, InfoItem> result = new ImmutableMap.Builder<>();
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
index c500397..b209a5d0 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/InfoItem.java
@@ -550,6 +550,28 @@
}
}
+ /**
+ * Info item for the default package. It is deprecated, it still works, when
+ * explicitly requested, but are not shown by default. It prints multi-line messages and thus
+ * don't play well with grep. We don't print them unless explicitly requested.
+ * @deprecated
+ */
+ @Deprecated
+ public static final class DefaultsPackageInfoItem extends InfoItem {
+ public DefaultsPackageInfoItem() {
+ super("defaults-package",
+ "Default packages used as implicit dependencies",
+ true);
+ }
+
+ @Override
+ public byte[] get(Supplier<BuildConfiguration> configurationSupplier, CommandEnvironment env)
+ throws AbruptExitException {
+ checkNotNull(env);
+ return print(env.getRuntime().getDefaultsPackageContent());
+ }
+ }
+
private static AllowedRuleClassInfo getAllowedRuleClasses(
Collection<RuleClass> ruleClasses, Attribute attr) {
AllowedRuleClassInfo.Builder info = AllowedRuleClassInfo.newBuilder();
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java
index ba6ac96..659d6c5 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/commands/QueryCommand.java
@@ -94,7 +94,7 @@
QueryOptions queryOptions = options.getOptions(QueryOptions.class);
try {
- env.setupPackageCache(options);
+ env.setupPackageCache(options, runtime.getDefaultsPackageContent());
} catch (InterruptedException e) {
env.getReporter().handle(Event.error("query interrupted"));
return BlazeCommandResult.exitCode(ExitCode.INTERRUPTED);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
index 88825cc..405ef5e 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
@@ -110,6 +110,8 @@
private final IncrementalityIntent incrementalityIntent;
+ static final PathFragment DEFAULTS_PACKAGE_NAME = PathFragment.create("tools/defaults");
+
public PackageFunction(
PackageFactory packageFactory,
CachingPackageLocator pkgLocator,
@@ -436,9 +438,16 @@
Path buildFilePath = buildFileRootedPath.asPath();
String replacementContents = null;
- buildFileValue = getBuildFileValue(env, buildFileRootedPath);
- if (buildFileValue == null) {
- return null;
+ if (isDefaultsPackage(packageId) && PrecomputedValue.isInMemoryToolsDefaults(env)) {
+ replacementContents = PrecomputedValue.DEFAULTS_PACKAGE_CONTENTS.get(env);
+ if (replacementContents == null) {
+ return null;
+ }
+ } else {
+ buildFileValue = getBuildFileValue(env, buildFileRootedPath);
+ if (buildFileValue == null) {
+ return null;
+ }
}
RuleVisibility defaultVisibility = PrecomputedValue.DEFAULT_VISIBILITY.get(env);
@@ -1330,4 +1339,9 @@
this.fileDependencies = fileDependencies;
}
}
+
+ public static boolean isDefaultsPackage(PackageIdentifier packageIdentifier) {
+ return packageIdentifier.getRepository().isMain()
+ && packageIdentifier.getPackageFragment().equals(DEFAULTS_PACKAGE_NAME);
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
index a291409..b3496b0 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
@@ -72,6 +72,11 @@
PackageIdentifier packageKey = (PackageIdentifier) skyKey.argument();
+ if (PackageFunction.isDefaultsPackage(packageKey)
+ && PrecomputedValue.isInMemoryToolsDefaults(env)) {
+ return PackageLookupValue.success(pkgLocator.getPathEntries().get(0), BuildFileName.BUILD);
+ }
+
if (!packageKey.getRepository().isMain()) {
return computeExternalPackageLookupValue(skyKey, env, packageKey);
} else if (packageKey.equals(Label.EXTERNAL_PACKAGE_IDENTIFIER)) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
index 826413a..937e59c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
@@ -79,6 +79,20 @@
return new Injected(precomputed, Suppliers.ofInstance(value));
}
+ public static final Precomputed<Boolean> ENABLE_DEFAULTS_PACKAGE =
+ new Precomputed<>(Key.create("enable_default_pkg"));
+
+ // TODO(dbabkin): better to move this code to PrecomputedValueUtils.
+ // It will gone soon after removing tools/defaults
+ public static boolean isInMemoryToolsDefaults(SkyFunction.Environment env)
+ throws InterruptedException {
+ Boolean enableDefaultsPackage = PrecomputedValue.ENABLE_DEFAULTS_PACKAGE.get(env);
+ return Preconditions.checkNotNull(enableDefaultsPackage);
+ }
+
+ public static final Precomputed<String> DEFAULTS_PACKAGE_CONTENTS =
+ new Precomputed<>(Key.create("default_pkg"));
+
public static final Precomputed<RuleVisibility> DEFAULT_VISIBILITY =
new Precomputed<>(Key.create("default_visibility"));
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
index 22968b3..82ef528 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
@@ -284,6 +284,7 @@
SkylarkSemanticsOptions skylarkSemanticsOptions,
Path outputBase,
Path workingDirectory,
+ String defaultsPackageContents,
UUID commandId,
Map<String, String> clientEnv,
TimestampGranularityMonitor tsgm,
@@ -295,16 +296,8 @@
resetEvaluator();
evaluatorNeedsReset = false;
}
- super.sync(
- eventHandler,
- packageCacheOptions,
- skylarkSemanticsOptions,
- outputBase,
- workingDirectory,
- commandId,
- clientEnv,
- tsgm,
- options);
+ super.sync(eventHandler, packageCacheOptions, skylarkSemanticsOptions, outputBase,
+ workingDirectory, defaultsPackageContents, commandId, clientEnv, tsgm, options);
handleDiffs(eventHandler, packageCacheOptions.checkOutputFiles, options);
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index 6fc5730..b06815b 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -852,6 +852,14 @@
public abstract void clearAnalysisCache(
Collection<ConfiguredTarget> topLevelTargets, Collection<AspectValue> topLevelAspects);
+ /**
+ * Injects the contents of the computed tools/defaults package.
+ */
+ @VisibleForTesting
+ public void setupDefaultPackage(String defaultsPackageContents) {
+ PrecomputedValue.DEFAULTS_PACKAGE_CONTENTS.set(injectable(), defaultsPackageContents);
+ }
+
private WorkspaceStatusAction makeWorkspaceStatusAction(String workspaceName) {
return workspaceStatusActionFactory.createWorkspaceStatusAction(
artifactFactory.get(), WorkspaceStatusValue.BUILD_INFO_KEY, workspaceName);
@@ -1146,6 +1154,7 @@
PathPackageLocator pkgLocator,
PackageCacheOptions packageCacheOptions,
SkylarkSemanticsOptions skylarkSemanticsOptions,
+ String defaultsPackageContents,
UUID commandId,
Map<String, String> clientEnv,
TimestampGranularityMonitor tsgm) {
@@ -1159,6 +1168,14 @@
setShowLoadingProgress(packageCacheOptions.showLoadingProgress);
setDefaultVisibility(packageCacheOptions.defaultVisibility);
setSkylarkSemantics(skylarkSemanticsOptions.toSkylarkSemantics());
+ if (packageCacheOptions.experimentalInMemoryToolsDefaultsPackage) {
+ setupDefaultPackage(defaultsPackageContents);
+ PrecomputedValue.ENABLE_DEFAULTS_PACKAGE.set(injectable(), true);
+ } else {
+ setupDefaultPackage("# //tools/defaults in-memory package is not enabled.");
+ PrecomputedValue.ENABLE_DEFAULTS_PACKAGE.set(injectable(), false);
+ }
+
setPackageLocator(pkgLocator);
syscalls.set(getPerBuildSyscallCache(packageCacheOptions.globbingThreads));
@@ -2115,6 +2132,7 @@
SkylarkSemanticsOptions skylarkSemanticsOptions,
Path outputBase,
Path workingDirectory,
+ String defaultsPackageContents,
UUID commandId,
Map<String, String> clientEnv,
TimestampGranularityMonitor tsgm,
@@ -2127,6 +2145,7 @@
skylarkSemanticsOptions,
outputBase,
workingDirectory,
+ defaultsPackageContents,
commandId,
clientEnv,
tsgm);
@@ -2138,6 +2157,7 @@
SkylarkSemanticsOptions skylarkSemanticsOptions,
Path outputBase,
Path workingDirectory,
+ String defaultsPackageContents,
UUID commandId,
Map<String, String> clientEnv,
TimestampGranularityMonitor tsgm)
@@ -2151,6 +2171,7 @@
workingDirectory),
packageCacheOptions,
skylarkSemanticsOptions,
+ defaultsPackageContents,
commandId,
clientEnv,
tsgm);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
index 1e05dd04..41ad785 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
@@ -142,6 +142,7 @@
protected Reporter reporter = new Reporter(new EventBus());
protected Map<SkyFunctionName, SkyFunction> extraSkyFunctions = new HashMap<>();
List<PrecomputedValue.Injected> extraPrecomputedValues = new ArrayList<>();
+ String defaultsPackageContents = getDefaultDefaultPackageContents();
int legacyGlobbingThreads = 1;
int skyframeThreads = 1;
@@ -230,6 +231,8 @@
protected abstract PackageLoader buildImpl();
protected abstract ConfiguredRuleClassProvider getDefaultRuleClassProvider();
+
+ protected abstract String getDefaultDefaultPackageContents();
}
AbstractPackageLoader(Builder builder) {
@@ -248,6 +251,7 @@
makePreinjectedDiff(
skylarkSemantics,
builder.pkgLocator,
+ builder.defaultsPackageContents,
ImmutableList.copyOf(builder.extraPrecomputedValues));
pkgFactory =
new PackageFactory(
@@ -261,6 +265,7 @@
private static ImmutableDiff makePreinjectedDiff(
SkylarkSemantics skylarkSemantics,
PathPackageLocator pkgLocator,
+ String defaultsPackageContents,
ImmutableList<PrecomputedValue.Injected> extraPrecomputedValues) {
final Map<SkyKey, SkyValue> valuesToInject = new HashMap<>();
Injectable injectable =
@@ -281,6 +286,8 @@
PrecomputedValue.PATH_PACKAGE_LOCATOR.set(injectable, pkgLocator);
PrecomputedValue.DEFAULT_VISIBILITY.set(injectable, ConstantRuleVisibility.PRIVATE);
PrecomputedValue.SKYLARK_SEMANTICS.set(injectable, skylarkSemantics);
+ PrecomputedValue.DEFAULTS_PACKAGE_CONTENTS.set(injectable, defaultsPackageContents);
+ PrecomputedValue.ENABLE_DEFAULTS_PACKAGE.set(injectable, true);
return new ImmutableDiff(ImmutableList.of(), valuesToInject);
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java
index d299418..b0d1aab 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BazelPackageLoader.java
@@ -29,6 +29,7 @@
import com.google.devtools.build.lib.rules.repository.RepositoryDelegatorFunction;
import com.google.devtools.build.lib.rules.repository.RepositoryFunction;
import com.google.devtools.build.lib.rules.repository.RepositoryLoaderFunction;
+import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.InvocationPolicy;
import com.google.devtools.build.lib.skyframe.ActionEnvironmentFunction;
import com.google.devtools.build.lib.skyframe.BazelSkyframeExecutorConstants;
import com.google.devtools.build.lib.skyframe.ClientEnvironmentFunction;
@@ -130,6 +131,12 @@
return DEFAULT_RULE_CLASS_PROVIDER;
}
+ @Override
+ protected String getDefaultDefaultPackageContents() {
+ return DEFAULT_RULE_CLASS_PROVIDER.getDefaultsPackageContent(
+ InvocationPolicy.getDefaultInstance());
+ }
+
Builder setFetchForTesting() {
this.isFetch.set(true);
return this;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/EnableDefaultsPackageOptionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/EnableDefaultsPackageOptionTest.java
new file mode 100644
index 0000000..92d149a
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/analysis/EnableDefaultsPackageOptionTest.java
@@ -0,0 +1,77 @@
+// 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;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Test for experimental_enable_tools_defaults_package flag. TODO(dbabkin): remove after
+ * //tools/defaults package gone.
+ */
+@RunWith(JUnit4.class)
+public class EnableDefaultsPackageOptionTest extends BuildViewTestCase {
+
+ @Test
+ public void testEnableDefaultsPackageOptionWorks() throws Exception {
+
+ setPackageCacheOptions("--experimental_enable_tools_defaults_package=true");
+
+ ConfiguredTarget target = getConfiguredTarget("//tools/defaults:jdk");
+
+ assertThat(target.getLabel().toString()).isEqualTo("//tools/defaults:jdk");
+ }
+
+ @Test
+ public void testDisabledDefaultsPackageOptionWorks() throws Exception {
+
+ scratch.file(
+ "a/BUILD",
+ "filegroup(",
+ " name = 'my_filegroup',",
+ " srcs = ['//tools/defaults:jdk'],",
+ ")");
+
+ reporter.removeHandler(failFastHandler);
+ setPackageCacheOptions("--experimental_enable_tools_defaults_package=false");
+ ConfiguredTarget target = getConfiguredTarget("//a:my_filegroup");
+
+ assertThat(target).isNull();
+ assertContainsEvent(
+ "no such package 'tools/defaults': "
+ + "BUILD file not found on package path and referenced by '//a:my_filegroup'");
+ }
+
+ @Test
+ public void testFlipFlagOnFly() throws Exception {
+
+ setPackageCacheOptions("--experimental_enable_tools_defaults_package=false");
+ ConfiguredTarget defaultsJDKtarget = getConfiguredTarget("//tools/defaults:jdk");
+ assertThat(defaultsJDKtarget).isNull();
+
+ setPackageCacheOptions("--experimental_enable_tools_defaults_package=true");
+ defaultsJDKtarget = getConfiguredTarget("//tools/defaults:jdk");
+ assertThat(defaultsJDKtarget).isNotNull();
+ assertThat(defaultsJDKtarget.getLabel().toString()).isEqualTo("//tools/defaults:jdk");
+
+ setPackageCacheOptions("--experimental_enable_tools_defaults_package=false");
+ defaultsJDKtarget = getConfiguredTarget("//tools/defaults:jdk");
+ assertThat(defaultsJDKtarget).isNull();
+ }
+}
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java
index c834494..3aefeff 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java
@@ -79,6 +79,12 @@
return new InvocationPolicyEnforcer(TestConstants.TEST_INVOCATION_POLICY);
}
+ @Override
+ public String getDefaultsPackageContent() {
+ return createRuleClassProvider()
+ .getDefaultsPackageContent(getInvocationPolicyEnforcer().getInvocationPolicy());
+ }
+
/**
* This is called from test setup to create the mock directory layout needed to create the
* configuration.
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
index 17d0723..eb4b9cf 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
@@ -210,6 +210,8 @@
pkgLocator,
packageCacheOptions,
Options.getDefaults(SkylarkSemanticsOptions.class),
+ ruleClassProvider.getDefaultsPackageContent(
+ analysisMock.getInvocationPolicyEnforcer().getInvocationPolicy()),
UUID.randomUUID(),
ImmutableMap.<String, String>of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
@@ -338,6 +340,8 @@
pathPackageLocator,
packageCacheOptions,
skylarkSemanticsOptions,
+ ruleClassProvider.getDefaultsPackageContent(
+ analysisMock.getInvocationPolicyEnforcer().getInvocationPolicy()),
UUID.randomUUID(),
ImmutableMap.<String, String>of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index 71a6a8c..9a18168 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -283,6 +283,7 @@
BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY),
packageCacheOptions,
skylarkSemanticsOptions,
+ "",
UUID.randomUUID(),
ImmutableMap.<String, String>of(),
tsgm);
@@ -401,6 +402,7 @@
pkgLocator,
packageCacheOptions,
skylarkSemanticsOptions,
+ ruleClassProvider.getDefaultsPackageContent(optionsParser),
UUID.randomUUID(),
ImmutableMap.<String, String>of(),
tsgm);
@@ -509,10 +511,11 @@
}
/**
- * Creates BuildView using current hostConfig/targetConfig values. Ensures that hostConfig is
- * either identical to the targetConfig or has 'host' short name.
+ * Creates BuildView using current hostConfig/targetConfig values.
+ * Ensures that hostConfig is either identical to the targetConfig or has
+ * 'host' short name.
*/
- protected final void createBuildView() {
+ protected final void createBuildView() throws Exception {
Preconditions.checkNotNull(masterConfig);
Preconditions.checkState(getHostConfiguration().equals(getTargetConfiguration())
|| getHostConfiguration().isHostConfiguration(),
@@ -520,6 +523,8 @@
+ "and does not match target configuration %s",
getHostConfiguration(), getTargetConfiguration());
+ String defaultsPackageContent = ruleClassProvider.getDefaultsPackageContent(optionsParser);
+ skyframeExecutor.setupDefaultPackage(defaultsPackageContent);
skyframeExecutor.handleConfiguredTargetChange();
view = new BuildViewForTesting(directories, ruleClassProvider, skyframeExecutor, null);
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
index 0567ac6..b927391 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
@@ -148,6 +148,8 @@
pkgLocator,
packageCacheOptions,
Options.getDefaults(SkylarkSemanticsOptions.class),
+ ruleClassProvider.getDefaultsPackageContent(
+ analysisMock.getInvocationPolicyEnforcer().getInvocationPolicy()),
UUID.randomUUID(),
ImmutableMap.<String, String>of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/DefaultsPackageUtil.java b/src/test/java/com/google/devtools/build/lib/analysis/util/DefaultsPackageUtil.java
new file mode 100644
index 0000000..38bb434
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/DefaultsPackageUtil.java
@@ -0,0 +1,45 @@
+// Copyright 2015 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.util;
+
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+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.FragmentOptions;
+import com.google.devtools.common.options.InvocationPolicyEnforcer;
+import com.google.devtools.common.options.OptionsBase;
+import com.google.devtools.common.options.OptionsParser;
+import com.google.devtools.common.options.OptionsParsingException;
+
+/**
+ * Helper class for testing {@link DefaultsPackage}.
+ */
+public class DefaultsPackageUtil {
+
+ public static String getDefaultsPackageForOptions(Class<? extends FragmentOptions> optionsClass,
+ String... options) throws OptionsParsingException {
+ OptionsParser parser = OptionsParser.newOptionsParser(
+ ImmutableList.<Class<? extends OptionsBase>>of(
+ BuildConfiguration.Options.class, optionsClass));
+ parser.parse(options);
+
+ InvocationPolicyEnforcer enforcer = AnalysisMock.get().getInvocationPolicyEnforcer();
+ enforcer.enforce(parser);
+
+ return DefaultsPackage.getDefaultsPackageContent(BuildOptions.of(
+ ImmutableList.<Class<? extends FragmentOptions>>of(
+ BuildConfiguration.Options.class, optionsClass), parser));
+ }
+}
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/LoadingMock.java b/src/test/java/com/google/devtools/build/lib/packages/util/LoadingMock.java
index bba1eb1..d50b43d 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/LoadingMock.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/LoadingMock.java
@@ -43,4 +43,13 @@
public InvocationPolicyEnforcer getInvocationPolicyEnforcer() {
return new InvocationPolicyEnforcer(TestConstants.TEST_INVOCATION_POLICY);
}
+
+ /**
+ * Returns the defaults package for the default settings using {@link #createRuleClassProvider}
+ * and applying {@link #getInvocationPolicyEnforcer}.
+ */
+ public String getDefaultsPackageContent() {
+ return createRuleClassProvider()
+ .getDefaultsPackageContent(getInvocationPolicyEnforcer().getInvocationPolicy());
+ }
}
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
index 337bb2d..85e4864 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageLoadingTestCase.java
@@ -137,7 +137,7 @@
return ImmutableList.<EnvironmentExtension>of();
}
- protected void setUpSkyframe(RuleVisibility defaultVisibility) {
+ protected void setUpSkyframe(RuleVisibility defaultVisibility, String defaultsPackageContents) {
PackageCacheOptions packageCacheOptions = Options.getDefaults(PackageCacheOptions.class);
packageCacheOptions.defaultVisibility = defaultVisibility;
packageCacheOptions.showLoadingProgress = true;
@@ -149,6 +149,7 @@
BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY),
packageCacheOptions,
Options.getDefaults(SkylarkSemanticsOptions.class),
+ defaultsPackageContents,
UUID.randomUUID(),
ImmutableMap.<String, String>of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
@@ -170,6 +171,7 @@
pkgLocator,
packageCacheOptions,
skylarkSemanticsOptions,
+ loadingMock.getDefaultsPackageContent(),
UUID.randomUUID(),
ImmutableMap.<String, String>of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/AbstractTargetPatternEvaluatorTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/AbstractTargetPatternEvaluatorTest.java
index bf8acad..1bc7460 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/AbstractTargetPatternEvaluatorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/AbstractTargetPatternEvaluatorTest.java
@@ -101,7 +101,7 @@
@Before
public final void initializeParser() throws Exception {
- setUpSkyframe(ConstantRuleVisibility.PRIVATE);
+ setUpSkyframe(ConstantRuleVisibility.PRIVATE, loadingMock.getDefaultsPackageContent());
parser = skyframeExecutor.newTargetPatternEvaluator();
parsingListener = new RecordingParsingListener(reporter);
}
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/BuildFileModificationTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/BuildFileModificationTest.java
index d8b59ee..d25e255 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/BuildFileModificationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/BuildFileModificationTest.java
@@ -123,6 +123,7 @@
pkgLocator,
packageCacheOptions,
skylarkSemanticsOptions,
+ analysisMock.getDefaultsPackageContent(),
UUID.randomUUID(),
ImmutableMap.<String, String>of(),
new TimestampGranularityMonitor(clock));
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/IOExceptionsTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/IOExceptionsTest.java
index 8d56fed..de8e71b 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/IOExceptionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/IOExceptionsTest.java
@@ -62,7 +62,7 @@
@Before
public final void initializeVisitor() throws Exception {
- setUpSkyframe(ConstantRuleVisibility.PRIVATE);
+ setUpSkyframe(ConstantRuleVisibility.PRIVATE, loadingMock.getDefaultsPackageContent());
}
private boolean visitTransitively(Label label) throws InterruptedException {
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
index 72445ef..bca7677 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/IncrementalLoadingTest.java
@@ -503,6 +503,7 @@
BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY),
packageCacheOptions,
Options.getDefaults(SkylarkSemanticsOptions.class),
+ "",
UUID.randomUUID(),
ImmutableMap.<String, String>of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
@@ -593,6 +594,7 @@
BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY),
packageCacheOptions,
Options.getDefaults(SkylarkSemanticsOptions.class),
+ "",
UUID.randomUUID(),
ImmutableMap.<String, String>of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java
index 6a7a944..29ff98f 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunnerTest.java
@@ -800,6 +800,7 @@
pkgLocator,
packageCacheOptions,
Options.getDefaults(SkylarkSemanticsOptions.class),
+ analysisMock.getDefaultsPackageContent(),
UUID.randomUUID(),
ImmutableMap.<String, String>of(),
new TimestampGranularityMonitor(clock));
@@ -872,6 +873,8 @@
}
private void sync() throws InterruptedException {
+ String pkgContents = analysisMock.getDefaultsPackageContent();
+ skyframeExecutor.setupDefaultPackage(pkgContents);
clock.advanceMillis(1);
ModifiedFileSet.Builder builder = ModifiedFileSet.builder();
for (Path path : changes) {
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
index 1408a94..97c4f2e2 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/PackageCacheTest.java
@@ -136,6 +136,7 @@
pkgLocator,
packageCacheOptions,
skylarkSemanticsOptions,
+ analysisMock.getDefaultsPackageContent(),
UUID.randomUUID(),
ImmutableMap.<String, String>of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppOptionsTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppOptionsTest.java
new file mode 100644
index 0000000..c34e0cf
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppOptionsTest.java
@@ -0,0 +1,52 @@
+// Copyright 2015 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.rules.cpp;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.devtools.build.lib.analysis.util.DefaultsPackageUtil;
+import com.google.devtools.build.lib.testutil.TestConstants;
+import com.google.devtools.common.options.OptionsParsingException;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Tests {@link CppOptions}.
+ */
+@RunWith(JUnit4.class)
+public class CppOptionsTest {
+
+ @Test
+ public void testGetDefaultsPackage() throws Exception {
+ String content = DefaultsPackageUtil.getDefaultsPackageForOptions(CppOptions.class);
+ assertThat(content).contains("filegroup(name = 'crosstool',\n"
+ + " srcs = ['" + TestConstants.TOOLS_REPOSITORY + "//tools/cpp:toolchain'])");
+ }
+
+ @Test
+ public void testGetDefaultsPackageHostCrosstoolTop() throws OptionsParsingException {
+ String content = DefaultsPackageUtil.getDefaultsPackageForOptions(
+ CppOptions.class, "--host_crosstool_top=//some/package:crosstool");
+ assertThat(content).contains("//some/package:crosstool");
+ }
+
+ @Test
+ public void testGetDefaultsPackageGrteTop() throws OptionsParsingException {
+ String content = DefaultsPackageUtil.getDefaultsPackageForOptions(
+ CppOptions.class, "--grte_top=//some/grte:other");
+ assertThat(content).contains("//some/grte:everything");
+ }
+}
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
index 1ce0c22..1a3dcdd 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
@@ -88,6 +88,7 @@
BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY),
packageCacheOptions,
Options.getDefaults(SkylarkSemanticsOptions.class),
+ "",
UUID.randomUUID(),
ImmutableMap.<String, String>of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
@@ -319,6 +320,7 @@
BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY),
packageCacheOptions,
Options.getDefaults(SkylarkSemanticsOptions.class),
+ "",
UUID.randomUUID(),
ImmutableMap.<String, String>of(),
tsgm);
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
index 56efe49..18e5ae4 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsFunctionSmartNegationTest.java
@@ -104,6 +104,7 @@
BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY),
Options.getDefaults(PackageCacheOptions.class),
Options.getDefaults(SkylarkSemanticsOptions.class),
+ AnalysisMock.get().getDefaultsPackageContent(),
UUID.randomUUID(),
ImmutableMap.<String, String>of(),
new TimestampGranularityMonitor(null));
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java
index f892ae6..bb30090 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java
@@ -412,6 +412,7 @@
BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY),
packageCacheOptions,
Options.getDefaults(SkylarkSemanticsOptions.class),
+ loadingMock.getDefaultsPackageContent(),
UUID.randomUUID(),
ImmutableMap.<String, String>of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTestCase.java
index 19ee7e9..fae9d22 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTestCase.java
@@ -237,7 +237,7 @@
@Before
public final void initializeVisitor() throws Exception {
- setUpSkyframe(ConstantRuleVisibility.PRIVATE);
+ setUpSkyframe(ConstantRuleVisibility.PRIVATE, loadingMock.getDefaultsPackageContent());
this.visitor = skyframeExecutor.pkgLoader();
}
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
index 0d7024d..58107d6 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
@@ -170,6 +170,7 @@
BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY),
packageCacheOptions,
Options.getDefaults(SkylarkSemanticsOptions.class),
+ "",
UUID.randomUUID(),
ImmutableMap.<String, String>of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunctionTest.java
index a695207..7ffc718 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunctionTest.java
@@ -62,6 +62,7 @@
BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY),
packageCacheOptions,
Options.getDefaults(SkylarkSemanticsOptions.class),
+ "",
UUID.randomUUID(),
ImmutableMap.<String, String>of(),
new TimestampGranularityMonitor(BlazeClock.instance()));
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageBuilderHelperForTesting.java b/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageBuilderHelperForTesting.java
index 601d6fe..e27bc4d 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageBuilderHelperForTesting.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageBuilderHelperForTesting.java
@@ -89,6 +89,18 @@
Iterables.transform(newlyLoadedPkg.getTargets().values(), TARGET_TO_LABEL));
if (!targetsInPkg.equals(targetsInNewlyLoadedPkg)) {
Sets.SetView<Label> unsatisfied = Sets.difference(targetsInPkg, targetsInNewlyLoadedPkg);
+ if (pkgId.compareTo(PackageIdentifier.createInMainRepo("tools/defaults")) == 0
+ && unsatisfied.isEmpty()) {
+ // The tools/defaults package is populated from command-line options
+ // (=configuration fragments) which the user specifies in tests using
+ // BuildViewTestCase.useConfiguration().
+ // We'd like PackageLoader to work as much as possible without duplicating the entire
+ // configuration of Bazel, so we prefer not to pass these flags to PackageLoader.
+ // As a result, the contents of tools/defaults might differ.
+ // As long as PackageLoader returns a superset of what Bazel returns, everything should load
+ // fine.
+ return;
+ }
Sets.SetView<Label> unexpected = Sets.difference(targetsInNewlyLoadedPkg, targetsInPkg);
throw new IllegalStateException(
String.format(