diff options
author | 2018-04-06 05:20:24 -0700 | |
---|---|---|
committer | 2018-04-06 05:21:38 -0700 | |
commit | aa3d37688f17435174156827a4beb4e1e5b0678a (patch) | |
tree | 849d2c6796a53a9a6cf9672e8bb31a12d777eebb /src/main/java/com/google/devtools/build/lib/rules/cpp | |
parent | 16198bf1f795af34bd72f751cc272c0ecc97f9e0 (diff) |
C++: Introduce provider that wraps C++ compilation providers.
For now, only CcCompilationContextInfo is wrapped. CcCompilationContextInfo will be renamed CcCompilationContext since the *Info suffix is used for providers. This will be done in a follow-up CL.
RELNOTES:none
PiperOrigin-RevId: 191876504
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp')
6 files changed, 143 insertions, 37 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java index b7bb5aa114..5e79a11e18 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java @@ -894,9 +894,13 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory { cppConfiguration.isLipoContextCollector(), cppConfiguration.processHeadersInDependencies(), CppHelper.usePicForDynamicLibraries(ruleContext, toolchain)); + + CcCompilationInfo.Builder ccCompilationInfoBuilder = CcCompilationInfo.Builder.create(); + ccCompilationInfoBuilder.setCcCompilationContextInfo(ccCompilationContextInfo); + builder .setFilesToBuild(filesToBuild) - .addNativeDeclaredProvider(ccCompilationContextInfo) + .addNativeDeclaredProvider(ccCompilationInfoBuilder.build()) .addProvider(TransitiveLipoInfoProvider.class, transitiveLipoInfo) .addNativeDeclaredProvider( new CcExecutionDynamicLibrariesInfo( diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContextInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContextInfo.java index c7b64d7c05..efd15ac512 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContextInfo.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContextInfo.java @@ -27,8 +27,6 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; -import com.google.devtools.build.lib.packages.NativeInfo; -import com.google.devtools.build.lib.packages.NativeProvider; import com.google.devtools.build.lib.rules.cpp.CppHelper.PregreppedHeader; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; @@ -56,11 +54,8 @@ import javax.annotation.Nullable; "Immutable store of information needed for C++ compilation that is aggregated across " + "dependencies." ) -public final class CcCompilationContextInfo extends NativeInfo { - public static final NativeProvider<CcCompilationContextInfo> PROVIDER = - new NativeProvider<CcCompilationContextInfo>( - CcCompilationContextInfo.class, "CcCompilationContextInfo") {}; - +// TODO(b/77669139): Rename to CcCompilationContext. +public final class CcCompilationContextInfo { /** An empty {@code CcCompilationContextInfo}. */ public static final CcCompilationContextInfo EMPTY = new Builder(null).build(); @@ -107,7 +102,6 @@ public final class CcCompilationContextInfo extends NativeInfo { CppModuleMap cppModuleMap, @Nullable CppModuleMap verificationModuleMap, boolean propagateModuleMapAsActionInput) { - super(PROVIDER); Preconditions.checkNotNull(commandLineCcCompilationContextInfo); this.commandLineCcCompilationContextInfo = commandLineCcCompilationContextInfo; this.declaredIncludeDirs = declaredIncludeDirs; @@ -274,8 +268,8 @@ public final class CcCompilationContextInfo extends NativeInfo { return new CcCompilationContextInfo( ccCompilationContextInfo.commandLineCcCompilationContextInfo, ccCompilationContextInfo.compilationPrerequisites, - NestedSetBuilder.<PathFragment>emptySet(Order.STABLE_ORDER), - NestedSetBuilder.<PathFragment>emptySet(Order.STABLE_ORDER), + NestedSetBuilder.emptySet(Order.STABLE_ORDER), + NestedSetBuilder.emptySet(Order.STABLE_ORDER), ccCompilationContextInfo.declaredIncludeSrcs, ccCompilationContextInfo.pregreppedHdrs, ccCompilationContextInfo.nonCodeInputs, diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java index ba662d8aff..49c88e280a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java @@ -128,8 +128,11 @@ public final class CcCompilationHelper { /** Function for extracting module maps from CppCompilationDependencies. */ private static final Function<TransitiveInfoCollection, CppModuleMap> CPP_DEPS_TO_MODULES = dep -> { - CcCompilationContextInfo ccCompilationContextInfo = - dep.get(CcCompilationContextInfo.PROVIDER); + CcCompilationInfo ccCompilationInfo = dep.get(CcCompilationInfo.PROVIDER); + CcCompilationContextInfo ccCompilationContextInfo = null; + if (ccCompilationInfo != null) { + ccCompilationContextInfo = ccCompilationInfo.getCcCompilationContextInfo(); + } return ccCompilationContextInfo == null ? null : ccCompilationContextInfo.getCppModuleMap(); }; @@ -150,17 +153,14 @@ public final class CcCompilationHelper { private final TransitiveInfoProviderMap providers; private final Map<String, NestedSet<Artifact>> outputGroups; private final CcCompilationOutputs compilationOutputs; - private final CcCompilationContextInfo ccCompilationContextInfo; private CompilationInfo( TransitiveInfoProviderMap providers, Map<String, NestedSet<Artifact>> outputGroups, - CcCompilationOutputs compilationOutputs, - CcCompilationContextInfo ccCompilationContextInfo) { + CcCompilationOutputs compilationOutputs) { this.providers = providers; this.outputGroups = outputGroups; this.compilationOutputs = compilationOutputs; - this.ccCompilationContextInfo = ccCompilationContextInfo; } public TransitiveInfoProviderMap getProviders() { @@ -177,8 +177,13 @@ public final class CcCompilationHelper { } @SkylarkCallable(name = "cc_compilation_info", documented = false) + public CcCompilationInfo getCcCompilationInfo() { + return (CcCompilationInfo) providers.getProvider(CcCompilationInfo.PROVIDER.getKey()); + } + public CcCompilationContextInfo getCcCompilationContextInfo() { - return ccCompilationContextInfo; + return ((CcCompilationInfo) providers.getProvider(CcCompilationInfo.PROVIDER.getKey())) + .getCcCompilationContextInfo(); } } @@ -731,7 +736,9 @@ public final class CcCompilationHelper { new CppDebugFileProvider( dwoArtifacts.getDwoArtifacts(), dwoArtifacts.getPicDwoArtifacts()), collectTransitiveLipoInfo(ccOutputs)); - providers.put(ccCompilationContextInfo); + CcCompilationInfo.Builder ccCompilationInfoBuilder = CcCompilationInfo.Builder.create(); + ccCompilationInfoBuilder.setCcCompilationContextInfo(ccCompilationContextInfo); + providers.put(ccCompilationInfoBuilder.build()); Map<String, NestedSet<Artifact>> outputGroups = new TreeMap<>(); outputGroups.put(OutputGroupInfo.TEMP_FILES, getTemps(ccOutputs)); @@ -747,8 +754,7 @@ public final class CcCompilationHelper { CcCommon.collectCompilationPrerequisites(ruleContext, ccCompilationContextInfo)); } - return new CompilationInfo( - providers.build(), outputGroups, ccOutputs, ccCompilationContextInfo); + return new CompilationInfo(providers.build(), outputGroups, ccOutputs); } @Immutable @@ -922,7 +928,7 @@ public final class CcCompilationHelper { if (useDeps) { ccCompilationContextInfoBuilder.mergeDependentCcCompilationContextInfos( - AnalysisUtils.getProviders(deps, CcCompilationContextInfo.PROVIDER)); + CcCompilationInfo.getCcCompilationContextInfos(deps)); ccCompilationContextInfoBuilder.mergeDependentCcCompilationContextInfos( depCcCompilationContextInfos); } @@ -1097,10 +1103,10 @@ public final class CcCompilationHelper { List<CppModuleMap> result = deps.stream().map(CPP_DEPS_TO_MODULES).collect(toCollection(ArrayList::new)); if (ruleContext.getRule().getAttributeDefinition(":stl") != null) { - CcCompilationContextInfo stl = - ruleContext.getPrerequisite(":stl", Mode.TARGET, CcCompilationContextInfo.PROVIDER); + CcCompilationInfo stl = + ruleContext.getPrerequisite(":stl", Mode.TARGET, CcCompilationInfo.PROVIDER); if (stl != null) { - result.add(stl.getCppModuleMap()); + result.add(stl.getCcCompilationContextInfo().getCppModuleMap()); } } @@ -1980,7 +1986,9 @@ public final class CcCompilationHelper { // implementation (with caching results of this method) to avoid O(N^2) slowdown. if (ruleContext.getRule().isAttrDefined("deps", BuildType.LABEL_LIST)) { for (TransitiveInfoCollection dep : ruleContext.getPrerequisites("deps", Mode.TARGET)) { - if (dep.get(CcCompilationContextInfo.PROVIDER) != null + CcCompilationInfo ccCompilationInfo = dep.get(CcCompilationInfo.PROVIDER); + if (ccCompilationInfo != null + && ccCompilationInfo.getCcCompilationContextInfo() != null && InstrumentedFilesCollector.shouldIncludeLocalSources(configuration, dep)) { return true; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationInfo.java new file mode 100644 index 0000000000..cba5d39184 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationInfo.java @@ -0,0 +1,97 @@ +// Copyright 2014 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.rules.cpp; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.analysis.AnalysisUtils; +import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; +import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; +import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.packages.NativeInfo; +import com.google.devtools.build.lib.packages.NativeProvider; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; +import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; + +/** Wrapper for every C++ compilation provider. */ +@Immutable +@AutoCodec +@SkylarkModule( + name = "cc_compilation_info", + documented = false, + category = SkylarkModuleCategory.PROVIDER, + doc = "Wrapper for every C++ compilation provider" +) +public final class CcCompilationInfo extends NativeInfo { + public static final NativeProvider<CcCompilationInfo> PROVIDER = + new NativeProvider<CcCompilationInfo>(CcCompilationInfo.class, "CcCompilationInfo") {}; + + private final CcCompilationContextInfo ccCompilationContextInfo; + + @AutoCodec.Instantiator + @VisibleForSerialization + CcCompilationInfo(CcCompilationContextInfo ccCompilationContextInfo) { + super(PROVIDER); + this.ccCompilationContextInfo = ccCompilationContextInfo; + } + + @SkylarkCallable( + name = "cc_compilation_context_info", + structField = true, + allowReturnNones = true, + doc = "Returns compilation information for this C++ target." + ) + public CcCompilationContextInfo getCcCompilationContextInfo() { + return ccCompilationContextInfo; + } + + /** A Builder for {@link CcCompilationInfo}. */ + public static class Builder { + CcCompilationContextInfo ccCompilationContextInfo; + + public static CcCompilationInfo.Builder create() { + return new CcCompilationInfo.Builder(); + } + + public <P extends TransitiveInfoProvider> Builder setCcCompilationContextInfo( + CcCompilationContextInfo ccCompilationContextInfo) { + Preconditions.checkState(this.ccCompilationContextInfo == null); + this.ccCompilationContextInfo = ccCompilationContextInfo; + return this; + } + + public CcCompilationInfo build() { + return new CcCompilationInfo(ccCompilationContextInfo); + } + } + + public static ImmutableList<CcCompilationContextInfo> getCcCompilationContextInfos( + Iterable<? extends TransitiveInfoCollection> deps) { + ImmutableList.Builder<CcCompilationContextInfo> ccCompilationContextInfosBuilder = + ImmutableList.builder(); + for (CcCompilationInfo ccCompilationInfo : + AnalysisUtils.getProviders(deps, CcCompilationInfo.PROVIDER)) { + CcCompilationContextInfo ccCompilationContextInfo = + ccCompilationInfo.getCcCompilationContextInfo(); + if (ccCompilationContextInfo != null) { + ccCompilationContextInfosBuilder.add(ccCompilationContextInfo); + } + } + return ccCompilationContextInfosBuilder.build(); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkylarkApiProvider.java index 61c89dd801..26ece69f1c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkylarkApiProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkylarkApiProvider.java @@ -51,7 +51,7 @@ public final class CcSkylarkApiProvider extends SkylarkApiProvider { + "(possibly empty but never <code>None</code>).") public NestedSet<Artifact> getTransitiveHeaders() { CcCompilationContextInfo ccCompilationContextInfo = - getInfo().get(CcCompilationContextInfo.PROVIDER); + getInfo().get(CcCompilationInfo.PROVIDER).getCcCompilationContextInfo(); return ccCompilationContextInfo.getDeclaredIncludeSrcs(); } @@ -99,7 +99,7 @@ public final class CcSkylarkApiProvider extends SkylarkApiProvider { + "(possibly empty but never <code>None</code>).") public ImmutableList<String> getDefines() { CcCompilationContextInfo ccCompilationContextInfo = - getInfo().get(CcCompilationContextInfo.PROVIDER); + getInfo().get(CcCompilationInfo.PROVIDER).getCcCompilationContextInfo(); return ccCompilationContextInfo == null ? ImmutableList.<String>of() : ccCompilationContextInfo.getDefines(); @@ -113,7 +113,7 @@ public final class CcSkylarkApiProvider extends SkylarkApiProvider { + "(possibly empty but never <code>None</code>).") public ImmutableList<String> getSystemIncludeDirs() { CcCompilationContextInfo ccCompilationContextInfo = - getInfo().get(CcCompilationContextInfo.PROVIDER); + getInfo().get(CcCompilationInfo.PROVIDER).getCcCompilationContextInfo(); if (ccCompilationContextInfo == null) { return ImmutableList.of(); } @@ -132,7 +132,7 @@ public final class CcSkylarkApiProvider extends SkylarkApiProvider { + "(possibly empty but never <code>None</code>).") public ImmutableList<String> getIncludeDirs() { CcCompilationContextInfo ccCompilationContextInfo = - getInfo().get(CcCompilationContextInfo.PROVIDER); + getInfo().get(CcCompilationInfo.PROVIDER).getCcCompilationContextInfo(); if (ccCompilationContextInfo == null) { return ImmutableList.of(); } @@ -151,7 +151,7 @@ public final class CcSkylarkApiProvider extends SkylarkApiProvider { + "(possibly empty but never <code>None</code>).") public ImmutableList<String> getQuoteIncludeDirs() { CcCompilationContextInfo ccCompilationContextInfo = - getInfo().get(CcCompilationContextInfo.PROVIDER); + getInfo().get(CcCompilationInfo.PROVIDER).getCcCompilationContextInfo(); if (ccCompilationContextInfo == null) { return ImmutableList.of(); } @@ -170,7 +170,7 @@ public final class CcSkylarkApiProvider extends SkylarkApiProvider { + "(possibly empty but never <code>None</code>).") public ImmutableList<String> getCcFlags() { CcCompilationContextInfo ccCompilationContextInfo = - getInfo().get(CcCompilationContextInfo.PROVIDER); + getInfo().get(CcCompilationInfo.PROVIDER).getCcCompilationContextInfo(); ImmutableList.Builder<String> options = ImmutableList.builder(); for (String define : ccCompilationContextInfo.getDefines()) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java index fe296394a9..2b8fd6a2f2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java @@ -120,13 +120,16 @@ public class CppHelper { if (ruleContext.getRule().getAttributeDefinition(":stl") != null) { TransitiveInfoCollection stl = ruleContext.getPrerequisite(":stl", Mode.TARGET); if (stl != null) { - CcCompilationContextInfo provider = stl.get(CcCompilationContextInfo.PROVIDER); - if (provider == null) { - ruleContext.ruleError("Unable to merge the STL '" + stl.getLabel() - + "' and toolchain contexts"); + CcCompilationInfo ccCompilationInfo = stl.get(CcCompilationInfo.PROVIDER); + CcCompilationContextInfo ccCompilationContextInfo = + ccCompilationInfo != null ? ccCompilationInfo.getCcCompilationContextInfo() : null; + if (ccCompilationContextInfo == null) { + ruleContext.ruleError( + "Unable to merge the STL '" + stl.getLabel() + "' and toolchain contexts"); return; } - ccCompilationContextInfoBuilder.mergeDependentCcCompilationContextInfo(provider); + ccCompilationContextInfoBuilder.mergeDependentCcCompilationContextInfo( + ccCompilationContextInfo); } } if (toolchain != null) { |