aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google
diff options
context:
space:
mode:
authorGravatar Rumou Duan <rduan@google.com>2017-03-24 18:35:40 +0000
committerGravatar Philipp Wollermann <philwo@google.com>2017-03-27 11:36:15 +0000
commita9e30d226e0083fe4fe2e14c664c66a5970abd74 (patch)
tree06227bd77d4e93beff15b6f9b8747b2052d8ce8b /src/main/java/com/google
parentd56e1c6502bab2f79585e08a990360ab1d006101 (diff)
Add a GenerateJ2objcHeaderMap action to generate the J2ObjC header mapping.
The header mapping used to be generated by J2ObjcTranspilationAction and consumed by dependent J2ObjcTranspilationActions. This setup led to chained J2ObjcTranspilationActions and long critical path build time. With GenerateJ2objcHeaderMap action, we break that chain and shorten the critical path build time. This feature is guarded behind a new build flag, --experimental_j2objc_header_map. -- PiperOrigin-RevId: 151149906 MOS_MIGRATED_REVID=151149906
Diffstat (limited to 'src/main/java/com/google')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java90
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcCommandLineOptions.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcConfiguration.java10
3 files changed, 82 insertions, 25 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
index 237b124c1d..204329d43f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
@@ -27,6 +27,7 @@ import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.ParameterFile;
+import com.google.devtools.build.lib.actions.ParameterFile.ParameterFileType;
import com.google.devtools.build.lib.analysis.ConfiguredAspect;
import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
@@ -171,6 +172,15 @@ public class J2ObjcAspect extends NativeAspectClass implements ConfiguredAspectF
Label.parseAbsoluteUnchecked(
toolsRepository + "//tools/j2objc:j2objc_wrapper")))
.add(
+ attr("$j2objc_header_map", LABEL)
+ .allowedFileTypes(FileType.of(".py"))
+ .cfg(HOST)
+ .exec()
+ .singleArtifact()
+ .value(
+ Label.parseAbsoluteUnchecked(
+ toolsRepository + "//tools/j2objc:j2objc_header_map")))
+ .add(
attr("$jre_emul_jar", LABEL)
.cfg(HOST)
.value(
@@ -423,7 +433,11 @@ public class J2ObjcAspect extends NativeAspectClass implements ConfiguredAspectF
// J2ObjC merges all transitive input header mapping files into one header mapping file,
// so we only need to re-export other dependent output header mapping files in proto rules and
// rules where J2ObjC is not run (e.g., no sources).
- if (isProtoRule(base) || exportedHeaderMappingFiles.isEmpty()) {
+ // We also add the transitive header mapping files if experimental J2ObjC header mapping is
+ // turned on. The experimental support does not merge transitive input header mapping files.
+ boolean experimentalJ2ObjcHeaderMap =
+ ruleContext.getFragment(J2ObjcConfiguration.class).experimentalJ2ObjcHeaderMap();
+ if (isProtoRule(base) || exportedHeaderMappingFiles.isEmpty() || experimentalJ2ObjcHeaderMap) {
exportedHeaderMappingFiles.addTransitive(
depJ2ObjcMappingFileProvider.getHeaderMappingFiles());
}
@@ -507,8 +521,12 @@ public class J2ObjcAspect extends NativeAspectClass implements ConfiguredAspectF
argBuilder.addJoinExecPaths("--header-mapping", ",", depsHeaderMappingFiles);
}
+ boolean experimentalJ2ObjcHeaderMap =
+ ruleContext.getFragment(J2ObjcConfiguration.class).experimentalJ2ObjcHeaderMap();
Artifact outputHeaderMappingFile = j2ObjcOutputHeaderMappingFile(ruleContext);
- argBuilder.addExecPath("--output-header-mapping", outputHeaderMappingFile);
+ if (!experimentalJ2ObjcHeaderMap) {
+ argBuilder.addExecPath("--output-header-mapping", outputHeaderMappingFile);
+ }
NestedSet<Artifact> depsClassMappingFiles = depJ2ObjcMappingFileProvider.getClassMappingFiles();
if (!depsClassMappingFiles.isEmpty()) {
@@ -542,29 +560,51 @@ public class J2ObjcAspect extends NativeAspectClass implements ConfiguredAspectF
ParameterFile.ParameterFileType.UNQUOTED,
ISO_8859_1));
- SpawnAction.Builder builder = new SpawnAction.Builder()
- .setMnemonic("TranspilingJ2objc")
- .setExecutable(ruleContext.getPrerequisiteArtifact("$j2objc_wrapper", Mode.HOST))
- .addInput(ruleContext.getPrerequisiteArtifact("$j2objc_wrapper", Mode.HOST))
- .addInput(j2ObjcDeployJar)
- .addInput(bootclasspathJar)
- .addInputs(sources)
- .addInputs(sourceJars)
- .addTransitiveInputs(compileTimeJars)
- .addTransitiveInputs(JavaHelper.getHostJavabaseInputs(ruleContext))
- .addTransitiveInputs(depsHeaderMappingFiles)
- .addTransitiveInputs(depsClassMappingFiles)
- .addInput(paramFile)
- .setCommandLine(CustomCommandLine.builder()
- .addPaths("@%s", paramFile.getExecPath())
- .build())
- .addOutputs(j2ObjcSource.getObjcSrcs())
- .addOutputs(j2ObjcSource.getObjcHdrs())
- .addOutput(outputHeaderMappingFile)
- .addOutput(outputDependencyMappingFile)
- .addOutput(archiveSourceMappingFile);
-
- ruleContext.registerAction(builder.build(ruleContext));
+ SpawnAction.Builder transpilationAction =
+ new SpawnAction.Builder()
+ .setMnemonic("TranspilingJ2objc")
+ .setExecutable(ruleContext.getPrerequisiteArtifact("$j2objc_wrapper", Mode.HOST))
+ .addInput(ruleContext.getPrerequisiteArtifact("$j2objc_wrapper", Mode.HOST))
+ .addInput(j2ObjcDeployJar)
+ .addInput(bootclasspathJar)
+ .addInputs(sources)
+ .addInputs(sourceJars)
+ .addTransitiveInputs(compileTimeJars)
+ .addTransitiveInputs(JavaHelper.getHostJavabaseInputs(ruleContext))
+ .addTransitiveInputs(depsHeaderMappingFiles)
+ .addTransitiveInputs(depsClassMappingFiles)
+ .addInput(paramFile)
+ .setCommandLine(
+ CustomCommandLine.builder().addPaths("@%s", paramFile.getExecPath()).build())
+ .addOutputs(j2ObjcSource.getObjcSrcs())
+ .addOutputs(j2ObjcSource.getObjcHdrs())
+ .addOutput(outputDependencyMappingFile)
+ .addOutput(archiveSourceMappingFile);
+ if (!experimentalJ2ObjcHeaderMap) {
+ transpilationAction.addOutput(outputHeaderMappingFile);
+ }
+ ruleContext.registerAction(transpilationAction.build(ruleContext));
+
+ if (experimentalJ2ObjcHeaderMap) {
+ CustomCommandLine.Builder headerMapCommandLine = CustomCommandLine.builder();
+ if (!Iterables.isEmpty(sources)) {
+ headerMapCommandLine.addJoinExecPaths("--source_files", ",", sources);
+ }
+ if (!Iterables.isEmpty(sourceJars)) {
+ headerMapCommandLine.addJoinExecPaths("--source_jars", ",", sourceJars);
+ }
+ headerMapCommandLine.addExecPath("--output_mapping_file", outputHeaderMappingFile);
+ ruleContext.registerAction(new SpawnAction.Builder()
+ .setMnemonic("GenerateJ2objcHeaderMap")
+ .setExecutable(ruleContext.getPrerequisiteArtifact("$j2objc_header_map", Mode.HOST))
+ .addInput(ruleContext.getPrerequisiteArtifact("$j2objc_header_map", Mode.HOST))
+ .addInputs(sources)
+ .addInputs(sourceJars)
+ .setCommandLine(headerMapCommandLine.build())
+ .useParameterFile(ParameterFileType.SHELL_QUOTED)
+ .addOutput(outputHeaderMappingFile)
+ .build(ruleContext));
+ }
return new J2ObjcMappingFileProvider(
NestedSetBuilder.<Artifact>stableOrder().add(outputHeaderMappingFile).build(),
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcCommandLineOptions.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcCommandLineOptions.java
index b54ef9ee84..4c6a42c67a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcCommandLineOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcCommandLineOptions.java
@@ -51,6 +51,13 @@ public class J2ObjcCommandLineOptions extends FragmentOptions {
)
public boolean explicitJreDeps;
+ @Option(name = "experimental_j2objc_header_map",
+ defaultValue = "false",
+ category = "flags",
+ help = "Whether to generate J2ObjC header map in parallel of J2ObjC transpilation."
+ )
+ public boolean experimentalJ2ObjcHeaderMap;
+
@Override
public void addAllLabels(Multimap<String, Label> labelMap) {}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcConfiguration.java
index bfe3074c5d..0253f6e386 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcConfiguration.java
@@ -87,10 +87,12 @@ public class J2ObjcConfiguration extends Fragment {
private final List<String> translationFlags;
private final boolean removeDeadCode;
private final boolean explicitJreDeps;
+ private final boolean experimentalJ2ObjcHeaderMap;
J2ObjcConfiguration(J2ObjcCommandLineOptions j2ObjcOptions) {
this.removeDeadCode = j2ObjcOptions.removeDeadCode;
this.explicitJreDeps = j2ObjcOptions.explicitJreDeps;
+ this.experimentalJ2ObjcHeaderMap = j2ObjcOptions.experimentalJ2ObjcHeaderMap;
this.translationFlags = ImmutableList.<String>builder()
.addAll(J2OBJC_DEFAULT_TRANSLATION_FLAGS)
.addAll(j2ObjcOptions.translationFlags)
@@ -127,6 +129,14 @@ public class J2ObjcConfiguration extends Fragment {
return explicitJreDeps;
}
+ /**
+ * Returns whether to generate J2ObjC header map in a separate action in parallel of the J2ObjC
+ * transpilation action.
+ */
+ public boolean experimentalJ2ObjcHeaderMap() {
+ return experimentalJ2ObjcHeaderMap;
+ }
+
@Override
public void reportInvalidOptions(EventHandler reporter, BuildOptions buildOptions) {
if (!Collections.disjoint(translationFlags, J2OBJC_BLACKLISTED_TRANSLATION_FLAGS)) {