diff options
author | 2015-05-12 22:58:08 +0000 | |
---|---|---|
committer | 2015-05-15 09:43:13 +0000 | |
commit | ea047be3dbd00206e3547bf04f14027aa5c1630f (patch) | |
tree | 0f766bb6fcf3ff5dea9849af8183f799a0f62857 /src/main | |
parent | 4eda0cf57fb18538211e0f74d3de5a3affb672c5 (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')
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. */ |