diff options
3 files changed, 29 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTestRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTestRule.java index d2454a363a..38059443f4 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTestRule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelIosTestRule.java @@ -46,12 +46,13 @@ public final class BazelIosTestRule implements RuleDefinition { <ul> <li><code><var>name</var>.ipa</code>: the test bundle as an <code>.ipa</code> file - <li><code><var>name</var>.xcodeproj/project.pbxproj: An Xcode project file which can be - used to develop or build on a Mac.</li> + <li><code><var>name</var>.xcodeproj/project.pbxproj</code>: An Xcode project file which + can be used to develop or build on a Mac + <li><code><var>name</var>_xctest_app.ipa</code>: ipa for the {@code xctest_app} binary </ul> <!-- #END_BLAZE_RULE.IMPLICIT_OUTPUTS -->*/ - .setImplicitOutputsFunction( - ImplicitOutputsFunction.fromFunctions(ReleaseBundlingSupport.IPA, XcodeSupport.PBXPROJ)) + .setImplicitOutputsFunction(ImplicitOutputsFunction.fromFunctions( + ReleaseBundlingSupport.IPA, XcodeSupport.PBXPROJ, ObjcRuleClasses.XCTEST_APP_IPA)) .add(attr(BazelIosTest.IOS_TEST_ON_BAZEL_ATTR, LABEL) .value(env.getLabel("//tools/objc:ios_test_on_bazel")).exec()) .build(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java index b04dc224c2..9be8102a57 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java @@ -22,6 +22,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.analysis.actions.SymlinkAction; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.packages.Type; @@ -101,6 +102,13 @@ public abstract class IosTest implements RuleConfiguredTargetFactory { "-bundle_loader", bundleLoader.getExecPathString()); extraLinkInputs = new ExtraLinkInputs(bundleLoader); + + ruleContext.registerAction( + new SymlinkAction( + ruleContext.getActionOwner(), + /*input=*/xcTestAppProvider(ruleContext).getIpa(), + /*output=*/ruleContext.getImplicitOutputArtifact(ObjcRuleClasses.XCTEST_APP_IPA), + "Symlink xctest_app .ipa")); } if (ruleContext.getConfiguration().isCodeCoverageEnabled()) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java index fd4caf6b52..d8c9f757c8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java @@ -38,6 +38,8 @@ import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.packages.Attribute; import com.google.devtools.build.lib.packages.AttributeMap; +import com.google.devtools.build.lib.packages.ImplicitOutputsFunction; +import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType; @@ -627,6 +629,20 @@ public class ObjcRuleClasses { } /** + * Output function for the .ipa containing the {@code xctest_app}, also known as the test rig. + * This is useful for external-to-Bazel scripts that require the test rig {@code .ipa}. + */ + public static final SafeImplicitOutputsFunction XCTEST_APP_IPA = + new SafeImplicitOutputsFunction() { + @Override + public Iterable<String> getImplicitOutputs(AttributeMap map) { + return map.get(IosTest.IS_XCTEST, Type.BOOLEAN) + ? ImplicitOutputsFunction.substitutePlaceholderIntoTemplate("%{name}_xctest_app.ipa", map) + : ImmutableList.<String>of(); + } + }; + + /** * Base rule definition for iOS test rules. */ @BlazeRule(name = "$ios_test_base_rule", |