diff options
author | plf <plf@google.com> | 2018-05-23 09:31:25 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-05-23 09:33:11 -0700 |
commit | 1435729d3d43b063a50227b9ab50a820569ee383 (patch) | |
tree | 98b696445037a4c0587fa17c8dccc72a213beb0c /src/main/java/com/google/devtools/build | |
parent | 14c6d8edadb474cb72f5307b531a2699770f02d0 (diff) |
C++: Expose additional methods for CcCompilationInfo and CcLinkingInfo
This is needed for re-writing match_clif in Skylark.
RELNOTES:none
PiperOrigin-RevId: 197738067
Diffstat (limited to 'src/main/java/com/google/devtools/build')
6 files changed, 158 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java index dade3218a3..954671a4ca 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java @@ -33,6 +33,7 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.analysis.config.CompilationMode; import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.platform.ToolchainInfo; +import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleContext; import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector; import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector.LocalMetadataCollector; import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider; @@ -41,7 +42,10 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.packages.BuildType; +import com.google.devtools.build.lib.packages.Rule; +import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.rules.apple.ApplePlatform; import com.google.devtools.build.lib.rules.cpp.CcCompilationHelper.SourceCategory; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.CollidingProvidesException; @@ -64,6 +68,7 @@ import java.util.Map; import java.util.TreeMap; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; +import java.util.stream.Collectors; import javax.annotation.Nullable; /** @@ -100,6 +105,9 @@ public final class CcCommon { } }; + private static final ImmutableList<PathFragment> WHITELISTED_PACKAGES = + ImmutableList.of(PathFragment.create("tools/build_defs")); + public static final ImmutableSet<String> ALL_COMPILE_ACTIONS = ImmutableSet.of( CppCompileAction.C_COMPILE, @@ -194,6 +202,39 @@ public final class CcCommon { return mergedOutputGroups; } + public static void checkRuleWhitelisted(SkylarkRuleContext skylarkRuleContext) + throws EvalException { + RuleContext context = skylarkRuleContext.getRuleContext(); + Rule rule = context.getRule(); + RuleClass ruleClass = rule.getRuleClassObject(); + Label label = ruleClass.getRuleDefinitionEnvironmentLabel(); + if (label != null + && WHITELISTED_PACKAGES + .stream() + .noneMatch(path -> label.getPackageFragment().startsWith(path))) { + throwWhiteListError(rule.getLocation(), label.getPackageFragment().toString()); + } + } + + public static void checkLocationWhitelisted(Location location) throws EvalException { + String bzlPath = location.getPath().toString(); + if (WHITELISTED_PACKAGES.stream().noneMatch(path -> bzlPath.contains(path.toString()))) { + throwWhiteListError(location, bzlPath); + } + } + + private static void throwWhiteListError(Location location, String bzlPath) throws EvalException { + String whitelistedPackages = + WHITELISTED_PACKAGES.stream().map(p -> p.toString()).collect(Collectors.joining(", ")); + throw new EvalException( + location, + String.format( + "the C++ Skylark API is for the time being only allowed for rules in in '//%s/...'; " + + "but this is defined in '//%s'. Contact blaze-rules@google.com for more " + + "information.", + whitelistedPackages, bzlPath)); + } + /** * Returns our own linkopts from the rule attribute. This determines linker * options to use when building this target and anything that depends on it. 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 index 98d596338a..f36d12397f 100644 --- 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 @@ -20,18 +20,46 @@ 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.events.Location; 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.skylarkbuildapi.cpp.CcCompilationInfoApi; +import com.google.devtools.build.lib.syntax.Environment; +import com.google.devtools.build.lib.syntax.EvalException; +import com.google.devtools.build.lib.syntax.FunctionSignature; +import com.google.devtools.build.lib.syntax.SkylarkType; /** Wrapper for every C++ compilation provider. */ @Immutable @AutoCodec public final class CcCompilationInfo extends NativeInfo implements CcCompilationInfoApi { + private static final FunctionSignature.WithValues<Object, SkylarkType> SIGNATURE = + FunctionSignature.WithValues.create( + FunctionSignature.of( + /* numMandatoryPositionals= */ 0, + /* numOptionalPositionals= */ 0, + /* numMandatoryNamedOnly= */ 1, + /* starArg= */ false, + /* kwArg= */ false, + "cc_compilation_context"), + /* defaultValues= */ ImmutableList.of(), + /* types= */ ImmutableList.of(SkylarkType.of(CcCompilationContext.class))); + public static final NativeProvider<CcCompilationInfo> PROVIDER = - new NativeProvider<CcCompilationInfo>(CcCompilationInfo.class, "CcCompilationInfo") {}; + new NativeProvider<CcCompilationInfo>( + CcCompilationInfo.class, "CcCompilationInfo", SIGNATURE) { + @Override + @SuppressWarnings("unchecked") + protected CcCompilationInfo createInstanceFromSkylark( + Object[] args, Environment env, Location loc) throws EvalException { + CcCommon.checkLocationWhitelisted(loc); + CcCompilationInfo.Builder ccCompilationInfoBuilder = CcCompilationInfo.Builder.create(); + ccCompilationInfoBuilder.setCcCompilationContext((CcCompilationContext) args[0]); + return ccCompilationInfoBuilder.build(); + } + }; private final CcCompilationContext ccCompilationContext; 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 index 840c32d702..b42eaa13f2 100644 --- 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 @@ -15,13 +15,20 @@ 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.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.events.Location; 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; +import com.google.devtools.build.lib.syntax.Environment; +import com.google.devtools.build.lib.syntax.EvalException; +import com.google.devtools.build.lib.syntax.FunctionSignature; +import com.google.devtools.build.lib.syntax.SkylarkType; /** Wrapper for every C++ linking provider. */ @Immutable @@ -33,8 +40,31 @@ import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; doc = "Wrapper for every C++ linking provider" ) public final class CcLinkingInfo extends NativeInfo { + + private static final FunctionSignature.WithValues<Object, SkylarkType> SIGNATURE = + FunctionSignature.WithValues.create( + FunctionSignature.of( + /* numMandatoryPositionals= */ 0, + /* numOptionalPositionals= */ 0, + /* numMandatoryNamedOnly= */ 1, + /* starArg= */ false, + /* kwArg= */ false, + "cc_runfiles"), + /* defaultValues= */ ImmutableList.of(), + /* types= */ ImmutableList.of(SkylarkType.of(CcRunfiles.class))); + public static final NativeProvider<CcLinkingInfo> PROVIDER = - new NativeProvider<CcLinkingInfo>(CcLinkingInfo.class, "CcLinkingInfo") {}; + new NativeProvider<CcLinkingInfo>(CcLinkingInfo.class, "CcLinkingInfo", SIGNATURE) { + @Override + @SuppressWarnings("unchecked") + protected CcLinkingInfo createInstanceFromSkylark( + Object[] args, Environment env, Location loc) throws EvalException { + CcCommon.checkLocationWhitelisted(loc); + CcLinkingInfo.Builder ccLinkingInfoBuilder = CcLinkingInfo.Builder.create(); + ccLinkingInfoBuilder.setCcRunfiles((CcRunfiles) args[0]); + return ccLinkingInfoBuilder.build(); + } + }; private final CcLinkParamsStore ccLinkParamsStore; private final CcRunfiles ccRunfiles; @@ -56,6 +86,11 @@ public final class CcLinkingInfo extends NativeInfo { return ccLinkParamsStore; } + @SkylarkCallable( + name = "cc_runfiles", + documented = false, + allowReturnNones = true, + structField = true) public CcRunfiles getCcRunfiles() { return ccRunfiles; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcRunfiles.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcRunfiles.java index bd6dd6b3cd..67e17c841f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcRunfiles.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcRunfiles.java @@ -19,9 +19,12 @@ import com.google.devtools.build.lib.analysis.Runfiles; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcRunfilesApi; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; /** - * Runfiles provider for C++ targets. + * Runfiles for C++ targets. * * <p>Contains two {@link Runfiles} objects: one for the statically linked binary and one for the * dynamically linked binary. Both contain dynamic libraries needed at runtime and data @@ -29,7 +32,13 @@ import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; */ @Immutable @AutoCodec -public final class CcRunfiles { +@SkylarkModule( + name = "cc_runfiles", + category = SkylarkModuleCategory.NONE, + doc = + "CC runfiles. Separated into files needed for linking statically and files needed for " + + "linking dynamically.") +public final class CcRunfiles implements CcRunfilesApi { private final Runfiles runfilesForLinkingStatically; private final Runfiles runfilesForLinkingDynamically; @@ -40,10 +49,12 @@ public final class CcRunfiles { this.runfilesForLinkingDynamically = runfilesForLinkingDynamically; } + @Override public Runfiles getRunfilesForLinkingStatically() { return runfilesForLinkingStatically; } + @Override public Runfiles getRunfilesForLinkingDynamically() { return runfilesForLinkingDynamically; } diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BUILD b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BUILD index 024e3239b9..811d5cb72b 100644 --- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BUILD +++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BUILD @@ -19,6 +19,7 @@ java_library( name = "cpp", srcs = glob(["*.java"]), deps = [ + "//src/main/java/com/google/devtools/build/lib:build-base", "//src/main/java/com/google/devtools/build/lib:skylarkinterface", "//src/main/java/com/google/devtools/build/lib:syntax", "//src/main/java/com/google/devtools/build/lib/actions", diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcRunfilesApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcRunfilesApi.java new file mode 100644 index 0000000000..eb49e2e77a --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcRunfilesApi.java @@ -0,0 +1,38 @@ +// Copyright 2018 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.skylarkbuildapi.cpp; + +import com.google.devtools.build.lib.analysis.Runfiles; +import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; +import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; + +/** Interface for Runfiles of C++ targets. */ +@SkylarkModule( + name = "cc_runfiles", + category = SkylarkModuleCategory.NONE, + doc = + "CC runfiles. Separated into files needed for linking statically and files needed for " + + "linking dynamically.") +public interface CcRunfilesApi { + @SkylarkCallable(name = "runfiles_for_linking_statically", documented = false, structField = true) + Runfiles getRunfilesForLinkingStatically(); + + @SkylarkCallable( + name = "runfiles_for_linking_dynamically", + documented = false, + structField = true) + Runfiles getRunfilesForLinkingDynamically(); +} |