diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java | 58 |
1 files changed, 42 insertions, 16 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java index 8931024b93..aa98d37cac 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java @@ -31,6 +31,7 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap; +import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMapBuilder; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; @@ -41,6 +42,7 @@ import com.google.devtools.build.lib.packages.NativeAspectClass; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.cpp.CcCommon; import com.google.devtools.build.lib.rules.cpp.CcLibraryHelper; +import com.google.devtools.build.lib.rules.cpp.CcLibraryHelper.Info; import com.google.devtools.build.lib.rules.cpp.CcToolchain; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration; import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider; @@ -144,13 +146,12 @@ public class CcProtoAspect extends NativeAspectClass implements ConfiguredAspect FeatureConfiguration featureConfiguration = getFeatureConfiguration(supportData); ProtoConfiguration protoConfiguration = ruleContext.getFragment(ProtoConfiguration.class); - CcLibraryHelper helper = initializeCcLibraryHelper(featureConfiguration); - helper.addDeps(ruleContext.getPrerequisites("deps", TARGET)); + CcLibraryHelper compilationHelper = initializeCompilationHelper(featureConfiguration); // Compute and register files generated by this proto library. Collection<Artifact> outputs = new ArrayList<>(); if (areSrcsBlacklisted()) { - registerBlacklistedSrcs(supportData, helper); + registerBlacklistedSrcs(supportData, compilationHelper); headerProvider = null; } else if (supportData.hasProtoSources()) { Collection<Artifact> headers = @@ -160,8 +161,8 @@ public class CcProtoAspect extends NativeAspectClass implements ConfiguredAspect outputs.addAll(headers); outputs.addAll(sources); - helper.addSources(sources); - helper.addPublicHeaders(headers); + compilationHelper.addSources(sources); + compilationHelper.addPublicHeaders(headers); NestedSetBuilder<Artifact> publicHeaderPaths = NestedSetBuilder.stableOrder(); publicHeaderPaths.addAll(headers); @@ -176,7 +177,7 @@ public class CcProtoAspect extends NativeAspectClass implements ConfiguredAspect NestedSetBuilder<Artifact> transitiveHeaders = NestedSetBuilder.stableOrder(); for (ProtoCcHeaderProvider provider : ruleContext.getPrerequisites("deps", TARGET, ProtoCcHeaderProvider.class)) { - helper.addPublicTextualHeaders(provider.getHeaders()); + compilationHelper.addPublicTextualHeaders(provider.getHeaders()); transitiveHeaders.addTransitive(provider.getHeaders()); } headerProvider = new ProtoCcHeaderProvider(transitiveHeaders.build()); @@ -186,11 +187,24 @@ public class CcProtoAspect extends NativeAspectClass implements ConfiguredAspect filesBuilder.addAll(outputs); createProtoCompileAction(supportData, outputs); - CcLibraryHelper.Info info = helper.build(); - ccLibraryProviders = info.getProviders(); - outputGroups = info.getOutputGroups(); + Info.CompilationInfo compilationInfo = compilationHelper.compile(); + Info.LinkingInfo linkingInfo = + initializeLinkingHelper(featureConfiguration) + .link( + compilationInfo.getCcCompilationOutputs(), + compilationInfo.getCppCompilationContext()); + + ccLibraryProviders = + new TransitiveInfoProviderMapBuilder() + .addAll(compilationInfo.getProviders()) + .addAll(linkingInfo.getProviders()) + .build(); + outputGroups = + ImmutableMap.copyOf( + Info.mergeOutputGroups( + compilationInfo.getOutputGroups(), linkingInfo.getOutputGroups())); // On Windows, dynamic library is not built by default, so don't add them to filesToBuild. - info.addLinkingOutputsTo( + linkingInfo.addLinkingOutputsTo( filesBuilder, !featureConfiguration.isEnabled(CppRuleClasses.TARGETS_WINDOWS)); } @@ -227,17 +241,29 @@ public class CcProtoAspect extends NativeAspectClass implements ConfiguredAspect featureConfiguration, ccToolchain(ruleContext), CppHelper.getFdoSupportUsingDefaultCcToolchainAttribute(ruleContext)); - helper.enableCcSpecificLinkParamsProvider(); - helper.enableCcNativeLibrariesProvider(); + TransitiveInfoCollection runtime = getProtoToolchainProvider().runtime(); + if (runtime != null) { + helper.addDeps(ImmutableList.of(runtime)); + } + + helper.addDeps(ruleContext.getPrerequisites("deps", TARGET)); + return helper; + } + + private CcLibraryHelper initializeCompilationHelper(FeatureConfiguration featureConfiguration) { + return initializeCcLibraryHelper(featureConfiguration); + } + + private CcLibraryHelper initializeLinkingHelper(FeatureConfiguration featureConfiguration) { + CcLibraryHelper helper = + initializeCcLibraryHelper(featureConfiguration) + .enableCcSpecificLinkParamsProvider() + .enableCcNativeLibrariesProvider(); // TODO(dougk): Configure output artifact with action_config // once proto compile action is configurable from the crosstool. if (!ccToolchain(ruleContext).supportsDynamicLinker()) { helper.setCreateDynamicLibrary(false); } - TransitiveInfoCollection runtime = getProtoToolchainProvider().runtime(); - if (runtime != null) { - helper.addDeps(ImmutableList.of(runtime)); - } return helper; } |