aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/objc
diff options
context:
space:
mode:
authorGravatar Dmitry Shevchenko <dmishe@google.com>2015-08-14 22:52:26 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-08-17 09:08:57 +0000
commitd8aff3352da3ee859d667e2e20bcf533669c3348 (patch)
tree36cbaca0b9437e7bf03770d84dd8e6447e105223 /src/main/java/com/google/devtools/build/lib/rules/objc
parent7513adedeb233135e2f1ed31dd0d7e36c692f5c2 (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')
-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/ObjcCommon.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java7
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.