use of com.facebook.buck.rules.SourcePathRuleFinder in project buck by facebook.
the class AndroidResourceDescription method createSymlinkTree.
private SymlinkTree createSymlinkTree(SourcePathRuleFinder ruleFinder, BuildRuleParams params, Optional<Either<SourcePath, ImmutableSortedMap<String, SourcePath>>> symlinkAttribute, String outputDirName) {
ImmutableMap<Path, SourcePath> links = ImmutableMap.of();
if (symlinkAttribute.isPresent()) {
if (symlinkAttribute.get().isLeft()) {
// If our resources are coming from a `PathSourcePath`, we collect only the inputs we care
// about and pass those in separately, so that that `AndroidResource` rule knows to only
// hash these into it's rule key.
// TODO(k21): This is deprecated and should be disabled or removed.
// Accessing the filesystem during rule creation is problematic because the accesses are
// not cached or tracked in any way.
Preconditions.checkArgument(symlinkAttribute.get().getLeft() instanceof PathSourcePath, "Resource or asset symlink tree can only be built for a PathSourcePath");
PathSourcePath path = (PathSourcePath) symlinkAttribute.get().getLeft();
links = collectInputFiles(path.getFilesystem(), path.getRelativePath());
} else {
links = RichStream.from(symlinkAttribute.get().getRight().entrySet()).map(e -> new AbstractMap.SimpleEntry<>(Paths.get(e.getKey()), e.getValue())).filter(e -> isPossibleResourcePath(e.getKey())).collect(MoreCollectors.toImmutableMap(e -> e.getKey(), e -> e.getValue()));
}
}
Path symlinkTreeRoot = BuildTargets.getGenPath(params.getProjectFilesystem(), params.getBuildTarget(), "%s").resolve(outputDirName);
return new SymlinkTree(params.getBuildTarget(), params.getProjectFilesystem(), symlinkTreeRoot, links, ruleFinder);
}
use of com.facebook.buck.rules.SourcePathRuleFinder in project buck by facebook.
the class ApkGenruleDescription method createBuildRule.
@Override
protected <A extends ApkGenruleDescription.Arg> BuildRule createBuildRule(BuildRuleParams params, BuildRuleResolver resolver, A args, Optional<com.facebook.buck.rules.args.Arg> cmd, Optional<com.facebook.buck.rules.args.Arg> bash, Optional<com.facebook.buck.rules.args.Arg> cmdExe) {
final BuildRule apk = resolver.getRule(args.apk);
if (!(apk instanceof HasInstallableApk)) {
throw new HumanReadableException("The 'apk' argument of %s, %s, must correspond to an " + "installable rule, such as android_binary() or apk_genrule().", params.getBuildTarget(), args.apk.getFullyQualifiedName());
}
HasInstallableApk installableApk = (HasInstallableApk) apk;
final Supplier<ImmutableSortedSet<BuildRule>> originalExtraDeps = params.getExtraDeps();
SourcePathRuleFinder ruleFinder = new SourcePathRuleFinder(resolver);
return new ApkGenrule(params.copyReplacingExtraDeps(Suppliers.memoize(() -> ImmutableSortedSet.<BuildRule>naturalOrder().addAll(originalExtraDeps.get()).add(installableApk).build())), ruleFinder, args.srcs, cmd, bash, cmdExe, args.type.isPresent() ? args.type : Optional.of("apk"), installableApk.getSourcePathToOutput());
}
use of com.facebook.buck.rules.SourcePathRuleFinder in project buck by facebook.
the class AndroidLibraryDescription method createBuildRule.
@Override
public <A extends Arg> BuildRule createBuildRule(TargetGraph targetGraph, BuildRuleParams params, BuildRuleResolver resolver, A args) throws NoSuchBuildTargetException {
if (params.getBuildTarget().getFlavors().contains(JavaLibrary.SRC_JAR)) {
return new JavaSourceJar(params, args.srcs, args.mavenCoords);
}
SourcePathRuleFinder ruleFinder = new SourcePathRuleFinder(resolver);
JavacOptions javacOptions = JavacOptionsFactory.create(defaultOptions, params, resolver, ruleFinder, args);
final ImmutableSet.Builder<BuildRule> queriedDepsBuilder = ImmutableSet.builder();
if (args.depsQuery.isPresent()) {
queriedDepsBuilder.addAll(QueryUtils.resolveDepQuery(params, args.depsQuery.get(), resolver, targetGraph).collect(Collectors.toList()));
}
final ImmutableSet<BuildRule> queriedDeps = queriedDepsBuilder.build();
AndroidLibraryGraphEnhancer graphEnhancer = new AndroidLibraryGraphEnhancer(params.getBuildTarget(), params.copyReplacingExtraDeps(Suppliers.ofInstance(ImmutableSortedSet.<BuildRule>naturalOrder().addAll(queriedDeps).addAll(resolver.getAllRules(args.exportedDeps)).build())), javacOptions, DependencyMode.FIRST_ORDER, /* forceFinalResourceIds */
false, args.resourceUnionPackage, args.finalRName, false);
boolean hasDummyRDotJavaFlavor = params.getBuildTarget().getFlavors().contains(DUMMY_R_DOT_JAVA_FLAVOR);
if (CalculateAbi.isAbiTarget(params.getBuildTarget())) {
if (hasDummyRDotJavaFlavor) {
return graphEnhancer.getBuildableForAndroidResourcesAbi(resolver, ruleFinder);
}
BuildTarget libraryTarget = CalculateAbi.getLibraryTarget(params.getBuildTarget());
BuildRule libraryRule = resolver.requireRule(libraryTarget);
return CalculateAbi.of(params.getBuildTarget(), ruleFinder, params, Preconditions.checkNotNull(libraryRule.getSourcePathToOutput()));
}
Optional<DummyRDotJava> dummyRDotJava = graphEnhancer.getBuildableForAndroidResources(resolver, /* createBuildableIfEmpty */
hasDummyRDotJavaFlavor);
if (hasDummyRDotJavaFlavor) {
return dummyRDotJava.get();
} else {
ImmutableSet<Either<SourcePath, Path>> additionalClasspathEntries = ImmutableSet.of();
if (dummyRDotJava.isPresent()) {
additionalClasspathEntries = ImmutableSet.of(Either.ofLeft(dummyRDotJava.get().getSourcePathToOutput()));
ImmutableSortedSet<BuildRule> newDeclaredDeps = ImmutableSortedSet.<BuildRule>naturalOrder().addAll(params.getDeclaredDeps().get()).add(dummyRDotJava.get()).build();
params = params.copyReplacingDeclaredAndExtraDeps(Suppliers.ofInstance(newDeclaredDeps), params.getExtraDeps());
}
AndroidLibraryCompiler compiler = compilerFactory.getCompiler(args.language.orElse(JvmLanguage.JAVA));
ImmutableSortedSet<BuildRule> exportedDeps = resolver.getAllRules(args.exportedDeps);
ImmutableSortedSet.Builder<BuildRule> declaredDepsBuilder = ImmutableSortedSet.<BuildRule>naturalOrder().addAll(params.getDeclaredDeps().get()).addAll(queriedDeps).addAll(compiler.getDeclaredDeps(args, resolver));
ImmutableSortedSet<BuildRule> declaredDeps = declaredDepsBuilder.build();
ImmutableSortedSet<BuildRule> extraDeps = ImmutableSortedSet.<BuildRule>naturalOrder().addAll(params.getExtraDeps().get()).addAll(BuildRules.getExportedRules(Iterables.concat(declaredDeps, exportedDeps, resolver.getAllRules(args.providedDeps)))).addAll(ruleFinder.filterBuildRuleInputs(javacOptions.getInputs(ruleFinder))).addAll(compiler.getExtraDeps(args, resolver)).build();
SourcePathResolver pathResolver = new SourcePathResolver(ruleFinder);
BuildRuleParams androidLibraryParams = params.copyReplacingDeclaredAndExtraDeps(Suppliers.ofInstance(declaredDeps), Suppliers.ofInstance(extraDeps));
return new AndroidLibrary(androidLibraryParams, pathResolver, ruleFinder, args.srcs, ResourceValidator.validateResources(pathResolver, params.getProjectFilesystem(), args.resources), args.proguardConfig, args.postprocessClassesCommands, exportedDeps, resolver.getAllRules(args.providedDeps), JavaLibraryRules.getAbiInputs(resolver, androidLibraryParams.getDeps()), additionalClasspathEntries, javacOptions, compiler.trackClassUsage(javacOptions), compiler.compileToJar(args, javacOptions, resolver), args.resourcesRoot, args.mavenCoords, args.manifest, args.tests);
}
}
use of com.facebook.buck.rules.SourcePathRuleFinder in project buck by facebook.
the class AndroidLibraryGraphEnhancer method getBuildableForAndroidResources.
public Optional<DummyRDotJava> getBuildableForAndroidResources(BuildRuleResolver ruleResolver, boolean createBuildableIfEmptyDeps) {
Preconditions.checkState(!CalculateAbi.isAbiTarget(dummyRDotJavaBuildTarget));
Optional<BuildRule> previouslyCreated = ruleResolver.getRuleOptional(dummyRDotJavaBuildTarget);
if (previouslyCreated.isPresent()) {
return previouslyCreated.map(input -> (DummyRDotJava) input);
}
ImmutableSortedSet<BuildRule> originalDeps = originalBuildRuleParams.getDeps();
ImmutableSet<HasAndroidResourceDeps> androidResourceDeps;
switch(resourceDependencyMode) {
case FIRST_ORDER:
androidResourceDeps = FluentIterable.from(originalDeps).filter(HasAndroidResourceDeps.class).filter(input -> input.getRes() != null).toSet();
break;
case TRANSITIVE:
androidResourceDeps = UnsortedAndroidResourceDeps.createFrom(originalDeps, Optional.empty()).getResourceDeps();
break;
default:
throw new IllegalStateException("Invalid resource dependency mode: " + resourceDependencyMode);
}
if (androidResourceDeps.isEmpty() && !createBuildableIfEmptyDeps) {
return Optional.empty();
}
SourcePathRuleFinder ruleFinder = new SourcePathRuleFinder(ruleResolver);
BuildRuleParams dummyRDotJavaParams = originalBuildRuleParams.withBuildTarget(dummyRDotJavaBuildTarget).copyReplacingDeclaredAndExtraDeps(Suppliers.ofInstance(ImmutableSortedSet.copyOf(ruleFinder.filterBuildRuleInputs(javacOptions.getInputs(ruleFinder)))), Suppliers.ofInstance(ImmutableSortedSet.of()));
DummyRDotJava dummyRDotJava = new DummyRDotJava(dummyRDotJavaParams, ruleFinder, androidResourceDeps, javacOptions, forceFinalResourceIds, resourceUnionPackage, finalRName, useOldStyleableFormat);
ruleResolver.addToIndex(dummyRDotJava);
return Optional.of(dummyRDotJava);
}
use of com.facebook.buck.rules.SourcePathRuleFinder in project buck by facebook.
the class AndroidManifestDescription method createBuildRule.
@Override
public <A extends Arg> AndroidManifest createBuildRule(TargetGraph targetGraph, BuildRuleParams params, BuildRuleResolver resolver, A args) {
SourcePathRuleFinder ruleFinder = new SourcePathRuleFinder(resolver);
AndroidTransitiveDependencyGraph transitiveDependencyGraph = new AndroidTransitiveDependencyGraph(resolver.getAllRules(args.deps));
ImmutableSet<SourcePath> manifestFiles = transitiveDependencyGraph.findManifestFiles();
// The only rules that need to be built before this AndroidManifest are those
// responsible for generating the AndroidManifest.xml files in the manifestFiles set (and
// possibly the skeleton).
//
// If the skeleton is a BuildTargetSourcePath, then its build rule must also be in the deps.
// The skeleton does not appear to be in either params.getDeclaredDeps() or
// params.getExtraDeps(), even though the type of Arg.skeleton is SourcePath.
// TODO(shs96c): t4744625 This should happen automagically.
ImmutableSortedSet<BuildRule> newDeps = ImmutableSortedSet.<BuildRule>naturalOrder().addAll(ruleFinder.filterBuildRuleInputs(Sets.union(manifestFiles, Collections.singleton(args.skeleton)))).build();
return new AndroidManifest(params.copyReplacingDeclaredAndExtraDeps(Suppliers.ofInstance(newDeps), params.getExtraDeps()), args.skeleton, manifestFiles);
}
Aggregations