aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2016-08-09 22:04:41 +0000
committerGravatar Yue Gan <yueg@google.com>2016-08-10 08:38:29 +0000
commiteff8b365c172b7e904ac6f7bba0c893fed7c91a8 (patch)
tree23061cc197b8e7e8f5a26de9b9c46061d81b5f64 /src/main/java/com/google/devtools/build/lib/rules
parentc8ced06a8349180325b9c6cda1653f38f7431a34 (diff)
*** 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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java27
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompilationContext.java22
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java31
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java94
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java19
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java8
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