aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationInfo.java31
2 files changed, 31 insertions, 9 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java
index 7153cf62a8..fda27a7f16 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java
@@ -522,7 +522,7 @@ public final class CcCompilationContext implements CcCompilationContextApi {
*
* <p>Filters out fileset directory artifacts, which are not valid inputs.
*/
- public Builder addDeclaredIncludeSrcs(Collection<Artifact> declaredIncludeSrcs) {
+ public Builder addDeclaredIncludeSrcs(Iterable<Artifact> declaredIncludeSrcs) {
for (Artifact source : declaredIncludeSrcs) {
addDeclaredIncludeSrc(source);
}
@@ -636,8 +636,11 @@ public final class CcCompilationContext implements CcCompilationContextApi {
ImmutableList.copyOf(quoteIncludeDirs),
ImmutableList.copyOf(systemIncludeDirs),
ImmutableList.copyOf(defines)),
+ // TODO(b/110873917): We don't have the middle man compilation prerequisite, therefore, we
+ // use the compilation prerequisites as they were passed to the builder, i.e. we use every
+ // header instead of a middle man.
prerequisiteStampFile == null
- ? ImmutableSet.of()
+ ? ImmutableSet.copyOf(compilationPrerequisites)
: ImmutableSet.of(prerequisiteStampFile),
declaredIncludeDirs.build(),
declaredIncludeWarnDirs.build(),
@@ -659,7 +662,7 @@ public final class CcCompilationContext implements CcCompilationContextApi {
*/
private Artifact createMiddleman(ActionOwner owner,
MiddlemanFactory middlemanFactory) {
- if (compilationPrerequisites.isEmpty()) {
+ if (middlemanFactory == null || compilationPrerequisites.isEmpty()) {
return null;
}
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 37c43b6f5f..9278bea09a 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
@@ -16,6 +16,7 @@ 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.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;
@@ -29,7 +30,10 @@ 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.Runtime;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
import com.google.devtools.build.lib.syntax.SkylarkType;
+import javax.annotation.Nullable;
/** Wrapper for every C++ compilation provider. */
@Immutable
@@ -40,12 +44,22 @@ public final class CcCompilationInfo extends NativeInfo implements CcCompilation
FunctionSignature.of(
/* numMandatoryPositionals= */ 0,
/* numOptionalPositionals= */ 0,
- /* numMandatoryNamedOnly= */ 1,
+ /* numMandatoryNamedOnly= */ 0,
/* starArg= */ false,
/* kwArg= */ false,
- "cc_compilation_info"),
- /* defaultValues= */ ImmutableList.of(),
- /* types= */ ImmutableList.of(SkylarkType.of(CcCompilationContext.class)));
+ "headers"),
+ /* defaultValues= */ ImmutableList.of(Runtime.NONE),
+ /* types= */ ImmutableList.of(SkylarkType.of(SkylarkNestedSet.class)));
+
+ @Nullable
+ private static Object nullIfNone(Object object) {
+ return nullIfNone(object, Object.class);
+ }
+
+ @Nullable
+ private static <T> T nullIfNone(Object object, Class<T> type) {
+ return object != Runtime.NONE ? type.cast(object) : null;
+ }
public static final NativeProvider<CcCompilationInfo> PROVIDER =
new NativeProvider<CcCompilationInfo>(
@@ -56,8 +70,13 @@ 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();
- ccCompilationInfoBuilder.setCcCompilationContext(
- ((CcCompilationInfo) args[0]).getCcCompilationContext());
+ SkylarkNestedSet headers = (SkylarkNestedSet) nullIfNone(args[0]);
+ CcCompilationContext.Builder ccCompilationContext =
+ new CcCompilationContext.Builder(/* ruleContext= */ null);
+ if (headers != null) {
+ ccCompilationContext.addDeclaredIncludeSrcs(headers.getSet(Artifact.class));
+ }
+ ccCompilationInfoBuilder.setCcCompilationContext(ccCompilationContext.build());
return ccCompilationInfoBuilder.build();
}
};