diff options
author | Googler <noreply@google.com> | 2016-08-09 22:04:41 +0000 |
---|---|---|
committer | Yue Gan <yueg@google.com> | 2016-08-10 08:38:29 +0000 |
commit | eff8b365c172b7e904ac6f7bba0c893fed7c91a8 (patch) | |
tree | 23061cc197b8e7e8f5a26de9b9c46061d81b5f64 /src/main/java/com/google/devtools/build/lib/rules | |
parent | c8ced06a8349180325b9c6cda1653f38f7431a34 (diff) |
Rollback of commit 99de0d07574f808fee36826289cb1f5c83e3b3e0.
*** Reason for rollback ***
Makes blaze unable to build //third_party/stl
IllegalArgumentException: complex.h.processed
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:127)
at com.google.devtools.build.lib.util.Preconditions.checkArgument(Preconditions.java:38)
at com.google.devtools.build.lib.rules.cpp.CppLinkActionBuilder.addObjectFile(CppLinkActionBuilder.java:831)
NOT a clean rollback; conflict in one file (CppCompilationContext.java).
So this also partially rolls back commit 603b540bbcd7414cd3e2c0b92c1c8985b035e41b (just the change in that file).
*** Original change description ***
Cleanup: store non-code inputs to link actions separately.
--
MOS_MIGRATED_REVID=129798636
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules')
8 files changed, 106 insertions, 109 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java index a4ceda45a3..35a3294d3a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java @@ -204,7 +204,7 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory { linkStaticness, linkopts); linkActionBuilder.setUseTestOnlyFlags(isTest); - linkActionBuilder.addNonCodeInputs(ccCompilationOutputs.getHeaderTokenFiles()); + linkActionBuilder.addNonLibraryInputs(ccCompilationOutputs.getHeaderTokenFiles()); CcToolchainProvider ccToolchain = CppHelper.getToolchain(ruleContext); if (linkStaticness == LinkStaticness.DYNAMIC) { @@ -398,7 +398,7 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory { CppLinkActionBuilder builder = new CppLinkActionBuilder(context, binary) .setCrosstoolInputs(CppHelper.getToolchain(context).getLink()) - .addNonCodeInputs(compilationPrerequisites); + .addNonLibraryInputs(compilationPrerequisites); // Determine the object files to link in. boolean usePic = CppHelper.usePic(context, !isLinkShared(context)); @@ -407,11 +407,11 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory { if (fake) { builder.addFakeNonLibraryInputs(objectFiles); } else { - builder.addObjectFiles(objectFiles); + builder.addNonLibraryInputs(objectFiles); } builder.addLTOBitcodeFiles(compilationOutputs.getLtoBitcodeFiles()); - builder.addNonCodeInputs(common.getLinkerScripts()); + builder.addNonLibraryInputs(common.getLinkerScripts()); // Determine the libraries to link in. // First libraries from srcs. Shared library artifacts here are substituted with mangled symlink diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java index d0cd8dfece..b7f0300adb 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java @@ -20,7 +20,7 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; -import com.google.devtools.build.lib.util.Preconditions; + import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; @@ -200,15 +200,11 @@ public class CcCompilationOutputs { * Adds an .o file. */ public Builder addObjectFile(Artifact artifact) { - Preconditions.checkArgument(Link.OBJECT_FILETYPES.matches(artifact.getFilename())); objectFiles.add(artifact); return this; } public Builder addObjectFiles(Iterable<Artifact> artifacts) { - for (Artifact artifact : artifacts) { - Preconditions.checkArgument(Link.OBJECT_FILETYPES.matches(artifact.getFilename())); - } Iterables.addAll(objectFiles, artifacts); return this; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java index ef70efb4f1..bd6e030813 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java @@ -51,6 +51,7 @@ import com.google.devtools.build.lib.util.FileTypeSet; import com.google.devtools.build.lib.util.Pair; import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.lib.vfs.PathFragment; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -61,6 +62,7 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.regex.Pattern; + import javax.annotation.Nullable; /** @@ -247,7 +249,6 @@ public final class CcLibraryHelper { private final Set<CppSource> compilationUnitSources = new LinkedHashSet<>(); private final List<Artifact> objectFiles = new ArrayList<>(); private final List<Artifact> picObjectFiles = new ArrayList<>(); - private final List<Artifact> nonCodeLinkerInputs = new ArrayList<>(); private final List<String> copts = new ArrayList<>(); private final List<String> linkopts = new ArrayList<>(); @Nullable private Pattern nocopts; @@ -334,7 +335,7 @@ public final class CcLibraryHelper { .addDefines(common.getDefines()) .addDeps(ruleContext.getPrerequisites("deps", Mode.TARGET)) .addLooseIncludeDirs(common.getLooseIncludeDirs()) - .addNonCodeLinkerInputs(common.getLinkerScripts()) + .addPicIndependentObjectFiles(common.getLinkerScripts()) .addSystemIncludeDirs(common.getSystemIncludeDirs()) .setNoCopts(common.getNoCopts()) .setHeadersCheckingMode(semantics.determineHeadersCheckingMode(ruleContext)); @@ -513,18 +514,18 @@ public final class CcLibraryHelper { } /** - * Adds the corresponding non-code files as linker inputs. + * Add the corresponding files as linker inputs for both PIC and non-PIC links. */ - public CcLibraryHelper addNonCodeLinkerInputs(Iterable<Artifact> nonCodeLinkerInputs) { - for (Artifact nonCodeLinkerInput : nonCodeLinkerInputs) { - String basename = nonCodeLinkerInput.getFilename(); - Preconditions.checkArgument(!Link.OBJECT_FILETYPES.matches(basename)); - Preconditions.checkArgument(!Link.ARCHIVE_LIBRARY_FILETYPES.matches(basename)); - Preconditions.checkArgument(!Link.SHARED_LIBRARY_FILETYPES.matches(basename)); - this.nonCodeLinkerInputs.add(nonCodeLinkerInput); - } + public CcLibraryHelper addPicIndependentObjectFiles(Iterable<Artifact> objectFiles) { + addPicObjectFiles(objectFiles); + return addObjectFiles(objectFiles); + } - return this; + /** + * Add the corresponding files as linker inputs for both PIC and non-PIC links. + */ + public CcLibraryHelper addPicIndependentObjectFiles(Artifact... objectFiles) { + return addPicIndependentObjectFiles(Arrays.asList(objectFiles)); } /** @@ -920,7 +921,7 @@ public final class CcLibraryHelper { // generate any link actions, effectively disabling header checking in some cases. if (linkType.isStaticLibraryLink()) { // TODO(bazel-team): This can't create the link action for a cc_binary yet. - ccLinkingOutputs = model.createCcLinkActions(ccOutputs, nonCodeLinkerInputs); + ccLinkingOutputs = model.createCcLinkActions(ccOutputs); } } CcLinkingOutputs originalLinkingOutputs = ccLinkingOutputs; diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java index c53b049153..6432b70bdf 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java @@ -23,6 +23,7 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.MiddlemanFactory; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; +import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; @@ -661,20 +662,13 @@ public final class CppCompilationContext implements TransitiveInfoProvider { public Builder addCompilationPrerequisites(Iterable<Artifact> prerequisites) { // LIPO collector must not add compilation prerequisites in order to avoid // the creation of a middleman action. - for (Artifact prerequisite : prerequisites) { - String basename = prerequisite.getFilename(); - Preconditions.checkArgument(!Link.OBJECT_FILETYPES.matches(basename)); - Preconditions.checkArgument(!Link.ARCHIVE_LIBRARY_FILETYPES.matches(basename)); - Preconditions.checkArgument(!Link.SHARED_LIBRARY_FILETYPES.matches(basename)); - } Iterables.addAll(compilationPrerequisites, prerequisites); return this; } /** * Add a single include directory to be added with "-I". It can be either - * relative to the exec root (see - * {@link com.google.devtools.build.lib.analysis.BlazeDirectories#getExecRoot}) or + * relative to the exec root (see {@link BuildConfiguration#getExecRoot}) or * absolute. Before it is stored, the include directory is normalized. */ public Builder addIncludeDir(PathFragment includeDir) { @@ -685,8 +679,8 @@ public final class CppCompilationContext implements TransitiveInfoProvider { /** * Add multiple include directories to be added with "-I". These can be * either relative to the exec root (see {@link - * com.google.devtools.build.lib.analysis.BlazeDirectories#getExecRoot}) or absolute. The - * entries are normalized before they are stored. + * BuildConfiguration#getExecRoot}) or absolute. The entries are normalized + * before they are stored. */ public Builder addIncludeDirs(Iterable<PathFragment> includeDirs) { for (PathFragment includeDir : includeDirs) { @@ -698,8 +692,8 @@ public final class CppCompilationContext implements TransitiveInfoProvider { /** * Add a single include directory to be added with "-iquote". It can be * either relative to the exec root (see {@link - * com.google.devtools.build.lib.analysis.BlazeDirectories#getExecRoot}) or absolute. Before it - * is stored, the include directory is normalized. + * BuildConfiguration#getExecRoot}) or absolute. Before it is stored, the + * include directory is normalized. */ public Builder addQuoteIncludeDir(PathFragment quoteIncludeDir) { quoteIncludeDirs.add(quoteIncludeDir.normalize()); @@ -709,8 +703,8 @@ public final class CppCompilationContext implements TransitiveInfoProvider { /** * Add a single include directory to be added with "-isystem". It can be * either relative to the exec root (see {@link - * com.google.devtools.build.lib.analysis.BlazeDirectories#getExecRoot}) or absolute. Before it - * is stored, the include directory is normalized. + * BuildConfiguration#getExecRoot}) or absolute. Before it is stored, the + * include directory is normalized. */ public Builder addSystemIncludeDir(PathFragment systemIncludeDir) { systemIncludeDirs.add(systemIncludeDir.normalize()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java index 32782a70d8..5a7d0717eb 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java @@ -18,6 +18,7 @@ import static java.nio.charset.StandardCharsets.ISO_8859_1; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Joiner; +import com.google.common.base.Predicate; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; @@ -50,10 +51,12 @@ import com.google.devtools.build.lib.util.ShellEscaper; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; + import java.io.IOException; import java.util.Collection; import java.util.List; import java.util.Map; + import javax.annotation.Nullable; /** @@ -158,6 +161,24 @@ public final class CppLinkAction extends AbstractAction implements ExecutionInfo this.executionRequirements = executionRequirements; } + static Iterable<LinkerInput> filterLinkerInputs(Iterable<LinkerInput> inputs) { + return Iterables.filter(inputs, new Predicate<LinkerInput>() { + @Override + public boolean apply(LinkerInput input) { + return Link.VALID_LINKER_INPUTS.matches(input.getArtifact().getFilename()); + } + }); + } + + static Iterable<Artifact> filterLinkerInputArtifacts(Iterable<Artifact> inputs) { + return Iterables.filter(inputs, new Predicate<Artifact>() { + @Override + public boolean apply(Artifact input) { + return Link.VALID_LINKER_INPUTS.matches(input.getFilename()); + } + }); + } + private CppConfiguration getCppConfiguration() { return cppConfiguration; } @@ -498,8 +519,7 @@ public final class CppLinkAction extends AbstractAction implements ExecutionInfo public static final class Context implements TransitiveInfoProvider { // Morally equivalent with {@link Builder}, except these are immutable. // Keep these in sync with {@link Builder}. - final ImmutableSet<LinkerInput> objectFiles; - final ImmutableSet<Artifact> nonCodeInputs; + final ImmutableSet<LinkerInput> nonLibraries; final NestedSet<LibraryToLink> libraries; final NestedSet<Artifact> crosstoolInputs; final Artifact runtimeMiddleman; @@ -520,8 +540,7 @@ public final class CppLinkAction extends AbstractAction implements ExecutionInfo * @param builder a mutable {@link CppLinkActionBuilder} to clone from */ public Context(CppLinkActionBuilder builder) { - this.objectFiles = ImmutableSet.copyOf(builder.getObjectFiles()); - this.nonCodeInputs = ImmutableSet.copyOf(builder.getNonCodeInputs()); + this.nonLibraries = ImmutableSet.copyOf(builder.getNonLibraries()); this.libraries = NestedSetBuilder.<LibraryToLink>linkOrder() .addTransitive(builder.getLibraries().build()).build(); this.crosstoolInputs = @@ -543,8 +562,8 @@ public final class CppLinkAction extends AbstractAction implements ExecutionInfo /** * Returns linker inputs that are not libraries. */ - public ImmutableSet<LinkerInput> getObjectFiles() { - return this.objectFiles; + public ImmutableSet<LinkerInput> getNonLibraries() { + return this.nonLibraries; } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java index 21425b2564..75fd3fdeff 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java @@ -123,8 +123,7 @@ public class CppLinkActionBuilder { // Morally equivalent with {@link Context}, except these are mutable. // Keep these in sync with {@link Context}. - private final Set<LinkerInput> objectFiles = new LinkedHashSet<>(); - private final Set<Artifact> nonCodeInputs = new LinkedHashSet<>(); + private final Set<LinkerInput> nonLibraries = new LinkedHashSet<>(); private final NestedSetBuilder<LibraryToLink> libraries = NestedSetBuilder.linkOrder(); private NestedSet<Artifact> crosstoolInputs = NestedSetBuilder.emptySet(Order.STABLE_ORDER); private Artifact runtimeMiddleman; @@ -228,8 +227,7 @@ public class CppLinkActionBuilder { Preconditions.checkNotNull(linkContext); // All linkContext fields should be transferred to this Builder. - this.objectFiles.addAll(linkContext.objectFiles); - this.nonCodeInputs.addAll(linkContext.nonCodeInputs); + this.nonLibraries.addAll(linkContext.nonLibraries); this.libraries.addTransitive(linkContext.libraries); this.crosstoolInputs = linkContext.crosstoolInputs; this.runtimeMiddleman = linkContext.runtimeMiddleman; @@ -250,14 +248,10 @@ public class CppLinkActionBuilder { } /** Returns linker inputs that are not libraries. */ - public Set<LinkerInput> getObjectFiles() { - return objectFiles; + public Set<LinkerInput> getNonLibraries() { + return nonLibraries; } - - public Set<Artifact> getNonCodeInputs() { - return nonCodeInputs; - } - + /** * Returns linker inputs that are libraries. */ @@ -378,9 +372,14 @@ public class CppLinkActionBuilder { } } } - for (LinkerInput input : objectFiles) { - if (this.ltoBitcodeFiles.contains(input.getArtifact())) { - allBitcode.put(input.getArtifact().getExecPath(), input.getArtifact()); + for (LinkerInput input : nonLibraries) { + // This relies on file naming conventions. It would be less fragile to have a dedicated + // field for non-library .o files. + if (CppFileTypes.OBJECT_FILE.matches(input.getArtifact().getExecPath()) + || CppFileTypes.PIC_OBJECT_FILE.matches(input.getArtifact().getExecPath())) { + if (this.ltoBitcodeFiles.contains(input.getArtifact())) { + allBitcode.put(input.getArtifact().getExecPath(), input.getArtifact()); + } } } @@ -436,11 +435,12 @@ public class CppLinkActionBuilder { || needWholeArchive(linkStaticness, linkType, linkopts, isNativeDeps, cppConfiguration); NestedSet<LibraryToLink> uniqueLibraries = libraries.build(); - final Iterable<Artifact> objectArtifacts = LinkerInputs.toLibraryArtifacts(objectFiles); + final Iterable<Artifact> filteredNonLibraryArtifacts = + CppLinkAction.filterLinkerInputArtifacts(LinkerInputs.toLibraryArtifacts(nonLibraries)); final Iterable<LinkerInput> linkerInputs = IterablesChain.<LinkerInput>builder() - .add(ImmutableList.copyOf(objectFiles)) + .add(ImmutableList.copyOf(CppLinkAction.filterLinkerInputs(nonLibraries))) .add( ImmutableIterable.from( Link.mergeInputsCmdLine( @@ -463,12 +463,12 @@ public class CppLinkActionBuilder { } final LibraryToLink outputLibrary = LinkerInputs.newInputLibrary( - output, libraryIdentifier, objectArtifacts, this.ltoBitcodeFiles); + output, libraryIdentifier, filteredNonLibraryArtifacts, this.ltoBitcodeFiles); final LibraryToLink interfaceOutputLibrary = (interfaceOutput == null) ? null : LinkerInputs.newInputLibrary(interfaceOutput, libraryIdentifier, - objectArtifacts, this.ltoBitcodeFiles); + filteredNonLibraryArtifacts, this.ltoBitcodeFiles); final ImmutableMap<Artifact, Artifact> linkstampMap = mapLinkstampsToOutputs(linkstamps, ruleContext, configuration, output, linkArtifactFactory); @@ -617,8 +617,7 @@ public class CppLinkActionBuilder { LinkerInputs.toLibraryArtifacts( Link.mergeInputsDependencies( uniqueLibraries, needWholeArchive, cppConfiguration.archiveType())); - Iterable<Artifact> expandedNonLibraryInputs = LinkerInputs.toLibraryArtifacts(objectFiles); - + Iterable<Artifact> expandedNonLibraryInputs = LinkerInputs.toLibraryArtifacts(nonLibraries); if (!isLTOIndexing && allLTOArtifacts != null) { // We are doing LTO, and this is the real link, so substitute // the LTO bitcode files with the real object files they were translated into. @@ -657,7 +656,6 @@ public class CppLinkActionBuilder { IterablesChain.Builder<Artifact> inputsBuilder = IterablesChain.<Artifact>builder() .add(ImmutableList.copyOf(expandedNonLibraryInputs)) - .add(ImmutableList.copyOf(nonCodeInputs)) .add(dependencyInputsBuilder.build()) .add(ImmutableIterable.from(expandedInputs)); @@ -841,10 +839,14 @@ public class CppLinkActionBuilder { return this; } - private void addObjectFile(LinkerInput input) { + private void addNonLibraryInput(LinkerInput input) { String name = input.getArtifact().getFilename(); - Preconditions.checkArgument(Link.OBJECT_FILETYPES.matches(name), name); - this.objectFiles.add(input); + Preconditions.checkArgument( + !Link.ARCHIVE_LIBRARY_FILETYPES.matches(name) + && !Link.SHARED_LIBRARY_FILETYPES.matches(name), + "'%s' is a library file", + input); + this.nonLibraries.add(input); } public CppLinkActionBuilder addLTOBitcodeFiles(Iterable<Artifact> files) { @@ -855,52 +857,30 @@ public class CppLinkActionBuilder { } /** - * Adds a single object file to the set of inputs. - */ - public CppLinkActionBuilder addObjectFile(Artifact input) { - addObjectFile(LinkerInputs.simpleLinkerInput(input)); - return this; - } - - /** - * Adds object files to the linker action. + * Adds a single artifact to the set of inputs (C++ source files, header files, etc). Artifacts + * that are not of recognized types will be used for dependency checking but will not be passed to + * the linker. The artifact must not be an archive or a shared library. */ - public CppLinkActionBuilder addObjectFiles(Iterable<Artifact> inputs) { - for (Artifact input : inputs) { - addObjectFile(LinkerInputs.simpleLinkerInput(input)); - } + public CppLinkActionBuilder addNonLibraryInput(Artifact input) { + addNonLibraryInput(LinkerInputs.simpleLinkerInput(input)); return this; } /** - * Adds non-code files to the set of inputs. They will not be passed to the linker command line - * unless that is explicitly modified, too. + * Adds multiple artifacts to the set of inputs (C++ source files, header files, etc). Artifacts + * that are not of recognized types will be used for dependency checking but will not be passed to + * the linker. The artifacts must not be archives or shared libraries. */ - public CppLinkActionBuilder addNonCodeInputs(Iterable<Artifact> inputs) { + public CppLinkActionBuilder addNonLibraryInputs(Iterable<Artifact> inputs) { for (Artifact input : inputs) { - addNonCodeInput(input); + addNonLibraryInput(LinkerInputs.simpleLinkerInput(input)); } - - return this; - } - - /** - * Adds a single non-code file to the set of inputs. It will not be passed to the linker command - * line unless that is explicitly modified, too. - */ - public CppLinkActionBuilder addNonCodeInput(Artifact input) { - String basename = input.getFilename(); - Preconditions.checkArgument(!Link.ARCHIVE_LIBRARY_FILETYPES.matches(basename), basename); - Preconditions.checkArgument(!Link.SHARED_LIBRARY_FILETYPES.matches(basename), basename); - Preconditions.checkArgument(!Link.OBJECT_FILETYPES.matches(basename), basename); - - this.nonCodeInputs.add(input); return this; } public CppLinkActionBuilder addFakeNonLibraryInputs(Iterable<Artifact> inputs) { for (Artifact input : inputs) { - addObjectFile(LinkerInputs.fakeLinkerInput(input)); + addNonLibraryInput(LinkerInputs.fakeLinkerInput(input)); } return this; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java index e7e52185a6..cd927d05dd 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java @@ -818,8 +818,8 @@ public final class CppModel { * * @throws RuleErrorException */ - public CcLinkingOutputs createCcLinkActions(CcCompilationOutputs ccOutputs, - Iterable<Artifact> nonCodeLinkerInputs) throws RuleErrorException { + public CcLinkingOutputs createCcLinkActions(CcCompilationOutputs ccOutputs) + throws RuleErrorException { // For now only handle static links. Note that the dynamic library link below ignores linkType. // TODO(bazel-team): Either support non-static links or move this check to setLinkType(). Preconditions.checkState(linkType.isStaticLibraryLink(), "can only handle static links"); @@ -857,9 +857,8 @@ public final class CppModel { labelName.replaceName("lib" + labelName.getBaseName())).getPathString(); CppLinkAction maybePicAction = newLinkActionBuilder(linkedArtifact) - .addObjectFiles(ccOutputs.getObjectFiles(usePicForBinaries)) - .addNonCodeInputs(ccOutputs.getHeaderTokenFiles()) - .addNonCodeInputs(nonCodeLinkerInputs) + .addNonLibraryInputs(ccOutputs.getObjectFiles(usePicForBinaries)) + .addNonLibraryInputs(ccOutputs.getHeaderTokenFiles()) .addLTOBitcodeFiles(ccOutputs.getLtoBitcodeFiles()) .setLinkType(linkType) .setLinkStaticness(LinkStaticness.FULLY_STATIC) @@ -885,8 +884,8 @@ public final class CppModel { CppLinkAction picAction = newLinkActionBuilder(picArtifact) - .addObjectFiles(ccOutputs.getObjectFiles(true)) - .addObjectFiles(ccOutputs.getHeaderTokenFiles()) + .addNonLibraryInputs(ccOutputs.getObjectFiles(true)) + .addNonLibraryInputs(ccOutputs.getHeaderTokenFiles()) .addLTOBitcodeFiles(ccOutputs.getLtoBitcodeFiles()) .setLinkType(picLinkType) .setLinkStaticness(LinkStaticness.FULLY_STATIC) @@ -936,8 +935,8 @@ public final class CppModel { CppLinkActionBuilder linkActionBuilder = newLinkActionBuilder(soImpl) .setInterfaceOutput(soInterface) - .addObjectFiles(ccOutputs.getObjectFiles(usePicForSharedLibs)) - .addNonCodeInputs(ccOutputs.getHeaderTokenFiles()) + .addNonLibraryInputs(ccOutputs.getObjectFiles(usePicForSharedLibs)) + .addNonLibraryInputs(ccOutputs.getHeaderTokenFiles()) .addLTOBitcodeFiles(ccOutputs.getLtoBitcodeFiles()) .setLinkType(LinkTargetType.DYNAMIC_LIBRARY) .setLinkStaticness(LinkStaticness.DYNAMIC) @@ -1001,7 +1000,7 @@ public final class CppModel { private CppLinkActionBuilder newLinkActionBuilder(Artifact outputArtifact) { return new CppLinkActionBuilder(ruleContext, outputArtifact) .setCrosstoolInputs(CppHelper.getToolchain(ruleContext).getLink()) - .addNonCodeInputs(context.getTransitiveCompilationPrerequisites()); + .addNonLibraryInputs(context.getTransitiveCompilationPrerequisites()); } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java index f75721d36f..1e3e313ab0 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java @@ -37,6 +37,14 @@ public abstract class Link { private Link() {} // uninstantiable + /** The set of valid linker input files. */ + public static final FileTypeSet VALID_LINKER_INPUTS = FileTypeSet.of( + CppFileTypes.ARCHIVE, CppFileTypes.PIC_ARCHIVE, + CppFileTypes.ALWAYS_LINK_LIBRARY, CppFileTypes.ALWAYS_LINK_PIC_LIBRARY, + CppFileTypes.OBJECT_FILE, CppFileTypes.PIC_OBJECT_FILE, + CppFileTypes.SHARED_LIBRARY, CppFileTypes.VERSIONED_SHARED_LIBRARY, + CppFileTypes.INTERFACE_SHARED_LIBRARY); + /** * These file are supposed to be added using {@code addLibrary()} calls to {@link CppLinkAction} * but will never be expanded to their constituent {@code .o} files. {@link CppLinkAction} checks |