diff options
author | 2017-10-16 11:25:18 +0200 | |
---|---|---|
committer | 2017-10-16 17:48:57 +0200 | |
commit | 22670a4e5abb879ebd5e41294f6aa0960346f4cf (patch) | |
tree | dc27a2a43eec21fea912a57d1a1d6ba0783a51ae /src/main | |
parent | 95e41675f94bff0dcec027b5516ae07a045dfbfa (diff) |
Export apple_host_system_env and target_apple_env through apple_common (as opposed to only through ctx.fragments.apple)
Progress towards #3424.
RELNOTES: None.
PiperOrigin-RevId: 172299240
Diffstat (limited to 'src/main')
15 files changed, 164 insertions, 94 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java index 752bf64e48..cc77b96018 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleConfiguration.java @@ -233,62 +233,74 @@ public class AppleConfiguration extends BuildConfiguration.Fragment { * Returns a map of environment variables (derived from configuration) that should be propagated * for actions pertaining to the given apple platform. Keys are variable names and values are * their corresponding values. + * + * @deprecated use {@link #appleTargetPlatformEnv(ApplePlatform, DottedVersion) instead)}. */ + @Deprecated @SkylarkCallable( - name = "target_apple_env", - doc = "Returns a <code>dict</code> of environment variables that should be set for actions " - + "that build targets of the given Apple platform type. For example, this dictionary " - + "contains variables that denote the platform name and SDK version with which to " - + "build. The keys are variable names and the values are their corresponding values.") + name = "target_apple_env", + doc = + "Returns a <code>dict</code> of environment variables that should be set for actions " + + "that build targets of the given Apple platform type. For example, this dictionary " + + "contains variables that denote the platform name and SDK version with which to " + + "build. The keys are variable names and the values are their corresponding values." + ) + // Bug tracking the removal of this method: https://github.com/bazelbuild/bazel/issues/3424 public ImmutableMap<String, String> getTargetAppleEnvironment(ApplePlatform platform) { - ImmutableMap.Builder<String, String> mapBuilder = ImmutableMap.builder(); - mapBuilder.putAll(appleTargetPlatformEnv(platform)); - return mapBuilder.build(); + return appleTargetPlatformEnv(platform, getSdkVersionForPlatform(platform)); + } + + /** + * Returns a map of environment variables (derived from configuration) that should be propagated + * for actions pertaining to building applications for apple platforms. These environment + * variables are needed to use apple toolkits. Keys are variable names and values are their + * corresponding values. + */ + public static ImmutableMap <String, String> appleTargetPlatformEnv( + ApplePlatform platform, DottedVersion sdkVersion) { + ImmutableMap.Builder<String, String> builder = ImmutableMap.builder(); + + builder + .put(AppleConfiguration.APPLE_SDK_VERSION_ENV_NAME, + sdkVersion.toStringWithMinimumComponents(2)) + .put(AppleConfiguration.APPLE_SDK_PLATFORM_ENV_NAME, + platform.getNameInPlist()); + + return builder.build(); } /** * Returns a map of environment variables that should be propagated for actions that build on an * apple host system. These environment variables are needed by the apple toolchain. Keys are * variable names and values are their corresponding values. + * + * @deprecated use {@link #getXcodeVersionEnv(DottedVersion)} instead}. */ @SkylarkCallable( - name = "apple_host_system_env", - doc = "Returns a <a href='dict.html'>dict</a> of environment variables that should be set " - + "for actions that need to run build tools on an Apple host system, such as the version " - + "of Xcode that should be used. The keys are variable names and the values are their " - + "corresponding values.") + name = "apple_host_system_env", + doc = + "Returns a <a href='dict.html'>dict</a> of environment variables that should be set " + + "for actions that need to run build tools on an Apple host system, such as the " + + "version of Xcode that should be used. The keys are variable names and the values " + + "are their corresponding values." + ) + @Deprecated + // Bug tracking the removal of this method: https://github.com/bazelbuild/bazel/issues/3424 public ImmutableMap<String, String> getAppleHostSystemEnv() { - if (xcodeVersion != null) { - return getXcodeVersionEnv(xcodeVersion); - } else { - return ImmutableMap.of(); - } + return getXcodeVersionEnv(xcodeVersion); } /** - * Returns a map of environment variables that should be propagated for actions that require - * a version of xcode to be explicitly declared. Keys are variable names and values are their - * corresponding values. - */ - public ImmutableMap<String, String> getXcodeVersionEnv(DottedVersion xcodeVersion) { - return ImmutableMap.of(AppleConfiguration.XCODE_VERSION_ENV_NAME, xcodeVersion.toString()); - } - - /** - * Returns a map of environment variables (derived from configuration) that should be propagated - * for actions pertaining to building applications for apple platforms. These environment - * variables are needed to use apple toolkits. Keys are variable names and values are their + * Returns a map of environment variables that should be propagated for actions that require a + * version of xcode to be explicitly declared. Keys are variable names and values are their * corresponding values. */ - public Map<String, String> appleTargetPlatformEnv(ApplePlatform platform) { - ImmutableMap.Builder<String, String> builder = ImmutableMap.builder(); - - String sdkVersion = getSdkVersionForPlatform(platform).toStringWithMinimumComponents(2); - builder - .put(AppleConfiguration.APPLE_SDK_VERSION_ENV_NAME, sdkVersion) - .put(AppleConfiguration.APPLE_SDK_PLATFORM_ENV_NAME, platform.getNameInPlist()); - - return builder.build(); + public static ImmutableMap<String, String> getXcodeVersionEnv(DottedVersion xcodeVersion) { + if (xcodeVersion != null) { + return ImmutableMap.of(AppleConfiguration.XCODE_VERSION_ENV_NAME, xcodeVersion.toString()); + } else { + return ImmutableMap.of(); + } } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfig.java b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfig.java index 9749a9eb80..7444c45bc0 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfig.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfig.java @@ -45,6 +45,7 @@ import javax.annotation.Nullable; * Implementation for the {@code xcode_config} rule. */ public class XcodeConfig implements RuleConfiguredTargetFactory { + private static ImmutableList<XcodeVersionRuleData> getAvailableVersions( ConfigurationEnvironment env, Rule xcodeConfigTarget) throws InvalidConfigurationException, InterruptedException { @@ -92,6 +93,7 @@ public class XcodeConfig implements RuleConfiguredTargetFactory { * An exception that signals that an Xcode config setup was invalid. */ public static class XcodeConfigException extends Exception { + XcodeConfigException(String reason) { super(reason); } @@ -149,18 +151,17 @@ public class XcodeConfig implements RuleConfiguredTargetFactory { .addNativeDeclaredProvider(xcodeVersionProperties) .build(); } - + /** * Uses the {@link AppleCommandLineOptions#xcodeVersion} and {@link * AppleCommandLineOptions#xcodeVersionConfig} command line options to determine and return the * effective xcode version and its properties. * - * @param requireDefinedVersions whether the version config requires an explicitly defined version * @param xcodeVersionOverrideFlag the value of the {@code --xcode_version} command line flag * @param xcodeVersions the Xcode versions listed in the {@code xcode_config} rule * @param defaultVersion the default Xcode version in the {@code xcode_config} rule. - * @throws XcodeConfigException if the options given (or configuration targets) were - * malformed and thus the xcode version could not be determined + * @throws XcodeConfigException if the options given (or configuration targets) were malformed and + * thus the xcode version could not be determined */ static XcodeVersionProperties resolveXcodeVersion( String xcodeVersionOverrideFlag, @@ -168,9 +169,10 @@ public class XcodeConfig implements RuleConfiguredTargetFactory { XcodeVersionRuleData defaultVersion) throws XcodeConfigException { if (defaultVersion != null - && Iterables.isEmpty(Iterables.filter( - xcodeVersions, - ruleData -> ruleData.getLabel().equals(defaultVersion.getLabel())))) { + && Iterables.isEmpty( + Iterables.filter( + xcodeVersions, + ruleData -> ruleData.getLabel().equals(defaultVersion.getLabel())))) { throw new XcodeConfigException( String.format("default label '%s' must be contained in versions attribute", defaultVersion.getLabel())); @@ -246,12 +248,11 @@ public class XcodeConfig implements RuleConfiguredTargetFactory { * Returns a map where keys are "names" of xcode versions as defined by the configuration target, * and values are the rule data objects which contain information regarding that xcode version. * - * @throws XcodeConfigException if there are duplicate aliases (if two xcode versions - * were registered to the same alias) + * @throws XcodeConfigException if there are duplicate aliases (if two xcode versions were + * registered to the same alias) */ private static Map<String, XcodeVersionRuleData> aliasesToVersionMap( - Iterable<XcodeVersionRuleData> xcodeVersionRules) - throws XcodeConfigException { + Iterable<XcodeVersionRuleData> xcodeVersionRules) throws XcodeConfigException { Map<String, XcodeVersionRuleData> aliasesToXcodeRules = Maps.newLinkedHashMap(); for (XcodeVersionRuleData xcodeVersionRule : xcodeVersionRules) { for (String alias : xcodeVersionRule.getAliases()) { @@ -271,13 +272,13 @@ public class XcodeConfig implements RuleConfiguredTargetFactory { } return aliasesToXcodeRules; } - + /** - * Convenience method for throwing an {@link XcodeConfigException} due to presence - * of duplicate aliases in an {@code xcode_config} target definition. + * Convenience method for throwing an {@link XcodeConfigException} due to presence of duplicate + * aliases in an {@code xcode_config} target definition. */ - private static void configErrorDuplicateAlias(String alias, - Iterable<XcodeVersionRuleData> xcodeVersionRules) throws XcodeConfigException { + private static void configErrorDuplicateAlias( + String alias, Iterable<XcodeVersionRuleData> xcodeVersionRules) throws XcodeConfigException { ImmutableList.Builder<Label> labelsContainingAlias = ImmutableList.builder(); for (XcodeVersionRuleData xcodeVersionRule : xcodeVersionRules) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfigProvider.java b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfigProvider.java index d711bd4506..913e367cd3 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfigProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfigProvider.java @@ -15,6 +15,8 @@ package com.google.devtools.build.lib.rules.apple; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.NativeInfo; import com.google.devtools.build.lib.packages.NativeProvider; @@ -115,4 +117,9 @@ public class XcodeConfigProvider extends NativeInfo { throw new IllegalArgumentException("Unhandled platform: " + platform); } } + + public static XcodeConfigProvider fromRuleContext(RuleContext ruleContext) { + return ruleContext.getPrerequisite( + XcodeConfigRule.XCODE_CONFIG_ATTR_NAME, Mode.TARGET, XcodeConfigProvider.PROVIDER); + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/AppleCcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/AppleCcToolchain.java index 5c78577ead..a2c6120e45 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/AppleCcToolchain.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/cpp/AppleCcToolchain.java @@ -25,6 +25,7 @@ import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.ApplePlatform; import com.google.devtools.build.lib.rules.apple.AppleToolchain; import com.google.devtools.build.lib.rules.apple.XcodeConfig; +import com.google.devtools.build.lib.rules.apple.XcodeConfigProvider; import com.google.devtools.build.lib.rules.cpp.CcToolchain; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables; import com.google.devtools.build.lib.rules.cpp.CppConfiguration; @@ -120,12 +121,12 @@ public class AppleCcToolchain extends CcToolchain { private ImmutableMap<String, String> getEnvironmentBuildVariables(RuleContext ruleContext) { Map<String, String> builder = new LinkedHashMap<>(); CppConfiguration cppConfiguration = ruleContext.getFragment(CppConfiguration.class); - AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); - builder.putAll(appleConfiguration.getAppleHostSystemEnv()); + XcodeConfigProvider xcodeConfig = XcodeConfigProvider.fromRuleContext(ruleContext); + builder.putAll(AppleConfiguration.getXcodeVersionEnv(xcodeConfig.getXcodeVersion())); if (ApplePlatform.isApplePlatform(cppConfiguration.getTargetCpu())) { - builder.putAll( - appleConfiguration.appleTargetPlatformEnv( - ApplePlatform.forTargetCpu(cppConfiguration.getTargetCpu()))); + ApplePlatform platform = ApplePlatform.forTargetCpu(cppConfiguration.getTargetCpu()); + builder.putAll(AppleConfiguration.appleTargetPlatformEnv( + platform, xcodeConfig.getSdkVersionForPlatform(platform))); } return ImmutableMap.copyOf(builder); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java index be4df25559..d61b803e60 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.rules.objc; import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.collect.nestedset.NestedSet; @@ -22,6 +23,7 @@ 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.Info; import com.google.devtools.build.lib.packages.Provider; +import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.ApplePlatform; import com.google.devtools.build.lib.rules.apple.ApplePlatform.PlatformType; import com.google.devtools.build.lib.rules.apple.AppleToolchain; @@ -286,6 +288,32 @@ public class AppleSkylarkCommon { return IosDeviceProvider.SKYLARK_CONSTRUCTOR; } + @SkylarkCallable( + name = "apple_host_system_env", + doc = + "Returns a <a href='dict.html'>dict</a> of environment variables that should be set " + + "for actions that need to run build tools on an Apple host system, such as the " + + " version of Xcode that should be used. The keys are variable names and the values " + + " are their corresponding values." + ) + public ImmutableMap<String, String> getAppleHostSystemEnv(XcodeConfigProvider xcodeConfig) { + return AppleConfiguration.getXcodeVersionEnv(xcodeConfig.getXcodeVersion()); + } + + @SkylarkCallable( + name = "target_apple_env", + doc = + "Returns a <code>dict</code> of environment variables that should be set for actions " + + "that build targets of the given Apple platform type. For example, this dictionary " + + "contains variables that denote the platform name and SDK version with which to " + + "build. The keys are variable names and the values are their corresponding values." + ) + public ImmutableMap<String, String> getTargetAppleEnvironment( + XcodeConfigProvider xcodeConfig, ApplePlatform platform) { + return AppleConfiguration.appleTargetPlatformEnv( + platform, xcodeConfig.getSdkVersionForPlatform(platform)); + } + @SkylarkSignature( name = "new_objc_provider", objectType = AppleSkylarkCommon.class, diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java index 467c463b9d..97a46368e1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java @@ -38,6 +38,7 @@ import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.ApplePlatform; import com.google.devtools.build.lib.rules.apple.ApplePlatform.PlatformType; import com.google.devtools.build.lib.rules.apple.AppleToolchain; +import com.google.devtools.build.lib.rules.apple.XcodeConfigProvider; import com.google.devtools.build.lib.util.StringUtil; import com.google.devtools.build.lib.vfs.PathFragment; @@ -117,7 +118,7 @@ public class AppleStubBinary implements RuleConfiguredTargetFactory { Artifact outputArtifact = ObjcRuleClasses.intermediateArtifacts(ruleContext).combinedArchitectureBinary(); - registerActions(ruleContext, appleConfiguration, platform, outputArtifact); + registerActions(ruleContext, platform, outputArtifact); NestedSetBuilder<Artifact> filesToBuild = NestedSetBuilder.<Artifact>stableOrder().add(outputArtifact); @@ -147,7 +148,6 @@ public class AppleStubBinary implements RuleConfiguredTargetFactory { /** Registers the actions that copy the stub binary to the target's output. */ private static void registerActions( RuleContext ruleContext, - AppleConfiguration appleConfiguration, ApplePlatform platform, Artifact outputBinary) throws RuleErrorException { @@ -159,7 +159,8 @@ public class AppleStubBinary implements RuleConfiguredTargetFactory { .build(); ruleContext.registerAction( - ObjcRuleClasses.spawnAppleEnvActionBuilder(appleConfiguration, platform) + ObjcRuleClasses.spawnAppleEnvActionBuilder( + XcodeConfigProvider.fromRuleContext(ruleContext), platform) .setExecutable(xcrunwrapper(ruleContext)) .addCommandLine(copyCommandLine) .setMnemonic("CopyStubExecutable") 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 e28c2bbbea..1943f70c3b 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 @@ -37,6 +37,7 @@ import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.ApplePlatform; import com.google.devtools.build.lib.rules.apple.ApplePlatform.PlatformType; import com.google.devtools.build.lib.rules.apple.AppleToolchain; +import com.google.devtools.build.lib.rules.apple.XcodeConfigProvider; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.HashMap; @@ -237,7 +238,8 @@ final class BundleSupport { .compiledStoryboardZip(storyboardInput); ruleContext.registerAction( - ObjcRuleClasses.spawnAppleEnvActionBuilder(appleConfiguration, platform) + ObjcRuleClasses.spawnAppleEnvActionBuilder( + XcodeConfigProvider.fromRuleContext(ruleContext), platform) .setMnemonic("StoryboardCompile") .setExecutable(attributes.ibtoolWrapper()) .addCommandLine(ibActionsCommandLine(archiveRoot, zipOutput, storyboardInput)) @@ -285,7 +287,8 @@ final class BundleSupport { for (Xcdatamodel datamodel : xcdatamodels) { Artifact outputZip = datamodel.getOutputZip(); ruleContext.registerAction( - ObjcRuleClasses.spawnAppleEnvActionBuilder(appleConfiguration, platform) + ObjcRuleClasses.spawnAppleEnvActionBuilder( + XcodeConfigProvider.fromRuleContext(ruleContext), platform) .setMnemonic("MomCompile") .setExecutable(attributes.momcWrapper()) .addOutput(outputZip) @@ -316,7 +319,8 @@ final class BundleSupport { FileSystemUtils.replaceExtension(original.getExecPath(), ".nib")); ruleContext.registerAction( - ObjcRuleClasses.spawnAppleEnvActionBuilder(appleConfiguration, platform) + ObjcRuleClasses.spawnAppleEnvActionBuilder( + XcodeConfigProvider.fromRuleContext(ruleContext), platform) .setMnemonic("XibCompile") .setExecutable(attributes.ibtoolWrapper()) .addCommandLine(ibActionsCommandLine(archiveRoot, zipOutput, original)) @@ -332,7 +336,8 @@ final class BundleSupport { for (Artifact strings : objcProvider.get(ObjcProvider.STRINGS)) { Artifact bundled = bundling.getIntermediateArtifacts().convertedStringsFile(strings); ruleContext.registerAction( - ObjcRuleClasses.spawnAppleEnvActionBuilder(appleConfiguration, platform) + ObjcRuleClasses.spawnAppleEnvActionBuilder( + XcodeConfigProvider.fromRuleContext(ruleContext), platform) .setMnemonic("ConvertStringsPlist") .setExecutable(PathFragment.create("/usr/bin/plutil")) .addCommandLine( @@ -414,7 +419,8 @@ 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( - ObjcRuleClasses.spawnAppleEnvActionBuilder(appleConfiguration, platform) + ObjcRuleClasses.spawnAppleEnvActionBuilder( + XcodeConfigProvider.fromRuleContext(ruleContext), platform) .setMnemonic("AssetCatalogCompile") .setExecutable(attributes.actoolWrapper()) .addTransitiveInputs(objcProvider.get(ASSET_CATALOG)) 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 2208b7a0fb..7a9282e7ce 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 @@ -74,6 +74,7 @@ import com.google.devtools.build.lib.rules.apple.ApplePlatform; import com.google.devtools.build.lib.rules.apple.ApplePlatform.PlatformType; import com.google.devtools.build.lib.rules.apple.AppleToolchain; import com.google.devtools.build.lib.rules.apple.XcodeConfig; +import com.google.devtools.build.lib.rules.apple.XcodeConfigProvider; import com.google.devtools.build.lib.rules.cpp.CcToolchain; import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider; import com.google.devtools.build.lib.rules.cpp.CppFileTypes; @@ -1127,7 +1128,8 @@ public abstract class CompilationSupport { ISO_8859_1)); ruleContext.registerAction( ObjcRuleClasses.spawnAppleEnvActionBuilder( - appleConfiguration, appleConfiguration.getSingleArchPlatform()) + XcodeConfigProvider.fromRuleContext(ruleContext), + appleConfiguration.getSingleArchPlatform()) .setMnemonic("DummyPruner") .setExecutable(pruner) .addInput(dummyArchive) @@ -1228,7 +1230,8 @@ public abstract class CompilationSupport { ruleContext.registerAction( ObjcRuleClasses.spawnAppleEnvActionBuilder( - appleConfiguration, appleConfiguration.getSingleArchPlatform()) + XcodeConfigProvider.fromRuleContext(ruleContext), + appleConfiguration.getSingleArchPlatform()) .setMnemonic("ObjcBinarySymbolStrip") .setExecutable(xcrunwrapper(ruleContext)) .addCommandLine(symbolStripCommandLine(stripArgs, binaryToLink, strippedBinary)) diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java index 71ae1351a9..e6d502c5f9 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java @@ -66,6 +66,7 @@ import com.google.devtools.build.lib.rules.apple.ApplePlatform; import com.google.devtools.build.lib.rules.apple.AppleToolchain; import com.google.devtools.build.lib.rules.apple.DottedVersion; import com.google.devtools.build.lib.rules.apple.XcodeConfig; +import com.google.devtools.build.lib.rules.apple.XcodeConfigProvider; import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider; import com.google.devtools.build.lib.rules.cpp.CppCompileAction.DotdFile; import com.google.devtools.build.lib.rules.cpp.CppModuleMap; @@ -398,7 +399,8 @@ public class LegacyCompilationSupport extends CompilationSupport { // TODO(bazel-team): Remove private headers from inputs once they're added to the provider. ObjcCompileAction.Builder compileBuilder = ObjcCompileAction.Builder.createObjcCompileActionBuilderWithAppleEnv( - appleConfiguration, appleConfiguration.getSingleArchPlatform()) + XcodeConfigProvider.fromRuleContext(ruleContext), + appleConfiguration.getSingleArchPlatform()) .setDotdPruningPlan(objcConfiguration.getDotdPruningPlan()) .setSourceFile(sourceFile) .addTransitiveHeaders(objcProvider.get(HEADER)) @@ -483,7 +485,9 @@ public class LegacyCompilationSupport extends CompilationSupport { .setMnemonics("ObjcCompileActionTemplate", "ObjcCompile") .setExecutable(xcrunwrapper(ruleContext)) .setCommandLineTemplate(commandLine) - .setEnvironment(ObjcRuleClasses.appleToolchainEnvironment(appleConfiguration, platform)) + .setEnvironment( + ObjcRuleClasses.appleToolchainEnvironment( + XcodeConfigProvider.fromRuleContext(ruleContext), platform)) .setExecutionInfo(ObjcRuleClasses.darwinActionExecutionRequirement()) .setOutputPathMapper(COMPILE_ACTION_TEMPLATE_OUTPUT_PATH_MAPPER) .addCommonTransitiveInputs(objcProvider.get(HEADER)) @@ -507,7 +511,8 @@ public class LegacyCompilationSupport extends CompilationSupport { Artifact objList = intermediateArtifacts.archiveObjList(); ruleContext.registerAction( ObjcRuleClasses.spawnAppleEnvActionBuilder( - appleConfiguration, appleConfiguration.getSingleArchPlatform()) + XcodeConfigProvider.fromRuleContext(ruleContext), + appleConfiguration.getSingleArchPlatform()) .setMnemonic("ObjcLink") .setExecutable(libtool(ruleContext)) .addCommandLine( @@ -530,7 +535,8 @@ public class LegacyCompilationSupport extends CompilationSupport { @Nullable CcToolchainProvider ccToolchain, @Nullable FdoSupportProvider fdoSupport) { ruleContext.registerAction( ObjcRuleClasses.spawnAppleEnvActionBuilder( - appleConfiguration, appleConfiguration.getSingleArchPlatform()) + XcodeConfigProvider.fromRuleContext(ruleContext), + appleConfiguration.getSingleArchPlatform()) .setMnemonic("ObjcLink") .setExecutable(libtool(ruleContext)) .addCommandLine( @@ -631,7 +637,8 @@ public class LegacyCompilationSupport extends CompilationSupport { bitcodeSymbolMap); ruleContext.registerAction( ObjcRuleClasses.spawnAppleEnvActionBuilder( - appleConfiguration, appleConfiguration.getSingleArchPlatform()) + XcodeConfigProvider.fromRuleContext(ruleContext), + appleConfiguration.getSingleArchPlatform()) .setMnemonic("ObjcLink") .setShellCommand(ImmutableList.of("/bin/bash", "-c")) .addCommandLine(new SingleArgCommandLine(commandLine)) diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/LipoSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/LipoSupport.java index f18f610b43..13ab3a828c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/LipoSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/LipoSupport.java @@ -20,8 +20,8 @@ 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.SymlinkAction; import com.google.devtools.build.lib.collect.nestedset.NestedSet; -import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.ApplePlatform; +import com.google.devtools.build.lib.rules.apple.XcodeConfigProvider; /** * Support for registering actions using the Apple tool "lipo", which combines artifacts of @@ -48,7 +48,7 @@ public class LipoSupport { if (inputBinaries.toList().size() > 1) { ruleContext.registerAction( ObjcRuleClasses.spawnAppleEnvActionBuilder( - ruleContext.getFragment(AppleConfiguration.class), platform) + XcodeConfigProvider.fromRuleContext(ruleContext), platform) .setMnemonic("ObjcCombiningArchitectures") .addTransitiveInputs(inputBinaries) .addOutput(outputBinary) diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCompileAction.java index bfa06e21f5..cabab193d3 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCompileAction.java @@ -43,8 +43,8 @@ import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadCompatible; import com.google.devtools.build.lib.profiler.Profiler; import com.google.devtools.build.lib.profiler.ProfilerTask; -import com.google.devtools.build.lib.rules.apple.AppleConfiguration; import com.google.devtools.build.lib.rules.apple.ApplePlatform; +import com.google.devtools.build.lib.rules.apple.XcodeConfigProvider; import com.google.devtools.build.lib.rules.cpp.CppCompileAction.DotdFile; import com.google.devtools.build.lib.rules.cpp.CppFileTypes; import com.google.devtools.build.lib.rules.cpp.HeaderDiscovery; @@ -352,12 +352,12 @@ public class ObjcCompileAction extends SpawnAction { * needed by the apple toolchain. */ public static ObjcCompileAction.Builder createObjcCompileActionBuilderWithAppleEnv( - AppleConfiguration appleConfiguration, ApplePlatform targetPlatform) { + XcodeConfigProvider xcodeConfigProvider, ApplePlatform targetPlatform) { return (Builder) new ObjcCompileAction.Builder() .setExecutionInfo(ObjcRuleClasses.darwinActionExecutionRequirement()) .setEnvironment( - ObjcRuleClasses.appleToolchainEnvironment(appleConfiguration, targetPlatform)); + ObjcRuleClasses.appleToolchainEnvironment(xcodeConfigProvider, targetPlatform)); } @Override 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 9278b01be3..a28dec5880 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 @@ -54,6 +54,7 @@ import com.google.devtools.build.lib.rules.apple.ApplePlatform; import com.google.devtools.build.lib.rules.apple.ApplePlatform.PlatformType; import com.google.devtools.build.lib.rules.apple.AppleToolchain; import com.google.devtools.build.lib.rules.apple.AppleToolchain.RequiresXcodeConfigRule; +import com.google.devtools.build.lib.rules.apple.XcodeConfigProvider; import com.google.devtools.build.lib.rules.cpp.CcToolchain; import com.google.devtools.build.lib.rules.cpp.CppConfiguration; import com.google.devtools.build.lib.rules.cpp.CppHelper; @@ -175,17 +176,18 @@ public class ObjcRuleClasses { * which contain information about the target and host architectures. */ static SpawnAction.Builder spawnAppleEnvActionBuilder( - AppleConfiguration appleConfiguration, ApplePlatform targetPlatform) { + XcodeConfigProvider xcodeConfigProvider, ApplePlatform targetPlatform) { return spawnOnDarwinActionBuilder() - .setEnvironment(appleToolchainEnvironment(appleConfiguration, targetPlatform)); + .setEnvironment(appleToolchainEnvironment(xcodeConfigProvider, targetPlatform)); } /** Returns apple environment variables that are typically needed by the apple toolchain. */ static ImmutableMap<String, String> appleToolchainEnvironment( - AppleConfiguration appleConfiguration, ApplePlatform targetPlatform) { + XcodeConfigProvider xcodeConfigProvider, ApplePlatform targetPlatform) { return ImmutableMap.<String, String>builder() - .putAll(appleConfiguration.getTargetAppleEnvironment(targetPlatform)) - .putAll(appleConfiguration.getAppleHostSystemEnv()) + .putAll(AppleConfiguration.appleTargetPlatformEnv( + targetPlatform, xcodeConfigProvider.getSdkVersionForPlatform(targetPlatform))) + .putAll(AppleConfiguration.getXcodeVersionEnv(xcodeConfigProvider.getXcodeVersion())) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/README.md b/src/main/java/com/google/devtools/build/lib/rules/objc/README.md index 3f047918ae..1a3fc54a7e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/README.md +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/README.md @@ -31,7 +31,6 @@ skylark, the fragment must be declared in the rule definition: ``` def __impl(ctx): cpu = ctx.fragments.apple.ios_cpu() - env = ctx.fragments.apple.target_apple_env(platform) my_rule = rule( implementation = __impl fragments = ['apple'] 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 ff9a318a04..b4ab7f9301 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 @@ -54,6 +54,7 @@ import com.google.devtools.build.lib.rules.apple.ApplePlatform; import com.google.devtools.build.lib.rules.apple.ApplePlatform.PlatformType; import com.google.devtools.build.lib.rules.apple.DottedVersion; import com.google.devtools.build.lib.rules.apple.XcodeConfig; +import com.google.devtools.build.lib.rules.apple.XcodeConfigProvider; import com.google.devtools.build.lib.rules.objc.BundleSupport.ExtraActoolArgs; import com.google.devtools.build.lib.rules.objc.Bundling.Builder; import com.google.devtools.build.lib.shell.ShellUtils; @@ -370,7 +371,6 @@ public final class ReleaseBundlingSupport { } private void registerEnvironmentPlistAction() { - AppleConfiguration configuration = ruleContext.getFragment(AppleConfiguration.class); // Generates a .plist that contains environment values (such as the SDK used to build, the Xcode // version, etc), which are parsed from various .plist files of the OS, namely Xcodes' and // Platforms' plists. @@ -381,7 +381,8 @@ public final class ReleaseBundlingSupport { platform.getLowerCaseNameInPlist(), XcodeConfig.getSdkVersionForPlatform(ruleContext, platform)); ruleContext.registerAction( - ObjcRuleClasses.spawnAppleEnvActionBuilder(configuration, platform) + ObjcRuleClasses.spawnAppleEnvActionBuilder( + XcodeConfigProvider.fromRuleContext(ruleContext), platform) .setMnemonic("EnvironmentPlist") .setExecutable(attributes.environmentPlist()) .addOutput(getGeneratedEnvironmentPlist()) @@ -472,10 +473,11 @@ public final class ReleaseBundlingSupport { actionCommandLine += "cd ${t} && /usr/bin/zip -q -r \"${signed_ipa}\" ."; - AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); SpawnAction.Builder processAction = ObjcRuleClasses.spawnBashOnDarwinActionBuilder(actionCommandLine) - .setEnvironment(ObjcRuleClasses.appleToolchainEnvironment(appleConfiguration, platform)) + .setEnvironment( + ObjcRuleClasses.appleToolchainEnvironment( + XcodeConfigProvider.fromRuleContext(ruleContext), platform)) .setMnemonic("ObjcProcessIpa") .setProgressMessage("Processing iOS IPA: %s", ruleContext.getLabel()) .disableSandboxing() @@ -1040,7 +1042,8 @@ public final class ReleaseBundlingSupport { .addExecPath("--scan-executable", combinedArchBinary); ruleContext.registerAction( - ObjcRuleClasses.spawnAppleEnvActionBuilder(appleConfiguration, platform) + ObjcRuleClasses.spawnAppleEnvActionBuilder( + XcodeConfigProvider.fromRuleContext(ruleContext), platform) .setMnemonic("SwiftStdlibCopy") .setExecutable(attributes.swiftStdlibToolWrapper()) .addCommandLine(commandLine.build()) @@ -1072,7 +1075,8 @@ public final class ReleaseBundlingSupport { .addExecPath("--scan-executable", combinedArchBinary); ruleContext.registerAction( - ObjcRuleClasses.spawnAppleEnvActionBuilder(configuration, platform) + ObjcRuleClasses.spawnAppleEnvActionBuilder( + XcodeConfigProvider.fromRuleContext(ruleContext), platform) .setMnemonic("SwiftCopySwiftSupport") .setExecutable(attributes.swiftStdlibToolWrapper()) .addCommandLine(commandLine.build()) diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java index 2fdc017e46..c8e9e6a052 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/TestSupport.java @@ -265,12 +265,11 @@ public class TestSupport { ruleContext.getPrerequisite( IosTest.TARGET_DEVICE, Mode.TARGET, IosDeviceProvider.SKYLARK_CONSTRUCTOR); DottedVersion xcodeVersion = deviceProvider.getXcodeVersion(); - AppleConfiguration configuration = ruleContext.getFragment(AppleConfiguration.class); ImmutableMap.Builder<String, String> envBuilder = ImmutableMap.builder(); if (xcodeVersion != null) { - envBuilder.putAll(configuration.getXcodeVersionEnv(xcodeVersion)); + envBuilder.putAll(AppleConfiguration.getXcodeVersionEnv(xcodeVersion)); } if (ruleContext.getConfiguration().isCodeCoverageEnabled()) { |