aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Cal Peyser <cpeyser@google.com>2016-03-31 22:44:57 +0000
committerGravatar Klaus Aehlig <aehlig@google.com>2016-04-01 08:30:28 +0000
commite321ce265d949fa8b7a77086f0b832e51e25de51 (patch)
tree8279db1f84359c2b3d7bafc6ff525d9841d6545c /src
parentf4de88ba5e724fc6721feefb0e5a54ff53754a60 (diff)
Allow .o files as sources for objc builds.
-- MOS_MIGRATED_REVID=118727286
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/CompilationArtifacts.java25
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java20
3 files changed, 50 insertions, 7 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationArtifacts.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationArtifacts.java
index 02789c119a..f4eff916d4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationArtifacts.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationArtifacts.java
@@ -32,6 +32,7 @@ final class CompilationArtifacts {
private Iterable<Artifact> nonArcSrcs = ImmutableList.of();
private Iterable<Artifact> additionalHdrs = ImmutableList.of();
private Iterable<Artifact> privateHdrs = ImmutableList.of();
+ private Iterable<Artifact> precompiledSrcs = ImmutableList.of();
private Optional<Artifact> pchFile;
private IntermediateArtifacts intermediateArtifacts;
@@ -64,6 +65,14 @@ final class CompilationArtifacts {
return this;
}
+ /**
+ * Adds precompiled sources (.o files).
+ */
+ Builder addPrecompiledSrcs(Iterable<Artifact> precompiledSrcs) {
+ this.precompiledSrcs = Iterables.concat(this.precompiledSrcs, precompiledSrcs);
+ return this;
+ }
+
Builder setPchFile(Optional<Artifact> pchFile) {
Preconditions.checkState(this.pchFile == null,
"pchFile is already set to: %s", this.pchFile);
@@ -80,11 +89,13 @@ final class CompilationArtifacts {
CompilationArtifacts build() {
Optional<Artifact> archive = Optional.absent();
- if (!Iterables.isEmpty(srcs) || !Iterables.isEmpty(nonArcSrcs)) {
+ if (!Iterables.isEmpty(srcs)
+ || !Iterables.isEmpty(nonArcSrcs)
+ || !Iterables.isEmpty(precompiledSrcs)) {
archive = Optional.of(intermediateArtifacts.archive());
}
return new CompilationArtifacts(
- srcs, nonArcSrcs, additionalHdrs, privateHdrs, archive, pchFile);
+ srcs, nonArcSrcs, additionalHdrs, privateHdrs, precompiledSrcs, archive, pchFile);
}
}
@@ -93,6 +104,7 @@ final class CompilationArtifacts {
private final Optional<Artifact> archive;
private final Iterable<Artifact> additionalHdrs;
private final Iterable<Artifact> privateHdrs;
+ private final Iterable<Artifact> precompiledSrcs;
private final Optional<Artifact> pchFile;
private final boolean hasSwiftSources;
@@ -101,12 +113,14 @@ final class CompilationArtifacts {
Iterable<Artifact> nonArcSrcs,
Iterable<Artifact> additionalHdrs,
Iterable<Artifact> privateHdrs,
+ Iterable<Artifact> precompiledSrcs,
Optional<Artifact> archive,
Optional<Artifact> pchFile) {
this.srcs = Preconditions.checkNotNull(srcs);
this.nonArcSrcs = Preconditions.checkNotNull(nonArcSrcs);
this.additionalHdrs = Preconditions.checkNotNull(additionalHdrs);
this.privateHdrs = Preconditions.checkNotNull(privateHdrs);
+ this.precompiledSrcs = Preconditions.checkNotNull(precompiledSrcs);
this.archive = Preconditions.checkNotNull(archive);
this.pchFile = Preconditions.checkNotNull(pchFile);
this.hasSwiftSources = Iterables.any(this.srcs, new Predicate<Artifact>() {
@@ -140,6 +154,13 @@ final class CompilationArtifacts {
return privateHdrs;
}
+ /**
+ * Returns .o files provided to the build directly as srcs.
+ */
+ public Iterable<Artifact> getPrecompiledSrcs() {
+ return precompiledSrcs;
+ }
+
public Optional<Artifact> getArchive() {
return archive;
}
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 fcb992d285..e62b8c3b8e 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,6 +38,7 @@ import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.DSYMUTIL;
import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.HEADERS;
import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.LIBTOOL;
import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.NON_ARC_SRCS_TYPE;
+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 static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.STRIP;
import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.SWIFT;
@@ -205,10 +206,13 @@ public final class CompilationSupport {
.errorsForNonMatching(SRCS_TYPE);
return new CompilationArtifacts.Builder()
.addSrcs(srcs.filter(COMPILABLE_SRCS_TYPE).list())
- .addNonArcSrcs(ruleContext.getPrerequisiteArtifacts("non_arc_srcs", Mode.TARGET)
- .errorsForNonMatching(NON_ARC_SRCS_TYPE)
- .list())
+ .addNonArcSrcs(
+ ruleContext
+ .getPrerequisiteArtifacts("non_arc_srcs", Mode.TARGET)
+ .errorsForNonMatching(NON_ARC_SRCS_TYPE)
+ .list())
.addPrivateHdrs(srcs.filter(HEADERS).list())
+ .addPrecompiledSrcs(srcs.filter(PRECOMPILED_SRCS_TYPE).list())
.setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext))
.setPchFile(Optional.fromNullable(ruleContext.getPrerequisiteArtifact("pch", Mode.TARGET)))
.build();
@@ -297,6 +301,8 @@ public final class CompilationSupport {
isCodeCoverageEnabled);
}
+ objFiles.addAll(compilationArtifacts.getPrecompiledSrcs());
+
if (compilationArtifacts.hasSwiftSources()) {
registerSwiftModuleMergeAction(intermediateArtifacts, compilationArtifacts, 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 9ec8fb3f80..ee98c7d0d9 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
@@ -297,6 +297,8 @@ public class ObjcRuleClasses {
static final FileType ASSEMBLY_SOURCES = FileType.of(".s", ".S", ".asm");
+ static final FileType OBJECT_FILE_SOURCES = FileType.of(".o");
+
static final FileType SWIFT_SOURCES = FileType.of(".swift");
/**
@@ -307,8 +309,14 @@ public class ObjcRuleClasses {
/**
* Files allowed in the srcs attribute. This includes private headers.
*/
- static final FileTypeSet SRCS_TYPE = FileTypeSet.of(NON_CPP_SOURCES, CPP_SOURCES,
- ASSEMBLY_SOURCES, SWIFT_SOURCES, HEADERS);
+ static final FileTypeSet SRCS_TYPE =
+ FileTypeSet.of(
+ NON_CPP_SOURCES,
+ CPP_SOURCES,
+ ASSEMBLY_SOURCES,
+ OBJECT_FILE_SOURCES,
+ SWIFT_SOURCES,
+ HEADERS);
/**
* Files that should actually be compiled.
@@ -316,6 +324,11 @@ public class ObjcRuleClasses {
static final FileTypeSet COMPILABLE_SRCS_TYPE = FileTypeSet.of(NON_CPP_SOURCES, CPP_SOURCES,
ASSEMBLY_SOURCES, SWIFT_SOURCES);
+ /**
+ * Files that are already compiled.
+ */
+ static final FileTypeSet PRECOMPILED_SRCS_TYPE = FileTypeSet.of(OBJECT_FILE_SOURCES);
+
static final FileTypeSet NON_ARC_SRCS_TYPE = FileTypeSet.of(FileType.of(".m", ".mm"));
static final FileTypeSet PLIST_TYPE = FileTypeSet.of(FileType.of(".plist"));
@@ -592,6 +605,9 @@ public class ObjcRuleClasses {
may be included/imported by any source or header in the srcs attribute
of this target, but not by headers in hdrs or any targets that depend
on this rule.
+ Additionally, precompiled .o files may be given as srcs. Be careful to
+ ensure consistency in the architecture of provided .o files and that of the
+ build to avoid missing symbol linker errors.
<!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
.add(attr("srcs", LABEL_LIST).direct_compile_time_input().allowedFileTypes(SRCS_TYPE))
/* <!-- #BLAZE_RULE($objc_compiling_rule).ATTRIBUTE(non_arc_srcs) -->