aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Lukacs Berki <lberki@google.com>2017-02-02 11:42:49 +0000
committerGravatar Yun Peng <pcloudy@google.com>2017-02-02 17:00:21 +0000
commitb99907661b785b0423cb2474da73205595b91fdd (patch)
tree9c258750e77e831e878fff9a3cd85e3796dfd327
parentcd8dde77ad57ade56d8dd153b1d9abd35fef46a7 (diff)
*** Reason for rollback *** Breaks //nlp/pragma/similarities/learners:abe_test : blaze test -c opt //nlp/pragma/similarities/learners:abe_test See [] *** Original change description *** Expose rpath entries as a build variable -- PiperOrigin-RevId: 146347832 MOS_MIGRATED_REVID=146347832
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppConfiguration.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java240
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionConfigs.java80
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java35
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.