diff options
author | 2017-03-16 19:33:27 +0000 | |
---|---|---|
committer | 2017-03-17 12:26:16 +0000 | |
commit | 8c33d5d83792d3984cc75a208476dcc2de38666c (patch) | |
tree | 3a7aa21b599f70d12a8980c4422855896f369cff /src/main/java/com/google | |
parent | 7ac6d59bcd8ea489ddb4218b495e131346419302 (diff) |
Sink automatic SDK frameworks into legacy compilation support.
--
PiperOrigin-RevId: 150353881
MOS_MIGRATED_REVID=150353881
Diffstat (limited to 'src/main/java/com/google')
5 files changed, 32 insertions, 7 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationAttributes.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationAttributes.java index 4120af16fb..6862165bb1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationAttributes.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationAttributes.java @@ -230,8 +230,6 @@ final class CompilationAttributes { private static void addSdkAttributesFromRuleContext(Builder builder, RuleContext ruleContext) { if (ruleContext.attributes().has("sdk_frameworks", Type.STRING_LIST)) { NestedSetBuilder<SdkFramework> frameworks = NestedSetBuilder.stableOrder(); - // TODO(bazel-team): Move the inclusion of the default frameworks to CompilationSupport. - frameworks.addAll(ObjcRuleClasses.AUTOMATIC_SDK_FRAMEWORKS); for (String explicit : ruleContext.attributes().get("sdk_frameworks", Type.STRING_LIST)) { frameworks.add(new SdkFramework(explicit)); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java index f87e24e8d8..32808abcce 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java @@ -388,6 +388,8 @@ public class CrosstoolCompilationSupport extends CompilationSupport { } else { activatedCrosstoolSelectables.add(GCC_COVERAGE_MAP_FORMAT); } + activatedCrosstoolSelectables.addAll(ruleContext.getFeatures()); + return configuration .getFragment(CppConfiguration.class) .getFeatures() 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 befa6b20e7..ccd5bea165 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 @@ -35,6 +35,7 @@ import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.NON_ARC_S import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.PRECOMPILED_SRCS_TYPE; import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.SRCS_TYPE; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Joiner; import com.google.common.base.Optional; import com.google.common.base.Predicates; @@ -69,7 +70,9 @@ import com.google.devtools.build.lib.rules.cpp.FdoSupportProvider; import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.PathFragment; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; import javax.annotation.Nullable; /** @@ -81,6 +84,13 @@ import javax.annotation.Nullable; public class LegacyCompilationSupport extends CompilationSupport { /** + * Frameworks implicitly linked to iOS, watchOS, and tvOS binaries when using legacy compilation. + */ + @VisibleForTesting + static final Iterable<SdkFramework> AUTOMATIC_SDK_FRAMEWORKS = + ImmutableList.of(new SdkFramework("Foundation"), new SdkFramework("UIKit")); + + /** * A mapper that maps input ObjC source {@link Artifact.TreeFileArtifact}s to output object file * {@link Artifact.TreeFileArtifact}s. */ @@ -633,6 +643,14 @@ public class LegacyCompilationSupport extends CompilationSupport { } } + @Override + protected Set<String> frameworkNames(ObjcProvider objcProvider) { + Set<String> names = new LinkedHashSet<>(); + Iterables.addAll(names, SdkFramework.names(AUTOMATIC_SDK_FRAMEWORKS)); + names.addAll(super.frameworkNames(objcProvider)); + return names; + } + private CommandLine linkCommandLine( ExtraLinkArgs extraLinkArgs, ObjcProvider objcProvider, 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 887535b8ef..527bb319df 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 @@ -23,7 +23,6 @@ import static com.google.devtools.build.lib.syntax.Type.BOOLEAN; import static com.google.devtools.build.lib.syntax.Type.STRING; import static com.google.devtools.build.lib.syntax.Type.STRING_LIST; -import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; @@ -139,10 +138,6 @@ public class ObjcRuleClasses { return !ASSEMBLY_SOURCES.matches(sourceArtifact.getFilename()); } - @VisibleForTesting - static final Iterable<SdkFramework> AUTOMATIC_SDK_FRAMEWORKS = ImmutableList.of( - new SdkFramework("Foundation"), new SdkFramework("UIKit")); - /** * Label of a filegroup that contains all crosstool and grte files for all configurations, * as specified on the command-line. diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java index 5dbd6962a2..45366a60ba 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.rules.objc; +import static com.google.devtools.build.lib.rules.objc.LegacyCompilationSupport.AUTOMATIC_SDK_FRAMEWORKS; import static com.google.devtools.build.lib.rules.objc.ObjcProvider.BUNDLE_IMPORT_DIR; import static com.google.devtools.build.lib.rules.objc.ObjcProvider.CC_LIBRARY; import static com.google.devtools.build.lib.rules.objc.ObjcProvider.DEFINE; @@ -29,6 +30,7 @@ import static com.google.devtools.build.lib.rules.objc.ObjcProvider.WEAK_SDK_FRA import static com.google.devtools.build.lib.rules.objc.ObjcProvider.XCASSETS_DIR; import static com.google.devtools.build.lib.rules.objc.ObjcProvider.XCDATAMODEL; import static com.google.devtools.build.lib.rules.objc.XcodeProductType.LIBRARY_STATIC; +import static com.google.devtools.build.lib.rules.objc.XcodeProductType.WATCH_OS1_APPLICATION; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; @@ -36,6 +38,7 @@ import com.google.common.base.Joiner; import com.google.common.base.Optional; import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.devtools.build.lib.actions.Artifact; @@ -626,6 +629,14 @@ public final class XcodeProvider implements TransitiveInfoProvider { .addTransitive(strictlyPropagatedHeaderSearchPaths) .build(); + // Automatic SDK frameworks are no longer propagated through ObjcProvider; they are now added + // during the link action. To preserve the existing Xcode project generation, we need to add + // them to the Xcode target below, unless it is a watchOS 1 application. + Set<SdkFramework> automaticSdkFrameworks = + (productType != WATCH_OS1_APPLICATION) + ? ImmutableSet.copyOf(AUTOMATIC_SDK_FRAMEWORKS) + : ImmutableSet.<SdkFramework>of(); + // TODO(bazel-team): Add provisioning profile information when Xcodegen supports it. TargetControl.Builder targetControl = TargetControl.newBuilder() @@ -650,6 +661,7 @@ public final class XcodeProvider implements TransitiveInfoProvider { "-weak_framework", SdkFramework.names(objcProvider.get(WEAK_SDK_FRAMEWORK)))) .addAllBuildSetting(xcodeprojBuildSettings) .addAllBuildSetting(AppleToolchain.defaultWarningsForXcode()) + .addAllSdkFramework(SdkFramework.names(automaticSdkFrameworks)) .addAllSdkFramework(SdkFramework.names(objcProvider.get(SDK_FRAMEWORK))) .addAllFramework(PathFragment.safePathStrings(objcProvider.get(STATIC_FRAMEWORK_DIR))) .addAllFrameworkSearchPathOnly( |