/** * 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()); } }