aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaLibraryRule.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelJ2ObjcLibraryRule.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java18
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaImportBaseRule.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java78
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcProtoAspect.java89
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java207
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java55
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionBinaryRule.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkBinaryRule.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java250
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcCommandLineOptions.java (renamed from src/main/java/com/google/devtools/build/lib/rules/java/J2ObjcCommandLineOptions.java)2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcConfiguration.java (renamed from src/main/java/com/google/devtools/build/lib/rules/java/J2ObjcConfiguration.java)4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java124
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java53
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibraryBaseRule.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java29
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcSrcsProvider.java172
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBinaryRule.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java23
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java85
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java29
28 files changed, 622 insertions, 633 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
index 650c556db1..ca1071dc87 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
@@ -87,8 +87,6 @@ import com.google.devtools.build.lib.rules.cpp.CppBuildInfo;
import com.google.devtools.build.lib.rules.cpp.CppConfigurationLoader;
import com.google.devtools.build.lib.rules.cpp.CppOptions;
import com.google.devtools.build.lib.rules.genquery.GenQueryRule;
-import com.google.devtools.build.lib.rules.java.J2ObjcCommandLineOptions;
-import com.google.devtools.build.lib.rules.java.J2ObjcConfiguration;
import com.google.devtools.build.lib.rules.java.JavaConfigurationLoader;
import com.google.devtools.build.lib.rules.java.JavaCpuSupplier;
import com.google.devtools.build.lib.rules.java.JavaImportBaseRule;
@@ -103,6 +101,8 @@ import com.google.devtools.build.lib.rules.objc.IosExtensionRule;
import com.google.devtools.build.lib.rules.objc.IosFrameworkBinaryRule;
import com.google.devtools.build.lib.rules.objc.IosFrameworkRule;
import com.google.devtools.build.lib.rules.objc.IosTestRule;
+import com.google.devtools.build.lib.rules.objc.J2ObjcCommandLineOptions;
+import com.google.devtools.build.lib.rules.objc.J2ObjcConfiguration;
import com.google.devtools.build.lib.rules.objc.J2ObjcLibraryBaseRule;
import com.google.devtools.build.lib.rules.objc.ObjcBinaryRule;
import com.google.devtools.build.lib.rules.objc.ObjcBuildInfoFactory;
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaLibraryRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaLibraryRule.java
index 454201f73c..317c9b8ce0 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaLibraryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaLibraryRule.java
@@ -26,7 +26,6 @@ import com.google.devtools.build.lib.bazel.rules.java.BazelJavaRuleClasses.JavaR
import com.google.devtools.build.lib.packages.RuleClass;
import com.google.devtools.build.lib.packages.RuleClass.Builder;
import com.google.devtools.build.lib.rules.cpp.CppConfiguration;
-import com.google.devtools.build.lib.rules.java.J2ObjcConfiguration;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
import com.google.devtools.build.lib.rules.java.JavaConfiguration;
import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider;
@@ -41,8 +40,7 @@ public final class BazelJavaLibraryRule implements RuleDefinition {
public RuleClass build(Builder builder, final RuleDefinitionEnvironment env) {
return builder
- .requiresConfigurationFragments(
- JavaConfiguration.class, CppConfiguration.class, J2ObjcConfiguration.class)
+ .requiresConfigurationFragments(JavaConfiguration.class, CppConfiguration.class)
.requiresHostConfigurationFragments(Jvm.class) // For BaseJavaCompilationHelper
/* <!-- #BLAZE_RULE(java_library).IMPLICIT_OUTPUTS -->
<ul>
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelJ2ObjcLibraryRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelJ2ObjcLibraryRule.java
index 4815526585..4c71e4ba4a 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelJ2ObjcLibraryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/objc/BazelJ2ObjcLibraryRule.java
@@ -22,8 +22,8 @@ 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.java.J2ObjcConfiguration;
import com.google.devtools.build.lib.rules.objc.J2ObjcAspect;
+import com.google.devtools.build.lib.rules.objc.J2ObjcConfiguration;
import com.google.devtools.build.lib.rules.objc.J2ObjcLibrary;
import com.google.devtools.build.lib.rules.objc.J2ObjcLibraryBaseRule;
import com.google.devtools.build.lib.rules.objc.ObjcConfiguration;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java
index bf55f10a67..1c4b6bf509 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java
@@ -170,6 +170,15 @@ public class AppleToolchain {
* Base rule definition to be ancestor for rules which may require an xcode toolchain.
*/
public static class RequiresXcodeConfigRule implements RuleDefinition {
+ public static final LateBoundLabel<BuildConfiguration> XCODE_CONFIG_LABEL =
+ new LateBoundLabel<BuildConfiguration>(
+ AppleCommandLineOptions.DEFAULT_XCODE_VERSION_CONFIG_LABEL, AppleConfiguration.class) {
+ @Override
+ public Label getDefault(Rule rule, BuildConfiguration configuration) {
+ return configuration.getFragment(AppleConfiguration.class).getXcodeConfigLabel();
+ }
+ };
+
@Override
public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
return builder
@@ -178,14 +187,7 @@ public class AppleToolchain {
.checkConstraints()
.direct_compile_time_input()
.cfg(HOST)
- .value(new LateBoundLabel<BuildConfiguration>(
- AppleCommandLineOptions.DEFAULT_XCODE_VERSION_CONFIG_LABEL,
- AppleConfiguration.class) {
- @Override
- public Label getDefault(Rule rule, BuildConfiguration configuration) {
- return configuration.getFragment(AppleConfiguration.class).getXcodeConfigLabel();
- }
- }))
+ .value(XCODE_CONFIG_LABEL))
.build();
}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImportBaseRule.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImportBaseRule.java
index 200a39eb5f..1c991c934c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImportBaseRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImportBaseRule.java
@@ -37,8 +37,7 @@ public class JavaImportBaseRule implements RuleDefinition {
@Override
public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) {
return builder
- .requiresConfigurationFragments(JavaConfiguration.class, CppConfiguration.class,
- J2ObjcConfiguration.class)
+ .requiresConfigurationFragments(JavaConfiguration.class, CppConfiguration.class)
.add(attr(":host_jdk", LABEL)
.cfg(HOST)
.value(JavaSemantics.HOST_JDK))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java
index 743c5442a4..f9cb428ec1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java
@@ -14,9 +14,13 @@
package com.google.devtools.build.lib.rules.objc;
+import static com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition.HOST;
+import static com.google.devtools.build.lib.packages.Attribute.attr;
+import static com.google.devtools.build.lib.packages.BuildType.LABEL;
import static com.google.devtools.build.lib.rules.objc.J2ObjcSource.SourceType;
import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.Constants;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredAspect;
import com.google.devtools.build.lib.analysis.ConfiguredNativeAspectFactory;
@@ -24,12 +28,14 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
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.AspectDefinition;
import com.google.devtools.build.lib.packages.AspectParameters;
+import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
+import com.google.devtools.build.lib.rules.apple.AppleToolchain;
import com.google.devtools.build.lib.rules.proto.ProtoCommon;
+import com.google.devtools.build.lib.rules.proto.ProtoConfiguration;
import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -51,32 +57,45 @@ import com.google.devtools.build.lib.vfs.PathFragment;
*/
public abstract class AbstractJ2ObjcProtoAspect implements ConfiguredNativeAspectFactory {
public static final String NAME = "J2ObjcProtoAspect";
+ private static final Iterable<Attribute> DEPENDENT_ATTRIBUTES = ImmutableList.of(
+ new Attribute("$protobuf_lib", Mode.TARGET),
+ new Attribute("deps", Mode.TARGET));
+ @Override
public AspectDefinition getDefinition(AspectParameters aspectParameters) {
AspectDefinition.Builder builder = new AspectDefinition.Builder("J2ObjcProtoAspect")
.requireProvider(ProtoSourcesProvider.class)
+ .requiresConfigurationFragments(
+ AppleConfiguration.class,
+ J2ObjcConfiguration.class,
+ ObjcConfiguration.class,
+ ProtoConfiguration.class)
.attributeAspect("deps", getClass())
.attributeAspect("exports", getClass())
- .attributeAspect("runtime_deps", getClass());
+ .attributeAspect("runtime_deps", getClass())
+ .add(attr("$protobuf_lib", LABEL)
+ .value(Label.parseAbsoluteUnchecked("//third_party/java/j2objc:proto_runtime")))
+ .add(attr("$xcrunwrapper", LABEL).cfg(HOST).exec()
+ .value(Label.parseAbsoluteUnchecked(
+ Constants.TOOLS_REPOSITORY + "//tools/objc:xcrunwrapper")))
+ .add(attr(":xcode_config", LABEL)
+ .allowedRuleClasses("xcode_config")
+ .checkConstraints()
+ .direct_compile_time_input()
+ .cfg(HOST)
+ .value(AppleToolchain.RequiresXcodeConfigRule.XCODE_CONFIG_LABEL));
return addAdditionalAttributes(builder).build();
}
protected abstract AspectDefinition.Builder addAdditionalAttributes(
AspectDefinition.Builder builder);
- protected static Label parseLabel(String from) {
- try {
- return Label.parseAbsolute(from);
- } catch (LabelSyntaxException e) {
- throw new IllegalArgumentException(from);
- }
- }
-
protected abstract boolean checkShouldCreateAspect(RuleContext ruleContext);
@Override
public ConfiguredAspect create(
- ConfiguredTarget base, RuleContext ruleContext, AspectParameters parameters) {
+ ConfiguredTarget base, RuleContext ruleContext, AspectParameters parameters)
+ throws InterruptedException {
if (!checkShouldCreateAspect(ruleContext)) {
return new ConfiguredAspect.Builder(NAME, ruleContext).build();
}
@@ -85,39 +104,64 @@ public abstract class AbstractJ2ObjcProtoAspect implements ConfiguredNativeAspec
ImmutableList<Artifact> protoSources = protoSourcesProvider.getDirectProtoSources();
NestedSet<Artifact> transitiveImports = protoSourcesProvider.getTransitiveImports();
- J2ObjcSrcsProvider.Builder srcsBuilder = new J2ObjcSrcsProvider.Builder();
+ XcodeProvider xcodeProvider;
Iterable<Artifact> headerMappingFiles;
Iterable<Artifact> classMappingFiles;
+ ObjcCommon common;
if (protoSources.isEmpty()) {
headerMappingFiles = ImmutableList.of();
classMappingFiles = ImmutableList.of();
+ common = J2ObjcAspect.common(
+ ruleContext,
+ ImmutableList.<Artifact>of(),
+ ImmutableList.<Artifact>of(),
+ ImmutableList.<PathFragment>of(),
+ DEPENDENT_ATTRIBUTES);
+ xcodeProvider = J2ObjcAspect.xcodeProvider(
+ ruleContext,
+ common,
+ ImmutableList.<Artifact>of(),
+ ImmutableList.<PathFragment>of(),
+ DEPENDENT_ATTRIBUTES);
} else {
J2ObjcSource j2ObjcSource = j2ObjcSource(ruleContext, protoSources);
headerMappingFiles = headerMappingFiles(ruleContext, protoSources);
classMappingFiles = classMappingFiles(ruleContext, protoSources);
- srcsBuilder.addSource(j2ObjcSource);
createActions(base, ruleContext, protoSources, transitiveImports,
headerMappingFiles, classMappingFiles, j2ObjcSource);
+ common = J2ObjcAspect.common(
+ ruleContext,
+ j2ObjcSource.getObjcSrcs(),
+ j2ObjcSource.getObjcHdrs(),
+ j2ObjcSource.getHeaderSearchPaths(),
+ DEPENDENT_ATTRIBUTES);
+ xcodeProvider = J2ObjcAspect.xcodeProvider(
+ ruleContext,
+ common,
+ j2ObjcSource.getObjcHdrs(),
+ j2ObjcSource.getHeaderSearchPaths(),
+ DEPENDENT_ATTRIBUTES);
+
+ new CompilationSupport(ruleContext).registerCompileAndArchiveActions(common);
}
- J2ObjcSrcsProvider j2objcSrcsProvider = srcsBuilder
- .addTransitiveJ2ObjcSrcs(ruleContext, "deps")
- .build();
NestedSet<Artifact> j2ObjcTransitiveHeaderMappingFiles = j2ObjcTransitiveHeaderMappingFiles(
ruleContext, headerMappingFiles);
NestedSet<Artifact> j2ObjcTransitiveClassMappingFiles = j2ObjcTransitiveClassMappingFiles(
ruleContext, classMappingFiles);
return new ConfiguredAspect.Builder(NAME, ruleContext)
- .addProvider(J2ObjcSrcsProvider.class, j2objcSrcsProvider)
.addProvider(
J2ObjcMappingFileProvider.class,
new J2ObjcMappingFileProvider(
j2ObjcTransitiveHeaderMappingFiles,
j2ObjcTransitiveClassMappingFiles,
+ NestedSetBuilder.<Artifact>stableOrder().build(),
NestedSetBuilder.<Artifact>stableOrder().build()))
+ .addProvider(ObjcProvider.class, common.getObjcProvider())
+ .addProvider(XcodeProvider.class, xcodeProvider)
.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BUILD b/src/main/java/com/google/devtools/build/lib/rules/objc/BUILD
index c746977eff..5879101486 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BUILD
@@ -14,6 +14,7 @@ java_library(
"//src/main/java/com/google/devtools/build/lib:collect",
"//src/main/java/com/google/devtools/build/lib:common",
"//src/main/java/com/google/devtools/build/lib:concurrent",
+ "//src/main/java/com/google/devtools/build/lib:events",
"//src/main/java/com/google/devtools/build/lib:java-rules",
"//src/main/java/com/google/devtools/build/lib:packages-internal",
"//src/main/java/com/google/devtools/build/lib:proto-rules",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcProtoAspect.java
index b2ce8f9f97..b49bb8f245 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcProtoAspect.java
@@ -26,6 +26,7 @@ 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.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
+import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.packages.AspectDefinition;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -43,62 +44,70 @@ public class BazelJ2ObjcProtoAspect extends AbstractJ2ObjcProtoAspect {
.add(attr("$protoc_darwin", LABEL)
.cfg(HOST)
.exec()
- .value(parseLabel(Constants.TOOLS_REPOSITORY + "//tools/objc:compile_protos")))
+ .value(Label.parseAbsoluteUnchecked(
+ Constants.TOOLS_REPOSITORY + "//tools/objc:compile_protos")))
.add(attr("$protoc_support_darwin", LABEL)
.cfg(HOST)
.exec()
- .value(parseLabel(Constants.TOOLS_REPOSITORY + "//tools/objc:proto_support")))
+ .value(Label.parseAbsoluteUnchecked(
+ Constants.TOOLS_REPOSITORY + "//tools/objc:proto_support")))
.add(attr("$j2objc_plugin", LABEL)
.cfg(HOST)
.exec()
- .value(parseLabel(
+ .value(Label.parseAbsoluteUnchecked(
Constants.TOOLS_REPOSITORY + "//third_party/java/j2objc:proto_plugin")));
}
- @Override
- protected boolean checkShouldCreateAspect(RuleContext ruleContext) {
- return true;
- }
+ @Override
+ protected boolean checkShouldCreateAspect(RuleContext ruleContext) {
+ return true;
+ }
- protected void createActions(ConfiguredTarget base, RuleContext ruleContext,
- Iterable<Artifact> protoSources, NestedSet<Artifact> transitiveProtoSources,
- Iterable<Artifact> headerMappingFiles, Iterable<Artifact> classMappingFiles,
+ @Override
+ protected void createActions(
+ ConfiguredTarget base,
+ RuleContext ruleContext,
+ Iterable<Artifact> protoSources,
+ NestedSet<Artifact> transitiveProtoSources,
+ Iterable<Artifact> headerMappingFiles,
+ Iterable<Artifact> classMappingFiles,
J2ObjcSource j2ObjcSource) {
String genDir = ruleContext.getConfiguration().getGenfilesDirectory().getExecPathString();
- Artifact compiler = ruleContext.getPrerequisiteArtifact(
- "$protoc_darwin", Mode.HOST);
+ Artifact compiler = ruleContext.getPrerequisiteArtifact("$protoc_darwin", Mode.HOST);
Artifact j2objcPlugin = ruleContext.getPrerequisiteArtifact("$j2objc_plugin", Mode.HOST);
- ruleContext.registerAction(new SpawnAction.Builder()
- .setMnemonic("TranslatingJ2ObjcProtos")
- .addInput(compiler)
- .addInput(j2objcPlugin)
- .addInputs(ruleContext.getPrerequisiteArtifacts(
- "$protoc_support_darwin", Mode.HOST).list())
- .addInputs(protoSources)
- .addTransitiveInputs(transitiveProtoSources)
- .addOutputs(j2ObjcSource.getObjcSrcs())
- .addOutputs(j2ObjcSource.getObjcHdrs())
- .addOutputs(headerMappingFiles)
- .addOutputs(classMappingFiles)
- .setExecutable(new PathFragment("/usr/bin/python"))
- .setCommandLine(new CustomCommandLine.Builder()
- .add(compiler.getPath().toString())
- .add("-w")
- .add(".") // Actions are always run with the exec root as cwd
- .add("--generate-j2objc")
- .add("--generator-param=file_dir_mapping")
- .add("--generator-param=generate_class_mappings")
- .add("--j2objc-plugin=" + j2objcPlugin.getExecPathString())
- .add("--output-dir=" + genDir)
- .addExecPaths(protoSources)
- .build())
- .setExecutionInfo(ImmutableMap.of(ExecutionRequirements.REQUIRES_DARWIN, ""))
- .build(ruleContext));
+ ruleContext.registerAction(
+ new SpawnAction.Builder()
+ .setMnemonic("TranslatingJ2ObjcProtos")
+ .addInput(compiler)
+ .addInput(j2objcPlugin)
+ .addInputs(
+ ruleContext.getPrerequisiteArtifacts("$protoc_support_darwin", Mode.HOST).list())
+ .addInputs(protoSources)
+ .addTransitiveInputs(transitiveProtoSources)
+ .addOutputs(j2ObjcSource.getObjcSrcs())
+ .addOutputs(j2ObjcSource.getObjcHdrs())
+ .addOutputs(headerMappingFiles)
+ .addOutputs(classMappingFiles)
+ .setExecutable(new PathFragment("/usr/bin/python"))
+ .setCommandLine(
+ new CustomCommandLine.Builder()
+ .add(compiler.getPath().toString())
+ .add("-w")
+ .add(".") // Actions are always run with the exec root as cwd
+ .add("--generate-j2objc")
+ .add("--generator-param=file_dir_mapping")
+ .add("--generator-param=generate_class_mappings")
+ .add("--j2objc-plugin=" + j2objcPlugin.getExecPathString())
+ .add("--output-dir=" + genDir)
+ .addExecPaths(protoSources)
+ .build())
+ .setExecutionInfo(ImmutableMap.of(ExecutionRequirements.REQUIRES_DARWIN, ""))
+ .build(ruleContext));
}
- @Override
+ @Override
protected boolean checkShouldCreateSources(RuleContext ruleContext) {
- return true;
+ return true;
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
index 44b949c5fc..433075199b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
@@ -99,7 +99,6 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
CompilationSupport compilationSupport =
new CompilationSupport(ruleContext)
- .registerJ2ObjcCompileAndArchiveActions(objcProvider)
.registerCompileAndArchiveActions(common)
.addXcodeSettings(xcodeProviderBuilder, common)
.registerLinkActions(
@@ -208,7 +207,6 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
.setIntermediateArtifacts(intermediateArtifacts)
.setAlwayslink(false)
.setHasModuleMap()
- .addExtraImportLibraries(ObjcRuleClasses.j2ObjcLibraries(ruleContext))
.setLinkedBinary(intermediateArtifacts.strippedSingleArchitectureBinary());
if (ObjcRuleClasses.objcConfiguration(ruleContext).generateDebugSymbols()) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
index 9fb00d47bf..c0eca43d44 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
@@ -69,6 +69,7 @@ import com.google.devtools.build.lib.analysis.actions.ParameterFileWriteAction;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
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.packages.BuildType;
import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction;
import com.google.devtools.build.lib.packages.TargetUtils;
@@ -78,8 +79,6 @@ import com.google.devtools.build.lib.rules.apple.Platform;
import com.google.devtools.build.lib.rules.cpp.CppModuleMap;
import com.google.devtools.build.lib.rules.cpp.CppModuleMapAction;
import com.google.devtools.build.lib.rules.cpp.LinkerInputs;
-import com.google.devtools.build.lib.rules.java.J2ObjcConfiguration;
-import com.google.devtools.build.lib.rules.objc.J2ObjcSource.SourceType;
import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes;
import com.google.devtools.build.lib.rules.objc.XcodeProvider.Builder;
import com.google.devtools.build.lib.rules.test.InstrumentedFilesCollector;
@@ -713,10 +712,30 @@ public final class CompilationSupport {
dsymBundle = Optional.absent();
}
- registerLinkAction(objcProvider, extraLinkArgs, extraLinkInputs, dsymBundle);
+ Iterable<Artifact> prunedJ2ObjcArchives = ImmutableList.<Artifact>of();
+ if (stripJ2ObjcDeadCode()) {
+ J2ObjcEntryClassProvider provider = J2ObjcEntryClassProvider.buildFrom(ruleContext);
+ registerJ2ObjcDeadCodeRemovalActions(objcProvider, provider.getEntryClasses());
+ prunedJ2ObjcArchives = j2objcPrunedLibraries(objcProvider);
+ }
+
+ registerLinkAction(
+ objcProvider,
+ extraLinkArgs,
+ extraLinkInputs,
+ dsymBundle,
+ prunedJ2ObjcArchives);
return this;
}
+ private boolean stripJ2ObjcDeadCode() {
+ J2ObjcEntryClassProvider provider = J2ObjcEntryClassProvider.buildFrom(ruleContext);
+ J2ObjcConfiguration j2objcConfiguration = ruleContext.getFragment(J2ObjcConfiguration.class);
+ // Only perform J2ObjC dead code stripping if flag --j2objc_dead_code_removal is specified and
+ // users have specified entry classes.
+ return j2objcConfiguration.removeDeadCode() && !provider.getEntryClasses().isEmpty();
+ }
+
/**
* Registers an action that will generate a clang module map for this target, using the hdrs
* attribute of this rule.
@@ -768,7 +787,8 @@ public final class CompilationSupport {
}
private void registerLinkAction(ObjcProvider objcProvider, ExtraLinkArgs extraLinkArgs,
- Iterable<Artifact> extraLinkInputs, Optional<Artifact> dsymBundle) {
+ Iterable<Artifact> extraLinkInputs, Optional<Artifact> dsymBundle,
+ Iterable<Artifact> prunedJ2ObjcArchives) {
ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext);
IntermediateArtifacts intermediateArtifacts =
ObjcRuleClasses.intermediateArtifacts(ruleContext);
@@ -784,19 +804,23 @@ public final class CompilationSupport {
: intermediateArtifacts.strippedSingleArchitectureBinary();
ImmutableList<Artifact> ccLibraries = ccLibraries(objcProvider);
+ NestedSet<Artifact> bazelBuiltLibraries = Iterables.isEmpty(prunedJ2ObjcArchives)
+ ? objcProvider.get(LIBRARY) : substituteJ2ObjcPrunedLibraries(objcProvider);
ruleContext.registerAction(
ObjcRuleClasses.spawnXcrunActionBuilder(ruleContext)
.setMnemonic("ObjcLink")
.setShellCommand(ImmutableList.of("/bin/bash", "-c"))
.setCommandLine(
- linkCommandLine(extraLinkArgs, objcProvider, binaryToLink, dsymBundle, ccLibraries))
+ linkCommandLine(extraLinkArgs, objcProvider, binaryToLink, dsymBundle, ccLibraries,
+ bazelBuiltLibraries))
.addOutput(binaryToLink)
.addOutputs(dsymBundle.asSet())
- .addTransitiveInputs(objcProvider.get(LIBRARY))
+ .addTransitiveInputs(bazelBuiltLibraries)
.addTransitiveInputs(objcProvider.get(IMPORTED_LIBRARY))
.addTransitiveInputs(objcProvider.get(FRAMEWORK_FILE))
.addInputs(ccLibraries)
.addInputs(extraLinkInputs)
+ .addInputs(prunedJ2ObjcArchives)
.addInput(xcrunwrapper(ruleContext).getExecutable())
.build(ruleContext));
@@ -827,6 +851,16 @@ public final class CompilationSupport {
return ccLibraryBuilder.build();
}
+ private ImmutableList<Artifact> j2objcPrunedLibraries(ObjcProvider objcProvider) {
+ IntermediateArtifacts intermediateArtifacts =
+ ObjcRuleClasses.intermediateArtifacts(ruleContext);
+ ImmutableList.Builder<Artifact> j2objcPrunedLibraryBuilder = ImmutableList.builder();
+ for (Artifact j2objcLibrary : objcProvider.get(ObjcProvider.J2OBJC_LIBRARY)) {
+ j2objcPrunedLibraryBuilder.add(intermediateArtifacts.j2objcPrunedArchive(j2objcLibrary));
+ }
+ return j2objcPrunedLibraryBuilder.build();
+ }
+
private static CommandLine symbolStripCommandLine(
Iterable<String> extraFlags, Artifact unstrippedArtifact, Artifact strippedArtifact) {
return CustomCommandLine.builder()
@@ -837,16 +871,37 @@ public final class CompilationSupport {
.build();
}
+ /**
+ * Returns a nested set of Bazel-built ObjC libraries with all unpruned J2ObjC libraries
+ * substituted with pruned ones.
+ */
+ private NestedSet<Artifact> substituteJ2ObjcPrunedLibraries(ObjcProvider objcProvider) {
+ ImmutableList.Builder<Artifact> libraries = new ImmutableList.Builder<>();
+ IntermediateArtifacts intermediateArtifacts =
+ ObjcRuleClasses.intermediateArtifacts(ruleContext);
+
+ Set<Artifact> unprunedJ2ObjcLibs = objcProvider.get(ObjcProvider.J2OBJC_LIBRARY).toSet();
+ for (Artifact library : objcProvider.get(LIBRARY)) {
+ // If we match an unpruned J2ObjC library, add the pruned version of the J2ObjC static library
+ // instead.
+ if (unprunedJ2ObjcLibs.contains(library)) {
+ libraries.add(intermediateArtifacts.j2objcPrunedArchive(library));
+ } else {
+ libraries.add(library);
+ }
+ }
+ return NestedSetBuilder.wrap(Order.NAIVE_LINK_ORDER, libraries.build());
+ }
+
private CommandLine linkCommandLine(ExtraLinkArgs extraLinkArgs,
ObjcProvider objcProvider, Artifact linkedBinary, Optional<Artifact> dsymBundle,
- ImmutableList<Artifact> ccLibraries) {
+ Iterable<Artifact> ccLibraries, Iterable<Artifact> bazelBuiltLibraries) {
ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext);
AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class);
Iterable<String> libraryNames = libraryNames(objcProvider);
CustomCommandLine.Builder commandLine = CustomCommandLine.builder()
.addPath(xcrunwrapper(ruleContext).getExecutable().getExecPath());
-
if (objcProvider.is(USES_CPP)) {
commandLine
.add(CLANG_PLUSPLUS)
@@ -883,7 +938,7 @@ public final class CompilationSupport {
commandLine
.addExecPath("-o", linkedBinary)
- .addExecPaths(objcProvider.get(LIBRARY))
+ .addExecPaths(bazelBuiltLibraries)
.addExecPaths(objcProvider.get(IMPORTED_LIBRARY))
.addExecPaths(ccLibraries)
.addBeforeEach("-force_load", Artifact.toExecPaths(objcProvider.get(FORCE_LOAD_LIBRARY)))
@@ -982,131 +1037,59 @@ public final class CompilationSupport {
return names;
}
- /**
- * Registers actions that compile and archive j2Objc dependencies of this rule.
- *
- * @param objcProvider common information about this rule's attributes and its dependencies
- *
- * @return this compilation support
- */
- CompilationSupport registerJ2ObjcCompileAndArchiveActions(ObjcProvider objcProvider)
- throws InterruptedException {
- J2ObjcSrcsProvider provider = J2ObjcSrcsProvider.buildFrom(ruleContext);
- Iterable<J2ObjcSource> j2ObjcSources = provider.getSrcs();
- J2ObjcConfiguration j2objcConfiguration = ruleContext.getFragment(J2ObjcConfiguration.class);
-
- // Only perform J2ObjC dead code stripping if flag --j2objc_dead_code_removal is specified and
- // users have specified entry classes.
- boolean stripJ2ObjcDeadCode = j2objcConfiguration.removeDeadCode()
- && !provider.getEntryClasses().isEmpty();
-
- if (stripJ2ObjcDeadCode) {
- registerJ2ObjcDeadCodeRemovalActions(j2ObjcSources, provider.getEntryClasses());
- }
-
- for (J2ObjcSource j2ObjcSource : j2ObjcSources) {
- if (j2ObjcSource.hasSourceFiles()) {
- J2ObjcSource sourceToCompile =
- j2ObjcSource.getSourceType() == SourceType.JAVA && stripJ2ObjcDeadCode
- ? j2ObjcSource.toPrunedSource(ruleContext)
- : j2ObjcSource;
- IntermediateArtifacts intermediateArtifacts =
- ObjcRuleClasses.j2objcIntermediateArtifacts(ruleContext, sourceToCompile);
- CompilationArtifacts compilationArtifact = new CompilationArtifacts.Builder()
- .addNonArcSrcs(sourceToCompile.getObjcSrcs())
- .setIntermediateArtifacts(intermediateArtifacts)
- .setPchFile(Optional.<Artifact>absent())
- .build();
- // The module map that the above intermediateArtifacts would point to is a combination of
- // the current target and the java target. Instead, we want the one generated for that
- // source, but there is no easy way to get that. So for now, compile the source with the
- // module map (and therefore module name) for this rule.
- // TODO(bazel-team): Generate module maps along with the J2Objc sources, and use that here.
- Optional<CppModuleMap> moduleMap;
- if (ObjcRuleClasses.objcConfiguration(ruleContext).moduleMapsEnabled()) {
- moduleMap = Optional.of(ObjcRuleClasses.intermediateArtifacts(ruleContext).moduleMap());
- } else {
- moduleMap = Optional.absent();
- }
- registerCompileAndArchiveActions(
- compilationArtifact,
- intermediateArtifacts,
- objcProvider.toJ2ObjcOnlyProvider(),
- moduleMap,
- ruleContext.getConfiguration().isCodeCoverageEnabled(),
- false);
- }
- }
-
- return this;
- }
-
- /**
- * Registers actions that generates a module map for all {@link J2ObjcSource}s in
- * {@link J2ObjcSrcsProvider}.
- *
- * @return this compilation support
- */
- public CompilationSupport registerJ2ObjcGenerateModuleMapAction(J2ObjcSrcsProvider provider) {
- if (ObjcRuleClasses.objcConfiguration(ruleContext).moduleMapsEnabled()) {
- CppModuleMap moduleMap = ObjcRuleClasses.intermediateArtifacts(ruleContext).moduleMap();
- ImmutableSet.Builder<Artifact> headers = ImmutableSet.builder();
- for (J2ObjcSource j2ObjcSource : provider.getSrcs()) {
- headers.addAll(j2ObjcSource.getObjcHdrs());
- }
- registerGenerateModuleMapAction(moduleMap, headers.build(), ImmutableList.<Artifact>of());
- }
- return this;
- }
-
- private void registerJ2ObjcDeadCodeRemovalActions(Iterable<J2ObjcSource> j2ObjcSources,
+ private void registerJ2ObjcDeadCodeRemovalActions(ObjcProvider objcProvider,
Iterable<String> entryClasses) {
Artifact pruner = ruleContext.getPrerequisiteArtifact("$j2objc_dead_code_pruner", Mode.HOST);
J2ObjcMappingFileProvider provider = ObjcRuleClasses.j2ObjcMappingFileProvider(ruleContext);
NestedSet<Artifact> j2ObjcDependencyMappingFiles = provider.getDependencyMappingFiles();
NestedSet<Artifact> j2ObjcHeaderMappingFiles = provider.getHeaderMappingFiles();
+ NestedSet<Artifact> j2ObjcArchiveSourceMappingFiles = provider.getArchiveSourceMappingFiles();
+ IntermediateArtifacts intermediateArtifacts =
+ ObjcRuleClasses.intermediateArtifacts(ruleContext);
- for (J2ObjcSource j2ObjcSource : j2ObjcSources) {
- if (j2ObjcSource.getSourceType() == SourceType.JAVA
- && j2ObjcSource.hasSourceFiles()) {
- Iterable<Artifact> sourceArtifacts = j2ObjcSource.getObjcSrcs();
- Iterable<Artifact> prunedSourceArtifacts =
- j2ObjcSource.toPrunedSource(ruleContext).getObjcSrcs();
- PathFragment paramFilePath = FileSystemUtils.replaceExtension(
- j2ObjcSource.getTargetLabel().toPathFragment(), ".param.j2objc");
- Artifact paramFile = ruleContext.getUniqueDirectoryArtifact(
- "_j2objc_pruned",
- paramFilePath,
- ruleContext.getBinOrGenfilesDirectory());
- PathFragment objcFilePath = j2ObjcSource.getObjcFilePath();
- CustomCommandLine commandLine = CustomCommandLine.builder()
- .addJoinExecPaths("--input_files", ",", sourceArtifacts)
- .addJoinExecPaths("--output_files", ",", prunedSourceArtifacts)
- .addJoinExecPaths("--dependency_mapping_files", ",", j2ObjcDependencyMappingFiles)
- .addJoinExecPaths("--header_mapping_files", ",", j2ObjcHeaderMappingFiles)
- .add("--entry_classes").add(Joiner.on(",").join(entryClasses))
- .add("--objc_file_path").add(objcFilePath.getPathString())
- .build();
+ for (Artifact j2objcArchive : objcProvider.get(ObjcProvider.J2OBJC_LIBRARY)) {
+ PathFragment paramFilePath = FileSystemUtils.replaceExtension(
+ j2objcArchive.getOwner().toPathFragment(), ".param.j2objc");
+ Artifact paramFile = ruleContext.getUniqueDirectoryArtifact(
+ "_j2objc_pruned",
+ paramFilePath,
+ ruleContext.getBinOrGenfilesDirectory());
+ Artifact prunedJ2ObjcArchive = intermediateArtifacts.j2objcPrunedArchive(j2objcArchive);
+ Artifact dummyArchive = Iterables.getOnlyElement(
+ ruleContext.getPrerequisite("$dummy_lib", Mode.TARGET, ObjcProvider.class).get(LIBRARY));
+
+ CustomCommandLine commandLine = CustomCommandLine.builder()
+ .addExecPath("--input_archive", j2objcArchive)
+ .addExecPath("--output_archive", prunedJ2ObjcArchive)
+ .addExecPath("--dummy_archive", dummyArchive)
+ .addExecPath("--xcrunwrapper", xcrunwrapper(ruleContext).getExecutable())
+ .addJoinExecPaths("--dependency_mapping_files", ",", j2ObjcDependencyMappingFiles)
+ .addJoinExecPaths("--header_mapping_files", ",", j2ObjcHeaderMappingFiles)
+ .addJoinExecPaths("--archive_source_mapping_files", ",", j2ObjcArchiveSourceMappingFiles)
+ .add("--entry_classes").add(Joiner.on(",").join(entryClasses))
+ .build();
ruleContext.registerAction(new ParameterFileWriteAction(
ruleContext.getActionOwner(),
paramFile,
commandLine,
ParameterFile.ParameterFileType.UNQUOTED, ISO_8859_1));
- ruleContext.registerAction(new SpawnAction.Builder()
+ ruleContext.registerAction(ObjcRuleClasses.spawnXcrunActionBuilder(ruleContext)
.setMnemonic("DummyPruner")
.setExecutable(pruner)
+ .addInput(dummyArchive)
.addInput(pruner)
.addInput(paramFile)
- .addInputs(sourceArtifacts)
+ .addInput(j2objcArchive)
+ .addInput(xcrunwrapper(ruleContext).getExecutable())
.addTransitiveInputs(j2ObjcDependencyMappingFiles)
.addTransitiveInputs(j2ObjcHeaderMappingFiles)
+ .addTransitiveInputs(j2ObjcArchiveSourceMappingFiles)
.setCommandLine(CustomCommandLine.builder()
.addPaths("@%s", paramFile.getExecPath())
.build())
- .addOutputs(prunedSourceArtifacts)
+ .addOutput(prunedJ2ObjcArchive)
.build(ruleContext));
- }
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java
index ad3c3e8c62..1ff60eb73f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java
@@ -14,7 +14,6 @@
package com.google.devtools.build.lib.rules.objc;
-import com.google.common.base.Optional;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.Root;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
@@ -41,21 +40,8 @@ public final class IntermediateArtifacts {
private final RuleContext ruleContext;
private final String archiveFileNameSuffix;
- /**
- * Label to scope the output paths of generated artifacts, in addition to label of the rule that
- * is being analyzed.
- */
- private final Optional<Label> scopingLabel;
-
IntermediateArtifacts(RuleContext ruleContext, String archiveFileNameSuffix) {
this.ruleContext = ruleContext;
- this.scopingLabel = Optional.<Label>absent();
- this.archiveFileNameSuffix = Preconditions.checkNotNull(archiveFileNameSuffix);
- }
-
- IntermediateArtifacts(RuleContext ruleContext, Label scopingLabel, String archiveFileNameSuffix) {
- this.ruleContext = ruleContext;
- this.scopingLabel = Optional.of(Preconditions.checkNotNull(scopingLabel));
this.archiveFileNameSuffix = Preconditions.checkNotNull(archiveFileNameSuffix);
}
@@ -178,23 +164,9 @@ public final class IntermediateArtifacts {
inGenfiles
? ruleContext.getConfiguration().getGenfilesDirectory()
: ruleContext.getConfiguration().getBinDirectory();
- if (scopingLabel.isPresent()) {
- // The path of this artifact will be
- // RULE_PACKAGE/_intermediate_scoped/RULE_LABEL/SCOPING_PACKAGE/SCOPING_LABEL/SCOPERELATIVE
- return ruleContext.getUniqueDirectoryArtifact(
- "_intermediate_scoped",
- scopingLabel
- .get()
- .getPackageIdentifier()
- .getPathFragment()
- .getRelative(scopingLabel.get().getName())
- .getRelative(scopeRelative),
- root);
- } else {
- // The path of this artifact will be
- // RULE_PACKAGE/SCOPERELATIVE
- return ruleContext.getPackageRelativeArtifact(scopeRelative, root);
- }
+
+ // The path of this artifact will be RULE_PACKAGE/SCOPERELATIVE
+ return ruleContext.getPackageRelativeArtifact(scopeRelative, root);
}
private Artifact scopedArtifact(PathFragment scopeRelative) {
@@ -205,12 +177,8 @@ public final class IntermediateArtifacts {
* The {@code .a} file which contains all the compiled sources for a rule.
*/
public Artifact archive() {
- // If scopingLabel is present, the path will be
- // RULE_PACKAGE/_intermediate_scoped/RULE_LABEL/SCOPE_PACKAGE/SCOPE_LABEL/libRULEBASENAME.a
- //
- // If it's not, the path will be RULE_PACKAGE/libRULEBASENAME.a .
- String basename = new PathFragment(scopingLabel.isPresent()
- ? scopingLabel.get().getName() : ruleContext.getLabel().getName()).getBaseName();
+ // The path will be RULE_PACKAGE/libRULEBASENAME.a
+ String basename = new PathFragment(ruleContext.getLabel().getName()).getBaseName();
return scopedArtifact(new PathFragment(String.format(
"lib%s%s.a", basename, archiveFileNameSuffix)));
}
@@ -381,4 +349,17 @@ public final class IntermediateArtifacts {
// parent directory in the module map search paths.
return new CppModuleMap(appendExtensionInGenfiles(".modulemaps/module.modulemap"), moduleName);
}
+
+ /**
+ * Returns a static library archive with dead code/objects removed by J2ObjC dead code removal,
+ * given the original unpruned static library containing J2ObjC-translated code.
+ */
+ public Artifact j2objcPrunedArchive(Artifact unprunedArchive) {
+ PathFragment prunedSourceArtifactPath = FileSystemUtils.appendWithoutExtension(
+ unprunedArchive.getRootRelativePath(), "_pruned");
+ return ruleContext.getUniqueDirectoryArtifact(
+ "_j2objc_pruned",
+ prunedSourceArtifactPath,
+ ruleContext.getBinOrGenfilesDirectory());
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionBinaryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionBinaryRule.java
index 6879e36f68..846e2a9e50 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionBinaryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionBinaryRule.java
@@ -20,7 +20,6 @@ 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.java.J2ObjcConfiguration;
/**
* Rule definition for ios_extension_binary.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkBinaryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkBinaryRule.java
index 3ee1bc7c50..209d53ef40 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkBinaryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosFrameworkBinaryRule.java
@@ -20,7 +20,6 @@ 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.java.J2ObjcConfiguration;
/**
* Rule definition for ios_framework_binary.
@@ -62,4 +61,4 @@ libraries.</p>
${IMPLICIT_OUTPUTS}
-<!-- #END_BLAZE_RULE -->*/ \ No newline at end of file
+<!-- #END_BLAZE_RULE -->*/
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 92b3f9d669..cfb68733ba 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
@@ -122,7 +122,6 @@ public final class IosTest implements RuleConfiguredTargetFactory {
new CompilationSupport(ruleContext)
.registerLinkActions(common.getObjcProvider(), extraLinkArgs, extraLinkInputs)
- .registerJ2ObjcCompileAndArchiveActions(common.getObjcProvider())
.registerCompileAndArchiveActions(common)
.addXcodeSettings(xcodeProviderBuilder, common)
.validateAttributes();
@@ -225,7 +224,6 @@ public final class IosTest implements RuleConfiguredTargetFactory {
.add(ruleContext.getPrerequisite(MEMLEAKS_DEP, Mode.TARGET, ObjcProvider.class));
}
return ObjcLibrary.common(ruleContext, extraSdkFrameworks, /*alwayslink=*/false,
- new ObjcLibrary.ExtraImportLibraries(ObjcRuleClasses.j2ObjcLibraries(ruleContext)),
extraDepObjcProviders);
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java
index 75cff59cce..d7b29f4204 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTestRule.java
@@ -35,7 +35,6 @@ import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.RuleClass;
import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
-import com.google.devtools.build.lib.rules.java.J2ObjcConfiguration;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.FileType;
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 ab1aa8a1db..5103e5640a 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
@@ -17,10 +17,13 @@ package com.google.devtools.build.lib.rules.objc;
import static com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition.HOST;
import static com.google.devtools.build.lib.packages.Attribute.attr;
import static com.google.devtools.build.lib.packages.BuildType.LABEL;
+import static com.google.devtools.build.lib.rules.objc.XcodeProductType.LIBRARY_STATIC;
import static java.nio.charset.StandardCharsets.ISO_8859_1;
+import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.Constants;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.ParameterFile;
@@ -34,13 +37,13 @@ import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.ParameterFileWriteAction;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
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.AspectDefinition;
import com.google.devtools.build.lib.packages.AspectParameters;
import com.google.devtools.build.lib.packages.BuildType;
-import com.google.devtools.build.lib.rules.java.J2ObjcConfiguration;
+import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
+import com.google.devtools.build.lib.rules.apple.AppleToolchain;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
import com.google.devtools.build.lib.rules.java.JavaCompilationHelper;
import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider;
@@ -56,10 +59,18 @@ import java.util.List;
*/
public class J2ObjcAspect implements ConfiguredNativeAspectFactory {
public static final String NAME = "J2ObjcAspect";
+
+ private static final Iterable<Attribute> DEPENDENT_ATTRIBUTES = ImmutableList.of(
+ new Attribute("$jre_emul_lib", Mode.TARGET),
+ new Attribute("deps", Mode.TARGET),
+ new Attribute("exports", Mode.TARGET),
+ new Attribute("runtime_deps", Mode.TARGET));
+
/**
- * Adds the attribute aspect args to the given AspectDefinition.Builder.
+ * Adds additional attribute aspects and attributes to the given AspectDefinition.Builder.
*/
- protected AspectDefinition.Builder addAttributeAspects(AspectDefinition.Builder builder) {
+ protected AspectDefinition.Builder addAdditionalAttributes(
+ AspectDefinition.Builder builder) {
return builder.attributeAspect("deps", J2ObjcAspect.class, BazelJ2ObjcProtoAspect.class)
.attributeAspect("exports", J2ObjcAspect.class, BazelJ2ObjcProtoAspect.class)
.attributeAspect("runtime_deps", J2ObjcAspect.class, BazelJ2ObjcProtoAspect.class);
@@ -67,67 +78,109 @@ public class J2ObjcAspect implements ConfiguredNativeAspectFactory {
@Override
public AspectDefinition getDefinition(AspectParameters aspectParameters) {
- return addAttributeAspects(new AspectDefinition.Builder("J2ObjCAspect"))
+ return addAdditionalAttributes(new AspectDefinition.Builder("J2ObjCAspect"))
.requireProvider(JavaSourceInfoProvider.class)
.requireProvider(JavaCompilationArgsProvider.class)
+ .requiresConfigurationFragments(
+ AppleConfiguration.class,
+ J2ObjcConfiguration.class,
+ ObjcConfiguration.class)
.add(attr("$j2objc", LABEL).cfg(HOST).exec()
- .value(parseLabel(Constants.TOOLS_REPOSITORY + "//tools/j2objc:j2objc_deploy.jar")))
+ .value(Label.parseAbsoluteUnchecked(
+ Constants.TOOLS_REPOSITORY + "//tools/j2objc:j2objc_deploy.jar")))
.add(attr("$j2objc_wrapper", LABEL)
.allowedFileTypes(FileType.of(".py"))
.cfg(HOST)
.exec()
.singleArtifact()
- .value(parseLabel(Constants.TOOLS_REPOSITORY + "//tools/j2objc:j2objc_wrapper")))
+ .value(Label.parseAbsoluteUnchecked(
+ Constants.TOOLS_REPOSITORY + "//tools/j2objc:j2objc_wrapper")))
+ .add(attr("$jre_emul_lib", LABEL)
+ .value(Label.parseAbsoluteUnchecked("//third_party/java/j2objc:jre_emul_lib")))
+ .add(attr("$xcrunwrapper", LABEL).cfg(HOST).exec()
+ .value(Label.parseAbsoluteUnchecked(
+ Constants.TOOLS_REPOSITORY + "//tools/objc:xcrunwrapper")))
+ .add(attr(":xcode_config", LABEL)
+ .allowedRuleClasses("xcode_config")
+ .checkConstraints()
+ .direct_compile_time_input()
+ .cfg(HOST)
+ .value(AppleToolchain.RequiresXcodeConfigRule.XCODE_CONFIG_LABEL))
.build();
}
- private static Label parseLabel(String from) {
- try {
- return Label.parseAbsolute(from);
- } catch (LabelSyntaxException e) {
- throw new IllegalArgumentException(from);
- }
- }
-
@Override
public ConfiguredAspect create(
- ConfiguredTarget base, RuleContext ruleContext, AspectParameters parameters) {
+ ConfiguredTarget base, RuleContext ruleContext, AspectParameters parameters)
+ throws InterruptedException {
ConfiguredAspect.Builder builder = new ConfiguredAspect.Builder(NAME, ruleContext);
-
JavaCompilationArgsProvider compilationArgsProvider =
base.getProvider(JavaCompilationArgsProvider.class);
JavaSourceInfoProvider sourceInfoProvider =
base.getProvider(JavaSourceInfoProvider.class);
-
ImmutableSet<Artifact> javaInputFiles = ImmutableSet.<Artifact>builder()
.addAll(sourceInfoProvider.getSourceFiles())
.addAll(sourceInfoProvider.getSourceJars())
.addAll(sourceInfoProvider.getSourceJarsForJarFiles())
.build();
- NestedSetBuilder<Artifact> depsHeaderMappingsBuilder = NestedSetBuilder.stableOrder();
- NestedSetBuilder<Artifact> depsClassMappingsBuilder = NestedSetBuilder.stableOrder();
- NestedSetBuilder<Artifact> depsDependencyMappingsBuilder = NestedSetBuilder.stableOrder();
-
- for (J2ObjcMappingFileProvider provider : getJ2ObjCMappings(ruleContext)) {
- depsHeaderMappingsBuilder.addTransitive(provider.getHeaderMappingFiles());
- depsClassMappingsBuilder.addTransitive(provider.getClassMappingFiles());
- depsDependencyMappingsBuilder.addTransitive(provider.getDependencyMappingFiles());
- }
-
- NestedSet<Artifact> depsHeaderMappings = depsHeaderMappingsBuilder.build();
- NestedSet<Artifact> depsClassMappings = depsClassMappingsBuilder.build();
- NestedSet<Artifact> depsDependencyMappings = depsDependencyMappingsBuilder.build();
-
- J2ObjcSrcsProvider.Builder srcsBuilder = new J2ObjcSrcsProvider.Builder();
- J2ObjcMappingFileProvider j2ObjcMappingFileProvider;
+ XcodeProvider xcodeProvider;
+ ObjcCommon common;
if (!javaInputFiles.isEmpty()) {
J2ObjcSource j2ObjcSource = buildJ2ObjcSource(ruleContext, javaInputFiles);
+ J2ObjcMappingFileProvider depJ2ObjcMappingFileProvider =
+ depJ2ObjcMappingFileProvider(ruleContext);
+ createJ2ObjcTranspilationAction(
+ ruleContext,
+ depJ2ObjcMappingFileProvider.getHeaderMappingFiles(),
+ depJ2ObjcMappingFileProvider.getClassMappingFiles(),
+ javaInputFiles,
+ compilationArgsProvider,
+ j2ObjcSource);
+ common = common(
+ ruleContext,
+ j2ObjcSource.getObjcSrcs(),
+ j2ObjcSource.getObjcHdrs(),
+ j2ObjcSource.getHeaderSearchPaths(),
+ DEPENDENT_ATTRIBUTES);
+ xcodeProvider = xcodeProvider(
+ ruleContext,
+ common,
+ j2ObjcSource.getObjcHdrs(),
+ j2ObjcSource.getHeaderSearchPaths(),
+ DEPENDENT_ATTRIBUTES);
+
+ new CompilationSupport(ruleContext).registerCompileAndArchiveActions(common);
+ } else {
+ common = common(
+ ruleContext,
+ ImmutableList.<Artifact>of(),
+ ImmutableList.<Artifact>of(),
+ ImmutableList.<PathFragment>of(),
+ DEPENDENT_ATTRIBUTES);
+ xcodeProvider = xcodeProvider(
+ ruleContext,
+ common,
+ ImmutableList.<Artifact>of(),
+ ImmutableList.<PathFragment>of(),
+ DEPENDENT_ATTRIBUTES);
+ }
- createJ2ObjcTranspilationAction(ruleContext, depsHeaderMappings, depsClassMappings,
- javaInputFiles, compilationArgsProvider, j2ObjcSource);
+ return builder
+ .addProvider(J2ObjcMappingFileProvider.class,
+ j2ObjcMappingFileProvider(ruleContext, !javaInputFiles.isEmpty()))
+ .addProvider(ObjcProvider.class, common.getObjcProvider())
+ .addProvider(XcodeProvider.class, xcodeProvider)
+ .build();
+ }
+ private J2ObjcMappingFileProvider j2ObjcMappingFileProvider(RuleContext ruleContext,
+ boolean hasTranslatedSource) {
+ J2ObjcMappingFileProvider depJ2ObjcMappingFileProvider =
+ depJ2ObjcMappingFileProvider(ruleContext);
+ J2ObjcMappingFileProvider j2ObjcMappingFileProvider = depJ2ObjcMappingFileProvider;
+ if (hasTranslatedSource) {
// J2ObjC merges all input header mapping files into the output header mapping file, so we
// only need to export the output header mapping file here.
NestedSet<Artifact> headerMappingFiles = NestedSetBuilder.<Artifact>stableOrder()
@@ -135,23 +188,22 @@ public class J2ObjcAspect implements ConfiguredNativeAspectFactory {
.build();
NestedSet<Artifact> dependencyMappingFiles = NestedSetBuilder.<Artifact>stableOrder()
.add(j2ObjcOutputDependencyMappingFile(ruleContext))
- .addTransitive(depsDependencyMappings)
+ .addTransitive(depJ2ObjcMappingFileProvider.getDependencyMappingFiles())
+ .build();
+
+ NestedSet<Artifact> archiveSourceMappingFiles = NestedSetBuilder.<Artifact>stableOrder()
+ .add(j2ObjcOutputArchiveSourceMappingFile(ruleContext))
+ .addTransitive(depJ2ObjcMappingFileProvider.getArchiveSourceMappingFiles())
.build();
- srcsBuilder.addSource(j2ObjcSource);
- j2ObjcMappingFileProvider = new J2ObjcMappingFileProvider(
- headerMappingFiles, depsClassMappings, dependencyMappingFiles);
- } else {
j2ObjcMappingFileProvider = new J2ObjcMappingFileProvider(
- depsHeaderMappings, depsClassMappings, depsDependencyMappings);
+ headerMappingFiles,
+ depJ2ObjcMappingFileProvider.getClassMappingFiles(),
+ dependencyMappingFiles,
+ archiveSourceMappingFiles);
}
- srcsBuilder.addTransitiveJ2ObjcSrcs(ruleContext);
-
- return builder
- .addProvider(J2ObjcSrcsProvider.class, srcsBuilder.build())
- .addProvider(J2ObjcMappingFileProvider.class, j2ObjcMappingFileProvider)
- .build();
+ return j2ObjcMappingFileProvider;
}
private static void createJ2ObjcTranspilationAction(
@@ -192,6 +244,12 @@ public class J2ObjcAspect implements ConfiguredNativeAspectFactory {
argBuilder.addJoinExecPaths("--mapping", ",", depsClassMappingFiles);
}
+ Artifact archiveSourceMappingFile = j2ObjcOutputArchiveSourceMappingFile(ruleContext);
+ argBuilder.addExecPath("--output_archive_source_mapping_file", archiveSourceMappingFile);
+
+ Artifact compiledLibrary = ObjcRuleClasses.j2objcIntermediateArtifacts(ruleContext).archive();
+ argBuilder.addExecPath("--compiled_archive_file_path", compiledLibrary);
+
argBuilder.add("-d").addPath(j2ObjcSource.getObjcFilePath());
// In J2ObjC, the jars you pass as dependencies must be precisely the same as the
@@ -228,11 +286,32 @@ public class J2ObjcAspect implements ConfiguredNativeAspectFactory {
.addOutputs(j2ObjcSource.getObjcSrcs())
.addOutputs(j2ObjcSource.getObjcHdrs())
.addOutput(outputHeaderMappingFile)
- .addOutput(outputDependencyMappingFile);
+ .addOutput(outputDependencyMappingFile)
+ .addOutput(archiveSourceMappingFile);
ruleContext.registerAction(builder.build(ruleContext));
}
+ private J2ObjcMappingFileProvider depJ2ObjcMappingFileProvider(RuleContext ruleContext) {
+ NestedSetBuilder<Artifact> depsHeaderMappingsBuilder = NestedSetBuilder.stableOrder();
+ NestedSetBuilder<Artifact> depsClassMappingsBuilder = NestedSetBuilder.stableOrder();
+ NestedSetBuilder<Artifact> depsDependencyMappingsBuilder = NestedSetBuilder.stableOrder();
+ NestedSetBuilder<Artifact> depsArchiveSourceMappingsBuilder = NestedSetBuilder.stableOrder();
+
+ for (J2ObjcMappingFileProvider mapping : getJ2ObjCMappings(ruleContext)) {
+ depsHeaderMappingsBuilder.addTransitive(mapping.getHeaderMappingFiles());
+ depsClassMappingsBuilder.addTransitive(mapping.getClassMappingFiles());
+ depsDependencyMappingsBuilder.addTransitive(mapping.getDependencyMappingFiles());
+ depsArchiveSourceMappingsBuilder.addTransitive(mapping.getArchiveSourceMappingFiles());
+ }
+
+ return new J2ObjcMappingFileProvider(
+ depsHeaderMappingsBuilder.build(),
+ depsClassMappingsBuilder.build(),
+ depsDependencyMappingsBuilder.build(),
+ depsArchiveSourceMappingsBuilder.build());
+ }
+
private static List<? extends J2ObjcMappingFileProvider> getJ2ObjCMappings(RuleContext context) {
ImmutableList.Builder<J2ObjcMappingFileProvider> mappingFileProviderBuilder =
new ImmutableList.Builder<>();
@@ -269,6 +348,11 @@ public class J2ObjcAspect implements ConfiguredNativeAspectFactory {
return ObjcRuleClasses.artifactByAppendingToBaseName(ruleContext, ".param.j2objc");
}
+ private static Artifact j2ObjcOutputArchiveSourceMappingFile(RuleContext ruleContext) {
+ return ObjcRuleClasses.artifactByAppendingToBaseName(
+ ruleContext, ".archive_source_mapping.j2objc");
+ }
+
private J2ObjcSource buildJ2ObjcSource(RuleContext ruleContext,
Iterable<Artifact> javaInputSourceFiles) {
PathFragment objcFileRootRelativePath = ruleContext.getUniqueDirectory("_j2objc");
@@ -303,4 +387,72 @@ public class J2ObjcAspect implements ConfiguredNativeAspectFactory {
return objcSources.build();
}
+
+ /**
+ * Sets up and returns an {@link ObjcCommon} object containing the J2ObjC-translated code.
+ *
+ */
+ static ObjcCommon common(RuleContext ruleContext, Iterable<Artifact> transpiledSources,
+ Iterable<Artifact> transpiledHeaders, Iterable<PathFragment> headerSearchPaths,
+ Iterable<Attribute> dependentAttributes) {
+ ObjcCommon.Builder builder = new ObjcCommon.Builder(ruleContext);
+ IntermediateArtifacts intermediateArtifacts =
+ ObjcRuleClasses.j2objcIntermediateArtifacts(ruleContext);
+
+ if (!Iterables.isEmpty(transpiledSources) || !Iterables.isEmpty(transpiledHeaders)) {
+ CompilationArtifacts compilationArtifacts = new CompilationArtifacts.Builder()
+ .addNonArcSrcs(transpiledSources)
+ .setIntermediateArtifacts(intermediateArtifacts)
+ .setPchFile(Optional.<Artifact>absent())
+ .addAdditionalHdrs(transpiledHeaders)
+ .build();
+ builder.setCompilationArtifacts(compilationArtifacts);
+ }
+
+ for (Attribute dependentAttribute : dependentAttributes) {
+ if (ruleContext.getAttribute(dependentAttribute.getName()) != null) {
+ builder.addDepObjcProviders(ruleContext.getPrerequisites(
+ dependentAttribute.getName(),
+ dependentAttribute.getAccessMode(),
+ ObjcProvider.class));
+ }
+ }
+
+ return builder
+ .addUserHeaderSearchPaths(headerSearchPaths)
+ .setIntermediateArtifacts(intermediateArtifacts)
+ .setHasModuleMap()
+ .build();
+ }
+
+ /**
+ * Sets up and returns an {@link XcodeProvider} object containing the J2ObjC-translated code.
+ *
+ */
+ static XcodeProvider xcodeProvider(RuleContext ruleContext, ObjcCommon common,
+ Iterable<Artifact> transpiledHeaders, Iterable<PathFragment> headerSearchPaths,
+ Iterable<Attribute> dependentAttributes) {
+ XcodeProvider.Builder xcodeProviderBuilder = new XcodeProvider.Builder();
+ XcodeSupport xcodeSupport = new XcodeSupport(ruleContext);
+ xcodeSupport.addXcodeSettings(xcodeProviderBuilder, common.getObjcProvider(), LIBRARY_STATIC);
+
+ for (Attribute dependentAttribute : dependentAttributes) {
+ if (ruleContext.getAttribute(dependentAttribute.getName()) != null) {
+ xcodeSupport.addDependencies(xcodeProviderBuilder, dependentAttribute);
+ }
+ }
+
+ if (!Iterables.isEmpty(transpiledHeaders)) {
+ xcodeProviderBuilder
+ .addUserHeaderSearchPaths(headerSearchPaths)
+ .addCopts(ruleContext.getFragment(ObjcConfiguration.class).getCopts())
+ .addHeaders(transpiledHeaders);
+ }
+
+ if (common.getCompilationArtifacts().isPresent()) {
+ xcodeProviderBuilder.setCompilationArtifacts(common.getCompilationArtifacts().get());
+ }
+
+ return xcodeProviderBuilder.build();
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/J2ObjcCommandLineOptions.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcCommandLineOptions.java
index 9b872aa57a..64b9069b87 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/J2ObjcCommandLineOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcCommandLineOptions.java
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.devtools.build.lib.rules.java;
+package com.google.devtools.build.lib.rules.objc;
import com.google.common.collect.Multimap;
import com.google.devtools.build.lib.analysis.config.FragmentOptions;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/J2ObjcConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcConfiguration.java
index d71d9c0a62..8c8ae8055b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/J2ObjcConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcConfiguration.java
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.google.devtools.build.lib.rules.java;
+package com.google.devtools.build.lib.rules.objc;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableSet;
@@ -79,7 +79,7 @@ public class J2ObjcConfiguration extends Fragment {
}
}
- private final ImmutableSet<String> translationFlags;
+ private final Set<String> translationFlags;
private final boolean removeDeadCode;
J2ObjcConfiguration(J2ObjcCommandLineOptions j2ObjcOptions) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java
new file mode 100644
index 0000000000..6bbc6a505f
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java
@@ -0,0 +1,124 @@
+// Copyright 2014 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.rules.objc;
+
+import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
+import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.packages.BuildType;
+
+/**
+ * This provider is exported by j2objc_library to export entry class information necessary for
+ * J2ObjC dead code removal performed at the binary level in ObjC rules.
+ */
+@Immutable
+public final class J2ObjcEntryClassProvider implements TransitiveInfoProvider {
+ private final NestedSet<String> entryClasses;
+
+ /**
+ * A builder for J2ObjcEntryClassProvider.
+ */
+ public static class Builder {
+ private final NestedSetBuilder<String> entryClassesBuilder = NestedSetBuilder.stableOrder();
+
+ /**
+ * Constructs a new, empty J2ObjcEntryClassProvider builder.
+ */
+ public Builder() {}
+
+ /**
+ * Transitively adds the given {@link J2ObjcEntryClassProvider}
+ * and all its properties to this builder.
+ *
+ * @param provider the J2ObjcEntryClassProvider to add
+ * @return this builder
+ */
+ public Builder addTransitive(J2ObjcEntryClassProvider provider) {
+ entryClassesBuilder.addTransitive(provider.getEntryClasses());
+ return this;
+ }
+
+ /**
+ * Transitively adds all the J2ObjcEntryClassProviders and all their properties
+ * that can be reached through the "deps" attribute.
+ *
+ * @param ruleContext the rule context
+ * @return this builder
+ */
+ public Builder addTransitive(RuleContext ruleContext) {
+ if (ruleContext.attributes().has("deps", BuildType.LABEL_LIST)) {
+ for (J2ObjcEntryClassProvider provider :
+ ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class)) {
+ addTransitive(provider);
+ }
+ }
+
+ return this;
+ }
+
+ /**
+ * Adds the given entry classes to this builder. See {@link #getEntryClasses()}.
+ *
+ * @param entryClasses the entry classes to add
+ * @return this builder
+ */
+ public Builder addEntryClasses(Iterable<String> entryClasses) {
+ entryClassesBuilder.addAll(entryClasses);
+ return this;
+ }
+
+ /**
+ * Builds a J2ObjcEntryClassProvider from the information in this builder.
+ *
+ * @return the J2ObjcEntryClassProvider to be built
+ */
+ public J2ObjcEntryClassProvider build() {
+ return new J2ObjcEntryClassProvider(entryClassesBuilder.build());
+ }
+ }
+
+ /**
+ * Constructs a new J2ObjcEntryClassProvider that contains all the information
+ * that can be transitively reached through the "deps" attribute of the given rule context.
+ *
+ * @param ruleContext the rule context in which to look for deps
+ */
+ public static J2ObjcEntryClassProvider buildFrom(RuleContext ruleContext) {
+ return new Builder().addTransitive(ruleContext).build();
+ }
+
+ /**
+ * Constructs a {@link J2ObjcEntryClassProvider} to supply J2ObjC-translated ObjC sources to
+ * objc_binary for compilation and linking.
+ *
+ * @param entryClasses a set of names of Java classes to used as entry point for J2ObjC dead code
+ * analysis. The Java class names should be in canonical format as defined by the Java
+ * Language Specification.
+ */
+ private J2ObjcEntryClassProvider(NestedSet<String> entryClasses) {
+ this.entryClasses = entryClasses;
+ }
+
+ /**
+ * Returns a set of entry classes specified on attribute entry_classes of j2objc_library targets
+ * transitively.
+ */
+ public NestedSet<String> getEntryClasses() {
+ return entryClasses;
+ }
+}
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 e072c0d5d6..fd37871cc8 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
@@ -27,8 +27,6 @@ import com.google.devtools.build.lib.analysis.RunfilesProvider;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.packages.BuildType;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
-import com.google.devtools.build.lib.rules.cpp.CppModuleMap;
-import com.google.devtools.build.lib.rules.java.J2ObjcConfiguration;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -45,6 +43,11 @@ public class J2ObjcLibrary implements RuleConfiguredTargetFactory {
"Entry classes must be specified when flag --compilationMode=opt is on in order to"
+ " perform J2ObjC dead code stripping.";
+ public static final List<String> J2OBJC_SUPPORTED_RULES = ImmutableList.of(
+ "java_import",
+ "java_library",
+ "proto_library");
+
@Override
public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException {
checkAttributes(ruleContext);
@@ -53,51 +56,28 @@ public class J2ObjcLibrary implements RuleConfiguredTargetFactory {
return null;
}
- J2ObjcSrcsProvider j2ObjcSrcsProvider = new J2ObjcSrcsProvider.Builder()
- .addTransitiveJ2ObjcSrcs(ruleContext)
+ J2ObjcEntryClassProvider j2ObjcEntryClassProvider = new J2ObjcEntryClassProvider.Builder()
+ .addTransitive(ruleContext)
.addEntryClasses(ruleContext.attributes().get("entry_classes", Type.STRING_LIST))
.build();
ObjcProvider.Builder objcProviderBuilder =
new ObjcProvider.Builder()
- .addJ2ObjcTransitiveAndPropagate(
- ruleContext.getPrerequisite("$jre_emul_lib", Mode.TARGET, ObjcProvider.class))
- .addJ2ObjcTransitiveAndPropagate(
+ .addTransitiveAndPropagate(
ruleContext.getPrerequisites("deps", Mode.TARGET, ObjcProvider.class));
XcodeProvider.Builder xcodeProviderBuilder = new XcodeProvider.Builder();
XcodeSupport xcodeSupport =
new XcodeSupport(ruleContext)
- .addDependencies(xcodeProviderBuilder, new Attribute("$jre_emul_lib", Mode.TARGET))
.addDependencies(xcodeProviderBuilder, new Attribute("deps", Mode.TARGET));
- if (j2ObjcSrcsProvider.hasProtos()) {
- // Public J2 in Bazel provides no protobuf_lib, and if OSS users try to sneakily use
- // undocumented functionality to reach here, the below code will error.
- objcProviderBuilder.addJ2ObjcTransitiveAndPropagate(
- ruleContext.getPrerequisite("$protobuf_lib", Mode.TARGET, ObjcProvider.class));
- xcodeSupport.addDependencies(
- xcodeProviderBuilder, new Attribute("$protobuf_lib", Mode.TARGET));
- }
-
- for (J2ObjcSource j2objcSource : j2ObjcSrcsProvider.getSrcs()) {
- objcProviderBuilder.addJ2ObjcAll(ObjcProvider.HEADER, j2objcSource.getObjcHdrs());
- objcProviderBuilder.addJ2ObjcAll(ObjcProvider.INCLUDE, j2objcSource.getHeaderSearchPaths());
- xcodeProviderBuilder.addHeaders(j2objcSource.getObjcHdrs());
- xcodeProviderBuilder.addUserHeaderSearchPaths(j2objcSource.getHeaderSearchPaths());
- }
-
- if (ObjcRuleClasses.objcConfiguration(ruleContext).moduleMapsEnabled()) {
- configureModuleMap(ruleContext, objcProviderBuilder, j2ObjcSrcsProvider);
- }
-
ObjcProvider objcProvider = objcProviderBuilder.build();
xcodeSupport.addXcodeSettings(xcodeProviderBuilder, objcProvider, LIBRARY_STATIC);
return new RuleConfiguredTargetBuilder(ruleContext)
.setFilesToBuild(NestedSetBuilder.<Artifact>emptySet(STABLE_ORDER))
.add(RunfilesProvider.class, RunfilesProvider.EMPTY)
- .addProvider(J2ObjcSrcsProvider.class, j2ObjcSrcsProvider)
+ .addProvider(J2ObjcEntryClassProvider.class, j2ObjcEntryClassProvider)
.addProvider(
J2ObjcMappingFileProvider.class, ObjcRuleClasses.j2ObjcMappingFileProvider(ruleContext))
.addProvider(ObjcProvider.class, objcProvider)
@@ -129,21 +109,6 @@ public class J2ObjcLibrary implements RuleConfiguredTargetFactory {
return headerSearchPaths.build();
}
- /**
- * Configures a module map for all the sources in {@code j2ObjcSrcsProvider}, registering
- * an action to generate the module map and exposing that module map through {@code objcProvider}.
- */
- private void configureModuleMap(
- RuleContext ruleContext,
- ObjcProvider.Builder objcProvider,
- J2ObjcSrcsProvider j2ObjcSrcsProvider) {
- new CompilationSupport(ruleContext).registerJ2ObjcGenerateModuleMapAction(j2ObjcSrcsProvider);
-
- CppModuleMap moduleMap = ObjcRuleClasses.intermediateArtifacts(ruleContext).moduleMap();
- objcProvider.add(ObjcProvider.MODULE_MAP, moduleMap.getArtifact());
- objcProvider.add(ObjcProvider.TOP_LEVEL_MODULE_MAP, moduleMap);
- }
-
private static void checkAttributes(RuleContext ruleContext) {
checkAttributes(ruleContext, "deps");
checkAttributes(ruleContext, "exports");
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibraryBaseRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibraryBaseRule.java
index 2da4068f1e..d8a860d411 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibraryBaseRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibraryBaseRule.java
@@ -15,7 +15,6 @@
package com.google.devtools.build.lib.rules.objc;
import static com.google.devtools.build.lib.packages.Attribute.attr;
-import static com.google.devtools.build.lib.packages.BuildType.LABEL;
import static com.google.devtools.build.lib.syntax.Type.STRING_LIST;
import com.google.devtools.build.lib.analysis.BaseRuleClasses;
@@ -44,12 +43,6 @@ public class J2ObjcLibraryBaseRule implements RuleDefinition {
Unused classes will then be removed from the final ObjC app bundle.
<!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
.add(attr("entry_classes", STRING_LIST))
- .add(attr("$jre_emul_lib", LABEL)
- .value(env.getLabel(
- env.getToolsRepository() + "//third_party/java/j2objc:jre_emul_lib")))
- .add(attr("$protobuf_lib", LABEL)
- .value(env.getLabel(
- env.getToolsRepository() + "//third_party/java/j2objc:proto_runtime")))
.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java
index b80c8ec9b0..e785130329 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java
@@ -30,6 +30,7 @@ public final class J2ObjcMappingFileProvider implements TransitiveInfoProvider {
private final NestedSet<Artifact> headerMappingFiles;
private final NestedSet<Artifact> classMappingFiles;
private final NestedSet<Artifact> dependencyMappingFiles;
+ private final NestedSet<Artifact> archiveSourceMappingFiles;
/**
* Constructs a {@link J2ObjcMappingFileProvider} with mapping files to export mappings required
@@ -43,12 +44,16 @@ public final class J2ObjcMappingFileProvider implements TransitiveInfoProvider {
* @param dependencyMappingFiles a nested set of dependency mapping files which map translated
* ObjC files to their translated direct dependency files. Used to support J2ObjC dead code
* analysis and removal.
+ * @param archiveSourceMappingFiles a nested set of files containing mappings between J2ObjC
+ * static library archives and their associated J2ObjC-translated source files.
*/
public J2ObjcMappingFileProvider(NestedSet<Artifact> headerMappingFiles,
- NestedSet<Artifact> classMappingFiles, NestedSet<Artifact> dependencyMappingFiles) {
+ NestedSet<Artifact> classMappingFiles, NestedSet<Artifact> dependencyMappingFiles,
+ NestedSet<Artifact> archiveSourceMappingFiles) {
this.headerMappingFiles = headerMappingFiles;
this.classMappingFiles = classMappingFiles;
this.dependencyMappingFiles = dependencyMappingFiles;
+ this.archiveSourceMappingFiles = archiveSourceMappingFiles;
}
/**
@@ -71,14 +76,24 @@ public final class J2ObjcMappingFileProvider implements TransitiveInfoProvider {
/**
* Returns the mapping files containing file dependency information among the translated ObjC
- * source files. They are used to strip unused translated files before the compilation and linking
- * actions at binary level.
+ * source files. When flag --j2objc_dead_code_removal is specified, they are used to strip unused
+ * object files inside J2ObjC static libraries before the linking action at binary level.
*/
public NestedSet<Artifact> getDependencyMappingFiles() {
return dependencyMappingFiles;
}
/**
+ * Returns the files containing mappings between J2ObjC static library archives and their
+ * associated J2ObjC-translated source files. When flag --j2objc_dead_code_removal is specified,
+ * they are used to strip unused object files inside J2ObjC static libraries before the linking
+ * action at binary level.
+ */
+ public NestedSet<Artifact> getArchiveSourceMappingFiles() {
+ return archiveSourceMappingFiles;
+ }
+
+ /**
* A builder for this provider that is optimized for collection information from transitive
* dependencies.
*/
@@ -86,18 +101,24 @@ public final class J2ObjcMappingFileProvider implements TransitiveInfoProvider {
private final NestedSetBuilder<Artifact> headerMappingFiles = NestedSetBuilder.stableOrder();
private final NestedSetBuilder<Artifact> classMappingFiles = NestedSetBuilder.stableOrder();
private final NestedSetBuilder<Artifact> depEntryFiles = NestedSetBuilder.stableOrder();
+ private final NestedSetBuilder<Artifact> archiveSourceMappingFiles =
+ NestedSetBuilder.stableOrder();
public Builder addTransitive(J2ObjcMappingFileProvider provider) {
headerMappingFiles.addTransitive(provider.getHeaderMappingFiles());
classMappingFiles.addTransitive(provider.getClassMappingFiles());
depEntryFiles.addTransitive(provider.getDependencyMappingFiles());
+ archiveSourceMappingFiles.addTransitive(provider.getArchiveSourceMappingFiles());
return this;
}
public J2ObjcMappingFileProvider build() {
return new J2ObjcMappingFileProvider(
- headerMappingFiles.build(), classMappingFiles.build(), depEntryFiles.build());
+ headerMappingFiles.build(),
+ classMappingFiles.build(),
+ depEntryFiles.build(),
+ archiveSourceMappingFiles.build());
}
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcSrcsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcSrcsProvider.java
deleted file mode 100644
index 4f540793ec..0000000000
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcSrcsProvider.java
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright 2014 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.rules.objc;
-
-import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
-import com.google.devtools.build.lib.analysis.RuleContext;
-import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
-import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.packages.BuildType;
-import com.google.devtools.build.lib.rules.objc.J2ObjcSource.SourceType;
-
-/**
- * This provider is exported by java_library rules to supply J2ObjC-translated ObjC sources to
- * objc_binary for compilation and linking.
- */
-@Immutable
-public final class J2ObjcSrcsProvider implements TransitiveInfoProvider {
- private final NestedSet<J2ObjcSource> srcs;
- private final NestedSet<String> entryClasses;
- private final boolean hasProtos;
-
- /**
- * A builder for J2ObjCSrcsProvider.
- */
- public static class Builder {
- private final NestedSetBuilder<J2ObjcSource> srcsBuilder = NestedSetBuilder.stableOrder();
- private final NestedSetBuilder<String> entryClassesBuilder = NestedSetBuilder.stableOrder();
- private boolean hasProtos = false;
-
- /**
- * Constructs a new, empty J2ObjCSrcsProvider builder.
- */
- public Builder() {}
-
- /**
- * Transitively adds the given {@link J2ObjcSrcsProvider}
- * and all its properties to this builder.
- *
- * @param provider the J2ObjcSrcsProvider to add
- * @return this builder
- */
- public Builder addTransitive(J2ObjcSrcsProvider provider) {
- srcsBuilder.addTransitive(provider.getSrcs());
- entryClassesBuilder.addTransitive(provider.getEntryClasses());
- hasProtos |= provider.hasProtos();
- return this;
- }
-
- /**
- * Transitively adds all the J2ObjcSrcsProviders and all their properties
- * that can be reached through the "deps", "exports" and "runtime_deps" attributes.
- *
- * @param ruleContext the rule context
- * @return this builder
- */
- public Builder addTransitiveJ2ObjcSrcs(RuleContext ruleContext) {
- return addTransitiveJ2ObjcSrcs(ruleContext, "deps")
- .addTransitiveJ2ObjcSrcs(ruleContext, "exports")
- .addTransitiveJ2ObjcSrcs(ruleContext, "runtime_deps");
- }
-
- /**
- * Transitively adds the J2ObjCSrcsProviders of a given attribute to this Builder.
- *
- * @param ruleContext the rule context
- * @param attribute the attribute to which to add sources
- * @return this builder
- */
- public Builder addTransitiveJ2ObjcSrcs(RuleContext ruleContext, String attribute) {
- if (ruleContext.attributes().has(attribute, BuildType.LABEL_LIST)) {
- for (J2ObjcSrcsProvider provider :
- ruleContext.getPrerequisites(attribute, Mode.TARGET, J2ObjcSrcsProvider.class)) {
- addTransitive(provider);
- }
- }
-
- return this;
- }
-
- /**
- * Adds the given {@link J2ObjcSource} to this builder.
- *
- * @param source the source to add
- * @return this builder
- */
- public Builder addSource(J2ObjcSource source) {
- srcsBuilder.add(source);
- hasProtos |= source.getSourceType() == SourceType.PROTO;
- return this;
- }
-
- /**
- * Adds the given entry classes to this builder. See {@link #getEntryClasses()}.
- *
- * @param entryClasses the entry classes to add
- * @return this builder
- */
- public Builder addEntryClasses(Iterable<String> entryClasses) {
- entryClassesBuilder.addAll(entryClasses);
- return this;
- }
-
- /**
- * Builds a J2ObjCSrcsProvider from the information in this builder.
- *
- * @return the J2ObjCSrcsProvider to be built
- */
- public J2ObjcSrcsProvider build() {
- return new J2ObjcSrcsProvider(srcsBuilder.build(), entryClassesBuilder.build(), hasProtos);
- }
- }
-
- /**
- * Constructs a new J2ObjCSrcsProvider that contains all the information
- * that can be transitively reached through the "deps" attribute of the given rule context.
- *
- * @param ruleContext the rule context in which to look for deps
- */
- public static J2ObjcSrcsProvider buildFrom(RuleContext ruleContext) {
- return new Builder().addTransitiveJ2ObjcSrcs(ruleContext).build();
- }
-
- /**
- * Constructs a {@link J2ObjcSrcsProvider} to supply J2ObjC-translated ObjC sources to
- * objc_binary for compilation and linking.
- *
- * @param srcs a nested set of {@link J2ObjcSource}s containing translated source files
- * @param entryClasses a set of names of Java classes to used as entry point for J2ObjC dead code
- * analysis. The Java class names should be in canonical format as defined by the Java
- * Language Specification.
- * @param hasProtos whether the translated files in this provider have J2ObjC proto files
- */
- private J2ObjcSrcsProvider(NestedSet<J2ObjcSource> srcs, NestedSet<String> entryClasses,
- boolean hasProtos) {
- this.srcs = srcs;
- this.entryClasses = entryClasses;
- this.hasProtos = hasProtos;
- }
-
- public NestedSet<J2ObjcSource> getSrcs() {
- return srcs;
- }
-
- /**
- * Returns a set of entry classes specified on attribute entry_classes of j2objc_library targets
- * transitively.
- */
- public NestedSet<String> getEntryClasses() {
- return entryClasses;
- }
-
- /**
- * Returns whether the translated source files in the provider has proto files.
- */
- public boolean hasProtos() {
- return hasProtos;
- }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBinaryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBinaryRule.java
index d8fde99a6f..34b5b8e817 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBinaryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBinaryRule.java
@@ -26,7 +26,6 @@ import com.google.devtools.build.lib.packages.ImplicitOutputsFunction;
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.java.J2ObjcConfiguration;
/**
* Rule definition for objc_binary.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
index 4b8412ee36..abf35a1fea 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
@@ -33,6 +33,7 @@ import static com.google.devtools.build.lib.rules.objc.ObjcProvider.HEADER;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.IMPORTED_LIBRARY;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.INCLUDE;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.INCLUDE_SYSTEM;
+import static com.google.devtools.build.lib.rules.objc.ObjcProvider.J2OBJC_LIBRARY;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.LIBRARY;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.LINKED_BINARY;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.LINKOPT;
@@ -575,6 +576,11 @@ public final class ObjcCommon {
.addAll(LIBRARY, artifacts.getArchive().asSet())
.addAll(SOURCE, allSources);
+ if (artifacts.getArchive().isPresent()
+ && J2ObjcLibrary.J2OBJC_SUPPORTED_RULES.contains(context.getRule().getRuleClass())) {
+ objcProvider.addAll(J2OBJC_LIBRARY, artifacts.getArchive().asSet());
+ }
+
boolean usesCpp = false;
boolean usesSwift = false;
for (Artifact sourceFile :
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
index 34a6305483..6c9d26c9bc 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
@@ -41,21 +41,6 @@ import com.google.devtools.build.lib.syntax.Type;
public class ObjcLibrary implements RuleConfiguredTargetFactory {
/**
- * An {@link IterableWrapper} containing extra library {@link Artifact}s to be linked into the
- * final ObjC application bundle.
- */
- static final class ExtraImportLibraries extends IterableWrapper<Artifact> {
-
- ExtraImportLibraries(Artifact... extraImportLibraries) {
- super(extraImportLibraries);
- }
-
- ExtraImportLibraries(Iterable<Artifact> extraImportLibraries) {
- super(extraImportLibraries);
- }
- }
-
- /**
* A {@link CcLinkParamsStore} to be propagated to dependent cc_{library, binary} targets.
*/
private static class ObjcLibraryCcLinkParamsStore extends CcLinkParamsStore {
@@ -87,8 +72,7 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory {
* should inherit from {@link ObjcLibraryRule}..
*/
static ObjcCommon common(RuleContext ruleContext, Iterable<SdkFramework> extraSdkFrameworks,
- boolean alwayslink, ExtraImportLibraries extraImportLibraries,
- Iterable<ObjcProvider> extraDepObjcProviders) {
+ boolean alwayslink, Iterable<ObjcProvider> extraDepObjcProviders) {
CompilationArtifacts compilationArtifacts =
CompilationSupport.compilationArtifacts(ruleContext);
@@ -109,7 +93,6 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory {
.setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext))
.setAlwayslink(alwayslink)
.setHasModuleMap()
- .addExtraImportLibraries(extraImportLibraries)
.addDepObjcProviders(extraDepObjcProviders)
.build();
}
@@ -121,7 +104,6 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory {
ruleContext,
ImmutableList.<SdkFramework>of(),
ruleContext.attributes().get("alwayslink", Type.BOOLEAN),
- new ExtraImportLibraries(),
ImmutableList.<ObjcProvider>of());
XcodeProvider.Builder xcodeProviderBuilder = new XcodeProvider.Builder();
@@ -150,7 +132,8 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory {
return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build())
.addProvider(XcodeProvider.class, xcodeProviderBuilder.build())
.addProvider(ObjcProvider.class, common.getObjcProvider())
- .addProvider(J2ObjcSrcsProvider.class, J2ObjcSrcsProvider.buildFrom(ruleContext))
+ .addProvider(
+ J2ObjcEntryClassProvider.class, J2ObjcEntryClassProvider.buildFrom(ruleContext))
.addProvider(
J2ObjcMappingFileProvider.class, ObjcRuleClasses.j2ObjcMappingFileProvider(ruleContext))
.addProvider(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
index d2573307ef..ee95b6ebee 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
@@ -213,6 +213,11 @@ public final class ObjcProvider implements TransitiveInfoProvider {
public static final Key<String> LINKOPT = new Key<>(LINK_ORDER);
/**
+ * Static libraries that are built from J2ObjC-translated Java code.
+ */
+ public static final Key<Artifact> J2OBJC_LIBRARY = new Key<>(LINK_ORDER);
+
+ /**
* Flags that apply to a transitive build dependency tree. Each item in the enum corresponds to a
* flag. If the item is included in the key {@link #FLAG}, then the flag is considered set.
*/
@@ -241,16 +246,11 @@ public final class ObjcProvider implements TransitiveInfoProvider {
// Items which should be passed to direct dependers, but not transitive dependers.
private final ImmutableMap<Key<?>, NestedSet<?>> nonPropagatedItems;
- // Items which are relevent only for J2ObjC-translated sources.
- private final ImmutableMap<Key<?>, NestedSet<?>> j2ObjcOnlyItems;
-
private ObjcProvider(
ImmutableMap<Key<?>, NestedSet<?>> items,
- ImmutableMap<Key<?>, NestedSet<?>> nonPropagatedItems,
- ImmutableMap<Key<?>, NestedSet<?>> j2ObjcOnlyItems) {
+ ImmutableMap<Key<?>, NestedSet<?>> nonPropagatedItems) {
this.items = Preconditions.checkNotNull(items);
this.nonPropagatedItems = Preconditions.checkNotNull(nonPropagatedItems);
- this.j2ObjcOnlyItems = Preconditions.checkNotNull(j2ObjcOnlyItems);
}
/**
@@ -285,25 +285,12 @@ public final class ObjcProvider implements TransitiveInfoProvider {
}
/**
- * Returns a corresponding provider that contains only information relevent for J2ObjC-translated
- * code. This trimmed provider offers a view that is used for compilation actions of
- * J2ObjC-translated sources to avoid pulling in unnecessary dependent information from the rest
- * of the transitive closure.
- */
- // TODO(rduan): Roll this back once J2ObjC compilation is moved to the edges in the dep graph.
- public ObjcProvider toJ2ObjcOnlyProvider() {
- return new ObjcProvider(j2ObjcOnlyItems, ImmutableMap.<Key<?>, NestedSet<?>>of(),
- j2ObjcOnlyItems);
- }
-
- /**
* A builder for this context with an API that is optimized for collecting information from
* several transitive dependencies.
*/
public static final class Builder {
private final Map<Key<?>, NestedSetBuilder<?>> items = new HashMap<>();
private final Map<Key<?>, NestedSetBuilder<?>> nonPropagatedItems = new HashMap<>();
- private final Map<Key<?>, NestedSetBuilder<?>> j2ObjcPropagatedItems = new HashMap<>();
private static void maybeAddEmptyBuilder(Map<Key<?>, NestedSetBuilder<?>> set, Key<?> key) {
if (!set.containsKey(key)) {
@@ -341,25 +328,6 @@ public final class ObjcProvider implements TransitiveInfoProvider {
for (Map.Entry<Key<?>, NestedSet<?>> typeEntry : provider.items.entrySet()) {
uncheckedAddTransitive(typeEntry.getKey(), typeEntry.getValue(), this.items);
}
- for (Map.Entry<Key<?>, NestedSet<?>> typeEntry : provider.j2ObjcOnlyItems.entrySet()) {
- uncheckedAddTransitive(typeEntry.getKey(), typeEntry.getValue(),
- this.j2ObjcPropagatedItems);
- }
- return this;
- }
-
- /**
- * Add all elements from provider relevent to J2ObjC (providers directly exporting
- * J2ObjC-translated code, J2ObjC runtime deps, etc.), and propagate them to any (transitive)
- * dependers on this ObjcProvider.
- */
- // TODO(rduan): Roll this back once J2ObjC compilation is moved to the edges in the dep graph.
- public Builder addJ2ObjcTransitiveAndPropagate(ObjcProvider provider) {
- addTransitiveAndPropagate(provider);
- for (Map.Entry<Key<?>, NestedSet<?>> typeEntry : provider.items.entrySet()) {
- uncheckedAddTransitive(typeEntry.getKey(), typeEntry.getValue(),
- this.j2ObjcPropagatedItems);
- }
return this;
}
@@ -384,19 +352,6 @@ public final class ObjcProvider implements TransitiveInfoProvider {
}
/**
- * Add all elements from providers relevent to J2ObjC (providers directly exporting
- * J2ObjC-translated code, J2ObjC runtime deps, etc.), and propagate them to any (transitive)
- * dependers on this ObjcProvider.
- */
- // TODO(rduan): Roll this back once J2ObjC compilation is moved to the edges in the dep graph.
- public Builder addJ2ObjcTransitiveAndPropagate(Iterable<ObjcProvider> providers) {
- for (ObjcProvider provider : providers) {
- addJ2ObjcTransitiveAndPropagate(provider);
- }
- return this;
- }
-
- /**
* Add elements from providers, but don't propagate them to any dependers on this ObjcProvider.
* These elements will be exposed to {@link #get(Key)} calls, but not to any ObjcProviders
* which add this provider to themselves.
@@ -419,17 +374,6 @@ public final class ObjcProvider implements TransitiveInfoProvider {
}
/**
- * Add element relevent to J2ObjC (elements containing information for J2ObjC-translated code),
- * and propagate it to any (transitive) dependers on this ObjcProvider.
- */
- // TODO(rduan): Roll this back once J2ObjC compilation is moved to the edges in the dep graph.
- public <E> Builder addJ2Objc(Key<E> key, E toAdd) {
- uncheckedAddAll(key, ImmutableList.of(toAdd), this.items);
- uncheckedAddAll(key, ImmutableList.of(toAdd), this.j2ObjcPropagatedItems);
- return this;
- }
-
- /**
* Add elements in toAdd, and propagate them to any (transitive) dependers on this ObjcProvider.
*/
public <E> Builder addAll(Key<E> key, Iterable<? extends E> toAdd) {
@@ -437,17 +381,6 @@ public final class ObjcProvider implements TransitiveInfoProvider {
return this;
}
- /**
- * Add elements relevent to J2ObjC (elements containing information for J2ObjC-translated code),
- * and propagate them to any (transitive) dependers on this ObjcProvider.
- */
- // TODO(rduan): Roll this back once J2ObjC compilation is moved to the edges in the dep graph.
- public <E> Builder addJ2ObjcAll(Key<E> key, Iterable<? extends E> toAdd) {
- uncheckedAddAll(key, toAdd, this.items);
- uncheckedAddAll(key, toAdd, this.j2ObjcPropagatedItems);
- return this;
- }
-
public ObjcProvider build() {
ImmutableMap.Builder<Key<?>, NestedSet<?>> propagated = new ImmutableMap.Builder<>();
for (Map.Entry<Key<?>, NestedSetBuilder<?>> typeEntry : items.entrySet()) {
@@ -457,11 +390,7 @@ public final class ObjcProvider implements TransitiveInfoProvider {
for (Map.Entry<Key<?>, NestedSetBuilder<?>> typeEntry : nonPropagatedItems.entrySet()) {
nonPropagated.put(typeEntry.getKey(), typeEntry.getValue().build());
}
- ImmutableMap.Builder<Key<?>, NestedSet<?>> j2ObjcPropagated = new ImmutableMap.Builder<>();
- for (Map.Entry<Key<?>, NestedSetBuilder<?>> typeEntry : j2ObjcPropagatedItems.entrySet()) {
- j2ObjcPropagated.put(typeEntry.getKey(), typeEntry.getValue().build());
- }
- return new ObjcProvider(propagated.build(), nonPropagated.build(), j2ObjcPropagated.build());
+ return new ObjcProvider(propagated.build(), nonPropagated.build());
}
}
}
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 9849565699..65b98ca456 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
@@ -81,41 +81,18 @@ public class ObjcRuleClasses {
/**
* Returns a {@link IntermediateArtifacts} to be used to compile and link the ObjC source files
- * in {@code j2ObjcSource}.
+ * generated by J2ObjC.
*/
- static IntermediateArtifacts j2objcIntermediateArtifacts(RuleContext ruleContext,
- J2ObjcSource j2ObjcSource) {
+ static IntermediateArtifacts j2objcIntermediateArtifacts(RuleContext ruleContext) {
// We need to append "_j2objc" to the name of the generated archive file to distinguish it from
// the C/C++ archive file created by proto_library targets with attribute cc_api_version
// specified.
return new IntermediateArtifacts(
ruleContext,
- j2ObjcSource.getTargetLabel(),
/*archiveFileNameSuffix=*/"_j2objc");
}
/**
- * Returns an {@link Iterable} of {@link Artifact}s containing all the j2objc archives from the
- * transitive closure of the rule through the "deps" attribute. This is useful for ensuring that
- * the j2objc archives are present for linking.
- *
- * @param ruleContext the {@link RuleContext} of the current rule
- * @return an {@link Iterable} of j2objc library archive artifacts.
- */
- static Iterable<Artifact> j2ObjcLibraries(RuleContext ruleContext) {
- ImmutableList.Builder<Artifact> j2objcLibraries = new ImmutableList.Builder<>();
-
- // TODO(bazel-team): Refactor the code to stop flattening the nested set here.
- for (J2ObjcSource j2ObjcSource : J2ObjcSrcsProvider.buildFrom(ruleContext).getSrcs()) {
- if (j2ObjcSource.hasSourceFiles()) {
- j2objcLibraries.add(j2objcIntermediateArtifacts(ruleContext, j2ObjcSource).archive());
- }
- }
-
- return j2objcLibraries.build();
- }
-
- /**
* Returns a {@link J2ObjcMappingFileProvider} containing J2ObjC mapping files from rules
* that can be reached transitively through the "deps" attribute.
*
@@ -763,6 +740,8 @@ public class ObjcRuleClasses {
.singleArtifact()
.value(env.getLabel(
env.getToolsRepository() + "//tools/objc:j2objc_dead_code_pruner")))
+ .add(attr("$dummy_lib", LABEL)
+ .value(env.getLabel("//tools/objc:dummy_lib")))
.build();
}
@Override