diff options
author | 2017-05-25 02:51:44 +0200 | |
---|---|---|
committer | 2017-05-26 09:36:32 +0200 | |
commit | 9c625eb5ae6f41fed49d3777639a266012aca7b5 (patch) | |
tree | f0923331929e2f82b510d47c1dd3b1f52c10340e /src | |
parent | 79ed48a2c69f991abfc0bd02b92237094467c7f8 (diff) |
Added an implicit output target to j2objc_library
This implicit output is similar to objc_library's fully linked static library. For j2objc_library targets, we can use this output to trigger transpilation and generate a fully linked static library.
PiperOrigin-RevId: 157062831
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java | 29 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibraryRule.java | 42 |
2 files changed, 69 insertions, 2 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java index 2b14cca296..37913f0e8a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java @@ -19,6 +19,7 @@ import static com.google.devtools.build.lib.rules.objc.ObjcProvider.JRE_LIBRARY; import static com.google.devtools.build.lib.rules.objc.ObjcProvider.LIBRARY; import static com.google.devtools.build.lib.rules.objc.XcodeProductType.LIBRARY_STATIC; +import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.ConfiguredTarget; @@ -48,6 +49,17 @@ public class J2ObjcLibrary implements RuleConfiguredTargetFactory { public static final ImmutableList<String> J2OBJC_SUPPORTED_RULES = ImmutableList.of("java_import", "java_library", "proto_library"); + private ObjcCommon common(RuleContext ruleContext) { + return new ObjcCommon.Builder(ruleContext) + .setCompilationAttributes( + CompilationAttributes.Builder.fromRuleContext(ruleContext).build()) + .addDeps(ruleContext.getPrerequisites("deps", Mode.TARGET)) + .addDeps(ruleContext.getPrerequisites("jre_deps", Mode.TARGET)) + .setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext)) + .setHasModuleMap() + .build(); + } + @Override public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException, RuleErrorException { @@ -85,6 +97,23 @@ public class J2ObjcLibrary implements RuleConfiguredTargetFactory { J2ObjcMappingFileProvider j2ObjcMappingFileProvider = J2ObjcMappingFileProvider.union( ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class)); + ObjcCommon common = common(ruleContext); + CompilationArtifacts moduleMapCompilationArtifacts = + new CompilationArtifacts.Builder() + .setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext)) + .setPchFile(Optional.<Artifact>absent()) + .build(); + + new CompilationSupport.Builder() + .setRuleContext(ruleContext) + .setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext)) + .build() + .registerFullyLinkAction( + common.getObjcProvider(), + ruleContext.getImplicitOutputArtifact(CompilationSupport.FULLY_LINKED_LIB)) + .registerGenerateModuleMapAction(moduleMapCompilationArtifacts) + .validateAttributes(); + return new RuleConfiguredTargetBuilder(ruleContext) .setFilesToBuild(NestedSetBuilder.<Artifact>emptySet(STABLE_ORDER)) .add(RunfilesProvider.class, RunfilesProvider.EMPTY) diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibraryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibraryRule.java index d2dcd3f087..19b46794bb 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibraryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibraryRule.java @@ -22,6 +22,7 @@ import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder; import com.google.devtools.build.lib.rules.apple.AppleConfiguration; +import com.google.devtools.build.lib.rules.cpp.CppConfiguration; /** <code>j2objc_library</code> rule declaration. */ public class J2ObjcLibraryRule implements RuleDefinition { @@ -35,7 +36,10 @@ public class J2ObjcLibraryRule implements RuleDefinition { public RuleClass build(Builder builder, RuleDefinitionEnvironment env) { return builder .requiresConfigurationFragments( - J2ObjcConfiguration.class, ObjcConfiguration.class, AppleConfiguration.class) + J2ObjcConfiguration.class, + ObjcConfiguration.class, + AppleConfiguration.class, + CppConfiguration.class) /* <!-- #BLAZE_RULE(j2objc_library).ATTRIBUTE(deps) --> A list of <code>j2objc_library</code>, <code>java_library</code> and <code>java_import</code> targets that contain @@ -71,6 +75,13 @@ public class J2ObjcLibraryRule implements RuleDefinition { .direct_compile_time_input() .allowedRuleClasses("j2objc_library", "java_library", "java_import") .allowedFileTypes()) + /*<!-- #BLAZE_RULE(j2objc_library).IMPLICIT_OUTPUTS --> + <ul> + <li><code><var>name</var>_fully_linked.a</code>: A fully linked static library that + contains the full transitive closure of transpiled dependencies.</li> + </ul> + <!-- #END_BLAZE_RULE.IMPLICIT_OUTPUTS -->*/ + .setImplicitOutputsFunction(CompilationSupport.FULLY_LINKED_LIB) .cfg(AppleCrosstoolTransition.APPLE_CROSSTOOL_TRANSITION) .build(); } @@ -80,7 +91,34 @@ public class J2ObjcLibraryRule implements RuleDefinition { return RuleDefinition.Metadata.builder() .name("j2objc_library") .factoryClass(J2ObjcLibrary.class) - .ancestors(J2ObjcLibraryBaseRule.class) + .ancestors( + J2ObjcLibraryBaseRule.class, + ObjcRuleClasses.CrosstoolRule.class, + ObjcRuleClasses.LibtoolRule.class, + ObjcRuleClasses.XcrunRule.class) .build(); } } + +/*<!-- #BLAZE_RULE (NAME = j2objc_library, TYPE = LIBRARY, FAMILY = Objective-C) --> + +<p> This rule uses <a href="https://github.com/google/j2objc">J2ObjC</a> to translate Java source +files to Objective-C, which then can be used used as dependencies of objc_library and objc_binary +rules. Detailed information about J2ObjC itself can be found at <a href="http://j2objc.org">the +J2ObjC site</a> +</p> +<p>Custom J2ObjC transpilation flags can be specified using the build flag +<code>--j2objc_translation_flags</code> in the command line. +</p> +<p>Please note that the translated files included in a j2objc_library target will be +compiled using the default compilation configuration, the same configuration as for the sources of +an objc_library rule with no compilation options specified in attributes. +</p> +<p>Plus, generated code is de-duplicated at target level, not source level. If you have two +different Java targets that include the same Java source files, you may see a duplicate symbol error +at link time. The correct way to resolve this issue is to move the shared Java source files into a +separate common target that can be depended upon. +</p> + + +<!-- #END_BLAZE_RULE -->*/ |