diff options
Diffstat (limited to 'src')
14 files changed, 172 insertions, 51 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/PackageManager.java b/src/main/java/com/google/devtools/build/lib/pkgcache/PackageManager.java index d38e16e714..08761f32be 100644 --- a/src/main/java/com/google/devtools/build/lib/pkgcache/PackageManager.java +++ b/src/main/java/com/google/devtools/build/lib/pkgcache/PackageManager.java @@ -14,14 +14,13 @@ package com.google.devtools.build.lib.pkgcache; import com.google.devtools.build.lib.concurrent.ThreadSafety; -import com.google.devtools.build.lib.packages.CachingPackageLocator; import java.io.PrintStream; /** - * A PackageManager keeps state about loaded packages around for quick lookup, and provides - * related functionality: Recursive package finding, loaded package checking, etc. + * A PackageManager keeps state about loaded packages around for quick lookup, and provides related + * functionality: Recursive package finding, loaded package checking, etc. */ -public interface PackageManager extends PackageProvider, CachingPackageLocator { +public interface PackageManager extends PackageProvider { PackageManagerStatistics getAndClearStatistics(); /** diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/PackageProvider.java b/src/main/java/com/google/devtools/build/lib/pkgcache/PackageProvider.java index e04a7c6f5f..f42ea3dd9e 100644 --- a/src/main/java/com/google/devtools/build/lib/pkgcache/PackageProvider.java +++ b/src/main/java/com/google/devtools/build/lib/pkgcache/PackageProvider.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.pkgcache; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.events.ExtendedEventHandler; +import com.google.devtools.build.lib.packages.CachingPackageLocator; import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.Package; @@ -24,7 +25,7 @@ import com.google.devtools.build.lib.packages.Package; * * <p><b>Concurrency</b>: Implementations should be thread safe for {@link #getPackage}. */ -public interface PackageProvider extends TargetProvider { +public interface PackageProvider extends TargetProvider, CachingPackageLocator { /** * Returns the {@link Package} named "packageName". If there is no such package (e.g. {@code diff --git a/src/main/java/com/google/devtools/build/lib/query2/BlazeQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/BlazeQueryEnvironment.java index 1fbc8d9e88..5445d40fc3 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/BlazeQueryEnvironment.java +++ b/src/main/java/com/google/devtools/build/lib/query2/BlazeQueryEnvironment.java @@ -33,9 +33,9 @@ import com.google.devtools.build.lib.packages.OutputFile; import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.Target; +import com.google.devtools.build.lib.pkgcache.PackageProvider; import com.google.devtools.build.lib.pkgcache.TargetEdgeObserver; import com.google.devtools.build.lib.pkgcache.TargetPatternEvaluator; -import com.google.devtools.build.lib.pkgcache.TargetProvider; import com.google.devtools.build.lib.pkgcache.TransitivePackageLoader; import com.google.devtools.build.lib.query2.engine.Callback; import com.google.devtools.build.lib.query2.engine.DigraphQueryEvalResult; @@ -50,6 +50,7 @@ import com.google.devtools.build.lib.query2.engine.QueryUtil.UniquifierImpl; import com.google.devtools.build.lib.query2.engine.SkyframeRestartQueryException; import com.google.devtools.build.lib.query2.engine.ThreadSafeOutputFormatterCallback; import com.google.devtools.build.lib.query2.engine.Uniquifier; +import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import java.io.IOException; import java.util.ArrayList; @@ -70,7 +71,7 @@ public class BlazeQueryEnvironment extends AbstractBlazeQueryEnvironment<Target> private final Map<String, Set<Target>> resolvedTargetPatterns = new HashMap<>(); private final TargetPatternEvaluator targetPatternEvaluator; private final TransitivePackageLoader transitivePackageLoader; - private final TargetProvider targetProvider; + private final PackageProvider packageProvider; private final Digraph<Target> graph = new Digraph<>(); private final ErrorPrintingTargetEdgeErrorObserver errorObserver; private final LabelVisitor labelVisitor; @@ -92,7 +93,7 @@ public class BlazeQueryEnvironment extends AbstractBlazeQueryEnvironment<Target> */ BlazeQueryEnvironment( TransitivePackageLoader transitivePackageLoader, - TargetProvider targetProvider, + PackageProvider packageProvider, TargetPatternEvaluator targetPatternEvaluator, boolean keepGoing, boolean strictScope, @@ -104,10 +105,10 @@ public class BlazeQueryEnvironment extends AbstractBlazeQueryEnvironment<Target> super(keepGoing, strictScope, labelFilter, eventHandler, settings, extraFunctions); this.targetPatternEvaluator = targetPatternEvaluator; this.transitivePackageLoader = transitivePackageLoader; - this.targetProvider = targetProvider; + this.packageProvider = packageProvider; this.errorObserver = new ErrorPrintingTargetEdgeErrorObserver(this.eventHandler); this.loadingPhaseThreads = loadingPhaseThreads; - this.labelVisitor = new LabelVisitor(targetProvider, dependencyFilter); + this.labelVisitor = new LabelVisitor(packageProvider, dependencyFilter); } @Override @@ -365,7 +366,7 @@ public class BlazeQueryEnvironment extends AbstractBlazeQueryEnvironment<Target> private Target getTargetOrThrow(Label label) throws NoSuchThingException, SkyframeRestartQueryException, InterruptedException { - Target target = targetProvider.getTarget(eventHandler, label); + Target target = packageProvider.getTarget(eventHandler, label); if (target == null) { throw new SkyframeRestartQueryException(); } @@ -406,15 +407,21 @@ public class BlazeQueryEnvironment extends AbstractBlazeQueryEnvironment<Target> } for (Label subinclude : extensions) { - addIfUniqueLabel(getSubincludeTarget(subinclude, pkg), seenLabels, dependentFiles); + + Node<Target> subincludeTarget = getSubincludeTarget(subinclude, pkg); + addIfUniqueLabel(subincludeTarget, seenLabels, dependentFiles); // Also add the BUILD file of the subinclude. if (buildFiles) { + Path buildFileForSubinclude = + packageProvider.getBuildFileForPackage( + subincludeTarget.getLabel().getLabel().getPackageIdentifier()); + Label buildFileLabel = + Label.createUnvalidated( + subincludeTarget.getLabel().getLabel().getPackageIdentifier(), + buildFileForSubinclude.getBaseName()); addIfUniqueLabel( - getSubincludeTarget( - Label.createUnvalidated(subinclude.getPackageIdentifier(), "BUILD"), pkg), - seenLabels, - dependentFiles); + getNode(new FakeLoadTarget(buildFileLabel, pkg)), seenLabels, dependentFiles); } } } @@ -440,7 +447,7 @@ public class BlazeQueryEnvironment extends AbstractBlazeQueryEnvironment<Target> } } - private Node<Target> getSubincludeTarget(final Label label, Package pkg) { + private Node<Target> getSubincludeTarget(Label label, Package pkg) { return getNode(new FakeLoadTarget(label, pkg)); } diff --git a/src/main/java/com/google/devtools/build/lib/query2/QueryEnvironmentFactory.java b/src/main/java/com/google/devtools/build/lib/query2/QueryEnvironmentFactory.java index 0f52e88735..da08aa2798 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/QueryEnvironmentFactory.java +++ b/src/main/java/com/google/devtools/build/lib/query2/QueryEnvironmentFactory.java @@ -19,9 +19,9 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.events.ExtendedEventHandler; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.Target; +import com.google.devtools.build.lib.pkgcache.PackageProvider; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; import com.google.devtools.build.lib.pkgcache.TargetPatternEvaluator; -import com.google.devtools.build.lib.pkgcache.TargetProvider; import com.google.devtools.build.lib.pkgcache.TransitivePackageLoader; import com.google.devtools.build.lib.query2.engine.QueryEnvironment.QueryFunction; import com.google.devtools.build.lib.query2.engine.QueryEnvironment.Setting; @@ -36,7 +36,7 @@ public class QueryEnvironmentFactory { public AbstractBlazeQueryEnvironment<Target> create( TransitivePackageLoader transitivePackageLoader, WalkableGraphFactory graphFactory, - TargetProvider targetProvider, + PackageProvider packageProvider, TargetPatternEvaluator targetPatternEvaluator, boolean keepGoing, boolean strictScope, @@ -63,9 +63,17 @@ public class QueryEnvironmentFactory { packagePath, blockUniverseEvaluationErrors); } else { - return new BlazeQueryEnvironment(transitivePackageLoader, targetProvider, - targetPatternEvaluator, keepGoing, strictScope, loadingPhaseThreads, labelFilter, - eventHandler, settings, functions); + return new BlazeQueryEnvironment( + transitivePackageLoader, + packageProvider, + targetPatternEvaluator, + keepGoing, + strictScope, + loadingPhaseThreads, + labelFilter, + eventHandler, + settings, + functions); } } diff --git a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java index 35c412ffc9..f3bdc78760 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java +++ b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java @@ -99,6 +99,7 @@ import com.google.devtools.build.lib.skyframe.TargetPatternValue; import com.google.devtools.build.lib.skyframe.TargetPatternValue.TargetPatternKey; import com.google.devtools.build.lib.skyframe.TransitiveTraversalValue; import com.google.devtools.build.lib.util.Pair; +import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.RootedPath; import com.google.devtools.build.skyframe.EvaluationResult; @@ -760,15 +761,26 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment<Target> } for (Label subinclude : extensions) { - addIfUniqueLabel(getSubincludeTarget(subinclude, pkg), seenLabels, dependentFiles); + Target subincludeTarget = getSubincludeTarget(subinclude, pkg); + addIfUniqueLabel(subincludeTarget, seenLabels, dependentFiles); + + // Also add the BUILD file of the subinclude. if (buildFiles) { - // Also add the BUILD file of the subinclude. - addIfUniqueLabel( - getSubincludeTarget( - Label.createUnvalidated(subinclude.getPackageIdentifier(), "BUILD"), pkg), - seenLabels, - dependentFiles); + Path buildFileForSubinclude = null; + try { + buildFileForSubinclude = + pkgPath.getPackageBuildFile(subincludeTarget.getLabel().getPackageIdentifier()); + } catch (NoSuchPackageException e) { + throw new QueryException( + subincludeTarget.getLabel().getPackageIdentifier() + " does not exist in graph"); + } + Label buildFileLabel = + Label.createUnvalidated( + subincludeTarget.getLabel().getPackageIdentifier(), + buildFileForSubinclude.getBaseName()); + + addIfUniqueLabel(new FakeLoadTarget(buildFileLabel, pkg), seenLabels, dependentFiles); } } } @@ -782,7 +794,7 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment<Target> } } - private static Target getSubincludeTarget(Label label, Package pkg) { + private Target getSubincludeTarget(Label label, Package pkg) { return new FakeLoadTarget(label, pkg); } @@ -793,30 +805,36 @@ public class SkyQueryEnvironment extends AbstractBlazeQueryEnvironment<Target> } @ThreadSafe - @Override - public Target getTarget(Label label) - throws TargetNotFoundException, QueryException, InterruptedException { - SkyKey packageKey = PackageValue.key(label.getPackageIdentifier()); - try { + private Package getPackage(PackageIdentifier packageIdentifier) + throws InterruptedException, QueryException, NoSuchPackageException { + SkyKey packageKey = PackageValue.key(packageIdentifier); PackageValue packageValue = (PackageValue) graph.getValue(packageKey); if (packageValue != null) { Package pkg = packageValue.getPackage(); if (pkg.containsErrors()) { - throw new BuildFileContainsErrorsException(label.getPackageIdentifier()); + throw new BuildFileContainsErrorsException(packageIdentifier); } - return packageValue.getPackage().getTarget(label.getName()); + return pkg; } else { - NoSuchThingException exception = (NoSuchThingException) graph.getException(packageKey); + NoSuchPackageException exception = (NoSuchPackageException) graph.getException(packageKey); if (exception != null) { throw exception; } if (graph.isCycle(packageKey)) { - throw new NoSuchPackageException( - label.getPackageIdentifier(), "Package depends on a cycle"); + throw new NoSuchPackageException(packageIdentifier, "Package depends on a cycle"); } else { throw new QueryException(packageKey + " does not exist in graph"); } } + } + + @ThreadSafe + @Override + public Target getTarget(Label label) + throws TargetNotFoundException, QueryException, InterruptedException { + try { + Package pkg = getPackage(label.getPackageIdentifier()); + return pkg.getTarget(label.getName()); } catch (NoSuchThingException e) { throw new TargetNotFoundException(e); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java index f14db5ab54..af785a57fd 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java +++ b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java @@ -77,6 +77,7 @@ import com.google.devtools.build.lib.skyframe.TransitiveTargetValue; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.util.Fingerprint; import com.google.devtools.build.lib.util.Pair; +import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyFunction; @@ -560,6 +561,15 @@ public class GenQuery implements RuleConfiguredTargetFactory { public boolean isPackage(ExtendedEventHandler eventHandler, PackageIdentifier packageName) { throw new UnsupportedOperationException(); } + + @Override + public Path getBuildFileForPackage(PackageIdentifier packageId) { + Package pkg = pkgMap.get(packageId); + if (pkg == null) { + return null; + } + return pkg.getBuildFile().getPath(); + } } private static class BrokenQueryScopeException extends Exception { diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java index 81c7c7afe2..285c45fa1c 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java @@ -52,9 +52,11 @@ import java.util.Map; public final class EnvironmentBackedRecursivePackageProvider implements RecursivePackageProvider { private final Environment env; + private final PathPackageLocator pkgPath; - public EnvironmentBackedRecursivePackageProvider(Environment env) { + public EnvironmentBackedRecursivePackageProvider(Environment env, PathPackageLocator pkgPath) { this.env = env; + this.pkgPath = pkgPath; } @Override @@ -94,6 +96,15 @@ public final class EnvironmentBackedRecursivePackageProvider implements Recursiv } @Override + public Path getBuildFileForPackage(PackageIdentifier packageName) { + try { + return pkgPath.getPackageBuildFile(packageName); + } catch (NoSuchPackageException e) { + return null; + } + } + + @Override public boolean isPackage(ExtendedEventHandler eventHandler, PackageIdentifier packageId) throws MissingDepException, InterruptedException { SkyKey packageLookupKey = PackageLookupValue.key(packageId); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java index 7985fcf965..d7e74ffae5 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java @@ -132,6 +132,14 @@ public final class GraphBackedRecursivePackageProvider implements RecursivePacka return pkgResults.build(); } + @Override + public Path getBuildFileForPackage(PackageIdentifier packageName) { + try { + return pkgPath.getPackageBuildFile(packageName); + } catch (NoSuchPackageException e) { + return null; + } + } @Override public boolean isPackage(ExtendedEventHandler eventHandler, PackageIdentifier packageName) diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java index a137551f5e..fd0f08fc44 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternFunction.java @@ -144,7 +144,7 @@ public class PrepareDepsOfPatternFunction implements SkyFunction { public DepsOfPatternPreparer(Environment env, PathPackageLocator pkgPath) { this.env = env; - this.packageProvider = new EnvironmentBackedRecursivePackageProvider(env); + this.packageProvider = new EnvironmentBackedRecursivePackageProvider(env, pkgPath); this.pkgPath = pkgPath; } 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 f93c96e613..4e68fb7818 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 @@ -260,7 +260,9 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { SkyFunctions.TARGET_PATTERN, SkyFunctions.PREPARE_DEPS_OF_PATTERN, SkyFunctions.WORKSPACE_FILE, - SkyFunctions.EXTERNAL_PACKAGE); + SkyFunctions.EXTERNAL_PACKAGE, + SkyFunctions.TARGET_PATTERN, + SkyFunctions.TARGET_PATTERN_PHASE); @Override protected void onNewPackageLocator(PathPackageLocator oldLocator, PathPackageLocator pkgLocator) { 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 6ab30a3372..1e89fe5ff1 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 @@ -374,7 +374,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { SkyFunctions.SKYLARK_IMPORTS_LOOKUP, newSkylarkImportLookupFunction(ruleClassProvider, pkgFactory)); map.put(SkyFunctions.GLOB, newGlobFunction()); - map.put(SkyFunctions.TARGET_PATTERN, new TargetPatternFunction()); + map.put(SkyFunctions.TARGET_PATTERN, new TargetPatternFunction(pkgLocator)); map.put(SkyFunctions.PREPARE_DEPS_OF_PATTERNS, new PrepareDepsOfPatternsFunction()); map.put(SkyFunctions.PREPARE_DEPS_OF_PATTERN, new PrepareDepsOfPatternFunction(pkgLocator)); map.put( @@ -387,7 +387,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { map.put(SkyFunctions.BLACKLISTED_PACKAGE_PREFIXES, new BlacklistedPackagePrefixesFunction()); map.put(SkyFunctions.TESTS_IN_SUITE, new TestsInSuiteFunction()); map.put(SkyFunctions.TEST_SUITE_EXPANSION, new TestSuiteExpansionFunction()); - map.put(SkyFunctions.TARGET_PATTERN_PHASE, new TargetPatternPhaseFunction()); + map.put(SkyFunctions.TARGET_PATTERN_PHASE, new TargetPatternPhaseFunction(pkgLocator)); map.put(SkyFunctions.RECURSIVE_PKG, new RecursivePkgFunction(directories)); map.put( SkyFunctions.PACKAGE, diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java index b97e51a509..b4a012fcdc 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java @@ -25,6 +25,7 @@ import com.google.devtools.build.lib.collect.compacthashset.CompactHashSet; import com.google.devtools.build.lib.concurrent.MultisetSemaphore; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.pkgcache.ParsingFailedEvent; +import com.google.devtools.build.lib.pkgcache.PathPackageLocator; import com.google.devtools.build.lib.skyframe.EnvironmentBackedRecursivePackageProvider.MissingDepException; import com.google.devtools.build.lib.util.BatchCallback; import com.google.devtools.build.lib.vfs.PathFragment; @@ -33,6 +34,7 @@ import com.google.devtools.build.skyframe.SkyFunctionException; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; import javax.annotation.Nullable; /** @@ -41,7 +43,10 @@ import javax.annotation.Nullable; */ public class TargetPatternFunction implements SkyFunction { - public TargetPatternFunction() { + private final AtomicReference<PathPackageLocator> pkgPath; + + public TargetPatternFunction(AtomicReference<PathPackageLocator> pkgPath) { + this.pkgPath = pkgPath; } @Override @@ -52,7 +57,7 @@ public class TargetPatternFunction implements SkyFunction { ResolvedTargets<Target> resolvedTargets; try { EnvironmentBackedRecursivePackageProvider provider = - new EnvironmentBackedRecursivePackageProvider(env); + new EnvironmentBackedRecursivePackageProvider(env, pkgPath.get()); RecursivePackageProviderBackedTargetPatternResolver resolver = new RecursivePackageProviderBackedTargetPatternResolver( provider, diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java index b3fd6e92b5..5a005827b0 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseFunction.java @@ -28,6 +28,7 @@ import com.google.devtools.build.lib.pkgcache.CompileOneDependencyTransformer; import com.google.devtools.build.lib.pkgcache.FilteringPolicies; import com.google.devtools.build.lib.pkgcache.LoadingPhaseRunner; import com.google.devtools.build.lib.pkgcache.ParsingFailedEvent; +import com.google.devtools.build.lib.pkgcache.PathPackageLocator; import com.google.devtools.build.lib.pkgcache.TargetParsingCompleteEvent; import com.google.devtools.build.lib.pkgcache.TargetProvider; import com.google.devtools.build.lib.pkgcache.TestFilter; @@ -45,6 +46,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; import javax.annotation.Nullable; /** @@ -53,6 +55,12 @@ import javax.annotation.Nullable; */ final class TargetPatternPhaseFunction implements SkyFunction { + private final AtomicReference<PathPackageLocator> pkgPath; + + public TargetPatternPhaseFunction(AtomicReference<PathPackageLocator> pkgPath) { + this.pkgPath = pkgPath; + } + @Override public TargetPatternPhaseValue compute(SkyKey key, Environment env) throws InterruptedException { TargetPatternPhaseKey options = (TargetPatternPhaseKey) key.argument(); @@ -74,7 +82,7 @@ final class TargetPatternPhaseFunction implements SkyFunction { } // Determine targets to build: - ResolvedTargets<Target> targets = getTargetsToBuild(env, options); + ResolvedTargets<Target> targets = getTargetsToBuild(env, options, pkgPath.get()); // If the --build_tests_only option was specified or we want to run tests, we need to determine // the list of targets to test. For that, we remove manual tests and apply the command-line @@ -197,7 +205,8 @@ final class TargetPatternPhaseFunction implements SkyFunction { * @param options the command-line arguments in structured form */ private static ResolvedTargets<Target> getTargetsToBuild( - Environment env, TargetPatternPhaseKey options) throws InterruptedException { + Environment env, TargetPatternPhaseKey options, PathPackageLocator pkgPath) + throws InterruptedException { List<TargetPatternKey> patternSkyKeys = new ArrayList<>(); for (TargetPatternSkyKeyOrException keyOrException : TargetPatternValue.keys( @@ -249,7 +258,7 @@ final class TargetPatternPhaseFunction implements SkyFunction { .filter(TargetUtils.tagFilter(options.getBuildTargetFilter())) .build(); if (options.getCompileOneDependency()) { - TargetProvider targetProvider = new EnvironmentBackedRecursivePackageProvider(env); + TargetProvider targetProvider = new EnvironmentBackedRecursivePackageProvider(env, pkgPath); try { return new CompileOneDependencyTransformer(targetProvider) .transformCompileOneDependency(env.getListener(), result); diff --git a/src/test/shell/integration/bazel_query_test.sh b/src/test/shell/integration/bazel_query_test.sh index eed50de082..f5de27c8e5 100755 --- a/src/test/shell/integration/bazel_query_test.sh +++ b/src/test/shell/integration/bazel_query_test.sh @@ -26,6 +26,7 @@ add_to_bazelrc "build --package_path=%workspace%" #### TESTS ############################################################# function test_does_not_fail_horribly() { + rm -rf peach mkdir -p peach cat > peach/BUILD <<EOF sh_library(name='brighton', deps=[':harken']) @@ -39,6 +40,7 @@ EOF } function test_visibility_affects_xml_output() { + rm -rf kiwi mkdir -p kiwi cat > kiwi/BUILD <<EOF @@ -71,6 +73,7 @@ EOF } function test_visibility_affects_proto_output() { + rm -rf kiwi mkdir -p kiwi cat > kiwi/BUILD <<EOF @@ -97,6 +100,8 @@ EOF } function make_depth_tests() { + rm -rf depth + rm -rf depth2 mkdir -p depth depth2 || die "Could not create test directory" cat > "depth/BUILD" <<EOF sh_binary(name = 'one', srcs = ['one.sh'], deps = [':two']) @@ -154,6 +159,7 @@ function test_depth_query_idempotence_unordered() { } function test_universe_scope_with_without_star() { + rm -rf foo mkdir -p foo || fail "Couldn't mkdir" echo "sh_library(name = 'foo')" > foo/BUILD || fail "Couldn't write BUILD" bazel query --order_output=no \ @@ -171,6 +177,8 @@ function test_universe_scope_with_without_star() { } function test_outside_universe_ok() { + rm -rf foo + rm -rf bar mkdir -p foo bar || fail "Couldn't mkdir" echo "sh_library(name = 'foo', deps = ['//bar:bar'])" > foo/BUILD || fail "Couldn't write BUILD" @@ -209,6 +217,8 @@ function test_minrank_le_depth_bound() { } function test_skylark_dep_in_sky_query() { + rm -rf foo + rm -rf bar mkdir -p foo bar || fail "Couldn't make directories" echo 'load("//bar:fakerule.bzl", "const")' > foo/BUILD || fail "Couldn't write" touch bar/BUILD || fail "Couldn't touch bar/BUILD" @@ -221,6 +231,7 @@ function test_skylark_dep_in_sky_query() { } function test_skylark_regular_file_not_included_in_rbuildfiles() { + rm -rf foo mkdir -p foo || fail "Couldn't make directories" echo "baz" > "foo/baz.bzl" || fail "Couldn't create baz.bzl" echo 'sh_library(name = "foo", srcs = ["baz.bzl"])' > foo/BUILD @@ -233,6 +244,7 @@ function test_skylark_regular_file_not_included_in_rbuildfiles() { } function test_skylark_symlink_source_not_included_in_rbuildfiles() { + rm -rf foo mkdir -p foo || fail "Couldn't make directories" echo "moo" > "foo/moo" || fail "Couldn't create moo" ln -s "foo/moo" "foo/baz.bzl" || fail "Couldn't create baz.bzl symlink" @@ -246,6 +258,7 @@ function test_skylark_symlink_source_not_included_in_rbuildfiles() { } function test_skylark_symlink_target_not_included_in_rbuildfiles() { + rm -rf foo mkdir -p foo || fail "Couldn't make directories" echo "baz" > "foo/baz.bzl" || fail "Couldn't create baz.bzl" ln -s "foo/baz.bzl" "foo/Moo.java" || fail "Couldn't create Moo.java symlink" @@ -259,6 +272,7 @@ function test_skylark_symlink_target_not_included_in_rbuildfiles() { } function test_skylark_glob_regular_file_not_included_in_rbuildfiles() { + rm -rf foo mkdir -p foo || fail "Couldn't make directories" echo "baz" > "foo/baz.bzl" || fail "Couldn't create baz.bzl" echo 'sh_library(name = "foo", srcs = glob(["*.bzl"]))' > foo/BUILD @@ -271,6 +285,7 @@ function test_skylark_glob_regular_file_not_included_in_rbuildfiles() { } function test_skylark_glob_symlink_source_not_included_in_rbuildfiles() { + rm -rf foo mkdir -p foo || fail "Couldn't make directories" echo "moo" > "foo/moo" || fail "Couldn't create moo" ln -s "foo/moo" "foo/baz.bzl" || fail "Couldn't create baz.bzl symlink" @@ -284,6 +299,7 @@ function test_skylark_glob_symlink_source_not_included_in_rbuildfiles() { } function test_skylark_glob_symlink_target_not_included_in_rbuildfiles() { + rm -rf foo mkdir -p foo || fail "Couldn't make directories" echo "baz" > "foo/baz.bzl" || fail "Couldn't create baz.bzl" ln -s "foo/baz.bzl" "foo/Moo.java" || fail "Couldn't create Moo.java symlink" @@ -297,6 +313,7 @@ function test_skylark_glob_symlink_target_not_included_in_rbuildfiles() { } function test_skylark_recursive_glob_regular_file_not_included_in_rbuildfiles() { + rm -rf foo mkdir -p foo/bar || fail "Couldn't make directories" echo "baz" > "foo/bar/baz.bzl" || fail "Couldn't create baz.bzl" echo 'sh_library(name = "foo", srcs = glob(["**/*.bzl"]))' > foo/BUILD @@ -309,6 +326,7 @@ function test_skylark_recursive_glob_regular_file_not_included_in_rbuildfiles() } function test_skylark_recursive_glob_symlink_source_not_included_in_rbuildfiles() { + rm -rf foo mkdir -p foo/bar || fail "Couldn't make directories" echo "moo" > "foo/moo" || fail "Couldn't create moo" ln -s "foo/moo" "foo/bar/baz.bzl" || fail "Couldn't create baz.bzl symlink" @@ -322,6 +340,7 @@ function test_skylark_recursive_glob_symlink_source_not_included_in_rbuildfiles( } function test_skylark_recursive_glob_symlink_target_not_included_in_rbuildfiles() { + rm -rf foo mkdir -p foo/bar || fail "Couldn't make directories" echo "baz" > "foo/bar/baz.bzl" || fail "Couldn't create baz.bzl" ln -s "foo/bar/baz.bzl" "foo/Moo.java" || fail "Couldn't create Moo.java symlink" @@ -335,6 +354,7 @@ function test_skylark_recursive_glob_symlink_target_not_included_in_rbuildfiles( } function test_skylark_subdir_dep_in_sky_query() { + rm -rf foo mkdir -p foo bar/baz || fail "Couldn't make directories" echo 'load("//bar:baz/fakerule.bzl", "const")' > foo/BUILD || fail "Couldn't write" touch bar/BUILD || fail "Couldn't touch bar/BUILD" @@ -347,6 +367,7 @@ function test_skylark_subdir_dep_in_sky_query() { } function test_parent_independent_of_child() { + rm -rf foo mkdir -p foo/subdir || fail "Couldn't make directories" echo 'sh_library(name = "sh", data = glob(["**"]))' > foo/BUILD || fail "Couldn't write" @@ -358,6 +379,7 @@ function test_parent_independent_of_child() { } function test_does_not_fail_horribly_with_file() { + rm -rf peach mkdir -p peach cat > peach/BUILD <<EOF sh_library(name='brighton', deps=[':harken']) @@ -372,7 +394,8 @@ EOF } function test_location_output_not_allowed_with_buildfiles_or_loadfiles() { - mkdir foo + rm -rf foo + mkdir -p foo cat > foo/bzl.bzl <<EOF x = 2 EOF @@ -414,6 +437,26 @@ EOF expect_log "//foo/bar:t2" } +function test_buildfiles_with_build_bazel() { + if [ "${PRODUCT_NAME}" != "bazel" ]; then + return 0 + fi + rm -rf foo + mkdir -p foo + cat > foo/bzl.bzl <<EOF +x = 2 +EOF + cat > foo/BUILD.bazel <<EOF +load('//foo:bzl.bzl', 'x') +sh_library(name='foo') +EOF + + bazel query 'buildfiles(//foo)' >& $TEST_log || fail "Expected success" + expect_log "//foo:bzl.bzl$" + expect_log "//foo:BUILD.bazel$" + expect_not_log "//foo:BUILD$" +} + function tear_down() { bazel shutdown } |