diff options
author | 2015-08-14 22:52:26 +0000 | |
---|---|---|
committer | 2015-08-17 09:08:57 +0000 | |
commit | d8aff3352da3ee859d667e2e20bcf533669c3348 (patch) | |
tree | 36cbaca0b9437e7bf03770d84dd8e6447e105223 /src/main/java/com/google/devtools/build/lib/rules/objc | |
parent | 7513adedeb233135e2f1ed31dd0d7e36c692f5c2 (diff) |
Add Bridging Header attribute to objc_ compilation rules
This allows Swift code to import and use Objective-C interfaces.
--
MOS_MIGRATED_REVID=100715248
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/objc')
3 files changed, 22 insertions, 4 deletions
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 5af6e94f81..a934f09b26 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 @@ -291,9 +291,15 @@ final class CompilationSupport { .addExecPath("-o", objFile) .addExecPath("-emit-module-path", intermediateArtifacts.swiftModuleFile(sourceFile)); - // Add all ObjC headers to the compiler, in case Swift code is calling into Objc - // TODO(bazel-team): This can be augmented by an explicit bridging header field in the rule. - commandLine.addBeforeEachExecPath("-import-objc-header", attributes.hdrs()); + + ImmutableList.Builder<Artifact> inputHeaders = ImmutableList.builder(); + inputHeaders.addAll(attributes.hdrs()); + + Optional<Artifact> bridgingHeader = attributes.bridgingHeader(); + if (bridgingHeader.isPresent()) { + commandLine.addExecPath("-import-objc-header", bridgingHeader.get()); + inputHeaders.add(bridgingHeader.get()); + } ruleContext.registerAction(ObjcRuleClasses.spawnOnDarwinActionBuilder() .setMnemonic("SwiftCompile") @@ -301,7 +307,7 @@ final class CompilationSupport { .setCommandLine(commandLine.build()) .addInput(sourceFile) .addInputs(otherSwiftSources) - .addInputs(attributes.hdrs()) + .addInputs(inputHeaders.build()) .addOutput(objFile) .addOutput(intermediateArtifacts.swiftModuleFile(sourceFile)) .build(ruleContext)); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java index 688fa13738..030164eaf4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java @@ -96,6 +96,11 @@ public final class ObjcCommon { return ImmutableList.copyOf(CcCommon.getHeaders(ruleContext)); } + Optional<Artifact> bridgingHeader() { + Artifact header = ruleContext.getPrerequisiteArtifact("bridging_header", Mode.TARGET); + return Optional.fromNullable(header); + } + Iterable<PathFragment> includes() { return Iterables.transform( ruleContext.attributes().get("includes", Type.STRING_LIST), 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 52b6a38896..e7129e5215 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 @@ -519,6 +519,13 @@ public class ObjcRuleClasses { .add(attr("hdrs", LABEL_LIST) .direct_compile_time_input() .allowedFileTypes(HDRS_TYPE)) + /* <!-- #BLAZE_RULE($objc_compile_dependency_rule).ATTRIBUTE(bridging_header) --> + A header defining the Objective-C interfaces to be exposed in Swift. + ${SYNOPSIS} + <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/ + .add(attr("bridging_header", Type.LABEL) + .direct_compile_time_input() + .allowedFileTypes(HDRS_TYPE)) /* <!-- #BLAZE_RULE($objc_compile_dependency_rule).ATTRIBUTE(includes) --> List of <code>#include/#import</code> search paths to add to this target and all depending targets. |