If the toolchain defines an action_config for each type of CppLinkAction, hardcoded action_configs are not used. -- MOS_MIGRATED_REVID=128695960
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 59ec2d5..9943a79 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
@@ -39,6 +39,7 @@ import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.rules.cpp.CppConfigurationLoader.CppConfigurationParameters; import com.google.devtools.build.lib.rules.cpp.CppLinkActionConfigs.CppLinkPlatform; +import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; @@ -47,6 +48,7 @@ import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig; import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain; +import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain.ActionConfig; import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.LinkingModeFlags; import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.LipoMode; import com.google.devtools.common.options.OptionsParsingException; @@ -682,6 +684,21 @@ return result.build(); } + private boolean linkActionsAreConfigured(CToolchain toolchain) { + for (LinkTargetType type : LinkTargetType.values()) { + boolean typeIsConfigured = false; + for (ActionConfig actionConfig : toolchain.getActionConfigList()) { + if (actionConfig.getActionName().equals(type.getActionName())) { + typeIsConfigured = true; + break; + } + } + if (!typeIsConfigured) { + return false; + } + } + return true; + } // TODO(bazel-team): Remove this once bazel supports all crosstool flags through // feature configuration, and all crosstools have been converted. @@ -697,13 +714,15 @@ return toolchain; } try { - - if (getTargetLibc().equals("macosx")) { - TextFormat.merge( - CppLinkActionConfigs.getCppLinkActionConfigs(CppLinkPlatform.MAC), toolchainBuilder); - } else { - TextFormat.merge( - CppLinkActionConfigs.getCppLinkActionConfigs(CppLinkPlatform.LINUX), toolchainBuilder); + if (!linkActionsAreConfigured(toolchain)) { + if (getTargetLibc().equals("macosx")) { + TextFormat.merge( + CppLinkActionConfigs.getCppLinkActionConfigs(CppLinkPlatform.MAC), toolchainBuilder); + } else { + TextFormat.merge( + CppLinkActionConfigs.getCppLinkActionConfigs(CppLinkPlatform.LINUX), + toolchainBuilder); + } } if (!features.contains("dependency_file")) {
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java index a3c5af2..adafd77 100644 --- a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java +++ b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
@@ -22,12 +22,12 @@ import com.google.devtools.build.lib.cmdline.LabelSyntaxException; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.RepositoryName; +import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType; import com.google.devtools.build.lib.testutil.TestConstants; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig; import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.CToolchain; import com.google.protobuf.TextFormat; - import java.io.IOException; /** @@ -230,6 +230,99 @@ + " pattern: 'foo%{bad_variable}bar'" + "}"; + public static final String INCOMPLETE_EXECUTABLE_ACTION_CONFIG = + "" + + "action_config {" + + " config_name: '" + + LinkTargetType.EXECUTABLE.getActionName() + + "'" + + " action_name: '" + + LinkTargetType.EXECUTABLE.getActionName() + + "'" + + " tool {" + + " tool_path: 'DUMMY_TOOL'" + + " }" + + "}"; + + public static final String INCOMPLETE_DYNAMIC_LIBRARY_ACTION_CONFIG = + "" + + "action_config {" + + " config_name: '" + + LinkTargetType.DYNAMIC_LIBRARY.getActionName() + + "'" + + " action_name: '" + + LinkTargetType.DYNAMIC_LIBRARY.getActionName() + + "'" + + " tool {" + + " tool_path: 'DUMMY_TOOL'" + + " }" + + "}"; + public static final String INCOMPLETE_STATIC_LIBRARY_ACTION_CONFIG = + "" + + "action_config {" + + " config_name: '" + + LinkTargetType.STATIC_LIBRARY.getActionName() + + "'" + + " action_name: '" + + LinkTargetType.STATIC_LIBRARY.getActionName() + + "'" + + " tool {" + + " tool_path: 'DUMMY_TOOL'" + + " }" + + "}"; + public static final String INCOMPLETE_PIC_STATIC_LIBRARY_ACTION_CONFIG = + "" + + "action_config {" + + " config_name: '" + + LinkTargetType.PIC_STATIC_LIBRARY.getActionName() + + "'" + + " action_name: '" + + LinkTargetType.PIC_STATIC_LIBRARY.getActionName() + + "'" + + " tool {" + + " tool_path: 'DUMMY_TOOL'" + + " }" + + "}"; + public static final String INCOMPLETE_ALWAYS_LINK_STATIC_LIBRARY_ACTION_CONFIG = + "" + + "action_config {" + + " config_name: '" + + LinkTargetType.ALWAYS_LINK_STATIC_LIBRARY.getActionName() + + "'" + + " action_name: '" + + LinkTargetType.ALWAYS_LINK_STATIC_LIBRARY.getActionName() + + "'" + + " tool {" + + " tool_path: 'DUMMY_TOOL'" + + " }" + + "}"; + public static final String INCOMPLETE_ALWAYS_LINK_PIC_STATIC_LIBRARY_EXECUTABLE_ACTION_CONFIG = + "" + + "action_config {" + + " config_name: '" + + LinkTargetType.ALWAYS_LINK_PIC_STATIC_LIBRARY.getActionName() + + "'" + + " action_name: '" + + LinkTargetType.ALWAYS_LINK_PIC_STATIC_LIBRARY.getActionName() + + "'" + + " tool {" + + " tool_path: 'DUMMY_TOOL'" + + " }" + + "}"; + public static final String INCOMPLETE_INTERFACE_DYNAMIC_LIBRARY_ACTION_CONFIG = + "" + + "action_config {" + + " config_name: '" + + LinkTargetType.INTERFACE_DYNAMIC_LIBRARY.getActionName() + + "'" + + " action_name: '" + + LinkTargetType.INTERFACE_DYNAMIC_LIBRARY.getActionName() + + "'" + + " tool {" + + " tool_path: 'DUMMY_TOOL'" + + " }" + + "}"; + /** Filter to remove implicit dependencies of C/C++ rules. */ private final Predicate<Label> ccLabelFilter = new Predicate<Label>() {
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java index a374dad..9842db8 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import com.google.common.base.Joiner; import com.google.common.base.Predicate; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -43,15 +44,13 @@ import com.google.devtools.build.lib.testutil.TestConstants; import com.google.devtools.build.lib.util.FileType; import com.google.devtools.build.lib.vfs.PathFragment; - +import java.util.ArrayList; +import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; -import java.util.ArrayList; -import java.util.List; - /** * "White-box" unit test of cc_library rule. */ @@ -242,6 +241,42 @@ .containsExactlyElementsIn(action.getLinkCommandLine().getLinkopts()); } + /** + * Tests that if a given crosstool defines action configs for all link actions, that the link + * action will be configured from the crosstool instead of from hard-coded action_configs in + * {@code CppLinkActionConfigs}. + */ + @Test + public void testUsesCrosstoolIfLinkActionDefined() throws Exception { + String completeBrokenActionConfigs = + Joiner.on("\n") + .join( + MockCcSupport.INCOMPLETE_EXECUTABLE_ACTION_CONFIG, + MockCcSupport.INCOMPLETE_DYNAMIC_LIBRARY_ACTION_CONFIG, + MockCcSupport.INCOMPLETE_STATIC_LIBRARY_ACTION_CONFIG, + MockCcSupport.INCOMPLETE_PIC_STATIC_LIBRARY_ACTION_CONFIG, + MockCcSupport.INCOMPLETE_ALWAYS_LINK_STATIC_LIBRARY_ACTION_CONFIG, + MockCcSupport.INCOMPLETE_ALWAYS_LINK_PIC_STATIC_LIBRARY_EXECUTABLE_ACTION_CONFIG, + MockCcSupport.INCOMPLETE_INTERFACE_DYNAMIC_LIBRARY_ACTION_CONFIG); + AnalysisMock.get().ccSupport().setupCrosstool(mockToolsConfig, completeBrokenActionConfigs); + + useConfiguration( + "--features=" + Link.LinkTargetType.EXECUTABLE.getActionName(), + "--features=" + Link.LinkTargetType.DYNAMIC_LIBRARY.getActionName(), + "--features=" + Link.LinkTargetType.STATIC_LIBRARY.getActionName(), + "--features=" + Link.LinkTargetType.PIC_STATIC_LIBRARY.getActionName(), + "--features=" + Link.LinkTargetType.ALWAYS_LINK_STATIC_LIBRARY.getActionName(), + "--features=" + Link.LinkTargetType.ALWAYS_LINK_PIC_STATIC_LIBRARY.getActionName(), + "--features=" + Link.LinkTargetType.INTERFACE_DYNAMIC_LIBRARY.getActionName()); + + ConfiguredTarget hello = getConfiguredTarget("//hello:hello_static"); + Artifact archive = + FileType.filter(getFilesToBuild(hello), CppFileTypes.ARCHIVE).iterator().next(); + CppLinkAction action = (CppLinkAction) getGeneratingAction(archive); + + assertThat(Joiner.on(" ").join(action.getArgv())).doesNotContain("hello.pic.o"); + } + @Test public void testLinkActionCanConsumeArtifactExtensions() throws Exception { AnalysisMock.get()