C++: Write GoWrapCc in Skylark
go_wrap_cc is partially re-written in Skylark in this CL. To completely re-write in Skylark, there would have to be a Go Skylark API that exposes the necessary bits. See b/113797843.
RELNOTES:none
PiperOrigin-RevId: 211806913
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
index bdeacf0..e8ed749 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProvider.java
@@ -273,8 +273,9 @@
*
* @return true if this rule's compilations should apply -fPIC, false otherwise
*/
+ @Override
public boolean usePicForDynamicLibraries() {
- return getCppConfiguration().forcePic() || toolchainNeedsPic();
+ return forcePic || toolchainNeedsPic();
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcToolchainProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcToolchainProviderApi.java
index 6d2e014..2ee2ea2 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcToolchainProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcToolchainProviderApi.java
@@ -27,6 +27,19 @@
public interface CcToolchainProviderApi extends ToolchainInfoApi {
@SkylarkCallable(
+ name = "use_pic_for_dynamic_libraries",
+ doc =
+ "Returns true if this rule's compilations should apply -fPIC, false otherwise. "
+ + "Determines if we should apply -fPIC for this rule's C++ compilations. This "
+ + "determination is generally made by the global C++ configuration settings "
+ + "<code>needsPic</code> and <code>usePicForBinaries</code>. However, an individual "
+ + "rule may override these settings by applying <code>-fPIC</code> to its "
+ + "<code>nocopts</code> attribute. This allows incompatible rules to opt out of "
+ + "global PIC settings.",
+ structField = true)
+ boolean usePicForDynamicLibraries();
+
+ @SkylarkCallable(
name = "built_in_include_directories",
doc = "Returns the list of built-in directories of the compiler.",
structField = true)
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderTest.java
index c7804b2..6d4f41d 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcToolchainProviderTest.java
@@ -18,18 +18,11 @@
import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.testing.EqualsTester;
-import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.config.CompilationMode;
import com.google.devtools.build.lib.analysis.util.AnalysisMock;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
-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.FdoProvider.FdoMode;
-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.ToolPath;
import java.util.List;
@@ -43,90 +36,6 @@
@RunWith(JUnit4.class)
public class CcToolchainProviderTest extends BuildViewTestCase {
@Test
- public void equalityIsObjectIdentity() throws Exception {
- CcToolchainProvider a =
- new CcToolchainProvider(
- /* values= */ ImmutableMap.of(),
- /* cppConfiguration= */ null,
- /* toolchainInfo= */ null,
- /* crosstoolTopPathFragment= */ null,
- /* crosstool= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* crosstoolMiddleman= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* compile= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* strip= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* objCopy= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* as= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* ar= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* link= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* interfaceSoBuilder= */ null,
- /* dwp= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* coverage= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* libcLink= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* staticRuntimeLinkInputs= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* staticRuntimeLinkMiddleman= */ null,
- /* dynamicRuntimeLinkInputs= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* dynamicRuntimeLinkMiddleman= */ null,
- /* dynamicRuntimeSolibDir= */ PathFragment.EMPTY_FRAGMENT,
- CcCompilationContext.EMPTY,
- /* supportsParamFiles= */ false,
- /* supportsHeaderParsing= */ false,
- CcToolchainVariables.EMPTY,
- /* builtinIncludeFiles= */ ImmutableList.<Artifact>of(),
- /* coverageEnvironment= */ NestedSetBuilder.emptySet(Order.COMPILE_ORDER),
- /* linkDynamicLibraryTool= */ null,
- /* builtInIncludeDirectories= */ ImmutableList.<PathFragment>of(),
- /* sysroot= */ null,
- FdoMode.OFF,
- /* fdoProvider= */ null,
- /* useLLVMCoverageMapFormat= */ false,
- /* codeCoverageEnabled= */ false,
- /* isHostConfiguration= */ false);
-
- CcToolchainProvider b =
- new CcToolchainProvider(
- /* values= */ ImmutableMap.of(),
- /* cppConfiguration= */ null,
- /* toolchainInfo= */ null,
- /* crosstoolTopPathFragment= */ null,
- /* crosstool= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* crosstoolMiddleman= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* compile= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* strip= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* objCopy= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* as= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* ar= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* link= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* interfaceSoBuilder= */ null,
- /* dwp= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* coverage= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* libcLink= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* staticRuntimeLinkInputs= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* staticRuntimeLinkMiddleman= */ null,
- /* dynamicRuntimeLinkInputs= */ NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
- /* dynamicRuntimeLinkMiddleman= */ null,
- /* dynamicRuntimeSolibDir= */ PathFragment.EMPTY_FRAGMENT,
- CcCompilationContext.EMPTY,
- /* supportsParamFiles= */ false,
- /* supportsHeaderParsing= */ false,
- CcToolchainVariables.EMPTY,
- /* builtinIncludeFiles= */ ImmutableList.<Artifact>of(),
- /* coverageEnvironment= */ NestedSetBuilder.emptySet(Order.COMPILE_ORDER),
- /* linkDynamicLibraryTool= */ null,
- /* builtInIncludeDirectories= */ ImmutableList.<PathFragment>of(),
- /* sysroot= */ null,
- FdoMode.OFF,
- /* fdoProvider= */ null,
- /* useLLVMCoverageMapFormat= */ false,
- /* codeCoverageEnabled= */ false,
- /* isHostConfiguration= */ false);
-
- new EqualsTester()
- .addEqualityGroup(a)
- .addEqualityGroup(b)
- .testEquals();
- }
-
- @Test
public void testSkylarkCallables() throws Exception {
AnalysisMock.get()
.ccSupport()
@@ -138,8 +47,9 @@
.setBuiltinSysroot("/usr/local/custom-sysroot")
.addToolPath(ToolPath.newBuilder().setName("ar").setPath("foo/ar/path").build())
.buildPartial());
- useConfiguration("--cpu=k8");
- scratch.file("test/rule.bzl",
+ useConfiguration("--cpu=k8", "--force_pic");
+ scratch.file(
+ "test/rule.bzl",
"def _impl(ctx):",
" provider = ctx.attr._cc_toolchain[cc_common.CcToolchainInfo]",
" return struct(",
@@ -151,6 +61,7 @@
" compiler_options = provider.compiler_options(),",
" cxx_options = provider.cxx_options(),",
" ar_executable = provider.ar_executable,",
+ " use_pic_for_dynamic_libraries = provider.use_pic_for_dynamic_libraries,",
" )",
"",
"my_rule = rule(",
@@ -186,6 +97,10 @@
@SuppressWarnings("unchecked")
List<String> unfilteredCompilerOptions = (List<String>) ct.get("unfiltered_compiler_options");
assertThat(unfilteredCompilerOptions).contains("--sysroot=/usr/local/custom-sysroot");
+
+ @SuppressWarnings("unchecked")
+ boolean usePicForDynamicLibraries = (boolean) ct.get("use_pic_for_dynamic_libraries");
+ assertThat(usePicForDynamicLibraries).isTrue();
}
@Test