diff options
4 files changed, 170 insertions, 191 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java index c5bf84083a..ea1a1e8fde 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java @@ -409,12 +409,12 @@ public class CppConfiguration extends BuildConfiguration.Fragment { this.toolchainIdentifier = toolchain.getToolchainIdentifier(); - this.supportsEmbeddedRuntimes = toolchain.getSupportsEmbeddedRuntimes(); toolchain = addLegacyFeatures(toolchain); this.toolchainFeatures = new CcToolchainFeatures(toolchain); this.supportsGoldLinker = toolchain.getSupportsGoldLinker(); this.supportsStartEndLib = toolchain.getSupportsStartEndLib(); this.supportsInterfaceSharedObjects = toolchain.getSupportsInterfaceSharedObjects(); + this.supportsEmbeddedRuntimes = toolchain.getSupportsEmbeddedRuntimes(); this.supportsFission = toolchain.getSupportsFission(); this.toolchainNeedsPic = toolchain.getNeedsPic(); this.usePicForBinaries = @@ -733,12 +733,12 @@ public class CppConfiguration extends BuildConfiguration.Fragment { if (getTargetLibc().equals("macosx")) { TextFormat.merge( CppLinkActionConfigs.getCppLinkActionConfigs( - CppLinkPlatform.MAC, features, linkerToolPath, supportsEmbeddedRuntimes), + CppLinkPlatform.MAC, features, linkerToolPath), toolchainBuilder); } else { TextFormat.merge( CppLinkActionConfigs.getCppLinkActionConfigs( - CppLinkPlatform.LINUX, features, linkerToolPath, supportsEmbeddedRuntimes), + CppLinkPlatform.LINUX, features, linkerToolPath), toolchainBuilder); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java index f02dea8e87..f99191da6b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java @@ -21,7 +21,6 @@ import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.ImmutableSet.Builder; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Action; import com.google.devtools.build.lib.actions.ActionOwner; @@ -64,9 +63,17 @@ import javax.annotation.Nullable; /** Builder class to construct {@link CppLinkAction}s. */ public class CppLinkActionBuilder { - /** A build variable for entries in the linker runtime search path (usually set by -rpath flag) */ - public static final String RUNTIME_LIBRARY_SEARCH_DIRECTORIES_VARIABLE = - "runtime_library_search_directories"; + /** A build variable for clang flags that set the root of the linker search path. */ + public static final String RUNTIME_ROOT_FLAGS_VARIABLE = "runtime_root_flags"; + + /** A build variable for entries in the linker search path. */ + public static final String RUNTIME_ROOT_ENTRIES_VARIABLE = "runtime_root_entries"; + + /** + * A build variable for options applying to specific libraries in the linker invocation that + * either identify a library to be linked or add a directory to the runtime library search path. + */ + public static final String LIBOPTS_VARIABLE = "libopts"; public static final String LIBRARY_SEARCH_DIRECTORIES_VARIABLE = "library_search_directories"; @@ -127,12 +134,6 @@ public class CppLinkActionBuilder { /** A build variable whose presence indicates that this action is a cc_test linking action. */ public static final String IS_CC_TEST_LINK_ACTION_VARIABLE = "is_cc_test_link_action"; - /** - * A (temporary) build variable whose presence indicates that this action is not a cc_test linking - * action. - */ - public static final String IS_NOT_CC_TEST_LINK_ACTION_VARIABLE = "is_not_cc_test_link_action"; - // Builder-only // Null when invoked from tests (e.g. via createTestBuilder). @Nullable private final RuleContext ruleContext; @@ -1196,13 +1197,22 @@ public class CppLinkActionBuilder { } private static class LinkArgCollector { - ImmutableSet<String> runtimeLibrarySearchDirectories; + String rpathRoot; + ImmutableList<String> rpathEntries; + ImmutableSet<String> libopts; ImmutableSet<String> librarySearchDirectories; SequenceBuilder librariesToLink; - public void setRuntimeLibrarySearchDirectories( - ImmutableSet<String> runtimeLibrarySearchDirectories) { - this.runtimeLibrarySearchDirectories = runtimeLibrarySearchDirectories; + public void setRpathRoot(String rPathRoot) { + this.rpathRoot = rPathRoot; + } + + public void setRpathEntries(ImmutableList<String> rpathEntries) { + this.rpathEntries = rpathEntries; + } + + public void setLibopts(ImmutableSet<String> libopts) { + this.libopts = libopts; } public void setLibrariesToLink(SequenceBuilder librariesToLink) { @@ -1213,8 +1223,16 @@ public class CppLinkActionBuilder { this.librarySearchDirectories = librarySearchDirectories; } - public ImmutableSet<String> getRuntimeLibrarySearchDirectories() { - return runtimeLibrarySearchDirectories; + public String getRpathRoot() { + return rpathRoot; + } + + public ImmutableList<String> getRpathEntries() { + return rpathEntries; + } + + public ImmutableSet<String> getLibopts() { + return libopts; } public SequenceBuilder getLibrariesToLink() { @@ -1296,16 +1314,21 @@ public class CppLinkActionBuilder { if (useTestOnlyFlags()) { buildVariables.addStringVariable(IS_CC_TEST_LINK_ACTION_VARIABLE, ""); - } else { - buildVariables.addStringVariable(IS_NOT_CC_TEST_LINK_ACTION_VARIABLE, ""); } - if (linkArgCollector.getRuntimeLibrarySearchDirectories() != null) { + // rpath + if (linkArgCollector.getRpathRoot() != null) { + buildVariables.addStringVariable( + RUNTIME_ROOT_FLAGS_VARIABLE, linkArgCollector.getRpathRoot()); + } + + if (linkArgCollector.getRpathEntries() != null) { buildVariables.addStringSequenceVariable( - RUNTIME_LIBRARY_SEARCH_DIRECTORIES_VARIABLE, - linkArgCollector.getRuntimeLibrarySearchDirectories()); + RUNTIME_ROOT_ENTRIES_VARIABLE, linkArgCollector.getRpathEntries()); } + buildVariables.addStringSequenceVariable(LIBOPTS_VARIABLE, linkArgCollector.getLibopts()); + buildVariables.addCustomBuiltVariable( LIBRARIES_TO_LINK_VARIABLE, linkArgCollector.getLibrariesToLink()); @@ -1393,9 +1416,10 @@ public class CppLinkActionBuilder { * <p>TODO: Factor out of the bazel binary into build variables for crosstool action_configs. */ private void addInputFileLinkOptions(LinkArgCollector linkArgCollector) { + + // Used to collect -L and -Wl,-rpath options, ensuring that each used only once. + ImmutableSet.Builder<String> libOpts = ImmutableSet.builder(); ImmutableSet.Builder<String> librarySearchDirectories = ImmutableSet.builder(); - ImmutableSet.Builder<String> runtimeRpathRoots = ImmutableSet.builder(); - ImmutableSet.Builder<String> rpathRootsForExplicitSoDeps = ImmutableSet.builder(); // List of command line parameters that need to be placed *outside* of // --whole-archive ... --no-whole-archive. @@ -1413,9 +1437,14 @@ public class CppLinkActionBuilder { || (linkType == LinkTargetType.EXECUTABLE && linkStaticness == LinkStaticness.DYNAMIC)); + ImmutableList.Builder<String> runtimeRpathEntries = ImmutableList.builder(); + + String origin = + useTestOnlyFlags && cppConfiguration.supportsExecOrigin() + ? "$EXEC_ORIGIN/" + : "$ORIGIN/"; if (runtimeRpath) { - runtimeRpathRoots.add("."); - runtimeRpathRoots.add(runtimeSolibName + "/"); + runtimeRpathEntries.add("-Wl,-rpath," + origin + runtimeSolibName + "/"); } String rpathRoot; @@ -1433,9 +1462,10 @@ public class CppLinkActionBuilder { // and the second could use $ORIGIN/../_solib_[arch]. But since this is a shared // artifact, both are symlinks to the same place, so // there's no *one* RPATH setting that fits all targets involved in the sharing. - rpathRoot = cppConfiguration.getSolibDirectory() + "/"; + rpathRoot = + "-Wl,-rpath," + origin + ":" + origin + cppConfiguration.getSolibDirectory() + "/"; if (runtimeRpath) { - runtimeRpathRoots.add("../" + runtimeSolibName + "/"); + runtimeRpathEntries.add("-Wl,-rpath," + origin + "../" + runtimeSolibName + "/"); } } else { // For all other links, calculate the relative path from the output file to _solib_[arch] @@ -1443,14 +1473,18 @@ public class CppLinkActionBuilder { // directory. In other words, given blaze-bin/my/package/binary, rpathRoot would be // "../../_solib_[arch]". if (runtimeRpath) { - runtimeRpathRoots.add( - Strings.repeat("../", output.getRootRelativePath().segmentCount() - 1) + runtimeRpathEntries.add( + "-Wl,-rpath," + + origin + + Strings.repeat("../", output.getRootRelativePath().segmentCount() - 1) + runtimeSolibName + "/"); } rpathRoot = - Strings.repeat("../", output.getRootRelativePath().segmentCount() - 1) + "-Wl,-rpath," + + origin + + Strings.repeat("../", output.getRootRelativePath().segmentCount() - 1) + cppConfiguration.getSolibDirectory() + "/"; @@ -1458,130 +1492,89 @@ public class CppLinkActionBuilder { // We also retain the $ORIGIN/ path to solibs that are in _solib_<arch>, as opposed to // the package directory) if (runtimeRpath) { - runtimeRpathRoots.add("../" + runtimeSolibName + "/"); + runtimeRpathEntries.add("-Wl,-rpath," + origin + "../" + runtimeSolibName + "/"); } + rpathRoot += ":" + origin; } } - Map<Artifact, Artifact> ltoMap = generateLtoMap(); - boolean includeSolibDir = - addLinkerInputs( - librarySearchDirectories, - rpathRootsForExplicitSoDeps, - librariesToLink, - solibDir, - rpathRoot, - ltoMap); - boolean includeRuntimeSolibDir = - addRuntimeLinkerInputs( - librarySearchDirectories, - rpathRootsForExplicitSoDeps, - librariesToLink, - solibDir, - rpathRoot, - ltoMap); - Preconditions.checkState( - ltoMap == null || ltoMap.isEmpty(), "Still have LTO objects left: %s", ltoMap); - - ImmutableSet.Builder<String> runtimeLibrarySearchDirectories = ImmutableSet.builder(); - // rpath ordering matters for performance; first add the one where most libraries are found. - if (includeSolibDir) { - runtimeLibrarySearchDirectories.add(rpathRoot); - } - runtimeLibrarySearchDirectories.addAll(rpathRootsForExplicitSoDeps.build()); - if (includeRuntimeSolibDir) { - runtimeLibrarySearchDirectories.addAll(runtimeRpathRoots.build()); - } - - linkArgCollector.setLibrarySearchDirectories(librarySearchDirectories.build()); - linkArgCollector.setRuntimeLibrarySearchDirectories(runtimeLibrarySearchDirectories.build()); - linkArgCollector.setLibrariesToLink(librariesToLink); - } + boolean includeSolibDir = false; - private Map<Artifact, Artifact> generateLtoMap() { - if (isLTOIndexing || allLTOArtifacts == null) { - return null; - } - // TODO(bazel-team): The LTO final link can only work if there are individual .o files on - // the command line. Rather than crashing, this should issue a nice error. We will get - // this by - // 1) moving supports_start_end_lib to a toolchain feature - // 2) having thin_lto require start_end_lib - // As a bonus, we can rephrase --nostart_end_lib as --features=-start_end_lib and get rid - // of a command line option. - - Preconditions.checkState(cppConfiguration.useStartEndLib()); - Map<Artifact, Artifact> ltoMap = new HashMap<>(); - for (LTOBackendArtifacts l : allLTOArtifacts) { - ltoMap.put(l.getBitcodeFile(), l.getObjectFile()); + Map<Artifact, Artifact> ltoMap = null; + if (!isLTOIndexing && (allLTOArtifacts != null)) { + // TODO(bazel-team): The LTO final link can only work if there are individual .o files on + // the command line. Rather than crashing, this should issue a nice error. We will get + // this by + // 1) moving supports_start_end_lib to a toolchain feature + // 2) having thin_lto require start_end_lib + // As a bonus, we can rephrase --nostart_end_lib as --features=-start_end_lib and get rid + // of a command line option. + + Preconditions.checkState(cppConfiguration.useStartEndLib()); + ltoMap = new HashMap<>(); + for (LTOBackendArtifacts l : allLTOArtifacts) { + ltoMap.put(l.getBitcodeFile(), l.getObjectFile()); + } } - return ltoMap; - } - private boolean addRuntimeLinkerInputs( - Builder<String> librarySearchDirectories, - Builder<String> rpathRootsForExplicitSoDeps, - SequenceBuilder librariesToLink, - PathFragment solibDir, - String rpathRoot, - Map<Artifact, Artifact> ltoMap) { - boolean includeRuntimeSolibDir = false; - for (LinkerInput input : runtimeLinkerInputs) { + for (LinkerInput input : linkerInputs) { if (input.getArtifactCategory() == ArtifactCategory.DYNAMIC_LIBRARY) { PathFragment libDir = input.getArtifact().getExecPath().getParentDirectory(); Preconditions.checkState( - runtimeSolibDir != null && libDir.equals(runtimeSolibDir), + libDir.startsWith(solibDir), "Artifact '%s' is not under directory '%s'.", input.getArtifact(), solibDir); - includeRuntimeSolibDir = true; + if (libDir.equals(solibDir)) { + includeSolibDir = true; + } addDynamicInputLinkOptions( input, librariesToLink, - true, + false, + libOpts, librarySearchDirectories, - rpathRootsForExplicitSoDeps, solibDir, rpathRoot); } else { - addStaticInputLinkOptions(input, librariesToLink, true, ltoMap); + addStaticInputLinkOptions(input, librariesToLink, false, ltoMap); } } - return includeRuntimeSolibDir; - } - private boolean addLinkerInputs( - Builder<String> librarySearchDirectories, - Builder<String> rpathEntries, - SequenceBuilder librariesToLink, - PathFragment solibDir, - String rpathRoot, - Map<Artifact, Artifact> ltoMap) { - boolean includeSolibDir = false; - for (LinkerInput input : linkerInputs) { + boolean includeRuntimeSolibDir = false; + + for (LinkerInput input : runtimeLinkerInputs) { if (input.getArtifactCategory() == ArtifactCategory.DYNAMIC_LIBRARY) { PathFragment libDir = input.getArtifact().getExecPath().getParentDirectory(); Preconditions.checkState( - libDir.startsWith(solibDir), + runtimeSolibDir != null && libDir.equals(runtimeSolibDir), "Artifact '%s' is not under directory '%s'.", input.getArtifact(), solibDir); - if (libDir.equals(solibDir)) { - includeSolibDir = true; - } + includeRuntimeSolibDir = true; addDynamicInputLinkOptions( - input, - librariesToLink, - false, - librarySearchDirectories, - rpathEntries, - solibDir, - rpathRoot); + input, librariesToLink, true, libOpts, librarySearchDirectories, solibDir, rpathRoot); } else { - addStaticInputLinkOptions(input, librariesToLink, false, ltoMap); + addStaticInputLinkOptions(input, librariesToLink, true, ltoMap); } } - return includeSolibDir; + + // rpath ordering matters for performance; first add the one where most libraries are found. + if (includeSolibDir) { + linkArgCollector.setRpathRoot(rpathRoot); + } + if (includeRuntimeSolibDir) { + linkArgCollector.setRpathEntries(runtimeRpathEntries.build()); + } + + linkArgCollector.setLibopts(libOpts.build()); + linkArgCollector.setLibrarySearchDirectories(librarySearchDirectories.build()); + + linkArgCollector.setLibrariesToLink(librariesToLink); + + if (ltoMap != null) { + Preconditions.checkState(ltoMap.isEmpty(), "Still have LTO objects left: %s", ltoMap); + } } /** @@ -1593,8 +1586,8 @@ public class CppLinkActionBuilder { LinkerInput input, SequenceBuilder librariesToLink, boolean isRuntimeLinkerInput, + ImmutableSet.Builder<String> libOpts, ImmutableSet.Builder<String> librarySearchDirectories, - ImmutableSet.Builder<String> rpathRootsForExplicitSoDeps, PathFragment solibDir, String rpathRoot) { Preconditions.checkState(input.getArtifactCategory() == ArtifactCategory.DYNAMIC_LIBRARY); @@ -1611,8 +1604,7 @@ public class CppLinkActionBuilder { commonParent = commonParent.getParentDirectory(); } - rpathRootsForExplicitSoDeps.add( - rpathRoot + dotdots + libDir.relativeTo(commonParent).getPathString()); + libOpts.add(rpathRoot + dotdots + libDir.relativeTo(commonParent).getPathString()); } librarySearchDirectories.add( diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionConfigs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionConfigs.java index 9cb308f4e6..d614c3d063 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionConfigs.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionConfigs.java @@ -32,10 +32,7 @@ public class CppLinkActionConfigs { } public static String getCppLinkActionConfigs( - CppLinkPlatform platform, - Set<String> features, - String cppLinkDynamicLibraryToolPath, - boolean supportsEmbeddedRuntimes) { + CppLinkPlatform platform, Set<String> features, String cppLinkDynamicLibraryToolPath) { String cppDynamicLibraryLinkerTool = ""; if (!features.contains("dynamic_library_linker_tool")) { cppDynamicLibraryLinkerTool = @@ -65,8 +62,9 @@ public class CppLinkActionConfigs { " implies: 'symbol_counts'", " implies: 'linkstamps'", " implies: 'output_execpath_flags_executable'", - " implies: 'runtime_library_search_directories'", + " implies: 'runtime_root_flags'", " implies: 'library_search_directories'", + " implies: 'input_param_flags'", " implies: 'libraries_to_link'", " implies: 'force_pic_flags'", " implies: 'legacy_link_flags'", @@ -84,8 +82,9 @@ public class CppLinkActionConfigs { " implies: 'shared_flag'", " implies: 'linkstamps'", " implies: 'output_execpath_flags'", - " implies: 'runtime_library_search_directories'", + " implies: 'runtime_root_flags'", " implies: 'library_search_directories'", + " implies: 'input_param_flags'", " implies: 'libraries_to_link'", " implies: 'legacy_link_flags'", " implies: 'linker_param_file'", @@ -96,8 +95,9 @@ public class CppLinkActionConfigs { " tool {", " tool_path: 'DUMMY_TOOL'", " }", - " implies: 'runtime_library_search_directories'", + " implies: 'runtime_root_flags'", " implies: 'library_search_directories'", + " implies: 'input_param_flags'", " implies: 'libraries_to_link'", " implies: 'linker_param_file'", "}", @@ -107,8 +107,9 @@ public class CppLinkActionConfigs { " tool {", " tool_path: 'DUMMY_TOOL'", " }", - " implies: 'runtime_library_search_directories'", + " implies: 'runtime_root_flags'", " implies: 'library_search_directories'", + " implies: 'input_param_flags'", " implies: 'libraries_to_link'", " implies: 'linker_param_file'", "}", @@ -118,8 +119,9 @@ public class CppLinkActionConfigs { " tool {", " tool_path: 'DUMMY_TOOL'", " }", - " implies: 'runtime_library_search_directories'", + " implies: 'runtime_root_flags'", " implies: 'library_search_directories'", + " implies: 'input_param_flags'", " implies: 'libraries_to_link'", " implies: 'linker_param_file'", "}", @@ -129,8 +131,9 @@ public class CppLinkActionConfigs { " tool {", " tool_path: 'DUMMY_TOOL'", " }", - " implies: 'runtime_library_search_directories'", + " implies: 'runtime_root_flags'", " implies: 'library_search_directories'", + " implies: 'input_param_flags'", " implies: 'libraries_to_link'", " implies: 'linker_param_file'", "}", @@ -220,9 +223,9 @@ public class CppLinkActionConfigs { " }", "}", "feature {", - " name: 'runtime_library_search_directories',", + " name: 'runtime_root_flags',", " flag_set {", - " expand_if_all_available: 'runtime_library_search_directories'", + " expand_if_all_available: 'runtime_root_flags'", " action: 'c++-link-executable'", " action: 'c++-link-dynamic-library'", " action: 'c++-link-static-library'", @@ -230,18 +233,19 @@ public class CppLinkActionConfigs { " action: 'c++-link-pic-static-library'", " action: 'c++-link-alwayslink-pic-static-library'", " flag_group {", - " iterate_over: 'runtime_library_search_directories'", - " flag_group {", - ifTrue( - supportsEmbeddedRuntimes, - " expand_if_all_available: 'is_cc_test_link_action'", - " flag: ", - " '-Wl,-rpath,$EXEC_ORIGIN/%{runtime_library_search_directories}'", - " }", - " flag_group {", - " expand_if_all_available: 'is_not_cc_test_link_action'"), - " flag: '-Wl,-rpath,$ORIGIN/%{runtime_library_search_directories}'", - " }", + " flag: '%{runtime_root_flags}'", + " }", + " }", + " flag_set {", + " expand_if_all_available: 'runtime_root_entries'", + " action: 'c++-link-executable'", + " action: 'c++-link-dynamic-library'", + " action: 'c++-link-static-library'", + " action: 'c++-link-alwayslink-static-library'", + " action: 'c++-link-pic-static-library'", + " action: 'c++-link-alwayslink-pic-static-library'", + " flag_group {", + " flag: '%{runtime_root_entries}'", " }", " }", "}", @@ -262,6 +266,22 @@ public class CppLinkActionConfigs { " }", "}", "feature {", + " name: 'input_param_flags'", + " flag_set {", + " expand_if_all_available: 'libopts'", + " action: 'c++-link-executable'", + " action: 'c++-link-dynamic-library'", + " action: 'c++-link-static-library'", + " action: 'c++-link-alwayslink-static-library'", + " action: 'c++-link-pic-static-library'", + " action: 'c++-link-alwayslink-pic-static-library'", + " flag_group {", + " iterate_over: 'libopts'", + " flag: '%{libopts}'", + " }", + " }", + "}", + "feature {", " name: 'libraries_to_link'", " flag_set {", " expand_if_all_available: 'libraries_to_link'", @@ -480,15 +500,15 @@ public class CppLinkActionConfigs { } private static String ifLinux(CppLinkPlatform platform, String... lines) { - return ifTrue(platform == CppLinkPlatform.LINUX, lines); + if (platform == CppLinkPlatform.LINUX) { + return Joiner.on("\n").join(lines); + } else { + return ""; + } } private static String ifMac(CppLinkPlatform platform, String... lines) { - return ifTrue(platform == CppLinkPlatform.MAC, lines); - } - - private static String ifTrue(boolean condition, String... lines) { - if (condition) { + if (platform == CppLinkPlatform.MAC) { return Joiner.on("\n").join(lines); } else { return ""; diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java index 0e2adddcb3..75e7cd912b 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java @@ -39,7 +39,6 @@ import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration; -import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables.VariableValue; import com.google.devtools.build.lib.rules.cpp.CppLinkActionConfigs.CppLinkPlatform; import com.google.devtools.build.lib.rules.cpp.Link.LinkStaticness; import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType; @@ -49,7 +48,6 @@ import com.google.devtools.build.lib.util.OS; import com.google.devtools.build.lib.util.OsUtils; import com.google.devtools.build.lib.vfs.PathFragment; import java.io.IOException; -import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; @@ -89,10 +87,7 @@ public class CppLinkActionTest extends BuildViewTestCase { private final FeatureConfiguration getMockFeatureConfiguration() throws Exception { return CcToolchainFeaturesTest.buildFeatures( CppLinkActionConfigs.getCppLinkActionConfigs( - CppLinkPlatform.LINUX, - ImmutableSet.<String>of(), - "dynamic_library_linker_tool", - true)) + CppLinkPlatform.LINUX, ImmutableSet.<String>of(), "dynamic_library_linker_tool")) .getFeatureConfiguration( Link.LinkTargetType.EXECUTABLE.getActionName(), Link.LinkTargetType.DYNAMIC_LIBRARY.getActionName(), @@ -163,34 +158,6 @@ public class CppLinkActionTest extends BuildViewTestCase { } @Test - public void testExposesRuntimeLibrarySearchDirectoriesVariable() throws Exception { - scratch.file( - "x/BUILD", - "cc_binary(", - " name = 'foo',", - " srcs = ['some-dir/bar.so', 'some-other-dir/qux.so'],", - ")"); - scratch.file("x/some-dir/bar.so"); - scratch.file("x/some-other-dir/qux.so"); - - ConfiguredTarget configuredTarget = getConfiguredTarget("//x:foo"); - CppLinkAction linkAction = - (CppLinkAction) - getGeneratingAction(configuredTarget, "x/foo" + OsUtils.executableExtension()); - - Iterable<? extends VariableValue> runtimeLibrarySearchDirectories = - linkAction - .getLinkCommandLine() - .getBuildVariables() - .getSequenceVariable(CppLinkActionBuilder.RUNTIME_LIBRARY_SEARCH_DIRECTORIES_VARIABLE); - List<String> directories = new ArrayList<>(); - for (VariableValue value : runtimeLibrarySearchDirectories) { - directories.add(value.getStringValue("runtime_library_search_directory")); - } - assertThat(Joiner.on(" ").join(directories)).matches(".*some-dir .*some-other-dir"); - } - - @Test public void testCompilesTestSourcesIntoDynamicLibrary() throws Exception { if (OS.getCurrent() == OS.WINDOWS) { // Skip the test on Windows. |