diff options
author | Cal Peyser <cpeyser@google.com> | 2016-03-31 22:44:57 +0000 |
---|---|---|
committer | Klaus Aehlig <aehlig@google.com> | 2016-04-01 08:30:28 +0000 |
commit | e321ce265d949fa8b7a77086f0b832e51e25de51 (patch) | |
tree | 8279db1f84359c2b3d7bafc6ff525d9841d6545c /src/main | |
parent | f4de88ba5e724fc6721feefb0e5a54ff53754a60 (diff) |
Allow .o files as sources for objc builds.
--
MOS_MIGRATED_REVID=118727286
Diffstat (limited to 'src/main')
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) --> |