aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar plf <plf@google.com>2018-05-23 09:31:25 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-05-23 09:33:11 -0700
commit1435729d3d43b063a50227b9ab50a820569ee383 (patch)
tree98b696445037a4c0587fa17c8dccc72a213beb0c /src/main/java/com/google/devtools/build/lib
parent14c6d8edadb474cb72f5307b531a2699770f02d0 (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/lib')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java41
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationInfo.java30
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkingInfo.java37
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcRunfiles.java15
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcRunfilesApi.java38
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();
+}