public static CxxHeaderSourceSpec requireLexYaccSources( BuildRuleParams params, BuildRuleResolver ruleResolver, SourcePathResolver pathResolver, CxxPlatform cxxPlatform, ImmutableMap<String, SourcePath> lexSources, ImmutableMap<String, SourcePath> yaccSources) { BuildTarget lexYaccTarget = createLexYaccSourcesBuildTarget(params.getBuildTarget()); // Check the cache... Optional<BuildRule> rule = ruleResolver.getRuleOptional(lexYaccTarget); if (rule.isPresent()) { @SuppressWarnings("unchecked") ContainerBuildRule<CxxHeaderSourceSpec> containerRule = (ContainerBuildRule<CxxHeaderSourceSpec>) rule.get(); return containerRule.get(); } // Setup the rules to run lex/yacc. CxxHeaderSourceSpec lexYaccSources = CxxDescriptionEnhancer.createLexYaccBuildRules( params, ruleResolver, cxxPlatform, ImmutableList.<String>of(), lexSources, ImmutableList.<String>of(), yaccSources); ruleResolver.addToIndex( ContainerBuildRule.of(params, pathResolver, lexYaccTarget, lexYaccSources)); return lexYaccSources; }
/** * Ensure that the build rule generated by the given {@link BuildRuleParams} had been generated by * it's corresponding {@link Description} and added to the {@link BuildRuleResolver}. If not, call * into it's associated {@link Description} to generate it's {@link BuildRule}. * * @return the {@link BuildRule} generated by the description corresponding to the supplied {@link * BuildRuleParams}. */ public static BuildRule requireBuildRule( TargetGraph targetGraph, BuildRuleParams params, BuildRuleResolver ruleResolver, Flavor... flavors) { BuildTarget target = BuildTarget.builder(params.getBuildTarget()).addFlavors(flavors).build(); Optional<BuildRule> rule = ruleResolver.getRuleOptional(target); if (!rule.isPresent()) { TargetNode<?> node = targetGraph.get(params.getBuildTarget()); Preconditions.checkNotNull( node, String.format("%s not in target graph", params.getBuildTarget())); rule = Optional.of(createBuildRule(targetGraph, params, ruleResolver, node, flavors)); ruleResolver.addToIndex(rule.get()); } return rule.get(); }
protected BuildRule resolve(BuildTarget target, BuildRuleResolver resolver, String input) throws MacroException { BuildTarget other; try { other = BuildTargetParser.INSTANCE.parse( input, BuildTargetPatternParser.forBaseName(target.getBaseName())); } catch (BuildTargetParseException e) { throw new MacroException(e.getMessage(), e); } Optional<BuildRule> rule = resolver.getRuleOptional(other); if (!rule.isPresent()) { throw new MacroException(String.format("no rule %s", other)); } return rule.get(); }
/** * @return a {@link Tool} identified by a @{link BuildTarget} or {@link Path} reference by the * given section:field, if set. */ public Optional<Tool> getTool(String section, String field, BuildRuleResolver resolver) { Optional<String> value = getValue(section, field); if (!value.isPresent()) { return Optional.absent(); } try { BuildTarget target = getBuildTargetForFullyQualifiedTarget(value.get()); Optional<BuildRule> rule = resolver.getRuleOptional(target); if (!rule.isPresent()) { throw new HumanReadableException("[%s] %s: no rule found for %s", section, field, target); } if (!(rule.get() instanceof BinaryBuildRule)) { throw new HumanReadableException( "[%s] %s: %s must be an executable rule", section, field, target); } return Optional.of(((BinaryBuildRule) rule.get()).getExecutableCommand()); } catch (BuildTargetParseException e) { checkPathExists( value.get(), String.format("Overridden %s:%s path not found: ", section, field)); return Optional.<Tool>of(new HashedFileTool(Paths.get(value.get()))); } }
public static HeaderSymlinkTree requireHeaderSymlinkTree( BuildRuleParams params, BuildRuleResolver ruleResolver, SourcePathResolver pathResolver, CxxPlatform cxxPlatform, boolean includeLexYaccHeaders, ImmutableMap<String, SourcePath> lexSources, ImmutableMap<String, SourcePath> yaccSources, ImmutableMap<Path, SourcePath> headers, HeaderVisibility headerVisibility) { BuildTarget headerSymlinkTreeTarget = CxxDescriptionEnhancer.createHeaderSymlinkTreeTarget( params.getBuildTarget(), cxxPlatform.getFlavor(), headerVisibility); // Check the cache... Optional<BuildRule> rule = ruleResolver.getRuleOptional(headerSymlinkTreeTarget); if (rule.isPresent()) { Preconditions.checkState(rule.get() instanceof HeaderSymlinkTree); return (HeaderSymlinkTree) rule.get(); } HeaderSymlinkTree symlinkTree = createHeaderSymlinkTree( params, ruleResolver, pathResolver, cxxPlatform, includeLexYaccHeaders, lexSources, yaccSources, headers, headerVisibility); ruleResolver.addToIndex(symlinkTree); return symlinkTree; }
/** * Creates/finds the set of build rules that correspond to pre-dex'd artifacts that should be * merged to create the final classes.dex for the APK. * * <p>This method may modify {@code ruleResolver}, inserting new rules into its index. */ @VisibleForTesting PreDexMerge createPreDexMergeRule( AaptPackageResources aaptPackageResources, Iterable<DexProducedFromJavaLibrary> preDexRulesNotInThePackageableCollection, AndroidPackageableCollection packageableCollection) { ImmutableSortedSet.Builder<JavaLibrary> javaLibraryDepsBuilder = ImmutableSortedSet.naturalOrder(); ImmutableSet.Builder<DexProducedFromJavaLibrary> preDexDeps = ImmutableSet.builder(); preDexDeps.addAll(preDexRulesNotInThePackageableCollection); for (BuildTarget buildTarget : packageableCollection.getJavaLibrariesToDex()) { Preconditions.checkState( !buildTargetsToExcludeFromDex.contains(buildTarget), "JavaLibrary should have been excluded from target to dex: %s", buildTarget); BuildRule libraryRule = ruleResolver.getRule(buildTarget); // Skip uber R.java since AaptPackageResources takes care of dexing. if (libraryRule.equals(aaptPackageResources)) { continue; } Preconditions.checkState(libraryRule instanceof JavaLibrary); JavaLibrary javaLibrary = (JavaLibrary) libraryRule; // If the rule has no output file (which happens when a java_library has no srcs or // resources, but export_deps is true), then there will not be anything to dx. if (javaLibrary.getPathToOutput() == null) { continue; } // Take note of the rule so we add it to the enhanced deps. javaLibraryDepsBuilder.add(javaLibrary); // See whether the corresponding IntermediateDexRule has already been added to the // ruleResolver. BuildTarget originalTarget = javaLibrary.getBuildTarget(); BuildTarget preDexTarget = BuildTarget.builder(originalTarget).addFlavors(DEX_FLAVOR).build(); Optional<BuildRule> preDexRule = ruleResolver.getRuleOptional(preDexTarget); if (preDexRule.isPresent()) { preDexDeps.add((DexProducedFromJavaLibrary) preDexRule.get()); continue; } // Create the IntermediateDexRule and add it to both the ruleResolver and preDexDeps. BuildRuleParams paramsForPreDex = buildRuleParams.copyWithChanges( preDexTarget, Suppliers.ofInstance( ImmutableSortedSet.of(ruleResolver.getRule(javaLibrary.getBuildTarget()))), /* extraDeps */ Suppliers.ofInstance(ImmutableSortedSet.<BuildRule>of())); DexProducedFromJavaLibrary preDex = new DexProducedFromJavaLibrary(paramsForPreDex, pathResolver, javaLibrary); ruleResolver.addToIndex(preDex); preDexDeps.add(preDex); } ImmutableSet<DexProducedFromJavaLibrary> allPreDexDeps = preDexDeps.build(); BuildRuleParams paramsForPreDexMerge = buildRuleParams.copyWithChanges( createBuildTargetWithFlavor(DEX_MERGE_FLAVOR), Suppliers.ofInstance( ImmutableSortedSet.<BuildRule>naturalOrder() .addAll(getDexMergeDeps(aaptPackageResources, allPreDexDeps)) .addAll(javaLibraryDepsBuilder.build()) .build()), /* extraDeps */ Suppliers.ofInstance(ImmutableSortedSet.<BuildRule>of())); PreDexMerge preDexMerge = new PreDexMerge( paramsForPreDexMerge, pathResolver, primaryDexPath, dexSplitMode, allPreDexDeps, aaptPackageResources, dxExecutorService, xzCompressionLevel); ruleResolver.addToIndex(preDexMerge); return preDexMerge; }