aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationInfo.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationInfo.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationInfo.java67
1 files changed, 63 insertions, 4 deletions
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 0e540b6106..d6806ad487 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
@@ -21,6 +21,8 @@ import com.google.devtools.build.lib.actions.Artifact;
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.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.events.Location;
import com.google.devtools.build.lib.packages.NativeInfo;
@@ -34,6 +36,8 @@ import com.google.devtools.build.lib.syntax.FunctionSignature;
import com.google.devtools.build.lib.syntax.Runtime;
import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
import com.google.devtools.build.lib.syntax.SkylarkType;
+import com.google.devtools.build.lib.vfs.PathFragment;
+import java.util.Collection;
import javax.annotation.Nullable;
/** Wrapper for every C++ compilation provider. */
@@ -48,9 +52,14 @@ public final class CcCompilationInfo extends NativeInfo implements CcCompilation
/* numMandatoryNamedOnly= */ 0,
/* starArg= */ false,
/* kwArg= */ false,
- "headers"),
- /* defaultValues= */ ImmutableList.of(Runtime.NONE),
- /* types= */ ImmutableList.of(SkylarkType.of(SkylarkNestedSet.class)));
+ "headers",
+ "system_includes",
+ "defines"),
+ /* defaultValues= */ ImmutableList.of(Runtime.NONE, Runtime.NONE, Runtime.NONE),
+ /* types= */ ImmutableList.of(
+ SkylarkType.of(SkylarkNestedSet.class),
+ SkylarkType.of(SkylarkNestedSet.class),
+ SkylarkType.of(SkylarkNestedSet.class)));
@Nullable
private static Object nullIfNone(Object object) {
@@ -71,12 +80,27 @@ public final class CcCompilationInfo extends NativeInfo implements CcCompilation
Object[] args, Environment env, Location loc) throws EvalException {
CcCommon.checkLocationWhitelisted(loc);
CcCompilationInfo.Builder ccCompilationInfoBuilder = CcCompilationInfo.Builder.create();
- SkylarkNestedSet headers = (SkylarkNestedSet) nullIfNone(args[0]);
CcCompilationContext.Builder ccCompilationContext =
new CcCompilationContext.Builder(/* ruleContext= */ null);
+ int i = 0;
+ SkylarkNestedSet headers = (SkylarkNestedSet) nullIfNone(args[i++]);
if (headers != null) {
ccCompilationContext.addDeclaredIncludeSrcs(headers.getSet(Artifact.class));
}
+ SkylarkNestedSet systemIncludes = (SkylarkNestedSet) nullIfNone(args[i++]);
+ if (systemIncludes != null) {
+ ccCompilationContext.addSystemIncludeDirs(
+ systemIncludes
+ .getSet(String.class)
+ .toList()
+ .stream()
+ .map(x -> PathFragment.create(x))
+ .collect(ImmutableList.toImmutableList()));
+ }
+ SkylarkNestedSet defines = (SkylarkNestedSet) nullIfNone(args[i++]);
+ if (defines != null) {
+ ccCompilationContext.addDefines(defines.getSet(String.class));
+ }
ccCompilationInfoBuilder.setCcCompilationContext(ccCompilationContext.build());
return ccCompilationInfoBuilder.build();
}
@@ -91,6 +115,41 @@ public final class CcCompilationInfo extends NativeInfo implements CcCompilation
this.ccCompilationContext = ccCompilationContext;
}
+ public static CcCompilationInfo merge(Collection<CcCompilationInfo> ccCompilationInfos) {
+ CcCompilationContext.Builder builder =
+ new CcCompilationContext.Builder(/* ruleContext= */ null);
+ builder.mergeDependentCcCompilationContexts(
+ ccCompilationInfos
+ .stream()
+ .map(CcCompilationInfo::getCcCompilationContext)
+ .collect(ImmutableList.toImmutableList()));
+ return (new CcCompilationInfo.Builder()).setCcCompilationContext(builder.build()).build();
+ }
+
+ @Override
+ public SkylarkNestedSet getSkylarkDefines() {
+ return SkylarkNestedSet.of(
+ String.class, NestedSetBuilder.wrap(Order.STABLE_ORDER, ccCompilationContext.getDefines()));
+ }
+
+ @Override
+ public SkylarkNestedSet getSkylarkHeaders() {
+ return SkylarkNestedSet.of(Artifact.class, ccCompilationContext.getDeclaredIncludeSrcs());
+ }
+
+ @Override
+ public SkylarkNestedSet getSkylarkDeclaredIncludeDirs() {
+ return SkylarkNestedSet.of(
+ String.class,
+ NestedSetBuilder.wrap(
+ Order.STABLE_ORDER,
+ ccCompilationContext
+ .getSystemIncludeDirs()
+ .stream()
+ .map(PathFragment::getPathString)
+ .collect(ImmutableList.toImmutableList())));
+ }
+
public CcCompilationContext getCcCompilationContext() {
return ccCompilationContext;
}