From 07b2ea405c1ee3b70d3dea153338f897ba522ee0 Mon Sep 17 00:00:00 2001 From: allevato Date: Wed, 13 Jun 2018 14:24:42 -0700 Subject: * Update apple_common.link_multi_arch_binary to return all of its providers and output groups. * Make ctx a keyword argument so that we can more easily add more parameters in the future and eventually remove ctx. PiperOrigin-RevId: 200453550 --- .../build/lib/rules/objc/AppleSkylarkCommon.java | 32 ++++++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) (limited to 'src/main/java/com/google/devtools/build/lib/rules') diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java index 9e4daaddb1..690bd6970a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java @@ -17,6 +17,7 @@ package com.google.devtools.build.lib.rules.objc; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; +import com.google.common.collect.Maps; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.RuleContext; @@ -24,12 +25,14 @@ import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleContext; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; +import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.packages.Attribute.SplitTransitionProvider; import com.google.devtools.build.lib.packages.Info; -import com.google.devtools.build.lib.packages.NativeInfo; +import com.google.devtools.build.lib.packages.NativeProvider; import com.google.devtools.build.lib.packages.Provider; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.packages.SkylarkAspect; +import com.google.devtools.build.lib.packages.SkylarkInfo; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.ApplePlatform; import com.google.devtools.build.lib.rules.apple.ApplePlatform.PlatformType; @@ -41,6 +44,7 @@ import com.google.devtools.build.lib.rules.objc.AppleBinary.AppleBinaryOutput; import com.google.devtools.build.lib.rules.objc.ObjcProvider.Key; import com.google.devtools.build.lib.skylarkbuildapi.SkylarkRuleContextApi; import com.google.devtools.build.lib.skylarkbuildapi.apple.AppleCommonApi; +import com.google.devtools.build.lib.skylarkinterface.SkylarkValue; import com.google.devtools.build.lib.syntax.Environment; import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.Runtime; @@ -230,13 +234,14 @@ public class AppleSkylarkCommon } @Override - public NativeInfo linkMultiArchBinary(SkylarkRuleContextApi skylarkRuleContextApi) + public Info linkMultiArchBinary( + SkylarkRuleContextApi skylarkRuleContextApi, Environment environment) throws EvalException, InterruptedException { SkylarkRuleContext skylarkRuleContext = (SkylarkRuleContext) skylarkRuleContextApi; try { RuleContext ruleContext = skylarkRuleContext.getRuleContext(); AppleBinaryOutput appleBinaryOutput = AppleBinary.linkMultiArchBinary(ruleContext); - return appleBinaryOutput.getBinaryInfoProvider(); + return createAppleBinaryOutputSkylarkStruct(appleBinaryOutput, environment); } catch (RuleErrorException | ActionConflictException exception) { throw new EvalException(null, exception); } @@ -252,6 +257,27 @@ public class AppleSkylarkCommon return objcProtoAspect; } + /** + * Creates a Skylark struct that contains the results of the {@code link_multi_arch_binary} + * function. + */ + private Info createAppleBinaryOutputSkylarkStruct( + AppleBinaryOutput output, Environment environment) { + Provider constructor = new NativeProvider(Info.class, "apple_binary_output") {}; + // We have to transform the output group dictionary into one that contains SkylarkValues instead + // of plain NestedSets because the Skylark caller may want to return this directly from their + // implementation function. + Map outputGroups = + Maps.transformValues(output.getOutputGroups(), v -> SkylarkNestedSet.of(Artifact.class, v)); + + ImmutableMap fields = + ImmutableMap.of( + "binary_provider", output.getBinaryInfoProvider(), + "debug_outputs_provider", output.getDebugOutputsProvider(), + "output_groups", SkylarkDict.copyOf(environment, outputGroups)); + return SkylarkInfo.createSchemaless(constructor, fields, Location.BUILTIN); + } + static { SkylarkSignatureProcessor.configureSkylarkFunctions(AppleSkylarkCommon.class); } -- cgit v1.2.3