aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main
diff options
context:
space:
mode:
authorGravatar Peter Schmitt <schmitt@google.com>2015-05-12 22:58:08 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-05-15 09:43:13 +0000
commitea047be3dbd00206e3547bf04f14027aa5c1630f (patch)
tree0f766bb6fcf3ff5dea9849af8183f799a0f62857 /src/main
parent4eda0cf57fb18538211e0f74d3de5a3affb672c5 (diff)
Clean up obcj rules by removing ObjcActionsBuilder.
Moved the last remaining logic to its corresponding support class (XcodeSupport). -- MOS_MIGRATED_REVID=93462899
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java29
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcActionsBuilder.java137
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java44
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java51
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcXcodeproj.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/XcodeSupport.java68
8 files changed, 143 insertions, 224 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java
index 56bc24669b..f1f1803df0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java
@@ -30,7 +30,6 @@ import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.packages.Type;
-import com.google.devtools.build.lib.rules.objc.ObjcActionsBuilder.ExtraActoolArgs;
import com.google.devtools.build.lib.rules.objc.TargetDeviceFamily.InvalidFamilyNameException;
import com.google.devtools.build.lib.rules.objc.TargetDeviceFamily.RepeatedFamilyNameException;
import com.google.devtools.build.lib.rules.objc.XcodeProvider.Builder;
@@ -52,12 +51,28 @@ import java.util.Objects;
*/
final class BundleSupport {
+ /**
+ * Iterable wrapper used to strongly type plists for merging into a bundle's {@code Info.plist}.
+ */
static class ExtraMergePlists extends IterableWrapper<Artifact> {
ExtraMergePlists(Artifact... inputs) {
super(inputs);
}
}
+ /**
+ * Iterable wrapper used to strongly type arguments eventually passed to {@code actool}.
+ */
+ static final class ExtraActoolArgs extends IterableWrapper<String> {
+ ExtraActoolArgs(Iterable<String> args) {
+ super(args);
+ }
+
+ ExtraActoolArgs(String... args) {
+ super(args);
+ }
+ }
+
private final RuleContext ruleContext;
private final ExtraActoolArgs extraActoolArgs;
private final Bundling bundling;
@@ -211,7 +226,7 @@ final class BundleSupport {
Artifact zipOutput = intermediateArtifacts.compiledStoryboardZip(storyboardInput);
ruleContext.registerAction(
- ObjcActionsBuilder.spawnJavaOnDarwinActionBuilder(attributes.ibtoolzipDeployJar())
+ ObjcRuleClasses.spawnJavaOnDarwinActionBuilder(attributes.ibtoolzipDeployJar())
.setMnemonic("StoryboardCompile")
.setCommandLine(ibActionsCommandLine(archiveRoot, zipOutput, storyboardInput))
.addOutput(zipOutput)
@@ -226,7 +241,7 @@ final class BundleSupport {
// The next three arguments are positional, i.e. they don't have flags before them.
.addPath(zipOutput.getExecPath())
.add(archiveRoot)
- .addPath(ObjcActionsBuilder.IBTOOL)
+ .addPath(ObjcRuleClasses.IBTOOL)
.add("--minimum-deployment-target").add(bundling.getMinimumOsVersion());
for (TargetDeviceFamily targetDeviceFamily : attributes.families()) {
@@ -247,7 +262,7 @@ final class BundleSupport {
for (Xcdatamodel datamodel : xcdatamodels) {
Artifact outputZip = datamodel.getOutputZip();
ruleContext.registerAction(
- ObjcActionsBuilder.spawnJavaOnDarwinActionBuilder(attributes.momczipDeployJar())
+ ObjcRuleClasses.spawnJavaOnDarwinActionBuilder(attributes.momczipDeployJar())
.setMnemonic("MomCompile")
.addOutput(outputZip)
.addInputs(datamodel.getInputs())
@@ -275,14 +290,14 @@ final class BundleSupport {
String archiveRoot = BundleableFile.flatBundlePath(
FileSystemUtils.replaceExtension(original.getExecPath(), ".nib"));
ruleContext.registerAction(
- ObjcActionsBuilder.spawnJavaOnDarwinActionBuilder(attributes.ibtoolzipDeployJar())
+ ObjcRuleClasses.spawnJavaOnDarwinActionBuilder(attributes.ibtoolzipDeployJar())
.setMnemonic("XibCompile")
.setCommandLine(CustomCommandLine.builder()
// The next three arguments are positional,
// i.e. they don't have flags before them.
.addPath(zipOutput.getExecPath())
.add(archiveRoot)
- .addPath(ObjcActionsBuilder.IBTOOL)
+ .addPath(ObjcRuleClasses.IBTOOL)
.add("--minimum-deployment-target").add(bundling.getMinimumOsVersion())
.addPath(original.getExecPath())
@@ -331,7 +346,7 @@ final class BundleSupport {
// zip file will be rooted at the bundle root, and we have to prepend the bundle root to each
// entry when merging it with the final .ipa file.
ruleContext.registerAction(
- ObjcActionsBuilder.spawnJavaOnDarwinActionBuilder(attributes.actoolzipDeployJar())
+ ObjcRuleClasses.spawnJavaOnDarwinActionBuilder(attributes.actoolzipDeployJar())
.setMnemonic("AssetCatalogCompile")
.addTransitiveInputs(objcProvider.get(ASSET_CATALOG))
.addOutput(zipOutput)
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 ed6edea8ab..a176fec52f 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
@@ -38,7 +38,6 @@ import com.google.common.base.Joiner;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Action;
import com.google.devtools.build.lib.actions.Artifact;
@@ -72,8 +71,8 @@ final class CompilationSupport {
"The path '%s' is absolute, but only relative paths are allowed.";
@VisibleForTesting
- static final ImmutableList<String> LINKER_COVERAGE_FLAGS = ImmutableList.<String>of(
- "-ftest-coverage", "-fprofile-arcs");
+ static final ImmutableList<String> LINKER_COVERAGE_FLAGS =
+ ImmutableList.of("-ftest-coverage", "-fprofile-arcs");
@VisibleForTesting
static final ImmutableList<String> CLANG_COVERAGE_FLAGS =
@@ -200,7 +199,7 @@ final class CompilationSupport {
.addExecPath("-c", sourceFile)
.addExecPath("-o", objFile);
- ruleContext.registerAction(ObjcActionsBuilder.spawnOnDarwinActionBuilder()
+ ruleContext.registerAction(ObjcRuleClasses.spawnOnDarwinActionBuilder()
.setMnemonic("ObjcCompile")
.setExecutable(CLANG)
.setCommandLine(commandLine.build())
@@ -237,7 +236,7 @@ final class CompilationSupport {
Artifact.joinExecPaths("\n", objFiles),
/*makeExecutable=*/ false));
- actions.add(ObjcActionsBuilder.spawnOnDarwinActionBuilder()
+ actions.add(ObjcRuleClasses.spawnOnDarwinActionBuilder()
.setMnemonic("ObjcLink")
.setExecutable(ObjcRuleClasses.LIBTOOL)
.setCommandLine(new CustomCommandLine.Builder()
@@ -287,7 +286,7 @@ final class CompilationSupport {
ObjcRuleClasses.intermediateArtifacts(ruleContext).singleArchitectureBinary();
ruleContext.registerAction(
- ObjcActionsBuilder.spawnOnDarwinActionBuilder()
+ ObjcRuleClasses.spawnOnDarwinActionBuilder()
.setMnemonic("ObjcLink")
.setShellCommand(ImmutableList.of("/bin/bash", "-c"))
.setCommandLine(linkCommandLine(extraLinkArgs, objcProvider, linkedBinary, dsymBundle))
@@ -539,11 +538,10 @@ final class CompilationSupport {
Artifact dumpsyms = ruleContext.getPrerequisiteArtifact(":dumpsyms", Mode.HOST);
Artifact breakpadFile = intermediateArtifacts.breakpadSym();
- ruleContext.registerAction(new SpawnAction.Builder()
+ ruleContext.registerAction(ObjcRuleClasses.spawnOnDarwinActionBuilder()
.setMnemonic("GenBreakpad")
.setProgressMessage("Generating breakpad file: " + ruleContext.getLabel())
.setShellCommand(ImmutableList.of("/bin/bash", "-c"))
- .setExecutionInfo(ImmutableMap.of(ExecutionRequirements.REQUIRES_DARWIN, ""))
.addInput(dumpsyms)
.addInput(debugSymbolFile)
.addArgument(String.format("%s %s > %s",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcActionsBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcActionsBuilder.java
deleted file mode 100644
index 0388028d88..0000000000
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcActionsBuilder.java
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2014 Google Inc. 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.common.base.Preconditions;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.io.ByteSource;
-import com.google.devtools.build.lib.actions.Action;
-import com.google.devtools.build.lib.actions.ActionRegistry;
-import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
-import com.google.devtools.build.lib.analysis.actions.BinaryFileWriteAction;
-import com.google.devtools.build.lib.analysis.actions.SpawnAction;
-import com.google.devtools.build.lib.vfs.PathFragment;
-import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos;
-
-import java.io.InputStream;
-
-/**
- * Object that creates actions used by Objective-C rules.
- */
-final class ObjcActionsBuilder {
-
- private final ActionConstructionContext context;
- private final IntermediateArtifacts intermediateArtifacts;
- private final ObjcConfiguration objcConfiguration;
- private final ActionRegistry actionRegistry;
-
- /**
- * @param context {@link ActionConstructionContext} of the rule
- * @param intermediateArtifacts provides intermediate output paths for this rule
- * @param objcConfiguration configuration for this rule
- * @param actionRegistry registry with which to register new actions
- */
- ObjcActionsBuilder(
- ActionConstructionContext context,
- IntermediateArtifacts intermediateArtifacts,
- ObjcConfiguration objcConfiguration,
- ActionRegistry actionRegistry) {
- this.context = Preconditions.checkNotNull(context);
- this.intermediateArtifacts = Preconditions.checkNotNull(intermediateArtifacts);
- this.objcConfiguration = Preconditions.checkNotNull(objcConfiguration);
- this.actionRegistry = Preconditions.checkNotNull(actionRegistry);
- }
-
- /**
- * Creates a new spawn action builder that requires a darwin architecture to run.
- */
- // TODO(bazel-team): Use everywhere we currently set the execution info manually.
- static SpawnAction.Builder spawnOnDarwinActionBuilder() {
- return new SpawnAction.Builder()
- .setExecutionInfo(ImmutableMap.of(ExecutionRequirements.REQUIRES_DARWIN, ""));
- }
-
- static final PathFragment JAVA = new PathFragment("/usr/bin/java");
- static final PathFragment IBTOOL = new PathFragment(IosSdkCommands.IBTOOL_PATH);
-
- // TODO(bazel-team): Reference a rule target rather than a jar file when Darwin runfiles work
- // better.
- static SpawnAction.Builder spawnJavaOnDarwinActionBuilder(Artifact deployJarArtifact) {
- return spawnOnDarwinActionBuilder()
- .setExecutable(JAVA)
- .addExecutableArguments("-jar", deployJarArtifact.getExecPathString())
- .addInput(deployJarArtifact);
- }
-
- private void register(Action... action) {
- actionRegistry.registerAction(action);
- }
-
- private static ByteSource xcodegenControlFileBytes(
- final Artifact pbxproj, final XcodeProvider.Project project,
- final ObjcConfiguration objcConfiguration) {
- return new ByteSource() {
- @Override
- public InputStream openStream() {
- return XcodeGenProtos.Control.newBuilder()
- .setPbxproj(pbxproj.getExecPathString())
- .addAllTarget(project.targets())
- .addBuildSetting(XcodeGenProtos.XcodeprojBuildSetting.newBuilder()
- .setName("IPHONEOS_DEPLOYMENT_TARGET")
- .setValue(objcConfiguration.getMinimumOs())
- .build())
- .addBuildSetting(XcodeGenProtos.XcodeprojBuildSetting.newBuilder()
- .setName("DEBUG_INFORMATION_FORMAT")
- .setValue(objcConfiguration.generateDebugSymbols() ? "dwarf-with-dsym" : "dwarf")
- .build())
- .build()
- .toByteString()
- .newInput();
- }
- };
- }
-
- /**
- * Generates actions needed to create an Xcode project file.
- */
- void registerXcodegenActions(
- ObjcRuleClasses.Tools baseTools, Artifact pbxproj, XcodeProvider.Project project) {
- Artifact controlFile = intermediateArtifacts.pbxprojControlArtifact();
- register(new BinaryFileWriteAction(
- context.getActionOwner(),
- controlFile,
- xcodegenControlFileBytes(pbxproj, project, objcConfiguration),
- /*makeExecutable=*/false));
- register(new SpawnAction.Builder()
- .setMnemonic("GenerateXcodeproj")
- .setExecutable(baseTools.xcodegen())
- .addArgument("--control")
- .addInputArgument(controlFile)
- .addOutput(pbxproj)
- .addTransitiveInputs(project.getInputsToXcodegen())
- .build(context));
- }
-
- static final class ExtraActoolArgs extends IterableWrapper<String> {
- ExtraActoolArgs(Iterable<String> args) {
- super(args);
- }
-
- ExtraActoolArgs(String... args) {
- super(args);
- }
- }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java
index ae6464dd95..ab58fd0d34 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java
@@ -22,7 +22,6 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
@@ -32,7 +31,6 @@ 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.FileWriteAction;
-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;
@@ -138,7 +136,7 @@ public class ObjcProtoLibrary implements RuleConfiguredTargetFactory {
}
if (!Iterables.isEmpty(protos)) {
- ruleContext.registerAction(new SpawnAction.Builder()
+ ruleContext.registerAction(ObjcRuleClasses.spawnOnDarwinActionBuilder()
.setMnemonic("GenObjcProtos")
.addInput(compileProtos)
.addInputs(optionsFile.asSet())
@@ -149,7 +147,6 @@ public class ObjcProtoLibrary implements RuleConfiguredTargetFactory {
.addOutputs(Iterables.concat(protoGeneratedSources, protoGeneratedHeaders))
.setExecutable(new PathFragment("/usr/bin/python"))
.setCommandLine(commandLineBuilder.build())
- .setExecutionInfo(ImmutableMap.of(ExecutionRequirements.REQUIRES_DARWIN, ""))
.build(ruleContext));
}
@@ -181,38 +178,31 @@ public class ObjcProtoLibrary implements RuleConfiguredTargetFactory {
.addHeaders(protoGeneratedSources)
.build();
+ NestedSetBuilder<Artifact> filesToBuild = NestedSetBuilder.<Artifact>stableOrder()
+ .addAll(common.getCompiledArchive().asSet())
+ .addAll(protoGeneratedSources)
+ .addAll(protoGeneratedHeaders);
+
ObjcConfiguration configuration = ObjcRuleClasses.objcConfiguration(ruleContext);
- Iterable<XcodeProvider> protoDeps = ruleContext.getPrerequisites(
- ObjcProtoLibraryRule.LIBPROTOBUF_ATTR, Mode.TARGET, XcodeProvider.class);
- XcodeProvider xcodeProvider = new XcodeProvider.Builder()
- .setLabel(ruleContext.getLabel())
- .setArchitecture(configuration.getIosCpu())
+ XcodeProvider.Builder xcodeProviderBuilder = new XcodeProvider.Builder()
.addUserHeaderSearchPaths(searchPathEntries)
- .addPropagatedDependencies(protoDeps)
- .setConfigurationDistinguisher(configuration.getConfigurationDistinguisher())
.addCopts(configuration.getCopts())
- .setProductType(LIBRARY_STATIC)
.addHeaders(protoGeneratedHeaders)
- .setCompilationArtifacts(common.getCompilationArtifacts().get())
- .setObjcProvider(common.getObjcProvider())
- .build();
+ .setCompilationArtifacts(common.getCompilationArtifacts().get());
- ObjcActionsBuilder actionsBuilder = ObjcRuleClasses.actionsBuilder(ruleContext);
new CompilationSupport(ruleContext)
.registerCompileAndArchiveActions(common, OptionsProvider.DEFAULT);
- actionsBuilder.registerXcodegenActions(
- new ObjcRuleClasses.Tools(ruleContext),
- ruleContext.getImplicitOutputArtifact(XcodeSupport.PBXPROJ),
- XcodeProvider.Project.fromTopLevelTarget(xcodeProvider));
+
+ new XcodeSupport(ruleContext)
+ .addFilesToBuild(filesToBuild)
+ .addXcodeSettings(xcodeProviderBuilder, common.getObjcProvider(), LIBRARY_STATIC)
+ .addDependencies(
+ xcodeProviderBuilder, new Attribute(ObjcProtoLibraryRule.LIBPROTOBUF_ATTR, Mode.TARGET))
+ .registerActions(xcodeProviderBuilder.build());
return common.configuredTarget(
- NestedSetBuilder.<Artifact>stableOrder()
- .addAll(common.getCompiledArchive().asSet())
- .addAll(protoGeneratedSources)
- .addAll(protoGeneratedHeaders)
- .add(ruleContext.getImplicitOutputArtifact(XcodeSupport.PBXPROJ))
- .build(),
- Optional.of(xcodeProvider),
+ filesToBuild.build(),
+ Optional.of(xcodeProviderBuilder.build()),
Optional.of(common.getObjcProvider()),
Optional.<XcTestAppProvider>absent(),
Optional.<J2ObjcSrcsProvider>absent(),
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 9aeb7acd27..df14de212e 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
@@ -24,16 +24,16 @@ import static com.google.devtools.build.lib.packages.Type.STRING_LIST;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.analysis.FilesToRunProvider;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.RuleDefinition;
import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
+import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.packages.Attribute;
@@ -62,6 +62,8 @@ public class ObjcRuleClasses {
static final PathFragment LIBTOOL = new PathFragment(BIN_DIR + "/libtool");
static final PathFragment DSYMUTIL = new PathFragment(BIN_DIR + "/dsymutil");
static final PathFragment LIPO = new PathFragment(BIN_DIR + "/lipo");
+ static final PathFragment IBTOOL = new PathFragment(IosSdkCommands.IBTOOL_PATH);
+ private static final PathFragment JAVA = new PathFragment("/usr/bin/java");
private ObjcRuleClasses() {
throw new UnsupportedOperationException("static-only");
@@ -205,14 +207,6 @@ public class ObjcRuleClasses {
context, context.getLabel().toPathFragment(), suffix);
}
- static ObjcActionsBuilder actionsBuilder(RuleContext ruleContext) {
- return new ObjcActionsBuilder(
- ruleContext,
- intermediateArtifacts(ruleContext),
- ObjcRuleClasses.objcConfiguration(ruleContext),
- ruleContext);
- }
-
public static ObjcConfiguration objcConfiguration(RuleContext ruleContext) {
return ruleContext.getFragment(ObjcConfiguration.class);
}
@@ -222,6 +216,27 @@ public class ObjcRuleClasses {
new SdkFramework("Foundation"), new SdkFramework("UIKit"));
/**
+ * Creates a new spawn action builder that requires a darwin architecture to run.
+ */
+ static SpawnAction.Builder spawnOnDarwinActionBuilder() {
+ return new SpawnAction.Builder()
+ .setExecutionInfo(ImmutableMap.of(ExecutionRequirements.REQUIRES_DARWIN, ""));
+ }
+
+ /**
+ * Creates a new spawn action builder that requires a darwin architecture to run and is executed
+ * with the given jar.
+ */
+ // TODO(bazel-team): Reference a rule target rather than a jar file when Darwin runfiles work
+ // better.
+ static SpawnAction.Builder spawnJavaOnDarwinActionBuilder(Artifact deployJarArtifact) {
+ return spawnOnDarwinActionBuilder()
+ .setExecutable(JAVA)
+ .addExecutableArguments("-jar", deployJarArtifact.getExecPathString())
+ .addInput(deployJarArtifact);
+ }
+
+ /**
* Attributes for {@code objc_*} rules that have compiler options.
*/
public static class CoptsRule implements RuleDefinition {
@@ -994,21 +1009,5 @@ public class ObjcRuleClasses {
.build();
}
}
-
- /**
- * Object that supplies tools used by all rules which have the helper tools common to most rule
- * implementations.
- */
- static final class Tools {
- private final RuleContext ruleContext;
-
- Tools(RuleContext ruleContext) {
- this.ruleContext = Preconditions.checkNotNull(ruleContext);
- }
-
- FilesToRunProvider xcodegen() {
- return ruleContext.getExecutablePrerequisite("$xcodegen", Mode.HOST);
- }
- }
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcXcodeproj.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcXcodeproj.java
index e167f8966a..85ed4bd444 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcXcodeproj.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcXcodeproj.java
@@ -21,7 +21,6 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.RunfilesProvider;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
-import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
/**
@@ -31,16 +30,13 @@ public class ObjcXcodeproj implements RuleConfiguredTargetFactory {
@Override
public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException {
- XcodeProvider.Project project = XcodeProvider.Project.fromTopLevelTargets(
- ruleContext.getPrerequisites("deps", Mode.TARGET, XcodeProvider.class));
- Artifact pbxproj = ruleContext.getImplicitOutputArtifact(XcodeSupport.PBXPROJ);
-
- ObjcActionsBuilder actionsBuilder = ObjcRuleClasses.actionsBuilder(ruleContext);
- actionsBuilder.registerXcodegenActions(
- new ObjcRuleClasses.Tools(ruleContext), pbxproj, project);
+ NestedSetBuilder<Artifact> filesToBuild = NestedSetBuilder.stableOrder();
+ new XcodeSupport(ruleContext)
+ .addFilesToBuild(filesToBuild)
+ .registerActions(ruleContext.getPrerequisites("deps", Mode.TARGET, XcodeProvider.class));
return new RuleConfiguredTargetBuilder(ruleContext)
- .setFilesToBuild(NestedSetBuilder.create(Order.STABLE_ORDER, pbxproj))
+ .setFilesToBuild(filesToBuild.build())
.addProvider(RunfilesProvider.class, RunfilesProvider.EMPTY)
.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java
index 9247461580..6cf939a129 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java
@@ -44,7 +44,7 @@ import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction;
import com.google.devtools.build.lib.packages.Type;
-import com.google.devtools.build.lib.rules.objc.ObjcActionsBuilder.ExtraActoolArgs;
+import com.google.devtools.build.lib.rules.objc.BundleSupport.ExtraActoolArgs;
import com.google.devtools.build.lib.shell.ShellUtils;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos.XcodeprojBuildSetting;
@@ -435,7 +435,7 @@ public final class ReleaseBundlingSupport {
Artifact resultingLinkedBinary = intermediateArtifacts.combinedArchitectureBinary();
NestedSet<Artifact> linkedBinaries = linkedBinaries();
- ruleContext.registerAction(ObjcActionsBuilder.spawnOnDarwinActionBuilder()
+ ruleContext.registerAction(ObjcRuleClasses.spawnOnDarwinActionBuilder()
.setMnemonic("ObjcCombiningArchitectures")
.addTransitiveInputs(linkedBinaries)
.addOutput(resultingLinkedBinary)
@@ -495,7 +495,7 @@ public final class ReleaseBundlingSupport {
private ReleaseBundlingSupport registerSignBundleAction(
Artifact entitlements, Artifact ipaOutput, Artifact ipaUnsigned) {
// TODO(bazel-team): Support variable substitution
- ruleContext.registerAction(ObjcActionsBuilder.spawnOnDarwinActionBuilder()
+ ruleContext.registerAction(ObjcRuleClasses.spawnOnDarwinActionBuilder()
.setMnemonic("IosSignBundle")
.setProgressMessage("Signing iOS bundle: " + ruleContext.getLabel())
.setExecutable(new PathFragment("/bin/bash"))
@@ -595,7 +595,7 @@ public final class ReleaseBundlingSupport {
}
private void registerExtractTeamPrefixAction(Artifact teamPrefixFile) {
- ruleContext.registerAction(ObjcActionsBuilder.spawnOnDarwinActionBuilder()
+ ruleContext.registerAction(ObjcRuleClasses.spawnOnDarwinActionBuilder()
.setMnemonic("ExtractIosTeamPrefix")
.setExecutable(new PathFragment("/bin/bash"))
.addArgument("-c")
@@ -616,7 +616,7 @@ public final class ReleaseBundlingSupport {
// BundleID consists of a reverse-DNS string to identify the app, where the last component
// is the application name, and is specified as an attribute.
- ruleContext.registerAction(ObjcActionsBuilder.spawnOnDarwinActionBuilder()
+ ruleContext.registerAction(ObjcRuleClasses.spawnOnDarwinActionBuilder()
.setMnemonic("ExtractIosEntitlements")
.setProgressMessage("Extracting entitlements: " + ruleContext.getLabel())
.setExecutable(new PathFragment("/bin/bash"))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeSupport.java
index a25f7861eb..ff24634aa0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeSupport.java
@@ -18,15 +18,22 @@ import static com.google.devtools.build.lib.packages.ImplicitOutputsFunction.fro
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
+import com.google.common.io.ByteSource;
import com.google.devtools.build.lib.actions.Artifact;
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.BinaryFileWriteAction;
+import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction;
import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport.SplitArchTransition.ConfigurationDistinguisher;
import com.google.devtools.build.lib.rules.objc.XcodeProvider.Builder;
+import com.google.devtools.build.lib.rules.objc.XcodeProvider.Project;
+import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos;
import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos.XcodeprojBuildSetting;
+import java.io.InputStream;
+
/**
* Support for Objc rule types that export an Xcode provider or generate xcode project files.
*
@@ -78,11 +85,18 @@ public final class XcodeSupport {
* @return this xcode support
*/
XcodeSupport registerActions(XcodeProvider xcodeProvider) {
- ObjcActionsBuilder actionsBuilder = ObjcRuleClasses.actionsBuilder(ruleContext);
- actionsBuilder.registerXcodegenActions(
- new ObjcRuleClasses.Tools(ruleContext),
- ruleContext.getImplicitOutputArtifact(XcodeSupport.PBXPROJ),
- XcodeProvider.Project.fromTopLevelTarget(xcodeProvider));
+ registerXcodegenActions(XcodeProvider.Project.fromTopLevelTarget(xcodeProvider));
+ return this;
+ }
+
+ /**
+ * Registers actions that generate the rule's Xcode project.
+ *
+ * @param xcodeProviders information about several rules' xcode settings
+ * @return this xcode support
+ */
+ XcodeSupport registerActions(Iterable<XcodeProvider> xcodeProviders) {
+ registerXcodegenActions(Project.fromTopLevelTargets(xcodeProviders));
return this;
}
@@ -174,6 +188,50 @@ public final class XcodeSupport {
return this;
}
+ private void registerXcodegenActions(XcodeProvider.Project project) {
+ Artifact controlFile =
+ ObjcRuleClasses.intermediateArtifacts(ruleContext).pbxprojControlArtifact();
+
+ ruleContext.registerAction(new BinaryFileWriteAction(
+ ruleContext.getActionOwner(),
+ controlFile,
+ xcodegenControlFileBytes(project),
+ /*makeExecutable=*/false));
+
+ ruleContext.registerAction(new SpawnAction.Builder()
+ .setMnemonic("GenerateXcodeproj")
+ .setExecutable(ruleContext.getExecutablePrerequisite("$xcodegen", Mode.HOST))
+ .addArgument("--control")
+ .addInputArgument(controlFile)
+ .addOutput(ruleContext.getImplicitOutputArtifact(XcodeSupport.PBXPROJ))
+ .addTransitiveInputs(project.getInputsToXcodegen())
+ .build(ruleContext));
+ }
+
+ private ByteSource xcodegenControlFileBytes(final XcodeProvider.Project project) {
+ final Artifact pbxproj = ruleContext.getImplicitOutputArtifact(XcodeSupport.PBXPROJ);
+ final ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext);
+ return new ByteSource() {
+ @Override
+ public InputStream openStream() {
+ return XcodeGenProtos.Control.newBuilder()
+ .setPbxproj(pbxproj.getExecPathString())
+ .addAllTarget(project.targets())
+ .addBuildSetting(XcodeGenProtos.XcodeprojBuildSetting.newBuilder()
+ .setName("IPHONEOS_DEPLOYMENT_TARGET")
+ .setValue(objcConfiguration.getMinimumOs())
+ .build())
+ .addBuildSetting(XcodeGenProtos.XcodeprojBuildSetting.newBuilder()
+ .setName("DEBUG_INFORMATION_FORMAT")
+ .setValue(objcConfiguration.generateDebugSymbols() ? "dwarf-with-dsym" : "dwarf")
+ .build())
+ .build()
+ .toByteString()
+ .newInput();
+ }
+ };
+ }
+
/**
* Returns a list of default XCode build settings for Bazel-generated XCode projects.
*/