aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2017-05-25 02:51:44 +0200
committerGravatar Irina Iancu <elenairina@google.com>2017-05-26 09:36:32 +0200
commit9c625eb5ae6f41fed49d3777639a266012aca7b5 (patch)
treef0923331929e2f82b510d47c1dd3b1f52c10340e /src
parent79ed48a2c69f991abfc0bd02b92237094467c7f8 (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.java29
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibraryRule.java42
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 -->*/