diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp')
5 files changed, 107 insertions, 25 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java index df9613d460..3941926f45 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParams.java @@ -243,7 +243,10 @@ public final class CcLinkParams { * the method does not do anything. */ public Builder addTransitiveTarget(TransitiveInfoCollection target) { - return addTransitiveProvider(target.get(CcLinkParamsInfo.PROVIDER)); + CcLinkingInfo ccLinkingInfo = target.get(CcLinkingInfo.PROVIDER); + CcLinkParamsInfo ccLinkParamsInfo = + ccLinkingInfo == null ? null : ccLinkingInfo.getCcLinkParamsInfo(); + return addTransitiveProvider(ccLinkParamsInfo); } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsInfo.java index 32afe7963a..7597d0ab8c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsInfo.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsInfo.java @@ -17,34 +17,23 @@ package com.google.devtools.build.lib.rules.cpp; import com.google.common.base.Function; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; 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.CcLinkParams.Builder; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsStore.CcLinkParamsStoreImpl; 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.SkylarkModule; -import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; /** A target that provides C linker parameters. */ @Immutable @AutoCodec -@SkylarkModule( - name = "cc_link_params_info", - title = "cc_link_params_info", - documented = false, - category = SkylarkModuleCategory.PROVIDER, - doc = "Link params provider" -) -public final class CcLinkParamsInfo extends NativeInfo { - public static final NativeProvider<CcLinkParamsInfo> PROVIDER = - new NativeProvider<CcLinkParamsInfo>(CcLinkParamsInfo.class, "link_params") {}; +public final class CcLinkParamsInfo { public static final Function<TransitiveInfoCollection, CcLinkParamsStore> TO_LINK_PARAMS = input -> { // ... then try Skylark. - CcLinkParamsInfo provider = input.get(PROVIDER); - if (provider != null) { - return provider.getCcLinkParamsStore(); + CcLinkingInfo provider = input.get(CcLinkingInfo.PROVIDER); + CcLinkParamsInfo ccLinkParamsInfo = + provider == null ? null : provider.getCcLinkParamsInfo(); + if (ccLinkParamsInfo != null) { + return ccLinkParamsInfo.getCcLinkParamsStore(); } return null; }; @@ -53,7 +42,6 @@ public final class CcLinkParamsInfo extends NativeInfo { @AutoCodec.Instantiator public CcLinkParamsInfo(CcLinkParamsStore store) { - super(PROVIDER); this.store = new CcLinkParamsStoreImpl(store); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java index 3b85d35add..6a9bab624d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingHelper.java @@ -107,9 +107,9 @@ public final class CcLinkingHelper { return providers; } - @SkylarkCallable(name = "cc_link_params_info", documented = false) - public CcLinkParamsInfo getCcLinkParamsInfo() { - return (CcLinkParamsInfo) providers.getProvider(CcLinkParamsInfo.PROVIDER.getKey()); + @SkylarkCallable(name = "cc_linking_info", documented = false) + public CcLinkingInfo getCcLinkParamsInfo() { + return (CcLinkingInfo) providers.getProvider(CcLinkingInfo.PROVIDER.getKey()); } public Map<String, NestedSet<Artifact>> getOutputGroups() { @@ -551,9 +551,11 @@ public final class CcLinkingHelper { new CcSpecificLinkParamsProvider( createCcLinkParamsStore(ccLinkingOutputs, ccCompilationContextInfo, forcePic))); } else { - providers.put( + CcLinkingInfo.Builder ccLinkingInfoBuilder = CcLinkingInfo.Builder.create(); + ccLinkingInfoBuilder.setCcLinkParamsInfo( new CcLinkParamsInfo( createCcLinkParamsStore(ccLinkingOutputs, ccCompilationContextInfo, forcePic))); + providers.put(ccLinkingInfoBuilder.build()); } return new LinkingInfo( providers.build(), outputGroups, ccLinkingOutputs, originalLinkingOutputs); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingInfo.java new file mode 100644 index 0000000000..2b25eae46d --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingInfo.java @@ -0,0 +1,85 @@ +// 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.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.SkylarkModule; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; + +/** Wrapper for every C++ linking provider. */ +@Immutable +@AutoCodec +@SkylarkModule( + name = "cc_linking_info", + documented = false, + category = SkylarkModuleCategory.PROVIDER, + doc = "Wrapper for every C++ linking provider" +) +public final class CcLinkingInfo extends NativeInfo { + public static final NativeProvider<CcLinkingInfo> PROVIDER = + new NativeProvider<CcLinkingInfo>(CcLinkingInfo.class, "CcLinkingInfo") {}; + + private final CcLinkParamsInfo ccLinkParamsInfo; + + @AutoCodec.Instantiator + @VisibleForSerialization + CcLinkingInfo(CcLinkParamsInfo ccLinkParamsInfo) { + super(PROVIDER); + this.ccLinkParamsInfo = ccLinkParamsInfo; + } + + public CcLinkParamsInfo getCcLinkParamsInfo() { + return ccLinkParamsInfo; + } + + /** A Builder for {@link CcLinkingInfo}. */ + public static class Builder { + CcLinkParamsInfo ccLinkParamsInfo; + + public static CcLinkingInfo.Builder create() { + return new CcLinkingInfo.Builder(); + } + + public Builder setCcLinkParamsInfo(CcLinkParamsInfo ccLinkParamsInfo) { + Preconditions.checkState(this.ccLinkParamsInfo == null); + this.ccLinkParamsInfo = ccLinkParamsInfo; + return this; + } + + public CcLinkingInfo build() { + return new CcLinkingInfo(ccLinkParamsInfo); + } + } + + public static ImmutableList<CcLinkParamsInfo> getCcLinkParamsInfos( + Iterable<? extends TransitiveInfoCollection> deps) { + ImmutableList.Builder<CcLinkParamsInfo> ccLinkParamsInfosBuilder = ImmutableList.builder(); + for (CcLinkingInfo ccLinkingInfo : AnalysisUtils.getProviders(deps, CcLinkingInfo.PROVIDER)) { + CcLinkParamsInfo ccLinkParamsInfo = ccLinkingInfo.getCcLinkParamsInfo(); + if (ccLinkParamsInfo != null) { + ccLinkParamsInfosBuilder.add(ccLinkParamsInfo); + } + } + return ccLinkParamsInfosBuilder.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 26ece69f1c..3d4fc9bcc5 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 @@ -65,7 +65,9 @@ public final class CcSkylarkApiProvider extends SkylarkApiProvider { + "(possibly empty but never <code>None</code>)") public NestedSet<Artifact> getLibraries() { NestedSetBuilder<Artifact> libs = NestedSetBuilder.linkOrder(); - CcLinkParamsInfo ccLinkParams = getInfo().get(CcLinkParamsInfo.PROVIDER); + CcLinkingInfo ccLinkingInfo = getInfo().get(CcLinkingInfo.PROVIDER); + CcLinkParamsInfo ccLinkParams = + ccLinkingInfo == null ? null : ccLinkingInfo.getCcLinkParamsInfo(); if (ccLinkParams == null) { return libs.build(); } @@ -84,7 +86,9 @@ public final class CcSkylarkApiProvider extends SkylarkApiProvider { + "<code>MOSTLY STATIC</code> mode (<code>linkstatic=1</code>) " + "(possibly empty but never <code>None</code>)") public ImmutableList<String> getLinkopts() { - CcLinkParamsInfo ccLinkParams = getInfo().get(CcLinkParamsInfo.PROVIDER); + CcLinkingInfo ccLinkingInfo = getInfo().get(CcLinkingInfo.PROVIDER); + CcLinkParamsInfo ccLinkParams = + ccLinkingInfo == null ? null : ccLinkingInfo.getCcLinkParamsInfo(); if (ccLinkParams == null) { return ImmutableList.of(); } |