diff options
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java | 9 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationInfo.java | 31 |
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(); } }; |