diff options
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.java | 67 |
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; } |