/** * Build a {@link HeaderSymlinkTree} of all the shared libraries found via the top-level rule's * transitive dependencies. */ public static SymlinkTree createSharedLibrarySymlinkTree( TargetGraph targetGraph, BuildRuleParams params, SourcePathResolver pathResolver, CxxPlatform cxxPlatform, Predicate<Object> traverse) { BuildTarget symlinkTreeTarget = createSharedLibrarySymlinkTreeTarget(params.getBuildTarget(), cxxPlatform.getFlavor()); Path symlinkTreeRoot = getSharedLibrarySymlinkTreePath(params.getBuildTarget(), cxxPlatform.getFlavor()); ImmutableSortedMap<String, SourcePath> libraries = NativeLinkables.getTransitiveSharedLibraries( targetGraph, cxxPlatform, params.getDeps(), Linker.LinkableDepType.SHARED, traverse); ImmutableMap.Builder<Path, SourcePath> links = ImmutableMap.builder(); for (Map.Entry<String, SourcePath> ent : libraries.entrySet()) { links.put(Paths.get(ent.getKey()), ent.getValue()); } try { return new SymlinkTree( params.copyWithChanges( symlinkTreeTarget, Suppliers.ofInstance(ImmutableSortedSet.<BuildRule>of()), Suppliers.ofInstance(ImmutableSortedSet.<BuildRule>of())), pathResolver, symlinkTreeRoot, links.build()); } catch (SymlinkTree.InvalidSymlinkTreeException e) { throw new RuntimeException(e.getMessage()); } }
/** * Build the {@link HeaderSymlinkTree} rule using the original build params from a target node. In * particular, make sure to drop all dependencies from the original build rule params, as these * are modeled via {@link CxxPreprocessAndCompile}. */ public static HeaderSymlinkTree createHeaderSymlinkTreeBuildRule( SourcePathResolver resolver, BuildTarget target, BuildRuleParams params, Path root, Optional<Path> headerMapPath, ImmutableMap<Path, SourcePath> links) { // Symlink trees never need to depend on anything. BuildRuleParams paramsWithoutDeps = params.copyWithChanges( target, Suppliers.ofInstance(ImmutableSortedSet.<BuildRule>of()), Suppliers.ofInstance(ImmutableSortedSet.<BuildRule>of())); try { if (headerMapPath.isPresent()) { return new HeaderSymlinkTreeWithHeaderMap( paramsWithoutDeps, resolver, root, headerMapPath.get(), links); } else { return new HeaderSymlinkTree(paramsWithoutDeps, resolver, root, links); } } catch (SymlinkTree.InvalidSymlinkTreeException e) { throw e.getHumanReadableExceptionForBuildTarget(target.getUnflavoredBuildTarget()); } }