diff options
author | Dmitry Lomov <dslomov@google.com> | 2016-10-06 12:14:43 +0000 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2016-10-07 08:04:02 +0000 |
commit | 299f57221bcd4b062f185ce1fc7840a8f29df217 (patch) | |
tree | 42eeeb39093cb57d57b194f92d39368dfa662a2e /src | |
parent | c23a997dd98bdaf5730044e3f73a921d160cf4b1 (diff) |
Add cc_common.link_params declared provider.
--
MOS_MIGRATED_REVID=135346927
Diffstat (limited to 'src')
4 files changed, 46 insertions, 11 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java index aa925d5a7f..51d2e6fe0a 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java @@ -45,7 +45,6 @@ import com.google.devtools.build.lib.util.Preconditions; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; -import java.util.Map.Entry; import java.util.TreeMap; /** @@ -297,6 +296,13 @@ public final class RuleConfiguredTargetBuilder { return this; } + public RuleConfiguredTargetBuilder addNativeDeclaredProvider(SkylarkClassObject provider) { + SkylarkClassObjectConstructor constructor = provider.getConstructor(); + Preconditions.checkState(constructor.isExported()); + skylarkDeclaredProviders.put(constructor.getKey(), provider); + return this; + } + /** * Add a Skylark transitive info. The provider value must be safe. */ diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java index 0854822e43..e4788334c3 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java +++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkClassObjectConstructor.java @@ -41,7 +41,7 @@ public final class SkylarkClassObjectConstructor extends BaseFunction implements * "struct" function. */ public static final SkylarkClassObjectConstructor STRUCT = - createNative("struct"); + createNativeConstructable("struct"); private static final FunctionSignature.WithValues<Object, SkylarkType> SIGNATURE = @@ -50,22 +50,39 @@ public final class SkylarkClassObjectConstructor extends BaseFunction implements @Nullable private Key key; + /** + * Some native declared providers are not constructable from Skylark. + */ + private final boolean isConstructable; + private SkylarkClassObjectConstructor(String name, Location location) { super(name, SIGNATURE, location); + // All Skylark-defined declared providers are constructable. + this.isConstructable = true; } - private SkylarkClassObjectConstructor(String name) { - this(name, Location.BUILTIN); - key = new NativeKey(); + private SkylarkClassObjectConstructor(String name, boolean isConstructable) { + super(name, SIGNATURE, Location.BUILTIN); + this.key = new NativeKey(); + this.isConstructable = isConstructable; } /** * Create a native Declared Provider ({@link SkylarkClassObject} constructor) */ public static SkylarkClassObjectConstructor createNative(String name) { - return new SkylarkClassObjectConstructor(name); + return new SkylarkClassObjectConstructor(name, false); + } + + /** + * Create a native Declared Provider ({@link SkylarkClassObject} constructor) + * that can be constructed from Skylark. + */ + public static SkylarkClassObjectConstructor createNativeConstructable(String name) { + return new SkylarkClassObjectConstructor(name, true); } + /** * Create a Skylark-defined Declared Provider ({@link SkylarkClassObject} constructor) * @@ -78,6 +95,11 @@ public final class SkylarkClassObjectConstructor extends BaseFunction implements @Override protected Object call(Object[] args, @Nullable FuncallExpression ast, @Nullable Environment env) throws EvalException, InterruptedException { + if (!isConstructable) { + Location loc = ast != null ? ast.getLocation() : Location.BUILTIN; + throw new EvalException(loc, + String.format("'%s' cannot be constructed from Skylark", getPrintableName())); + } @SuppressWarnings("unchecked") Map<String, Object> kwargs = (Map<String, Object>) args[0]; return new SkylarkClassObject(this, kwargs, ast != null ? ast.getLocation() : Location.BUILTIN); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsProvider.java index a433850b36..965cc9ef7b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsProvider.java @@ -15,16 +15,20 @@ package com.google.devtools.build.lib.rules.cpp; import com.google.common.base.Function; +import com.google.common.collect.ImmutableMap; 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.packages.SkylarkClassObject; +import com.google.devtools.build.lib.packages.SkylarkClassObjectConstructor; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsStore.CcLinkParamsStoreImpl; -/** - * A target that provides C linker parameters. - */ +/** A target that provides C linker parameters. */ @Immutable -public final class CcLinkParamsProvider implements TransitiveInfoProvider { +public final class CcLinkParamsProvider extends SkylarkClassObject + implements TransitiveInfoProvider { + public static final SkylarkClassObjectConstructor CC_LINK_PARAMS = + SkylarkClassObjectConstructor.createNative("link_params"); public static final Function<TransitiveInfoCollection, CcLinkParamsStore> TO_LINK_PARAMS = new Function<TransitiveInfoCollection, CcLinkParamsStore>() { @Override @@ -38,6 +42,7 @@ public final class CcLinkParamsProvider implements TransitiveInfoProvider { private final CcLinkParamsStoreImpl store; public CcLinkParamsProvider(CcLinkParamsStore store) { + super(CC_LINK_PARAMS, ImmutableMap.<String, Object>of()); this.store = new CcLinkParamsStoreImpl(store); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java index a6239ff270..6104833c31 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java @@ -168,6 +168,7 @@ public class JavaLibrary implements RuleConfiguredTargetFactory { NestedSet<Artifact> proguardSpecs = new ProguardLibrary(ruleContext).collectProguardSpecs(); + CcLinkParamsProvider ccLinkParamsProvider = new CcLinkParamsProvider(ccLinkParamsStore); builder .add( JavaRuleOutputJarsProvider.class, @@ -190,7 +191,8 @@ public class JavaLibrary implements RuleConfiguredTargetFactory { JavaCompilationArgsProvider.create( javaCompilationArgs, recursiveJavaCompilationArgs, compileTimeJavaDepArtifacts, runTimeJavaDepArtifacts)) - .add(CcLinkParamsProvider.class, new CcLinkParamsProvider(ccLinkParamsStore)) + .add(CcLinkParamsProvider.class, ccLinkParamsProvider) + .addNativeDeclaredProvider(ccLinkParamsProvider) .add( JavaNativeLibraryProvider.class, new JavaNativeLibraryProvider(transitiveJavaNativeLibraries)) |