aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Lukacs Berki <lberki@google.com>2016-08-11 15:48:57 +0000
committerGravatar Yue Gan <yueg@google.com>2016-08-12 08:51:20 +0000
commit0978a8ea1593ef204ea97155014f76baba2508c5 (patch)
tree432293ba19ab848e9d4534ffa772e1406a9209eb /src
parentc1ffa41b27ebd9ff405909617227eb9c0dd612da (diff)
Record the category of the artifact to be linked in LinkerInput.
It's currently only used for sanity checks, but the idea is that we'll use this field to decide what to do with a given linker input instead of inferring things from its file name. Also make artifact name creation a bit simpler by using the same set of variables for compiler and linker outputs. -- MOS_MIGRATED_REVID=129990944
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/ArtifactCategory.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java23
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java29
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionBuilder.java40
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CppModel.java50
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java85
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInput.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java89
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/PrecompiledFiles.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/NativeLibraryNestedSetBuilder.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java4
-rw-r--r--src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java4
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java12
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java9
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java23
22 files changed, 314 insertions, 143 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/ArtifactCategory.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/ArtifactCategory.java
index df58dbf9e2..68ec14b4bd 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/ArtifactCategory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/ArtifactCategory.java
@@ -19,9 +19,7 @@ package com.google.devtools.build.lib.rules.cpp;
*/
public enum ArtifactCategory {
STATIC_LIBRARY("lib%{base_name}.a"),
- PIC_STATIC_LIBRARY("lib%{base_name}.pic.a"),
ALWAYSLINK_STATIC_LIBRARY("lib%{base_name}.lo"),
- ALWAYSLINK_PIC_STATIC_LIBRARY("lib%{base_name}.pic.lo"),
DYNAMIC_LIBRARY("lib%{base_name}.so"),
EXECUTABLE("%{base_name}"),
INTERFACE_LIBRARY("lib%{base_name}.ifso"),
@@ -38,14 +36,10 @@ public enum ArtifactCategory {
private final String defaultPattern;
- private ArtifactCategory(String defaultPattern) {
+ ArtifactCategory(String defaultPattern) {
this.defaultPattern = defaultPattern;
}
- private ArtifactCategory() {
- this.defaultPattern = null;
- }
-
/** Returns the name of the category. */
public String getCategoryName() {
return this.toString().toLowerCase();
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 0e12de1d50..1856b04a19 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
@@ -190,7 +190,13 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory {
if (!isLinkShared(ruleContext)) {
binaryPath = new PathFragment(binaryPath.getPathString() + OsUtils.executableExtension());
}
+
Artifact binary = ruleContext.getBinArtifact(binaryPath);
+ if (isLinkShared(ruleContext) && !CppFileTypes.SHARED_LIBRARY.matches(binary.getFilename())) {
+ ruleContext.attributeError("linkshared", "'linkshared' used in non-shared library");
+ return null;
+ }
+
CppLinkActionBuilder linkActionBuilder =
determineLinkerArguments(
ruleContext,
@@ -208,10 +214,12 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory {
CcToolchainProvider ccToolchain = CppHelper.getToolchain(ruleContext);
if (linkStaticness == LinkStaticness.DYNAMIC) {
linkActionBuilder.setRuntimeInputs(
+ ArtifactCategory.DYNAMIC_LIBRARY,
ccToolchain.getDynamicRuntimeLinkMiddleman(),
ccToolchain.getDynamicRuntimeLinkInputs());
} else {
linkActionBuilder.setRuntimeInputs(
+ ArtifactCategory.STATIC_LIBRARY,
ccToolchain.getStaticRuntimeLinkMiddleman(),
ccToolchain.getStaticRuntimeLinkInputs());
// Only force a static link of libgcc if static runtime linking is enabled (which
@@ -258,15 +266,11 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory {
LibraryToLink outputLibrary = linkAction.getOutputLibrary();
Iterable<Artifact> fakeLinkerInputs =
fake ? linkAction.getInputs() : ImmutableList.<Artifact>of();
- Artifact executable = outputLibrary.getArtifact();
+ Artifact executable = linkAction.getLinkOutput();
CcLinkingOutputs.Builder linkingOutputsBuilder = new CcLinkingOutputs.Builder();
if (isLinkShared(ruleContext)) {
- if (CppFileTypes.SHARED_LIBRARY.matches(binary.getFilename())) {
- linkingOutputsBuilder.addDynamicLibrary(outputLibrary);
- linkingOutputsBuilder.addExecutionDynamicLibrary(outputLibrary);
- } else {
- ruleContext.attributeError("linkshared", "'linkshared' used in non-shared library");
- }
+ linkingOutputsBuilder.addDynamicLibrary(outputLibrary);
+ linkingOutputsBuilder.addExecutionDynamicLibrary(outputLibrary);
}
// Also add all shared libraries from srcs.
for (Artifact library : precompiledFiles.getSharedLibraries()) {
@@ -403,7 +407,7 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory {
Iterable<Artifact> objectFiles = compilationOutputs.getObjectFiles(usePic);
if (fake) {
- builder.addFakeNonLibraryInputs(objectFiles);
+ builder.addFakeObjectFiles(objectFiles);
} else {
builder.addObjectFiles(objectFiles);
}
@@ -421,7 +425,8 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory {
common.getDynamicLibrarySymlink(library, true), library,
CcLinkingOutputs.libraryIdentifierOf(library)));
} else {
- builder.addLibrary(LinkerInputs.precompiledLibraryToLink(library));
+ builder.addLibrary(LinkerInputs.precompiledLibraryToLink(
+ library, ArtifactCategory.STATIC_LIBRARY));
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
index 80de4c058c..73fd7095b1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
@@ -218,8 +218,8 @@ public abstract class CcLibrary implements RuleConfiguredTargetFactory {
*
* Note that some target platforms do not require shared library code to be PIC.
*/
- Iterable<LibraryToLink> staticLibrariesFromSrcs =
- LinkerInputs.opaqueLibrariesToLink(precompiledFiles.getStaticLibraries());
+ Iterable<LibraryToLink> staticLibrariesFromSrcs = LinkerInputs.opaqueLibrariesToLink(
+ ArtifactCategory.STATIC_LIBRARY, precompiledFiles.getStaticLibraries());
helper.addStaticLibraries(staticLibrariesFromSrcs);
helper.addPicStaticLibraries(Iterables.filter(staticLibrariesFromSrcs, PIC_STATIC_FILTER));
helper.addPicStaticLibraries(precompiledFiles.getPicStaticLibraries());
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 01d957f2aa..43d43dcc95 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
@@ -44,6 +44,7 @@ import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfig
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables.VariablesExtension;
import com.google.devtools.build.lib.rules.cpp.CppConfiguration.HeadersCheckingMode;
import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
+import com.google.devtools.build.lib.rules.cpp.Link.Staticness;
import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.FileType;
@@ -924,7 +925,7 @@ public final class CcLibraryHelper {
//
// An additional pre-existing issue is that the header check tokens are dropped if we don't
// generate any link actions, effectively disabling header checking in some cases.
- if (linkType.isStaticLibraryLink()) {
+ if (linkType.staticness() == Staticness.STATIC) {
// TODO(bazel-team): This can't create the link action for a cc_binary yet.
ccLinkingOutputs = model.createCcLinkActions(ccOutputs, nonCodeLinkerInputs);
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java
index 7f372b5d91..02f1f950a3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java
@@ -26,7 +26,6 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
-import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -732,21 +731,20 @@ public class CcToolchainFeatures implements Serializable {
}
/**
- * Returns the artifact name that pattern selects for a given rule.
+ * Returns the artifact name that this pattern selects.
*/
- public String getArtifactName(RuleContext ruleContext, Map<String, String> extraVariables) {
- StringBuilder result = new StringBuilder();
- PathFragment nameFragment = new PathFragment(ruleContext.getLabel().getName());
+ public String getArtifactName(Map<String, String> variables) {
+ StringBuilder resultBuilder = new StringBuilder();
Variables.View artifactNameVariables =
new Variables.Builder()
- .addVariable("base_name", nameFragment.getBaseName())
- .addAllVariables(extraVariables)
+ .addAllVariables(variables)
.build()
- .getView(variables);
+ .getView(this.variables);
for (StringChunk chunk : chunks) {
- chunk.expand(artifactNameVariables.getVariables(), result);
+ chunk.expand(artifactNameVariables.getVariables(), resultBuilder);
}
- return result.toString();
+ String result = resultBuilder.toString();
+ return result.charAt(0) == '/' ? result.substring(1) : result;
}
}
@@ -1453,8 +1451,10 @@ public class CcToolchainFeatures implements Serializable {
* Returns the artifact selected by the toolchain for the given action type and action category,
* or null if the category is not supported by the action config.
*/
- String getArtifactNameForCategory(ArtifactCategory artifactCategory, RuleContext ruleContext,
- Map<String, String> extraVariables) throws ExpansionException {
+ String getArtifactNameForCategory(ArtifactCategory artifactCategory, String outputName)
+ throws ExpansionException {
+ PathFragment output = new PathFragment(outputName);
+
ArtifactNamePattern patternForCategory = null;
for (ArtifactNamePattern artifactNamePattern : artifactNamePatterns) {
if (artifactNamePattern.getArtifactCategory() == artifactCategory) {
@@ -1467,7 +1467,10 @@ public class CcToolchainFeatures implements Serializable {
MISSING_ARTIFACT_NAME_PATTERN_ERROR_TEMPLATE, artifactCategory.getCategoryName()));
}
- return patternForCategory.getArtifactName(ruleContext, extraVariables);
+ return patternForCategory.getArtifactName(ImmutableMap.of(
+ "output_name", outputName,
+ "base_name", output.getBaseName(),
+ "output_directory", output.getParentDirectory().getPathString()));
}
/** Returns true if the toolchain defines an ArtifactNamePattern for the given category. */
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
index c751955285..e7dc066a74 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
@@ -381,7 +381,7 @@ public class CppCompileActionBuilder {
public CppCompileActionBuilder setOutputs(
ArtifactCategory outputCategory, String outputName, boolean generateDotd) {
this.outputFile = CppHelper.getCompileOutputArtifact(
- ruleContext, CppHelper.getCompileArtifactName(ruleContext, outputCategory, outputName));
+ ruleContext, CppHelper.getArtifactNameForCategory(ruleContext, outputCategory, outputName));
if (generateDotd) {
String dotdFileName = CppHelper.getDotdFileName(ruleContext, outputCategory, outputName);
if (configuration.getFragment(CppConfiguration.class).getInmemoryDotdFiles()) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
index fe0b605a0b..b09ff13cc4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
@@ -16,7 +16,6 @@ package com.google.devtools.build.lib.rules.cpp;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.ActionOwner;
import com.google.devtools.build.lib.actions.Artifact;
@@ -610,10 +609,9 @@ public class CppHelper {
ruleContext.getConfiguration().getBinDirectory(ruleContext.getRule().getRepository()));
}
- static String getCompileArtifactName(RuleContext ruleContext, ArtifactCategory category,
- String base) {
- return getToolchain(ruleContext).getFeatures().getArtifactNameForCategory(
- category, ruleContext, ImmutableMap.of("output_name", base));
+ static String getArtifactNameForCategory(RuleContext ruleContext, ArtifactCategory category,
+ String outputName) {
+ return getToolchain(ruleContext).getFeatures().getArtifactNameForCategory(category, outputName);
}
static String getDotdFileName(RuleContext ruleContext, ArtifactCategory outputCategory,
@@ -621,8 +619,8 @@ public class CppHelper {
String baseName = outputCategory == ArtifactCategory.OBJECT_FILE
|| outputCategory == ArtifactCategory.PROCESSED_HEADER
? outputName
- : getCompileArtifactName(ruleContext, outputCategory, outputName);
+ : getArtifactNameForCategory(ruleContext, outputCategory, outputName);
- return getCompileArtifactName(ruleContext, ArtifactCategory.INCLUDED_FILE_LIST, baseName);
+ return getArtifactNameForCategory(ruleContext, ArtifactCategory.INCLUDED_FILE_LIST, baseName);
}
}
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 ef5e4e474b..1a2de41530 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
@@ -95,6 +95,7 @@ public final class CppLinkAction extends AbstractAction implements ExecutionInfo
private final CppConfiguration cppConfiguration;
private final LibraryToLink outputLibrary;
+ private final Artifact linkOutput;
private final LibraryToLink interfaceOutputLibrary;
private final Map<String, String> toolchainEnv;
private final ImmutableSet<String> executionRequirements;
@@ -139,6 +140,7 @@ public final class CppLinkAction extends AbstractAction implements ExecutionInfo
ImmutableList<Artifact> outputs,
CppConfiguration cppConfiguration,
LibraryToLink outputLibrary,
+ Artifact linkOutput,
LibraryToLink interfaceOutputLibrary,
boolean fake,
boolean isLTOIndexing,
@@ -150,6 +152,7 @@ public final class CppLinkAction extends AbstractAction implements ExecutionInfo
this.mandatoryInputs = inputs;
this.cppConfiguration = cppConfiguration;
this.outputLibrary = outputLibrary;
+ this.linkOutput = linkOutput;
this.interfaceOutputLibrary = interfaceOutputLibrary;
this.fake = fake;
this.isLTOIndexing = isLTOIndexing;
@@ -208,6 +211,10 @@ public final class CppLinkAction extends AbstractAction implements ExecutionInfo
return linkCommandLine;
}
+ /**
+ * Returns the output of this action as a {@link LibraryToLink} or null if it is an executable.
+ */
+ @Nullable
public LibraryToLink getOutputLibrary() {
return outputLibrary;
}
@@ -217,10 +224,17 @@ public final class CppLinkAction extends AbstractAction implements ExecutionInfo
}
/**
+ * Returns the output of the linking.
+ */
+ public Artifact getLinkOutput() {
+ return linkOutput;
+ }
+
+ /**
* Returns the path to the output artifact produced by the linker.
*/
public Path getOutputFile() {
- return outputLibrary.getArtifact().getPath();
+ return linkOutput.getPath();
}
@Override
@@ -440,8 +454,7 @@ public final class CppLinkAction extends AbstractAction implements ExecutionInfo
@Override
protected String getRawProgressMessage() {
- return (isLTOIndexing ? "LTO indexing " : "Linking ")
- + outputLibrary.getArtifact().prettyPrint();
+ return (isLTOIndexing ? "LTO indexing " : "Linking ") + linkOutput.prettyPrint();
}
@Override
@@ -505,6 +518,7 @@ public final class CppLinkAction extends AbstractAction implements ExecutionInfo
final NestedSet<Artifact> crosstoolInputs;
final Artifact runtimeMiddleman;
final NestedSet<Artifact> runtimeInputs;
+ final ArtifactCategory runtimeType;
final NestedSet<Artifact> compilationInputs;
final ImmutableSet<Artifact> linkstamps;
final ImmutableList<String> linkopts;
@@ -530,6 +544,7 @@ public final class CppLinkAction extends AbstractAction implements ExecutionInfo
this.runtimeMiddleman = builder.getRuntimeMiddleman();
this.runtimeInputs =
NestedSetBuilder.<Artifact>stableOrder().addTransitive(builder.getRuntimeInputs()).build();
+ this.runtimeType = builder.getRuntimeType();
this.compilationInputs = NestedSetBuilder.<Artifact>stableOrder()
.addTransitive(builder.getCompilationInputs().build()).build();
this.linkstamps = ImmutableSet.copyOf(builder.getLinkstamps());
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 81cdd26f83..ab0eb4163b 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
@@ -44,6 +44,7 @@ import com.google.devtools.build.lib.rules.cpp.CppLinkAction.Context;
import com.google.devtools.build.lib.rules.cpp.CppLinkAction.LinkArtifactFactory;
import com.google.devtools.build.lib.rules.cpp.Link.LinkStaticness;
import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
+import com.google.devtools.build.lib.rules.cpp.Link.Staticness;
import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
@@ -128,6 +129,7 @@ public class CppLinkActionBuilder {
private final NestedSetBuilder<LibraryToLink> libraries = NestedSetBuilder.linkOrder();
private NestedSet<Artifact> crosstoolInputs = NestedSetBuilder.emptySet(Order.STABLE_ORDER);
private Artifact runtimeMiddleman;
+ private ArtifactCategory runtimeType = null;
private NestedSet<Artifact> runtimeInputs = NestedSetBuilder.emptySet(Order.STABLE_ORDER);
private final NestedSetBuilder<Artifact> compilationInputs = NestedSetBuilder.stableOrder();
private final Set<Artifact> linkstamps = new LinkedHashSet<>();
@@ -234,6 +236,7 @@ public class CppLinkActionBuilder {
this.crosstoolInputs = linkContext.crosstoolInputs;
this.runtimeMiddleman = linkContext.runtimeMiddleman;
this.runtimeInputs = linkContext.runtimeInputs;
+ this.runtimeType = linkContext.runtimeType;
this.compilationInputs.addTransitive(linkContext.compilationInputs);
this.linkstamps.addAll(linkContext.linkstamps);
this.linkopts.addAll(linkContext.linkopts);
@@ -285,7 +288,11 @@ public class CppLinkActionBuilder {
public NestedSet<Artifact> getRuntimeInputs() {
return this.runtimeInputs;
}
-
+
+ public ArtifactCategory getRuntimeType() {
+ return runtimeType;
+ }
+
/**
* Returns compilation inputs for this link action.
*/
@@ -462,12 +469,20 @@ public class CppLinkActionBuilder {
}
}
- final LibraryToLink outputLibrary = LinkerInputs.newInputLibrary(
- output, libraryIdentifier, objectArtifacts, this.ltoBitcodeFiles);
+ final LibraryToLink outputLibrary = linkType == LinkTargetType.EXECUTABLE
+ ? null
+ : LinkerInputs.newInputLibrary(output,
+ linkType.staticness() == Staticness.STATIC
+ ? ArtifactCategory.STATIC_LIBRARY
+ : ArtifactCategory.DYNAMIC_LIBRARY,
+ libraryIdentifier,
+ objectArtifacts, this.ltoBitcodeFiles);
final LibraryToLink interfaceOutputLibrary =
(interfaceOutput == null)
? null
- : LinkerInputs.newInputLibrary(interfaceOutput, libraryIdentifier,
+ : LinkerInputs.newInputLibrary(interfaceOutput,
+ ArtifactCategory.DYNAMIC_LIBRARY,
+ libraryIdentifier,
objectArtifacts, this.ltoBitcodeFiles);
final ImmutableMap<Artifact, Artifact> linkstampMap =
@@ -498,7 +513,7 @@ public class CppLinkActionBuilder {
}
ImmutableList<LinkerInput> runtimeLinkerInputs =
- ImmutableList.copyOf(LinkerInputs.simpleLinkerInputs(runtimeInputs));
+ ImmutableList.copyOf(LinkerInputs.simpleLinkerInputs(runtimeInputs, runtimeType));
// Add build variables necessary to template link args into the crosstool.
Variables.Builder buildVariablesBuilder = new Variables.Builder();
@@ -536,7 +551,7 @@ public class CppLinkActionBuilder {
interfaceOutput == null,
"interface output may only be non-null for dynamic library links");
}
- if (linkType.isStaticLibraryLink()) {
+ if (linkType.staticness() == Staticness.STATIC) {
// solib dir must be null for static links
runtimeSolibDir = null;
@@ -557,7 +572,7 @@ public class CppLinkActionBuilder {
.setLinkTargetType(linkType)
.setLinkStaticness(linkStaticness)
.setFeatures(features)
- .setRuntimeSolibDir(linkType.isStaticLibraryLink() ? null : runtimeSolibDir)
+ .setRuntimeSolibDir(linkType.staticness() == Staticness.STATIC ? null : runtimeSolibDir)
.setNativeDeps(isNativeDeps)
.setUseTestOnlyFlags(useTestOnlyFlags)
.setParamFile(paramFile)
@@ -692,6 +707,7 @@ public class CppLinkActionBuilder {
actionOutputs,
cppConfiguration,
outputLibrary,
+ output,
interfaceOutputLibrary,
fake,
isLTOIndexing,
@@ -799,8 +815,10 @@ public class CppLinkActionBuilder {
}
/** Sets the C++ runtime library inputs for the action. */
- public CppLinkActionBuilder setRuntimeInputs(Artifact middleman, NestedSet<Artifact> inputs) {
+ public CppLinkActionBuilder setRuntimeInputs(
+ ArtifactCategory runtimeType, Artifact middleman, NestedSet<Artifact> inputs) {
Preconditions.checkArgument((middleman == null) == inputs.isEmpty());
+ this.runtimeType = runtimeType;
this.runtimeMiddleman = middleman;
this.runtimeInputs = inputs;
return this;
@@ -859,7 +877,7 @@ public class CppLinkActionBuilder {
* Adds a single object file to the set of inputs.
*/
public CppLinkActionBuilder addObjectFile(Artifact input) {
- addObjectFile(LinkerInputs.simpleLinkerInput(input));
+ addObjectFile(LinkerInputs.simpleLinkerInput(input, ArtifactCategory.OBJECT_FILE));
return this;
}
@@ -868,7 +886,7 @@ public class CppLinkActionBuilder {
*/
public CppLinkActionBuilder addObjectFiles(Iterable<Artifact> inputs) {
for (Artifact input : inputs) {
- addObjectFile(LinkerInputs.simpleLinkerInput(input));
+ addObjectFile(LinkerInputs.simpleLinkerInput(input, ArtifactCategory.OBJECT_FILE));
}
return this;
}
@@ -899,7 +917,7 @@ public class CppLinkActionBuilder {
return this;
}
- public CppLinkActionBuilder addFakeNonLibraryInputs(Iterable<Artifact> inputs) {
+ public CppLinkActionBuilder addFakeObjectFiles(Iterable<Artifact> inputs) {
for (Artifact input : inputs) {
addObjectFile(LinkerInputs.fakeLinkerInput(input));
}
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 77b7e13e2d..ba76f3e56d 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
@@ -35,6 +35,8 @@ import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables.Var
import com.google.devtools.build.lib.rules.cpp.CppCompileAction.DotdFile;
import com.google.devtools.build.lib.rules.cpp.Link.LinkStaticness;
import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
+import com.google.devtools.build.lib.rules.cpp.Link.Picness;
+import com.google.devtools.build.lib.rules.cpp.Link.Staticness;
import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
import com.google.devtools.build.lib.rules.test.InstrumentedFilesCollector;
import com.google.devtools.build.lib.util.FileType;
@@ -61,7 +63,6 @@ import javax.annotation.Nullable;
public final class CppModel {
private final CppSemantics semantics;
private final RuleContext ruleContext;
- private final CcToolchainFeatures features;
private final BuildConfiguration configuration;
private final CppConfiguration cppConfiguration;
@@ -92,7 +93,6 @@ public final class CppModel {
this.semantics = semantics;
configuration = ruleContext.getConfiguration();
cppConfiguration = ruleContext.getFragment(CppConfiguration.class);
- features = CppHelper.getToolchain(ruleContext).getFeatures();
}
private Artifact getDwoFile(Artifact outputFile) {
@@ -556,7 +556,7 @@ public final class CppModel {
private void createHeaderAction(String outputName, Builder result, AnalysisEnvironment env,
CppCompileActionBuilder builder, boolean generateDotd) {
- String outputNameBase = CppHelper.getCompileArtifactName(ruleContext,
+ String outputNameBase = CppHelper.getArtifactNameForCategory(ruleContext,
ArtifactCategory.GENERATED_HEADER, outputName);
builder
@@ -612,11 +612,11 @@ public final class CppModel {
// Create PIC compile actions (same as non-PIC, but use -fPIC and
// generate .pic.o, .pic.d, .pic.gcno instead of .o, .d, .gcno.)
if (generatePicAction) {
- String picOutputBase = CppHelper.getCompileArtifactName(ruleContext,
+ String picOutputBase = CppHelper.getArtifactNameForCategory(ruleContext,
ArtifactCategory.PIC_FILE, outputName);
CppCompileActionBuilder picBuilder = copyAsPicBuilder(
builder, picOutputBase, outputCategory, generateDotd);
- String gcnoFileName = CppHelper.getCompileArtifactName(ruleContext,
+ String gcnoFileName = CppHelper.getArtifactNameForCategory(ruleContext,
ArtifactCategory.COVERAGE_DATA_FILE, picOutputBase);
Artifact gcnoFile = enableCoverage
? CppHelper.getCompileOutputArtifact(ruleContext, gcnoFileName)
@@ -663,9 +663,9 @@ public final class CppModel {
if (generateNoPicAction) {
Artifact noPicOutputFile = CppHelper.getCompileOutputArtifact(ruleContext,
- CppHelper.getCompileArtifactName(ruleContext, outputCategory, outputName));
+ CppHelper.getArtifactNameForCategory(ruleContext, outputCategory, outputName));
builder.setOutputs(outputCategory, outputName, generateDotd);
- String gcnoFileName = CppHelper.getCompileArtifactName(ruleContext,
+ String gcnoFileName = CppHelper.getArtifactNameForCategory(ruleContext,
ArtifactCategory.COVERAGE_DATA_FILE, outputName);
// Create non-PIC compile actions
@@ -723,7 +723,7 @@ public final class CppModel {
String getOutputNameBaseWith(String base, boolean usePic) {
return usePic
- ? CppHelper.getCompileArtifactName(ruleContext, ArtifactCategory.PIC_FILE, base)
+ ? CppHelper.getArtifactNameForCategory(ruleContext, ArtifactCategory.PIC_FILE, base)
: base;
}
@@ -734,7 +734,7 @@ public final class CppModel {
String outputNameBase = getOutputNameBaseWith(outputName, usePic);
String tempOutputName = ruleContext.getConfiguration().getBinFragment()
.getRelative(CppHelper.getObjDirectory(ruleContext.getLabel()))
- .getRelative(CppHelper.getCompileArtifactName(ruleContext, outputCategory,
+ .getRelative(CppHelper.getArtifactNameForCategory(ruleContext, outputCategory,
getOutputNameBaseWith(outputName + ".temp", usePic)))
.getPathString();
builder
@@ -780,10 +780,16 @@ public final class CppModel {
Artifact linuxDefault = CppHelper.getLinuxLinkedArtifact(ruleContext, linkTargetType);
try {
- String templatedName = features.getArtifactNameForCategory(
- linkTargetType.getLinkerOutput(), ruleContext, ImmutableMap.<String, String>of());
+ String maybePicName = ruleContext.getLabel().getName();
+ if (linkTargetType.picness() == Picness.PIC) {
+ maybePicName = CppHelper.getArtifactNameForCategory(
+ ruleContext, ArtifactCategory.PIC_FILE, maybePicName);
+ }
+
+ String linkedName = CppHelper.getArtifactNameForCategory(
+ ruleContext, linkTargetType.getLinkerOutput(), maybePicName);
PathFragment artifactFragment = new PathFragment(ruleContext.getLabel().getName())
- .getParentDirectory().getRelative(templatedName);
+ .getParentDirectory().getRelative(linkedName);
result = ruleContext.getBinArtifact(artifactFragment);
} catch (ExpansionException e) {
ruleContext.throwWithRuleError(e.getMessage());
@@ -821,7 +827,8 @@ public final class CppModel {
Iterable<Artifact> nonCodeLinkerInputs) 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");
+ Preconditions.checkState(
+ linkType.staticness() == Staticness.STATIC, "can only handle static links");
CcLinkingOutputs.Builder result = new CcLinkingOutputs.Builder();
if (cppConfiguration.isLipoContextCollector()) {
@@ -868,7 +875,9 @@ public final class CppModel {
.setFeatureConfiguration(featureConfiguration)
.build();
env.registerAction(maybePicAction);
- result.addStaticLibrary(maybePicAction.getOutputLibrary());
+ if (linkType != LinkTargetType.EXECUTABLE) {
+ result.addStaticLibrary(maybePicAction.getOutputLibrary());
+ }
// Create a second static library (.pic.a). Only in case (2) do we need both PIC and non-PIC
// static libraries. In that case, the first static library contains the non-PIC code, and this
@@ -895,7 +904,9 @@ public final class CppModel {
.setFeatureConfiguration(featureConfiguration)
.build();
env.registerAction(picAction);
- result.addPicStaticLibrary(picAction.getOutputLibrary());
+ if (linkType != LinkTargetType.EXECUTABLE) {
+ result.addPicStaticLibrary(picAction.getOutputLibrary());
+ }
}
if (!createDynamicLibrary) {
@@ -945,6 +956,7 @@ public final class CppModel {
.addLinkopts(linkopts)
.addLinkopts(sonameLinkopts)
.setRuntimeInputs(
+ ArtifactCategory.DYNAMIC_LIBRARY,
CppHelper.getToolchain(ruleContext).getDynamicRuntimeLinkMiddleman(),
CppHelper.getToolchain(ruleContext).getDynamicRuntimeLinkInputs())
.setFeatureConfiguration(featureConfiguration)
@@ -966,16 +978,16 @@ public final class CppModel {
CppLinkAction action = linkActionBuilder.build();
env.registerAction(action);
+ if (linkType == LinkTargetType.EXECUTABLE) {
+ return result.build();
+ }
+
LibraryToLink dynamicLibrary = action.getOutputLibrary();
LibraryToLink interfaceLibrary = action.getInterfaceOutputLibrary();
if (interfaceLibrary == null) {
interfaceLibrary = dynamicLibrary;
}
- if (linkType == LinkTargetType.EXECUTABLE) {
- return result.build();
- }
-
// If shared library has neverlink=1, then leave it untouched. Otherwise,
// create a mangled symlink for it and from now on reference it through
// mangled name only.
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..7b5f693dc5 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
@@ -80,70 +80,121 @@ public abstract class Link {
public static final String FAKE_OBJECT_PREFIX = "fake:";
/**
+ * Whether a particular link target requires PIC code.
+ */
+ public enum Picness {
+ PIC,
+ NOPIC
+ }
+
+ /**
+ * Whether a particular link target linked in statically or dynamically.
+ */
+ public enum Staticness {
+ STATIC,
+ DYNAMIC
+ }
+
+ /**
* Types of ELF files that can be created by the linker (.a, .so, .lo,
* executable).
*/
public enum LinkTargetType {
/** A normal static archive. */
- STATIC_LIBRARY(".a", true, "c++-link-static-library", ArtifactCategory.STATIC_LIBRARY),
+ STATIC_LIBRARY(
+ ".a",
+ Staticness.STATIC,
+ "c++-link-static-library",
+ Picness.NOPIC,
+ ArtifactCategory.STATIC_LIBRARY),
/** A static archive with .pic.o object files (compiled with -fPIC). */
PIC_STATIC_LIBRARY(
- ".pic.a", true, "c++-link-pic-static-library", ArtifactCategory.PIC_STATIC_LIBRARY),
+ ".pic.a",
+ Staticness.STATIC,
+ "c++-link-pic-static-library",
+ Picness.PIC,
+ ArtifactCategory.STATIC_LIBRARY),
/** An interface dynamic library. */
INTERFACE_DYNAMIC_LIBRARY(
- ".ifso", false, "c++-link-interface-dynamic-library", ArtifactCategory.INTERFACE_LIBRARY),
+ ".ifso",
+ Staticness.DYNAMIC,
+ "c++-link-interface-dynamic-library",
+ Picness.NOPIC, // Actually PIC but it's not indicated in the file name
+ ArtifactCategory.INTERFACE_LIBRARY),
/** A dynamic library. */
- DYNAMIC_LIBRARY(".so", false, "c++-link-dynamic-library", ArtifactCategory.DYNAMIC_LIBRARY),
+ DYNAMIC_LIBRARY(
+ ".so",
+ Staticness.DYNAMIC,
+ "c++-link-dynamic-library",
+ Picness.NOPIC, // Actually PIC but it's not indicated in the file name
+ ArtifactCategory.DYNAMIC_LIBRARY),
/** A static archive without removal of unused object files. */
ALWAYS_LINK_STATIC_LIBRARY(
".lo",
- true,
+ Staticness.STATIC,
"c++-link-alwayslink-static-library",
+ Picness.NOPIC,
ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY),
/** A PIC static archive without removal of unused object files. */
ALWAYS_LINK_PIC_STATIC_LIBRARY(
".pic.lo",
- true,
+ Staticness.STATIC,
"c++-link-alwayslink-pic-static-library",
- ArtifactCategory.ALWAYSLINK_PIC_STATIC_LIBRARY),
+ Picness.PIC,
+ ArtifactCategory.ALWAYSLINK_STATIC_LIBRARY),
/** An executable binary. */
- EXECUTABLE("", false, "c++-link-executable", ArtifactCategory.EXECUTABLE);
+ EXECUTABLE(
+ "",
+ Staticness.DYNAMIC,
+ "c++-link-executable",
+ Picness.NOPIC, // Picness is not indicate in the file name
+ ArtifactCategory.EXECUTABLE);
private final String extension;
- private final boolean staticLibraryLink;
+ private final Staticness staticness;
private final String actionName;
private final ArtifactCategory linkerOutput;
+ private final Picness picness;
- private LinkTargetType(
+ LinkTargetType(
String extension,
- boolean staticLibraryLink,
+ Staticness staticness,
String actionName,
+ Picness picness,
ArtifactCategory linkerOutput) {
this.extension = extension;
- this.staticLibraryLink = staticLibraryLink;
+ this.staticness = staticness;
this.actionName = actionName;
this.linkerOutput = linkerOutput;
+ this.picness = picness;
+ }
+
+ /**
+ * Returns whether the name of the output file should denote that the code in the file is PIC.
+ */
+ public Picness picness() {
+ return picness;
}
public String getExtension() {
return extension;
}
- public boolean isStaticLibraryLink() {
- return staticLibraryLink;
+ public Staticness staticness() {
+ return staticness;
}
/** Returns an {@code ArtifactCategory} identifying the artifact type this link action emits. */
public ArtifactCategory getLinkerOutput() {
return linkerOutput;
}
-
+
/**
* The name of a link action with this LinkTargetType, for the purpose of crosstool feature
* selection.
@@ -279,7 +330,9 @@ public abstract class Link {
// deps is true, in which case this code only computes the list of inputs for the link
// action (so the order isn't critical).
if (passMembersToLinkCmd || (deps && needMembersForLink)) {
- delayList = LinkerInputs.simpleLinkerInputs(inputLibrary.getObjectFiles()).iterator();
+ delayList = LinkerInputs
+ .simpleLinkerInputs(inputLibrary.getObjectFiles(), ArtifactCategory.OBJECT_FILE)
+ .iterator();
}
if (!(passMembersToLinkCmd || (deps && useStartEndLib(inputLibrary, archiveType)))) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java
index c5cb3017ed..c0f365c92f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java
@@ -34,6 +34,7 @@ import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfig
import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.Variables;
import com.google.devtools.build.lib.rules.cpp.Link.LinkStaticness;
import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
+import com.google.devtools.build.lib.rules.cpp.Link.Staticness;
import com.google.devtools.build.lib.util.Pair;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.util.ShellEscaper;
@@ -122,7 +123,7 @@ public final class LinkCommandLine extends CommandLine {
this.linkTargetType = Preconditions.checkNotNull(linkTargetType);
this.linkStaticness = Preconditions.checkNotNull(linkStaticness);
// For now, silently ignore linkopts if this is a static library link.
- this.linkopts = linkTargetType.isStaticLibraryLink()
+ this.linkopts = linkTargetType.staticness() == Staticness.STATIC
? ImmutableList.<String>of()
: Preconditions.checkNotNull(linkopts);
this.features = Preconditions.checkNotNull(features);
@@ -252,7 +253,7 @@ public final class LinkCommandLine extends CommandLine {
@VisibleForTesting
final Pair<List<String>, List<String>> splitCommandline() {
List<String> args = getRawLinkArgv();
- if (linkTargetType.isStaticLibraryLink()) {
+ if (linkTargetType.staticness() == Staticness.STATIC) {
// Ar link commands can also generate huge command lines.
List<String> paramFileArgs = args.subList(1, args.size());
List<String> commandlineArgs = new ArrayList<>();
@@ -383,7 +384,7 @@ public final class LinkCommandLine extends CommandLine {
}
// Fission mode: debug info is in .dwo files instead of .o files. Inform the linker of this.
- if (!linkTargetType.isStaticLibraryLink() && cppConfiguration.useFission()) {
+ if (linkTargetType.staticness() == Staticness.DYNAMIC && cppConfiguration.useFission()) {
argv.add("-Wl,--gdb-index");
}
}
@@ -688,7 +689,7 @@ public final class LinkCommandLine extends CommandLine {
public LinkCommandLine build() {
- if (linkTargetType.isStaticLibraryLink()) {
+ if (linkTargetType.staticness() == Staticness.STATIC) {
Preconditions.checkArgument(
linkstamps.isEmpty(),
"linkstamps may only be present on dynamic library or executable links");
@@ -771,7 +772,7 @@ public final class LinkCommandLine extends CommandLine {
/**
* Sets the type of the link. It is an error to try to set this to {@link
* LinkTargetType#INTERFACE_DYNAMIC_LIBRARY}. Note that all the static target types (see {@link
- * LinkTargetType#isStaticLibraryLink}) are equivalent, and there is no check that the output
+ * LinkTargetType#staticness}) are equivalent, and there is no check that the output
* artifact matches the target type extension.
*/
public Builder setLinkTargetType(LinkTargetType linkTargetType) {
@@ -817,7 +818,7 @@ public final class LinkCommandLine extends CommandLine {
* Sets the linker options. These are passed to the linker in addition to the other linker
* options like linker inputs, symbol count options, etc. The {@link #build} method throws an
* exception if the linker options are non-empty for a static link (see {@link
- * LinkTargetType#isStaticLibraryLink}).
+ * LinkTargetType#staticness()}).
*/
public Builder setLinkopts(ImmutableList<String> linkopts) {
this.linkopts = linkopts;
@@ -826,7 +827,7 @@ public final class LinkCommandLine extends CommandLine {
/**
* Sets how static the link is supposed to be. For static target types (see {@link
- * LinkTargetType#isStaticLibraryLink}), the {@link #build} method throws an exception if this
+ * LinkTargetType#staticness()}}), the {@link #build} method throws an exception if this
* is not {@link LinkStaticness#FULLY_STATIC}. The default setting is {@link
* LinkStaticness#FULLY_STATIC}.
*/
@@ -848,7 +849,7 @@ public final class LinkCommandLine extends CommandLine {
/**
* Sets the linkstamps. Linkstamps are additional C++ source files that are compiled as part of
* the link command. The {@link #build} method throws an exception if the linkstamps are
- * non-empty for a static link (see {@link LinkTargetType#isStaticLibraryLink}).
+ * non-empty for a static link (see {@link LinkTargetType#staticness()}}).
*/
public Builder setLinkstamps(ImmutableMap<Artifact, Artifact> linkstamps) {
this.linkstamps = linkstamps;
@@ -867,7 +868,7 @@ public final class LinkCommandLine extends CommandLine {
/**
* The build info header artifacts are generated header files that are used for link stamping.
* The {@link #build} method throws an exception if the build info header artifacts are
- * non-empty for a static link (see {@link LinkTargetType#isStaticLibraryLink}).
+ * non-empty for a static link (see {@link LinkTargetType#staticness()}}).
*/
public Builder setBuildInfoHeaderArtifacts(ImmutableList<Artifact> buildInfoHeaderArtifacts) {
this.buildInfoHeaderArtifacts = buildInfoHeaderArtifacts;
@@ -885,7 +886,7 @@ public final class LinkCommandLine extends CommandLine {
/**
* Whether the resulting library is intended to be used as a native library from another
* programming language. This influences the rpath. The {@link #build} method throws an
- * exception if this is true for a static link (see {@link LinkTargetType#isStaticLibraryLink}).
+ * exception if this is true for a static link (see {@link LinkTargetType#staticness()}}).
*/
public Builder setNativeDeps(boolean nativeDeps) {
this.nativeDeps = nativeDeps;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInput.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInput.java
index 91501f443a..dacc11275c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInput.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInput.java
@@ -22,6 +22,12 @@ import com.google.devtools.build.lib.actions.Artifact;
* contains embedded objects and if so, the list of the object files themselves.
*/
public interface LinkerInput {
+
+ /**
+ * Returns the type of the linker input.
+ */
+ ArtifactCategory getArtifactCategory();
+
/**
* Returns the artifact that is the input of the linker.
*/
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java
index 97b3216b7a..9f3e215dac 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java
@@ -33,9 +33,33 @@ public abstract class LinkerInputs {
@ThreadSafety.Immutable
public static class SimpleLinkerInput implements LinkerInput {
private final Artifact artifact;
+ private final ArtifactCategory category;
- public SimpleLinkerInput(Artifact artifact) {
+ public SimpleLinkerInput(Artifact artifact, ArtifactCategory category) {
+ String basename = artifact.getFilename();
+ switch (category) {
+ case STATIC_LIBRARY:
+ Preconditions.checkState(Link.ARCHIVE_LIBRARY_FILETYPES.matches(basename));
+ break;
+
+ case DYNAMIC_LIBRARY:
+ Preconditions.checkState(Link.SHARED_LIBRARY_FILETYPES.matches(basename));
+ break;
+
+ case OBJECT_FILE:
+ Preconditions.checkState(Link.OBJECT_FILETYPES.matches(basename));
+ break;
+
+ default:
+ throw new IllegalStateException();
+ }
this.artifact = Preconditions.checkNotNull(artifact);
+ this.category = category;
+ }
+
+ @Override
+ public ArtifactCategory getArtifactCategory() {
+ return category;
}
@Override
@@ -95,7 +119,7 @@ public abstract class LinkerInputs {
@ThreadSafety.Immutable
private static class FakeLinkerInput extends SimpleLinkerInput {
private FakeLinkerInput(Artifact artifact) {
- super(artifact);
+ super(artifact, ArtifactCategory.OBJECT_FILE);
Preconditions.checkState(Link.OBJECT_FILETYPES.matches(artifact.getFilename()));
}
@@ -132,7 +156,9 @@ public abstract class LinkerInputs {
private SolibLibraryToLink(Artifact solibSymlinkArtifact, Artifact libraryArtifact,
String libraryIdentifier) {
- this.solibSymlinkArtifact = Preconditions.checkNotNull(solibSymlinkArtifact);
+ Preconditions.checkArgument(
+ Link.SHARED_LIBRARY_FILETYPES.matches(solibSymlinkArtifact.getFilename()));
+ this.solibSymlinkArtifact = solibSymlinkArtifact;
this.libraryArtifact = libraryArtifact;
this.libraryIdentifier = libraryIdentifier;
}
@@ -144,6 +170,11 @@ public abstract class LinkerInputs {
}
@Override
+ public ArtifactCategory getArtifactCategory() {
+ return ArtifactCategory.DYNAMIC_LIBRARY;
+ }
+
+ @Override
public Artifact getArtifact() {
return solibSymlinkArtifact;
}
@@ -207,16 +238,33 @@ public abstract class LinkerInputs {
@ThreadSafety.Immutable
private static class CompoundLibraryToLink implements LibraryToLink {
private final Artifact libraryArtifact;
+ private final ArtifactCategory category;
private final String libraryIdentifier;
private final Iterable<Artifact> objectFiles;
private final Iterable<Artifact> ltoBitcodeFiles;
private CompoundLibraryToLink(
Artifact libraryArtifact,
+ ArtifactCategory category,
String libraryIdentifier,
Iterable<Artifact> objectFiles,
Iterable<Artifact> ltoBitcodeFiles) {
+ String basename = libraryArtifact.getFilename();
+ switch (category) {
+ case STATIC_LIBRARY:
+ Preconditions.checkState(Link.ARCHIVE_LIBRARY_FILETYPES.matches(basename));
+ break;
+
+ case DYNAMIC_LIBRARY:
+ Preconditions.checkState(Link.SHARED_LIBRARY_FILETYPES.matches(basename));
+ break;
+
+ default:
+ throw new IllegalStateException();
+ }
+
this.libraryArtifact = Preconditions.checkNotNull(libraryArtifact);
+ this.category = category;
this.libraryIdentifier = libraryIdentifier;
this.objectFiles = objectFiles == null ? null : CollectionUtils.makeImmutable(objectFiles);
this.ltoBitcodeFiles =
@@ -231,6 +279,11 @@ public abstract class LinkerInputs {
}
@Override
+ public ArtifactCategory getArtifactCategory() {
+ return category;
+ }
+
+ @Override
public Artifact getArtifact() {
return libraryArtifact;
}
@@ -292,11 +345,12 @@ public abstract class LinkerInputs {
/**
* Creates linker input objects for non-library files.
*/
- public static Iterable<LinkerInput> simpleLinkerInputs(Iterable<Artifact> input) {
+ public static Iterable<LinkerInput> simpleLinkerInputs(Iterable<Artifact> input,
+ final ArtifactCategory category) {
return Iterables.transform(input, new Function<Artifact, LinkerInput>() {
@Override
public LinkerInput apply(Artifact artifact) {
- return simpleLinkerInput(artifact);
+ return simpleLinkerInput(artifact, category);
}
});
}
@@ -304,11 +358,11 @@ public abstract class LinkerInputs {
/**
* Creates a linker input for which we do not know what objects files it consists of.
*/
- public static LinkerInput simpleLinkerInput(Artifact artifact) {
+ public static LinkerInput simpleLinkerInput(Artifact artifact, ArtifactCategory category) {
// This precondition check was in place and *most* of the tests passed with them; the only
// exception is when you mention a generated .a file in the srcs of a cc_* rule.
// Preconditions.checkArgument(!ARCHIVE_LIBRARY_FILETYPES.contains(artifact.getFileType()));
- return new SimpleLinkerInput(artifact);
+ return new SimpleLinkerInput(artifact, category);
}
/**
@@ -321,11 +375,12 @@ public abstract class LinkerInputs {
/**
* Creates input libraries for which we do not know what objects files it consists of.
*/
- public static Iterable<LibraryToLink> opaqueLibrariesToLink(Iterable<Artifact> input) {
+ public static Iterable<LibraryToLink> opaqueLibrariesToLink(
+ final ArtifactCategory category, Iterable<Artifact> input) {
return Iterables.transform(input, new Function<Artifact, LibraryToLink>() {
@Override
public LibraryToLink apply(Artifact artifact) {
- return precompiledLibraryToLink(artifact);
+ return precompiledLibraryToLink(artifact, category);
}
});
}
@@ -341,7 +396,8 @@ public abstract class LinkerInputs {
/**
* Creates an input library for which we do not know what objects files it consists of.
*/
- public static LibraryToLink precompiledLibraryToLink(Artifact artifact) {
+ public static LibraryToLink precompiledLibraryToLink(
+ Artifact artifact, ArtifactCategory category) {
// This precondition check was in place and *most* of the tests passed with them; the only
// exception is when you mention a generated .a file in the srcs of a cc_* rule.
// It was very useful for proving that this actually works, though.
@@ -349,21 +405,22 @@ public abstract class LinkerInputs {
// !(artifact.getGeneratingAction() instanceof CppLinkAction) ||
// !Link.ARCHIVE_LIBRARY_FILETYPES.contains(artifact.getFileType()));
return new CompoundLibraryToLink(
- artifact, CcLinkingOutputs.libraryIdentifierOf(artifact), null, null);
+ artifact, category, CcLinkingOutputs.libraryIdentifierOf(artifact), null, null);
}
public static LibraryToLink opaqueLibraryToLink(
- Artifact artifact, String libraryIdentifier) {
- return new CompoundLibraryToLink(artifact, libraryIdentifier, null, null);
+ Artifact artifact, ArtifactCategory category, String libraryIdentifier) {
+ return new CompoundLibraryToLink(artifact, category, libraryIdentifier, null, null);
}
/**
* Creates a library to link with the specified object files.
*/
public static LibraryToLink newInputLibrary(
- Artifact library, String libraryIdentifier, Iterable<Artifact> objectFiles,
- Iterable<Artifact> ltoBitcodeFiles) {
- return new CompoundLibraryToLink(library, libraryIdentifier, objectFiles, ltoBitcodeFiles);
+ Artifact library, ArtifactCategory category, String libraryIdentifier,
+ Iterable<Artifact> objectFiles, Iterable<Artifact> ltoBitcodeFiles) {
+ return new CompoundLibraryToLink(
+ library, category, libraryIdentifier, objectFiles, ltoBitcodeFiles);
}
private static final Function<LibraryToLink, Artifact> LIBRARY_TO_NON_SOLIB =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/PrecompiledFiles.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/PrecompiledFiles.java
index 3fe70b720e..798b531b57 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/PrecompiledFiles.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/PrecompiledFiles.java
@@ -59,7 +59,7 @@ public final class PrecompiledFiles {
}
public Iterable<LibraryToLink> getPicStaticLibraries() {
- return LinkerInputs.opaqueLibrariesToLink(
+ return LinkerInputs.opaqueLibrariesToLink(ArtifactCategory.STATIC_LIBRARY,
FileType.filter(files, CppFileTypes.PIC_ARCHIVE,
CppFileTypes.ALWAYS_LINK_PIC_LIBRARY));
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/NativeLibraryNestedSetBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/java/NativeLibraryNestedSetBuilder.java
index 1a45227ab6..c7a953d38b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/NativeLibraryNestedSetBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/NativeLibraryNestedSetBuilder.java
@@ -19,6 +19,7 @@ import com.google.devtools.build.lib.analysis.FileProvider;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.rules.cpp.ArtifactCategory;
import com.google.devtools.build.lib.rules.cpp.CcNativeLibraryProvider;
import com.google.devtools.build.lib.rules.cpp.CppFileTypes;
import com.google.devtools.build.lib.rules.cpp.LinkerInput;
@@ -44,7 +45,7 @@ public final class NativeLibraryNestedSetBuilder {
*/
public NativeLibraryNestedSetBuilder addAll(Iterable<Artifact> deps) {
for (Artifact dep : deps) {
- builder.add(new LinkerInputs.SimpleLinkerInput(dep));
+ builder.add(new LinkerInputs.SimpleLinkerInput(dep, ArtifactCategory.DYNAMIC_LIBRARY));
}
return this;
}
@@ -111,7 +112,7 @@ public final class NativeLibraryNestedSetBuilder {
for (Artifact artifact : FileType.filterList(
dep.getProvider(FileProvider.class).getFilesToBuild(),
CppFileTypes.SHARED_LIBRARY)) {
- builder.add(new LinkerInputs.SimpleLinkerInput(artifact));
+ builder.add(new LinkerInputs.SimpleLinkerInput(artifact, ArtifactCategory.DYNAMIC_LIBRARY));
}
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java b/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
index a7a53d522e..8b9f9fe878 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/nativedeps/NativeDepsHelper.java
@@ -21,6 +21,7 @@ import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.actions.SymlinkAction;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.rules.cpp.ArtifactCategory;
import com.google.devtools.build.lib.rules.cpp.CcLinkParams;
import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
import com.google.devtools.build.lib.rules.cpp.CppBuildInfo;
@@ -160,10 +161,10 @@ public abstract class NativeDepsHelper {
CppLinkActionBuilder builder =
new CppLinkActionBuilder(ruleContext, sharedLibrary, configuration, toolchain);
if (useDynamicRuntime) {
- builder.setRuntimeInputs(
+ builder.setRuntimeInputs(ArtifactCategory.DYNAMIC_LIBRARY,
toolchain.getDynamicRuntimeLinkMiddleman(), toolchain.getDynamicRuntimeLinkInputs());
} else {
- builder.setRuntimeInputs(
+ builder.setRuntimeInputs(ArtifactCategory.DYNAMIC_LIBRARY,
toolchain.getStaticRuntimeLinkMiddleman(), toolchain.getStaticRuntimeLinkInputs());
}
CppLinkAction linkAction =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
index f2a7c24115..1f371fb2cb 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
@@ -23,6 +23,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
+import com.google.devtools.build.lib.rules.cpp.ArtifactCategory;
import com.google.devtools.build.lib.rules.cpp.CcLinkParams;
import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider;
import com.google.devtools.build.lib.rules.cpp.CcLinkParamsStore;
@@ -57,7 +58,8 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory {
ImmutableSet.Builder<LibraryToLink> libraries = new ImmutableSet.Builder<>();
for (Artifact library : objcProvider.get(ObjcProvider.LIBRARY)) {
libraries.add(LinkerInputs.opaqueLibraryToLink(
- library, FileSystemUtils.removeExtension(library.getRootRelativePathString())));
+ library, ArtifactCategory.STATIC_LIBRARY,
+ FileSystemUtils.removeExtension(library.getRootRelativePathString())));
}
libraries.addAll(objcProvider.get(ObjcProvider.CC_LIBRARY));
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
index 69856e2848..8dbe6e978d 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
@@ -209,11 +209,11 @@ public abstract class MockCcSupport {
+ " }"
+ "}";
- public static final String STATIC_LINK_AS_LIB_CONFIGURATION =
+ public static final String STATIC_LINK_TWEAKED_CONFIGURATION =
""
+ "artifact_name_pattern {"
+ " category_name: 'static_library'"
- + " pattern: 'lib%{base_name}.lib'"
+ + " pattern: 'lib%{base_name}.tweaked.a'"
+ "}";
public static final String STATIC_LINK_AS_DOT_A_CONFIGURATION =
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
index ace2d9d4cf..727c04ffb6 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcCommonTest.java
@@ -48,15 +48,13 @@ import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.ModifiedFileSet;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig;
-
+import java.util.Arrays;
+import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-import java.util.Arrays;
-import java.util.List;
-
/** A test for {@link CcCommon}. */
@RunWith(JUnit4.class)
public class CcCommonTest extends BuildViewTestCase {
@@ -760,7 +758,7 @@ public class CcCommonTest extends BuildViewTestCase {
CcLinkingOutputs.builder()
.addStaticLibraries(
ImmutableList.copyOf(
- LinkerInputs.opaqueLibrariesToLink(
+ LinkerInputs.opaqueLibrariesToLink(ArtifactCategory.STATIC_LIBRARY,
Arrays.asList(
getSourceArtifact("liba.a"),
getSourceArtifact("libb.a"),
@@ -768,7 +766,7 @@ public class CcCommonTest extends BuildViewTestCase {
getSourceArtifact("libd.a")))))
.addPicStaticLibraries(
ImmutableList.copyOf(
- LinkerInputs.opaqueLibrariesToLink(
+ LinkerInputs.opaqueLibrariesToLink(ArtifactCategory.STATIC_LIBRARY,
Arrays.asList(
getSourceArtifact("liba.pic.a"),
getSourceArtifact("libb.pic.a"),
@@ -776,7 +774,7 @@ public class CcCommonTest extends BuildViewTestCase {
getSourceArtifact("libf.pic.a")))))
.addDynamicLibraries(
ImmutableList.copyOf(
- LinkerInputs.opaqueLibrariesToLink(
+ LinkerInputs.opaqueLibrariesToLink(ArtifactCategory.DYNAMIC_LIBRARY,
Arrays.asList(
getSourceArtifact("liba.so"),
getSourceArtifact("libc.so"),
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
index 6b354e4b73..c2bbf26169 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
@@ -59,7 +59,6 @@ public class CcLibraryConfiguredTargetTest extends BuildViewTestCase {
private static final PathFragment STL_CPPMAP = new PathFragment("stl.cppmap");
private static final PathFragment CROSSTOOL_CPPMAP = new PathFragment("crosstool.cppmap");
-
@Before
public final void createFiles() throws Exception {
scratch.file("hello/BUILD",
@@ -281,11 +280,11 @@ public class CcLibraryConfiguredTargetTest extends BuildViewTestCase {
public void testLinkActionCanConsumeArtifactExtensions() throws Exception {
AnalysisMock.get()
.ccSupport()
- .setupCrosstool(mockToolsConfig, MockCcSupport.STATIC_LINK_AS_LIB_CONFIGURATION);
+ .setupCrosstool(mockToolsConfig, MockCcSupport.STATIC_LINK_TWEAKED_CONFIGURATION);
useConfiguration("--features=" + Link.LinkTargetType.STATIC_LIBRARY.getActionName());
ConfiguredTarget hello = getConfiguredTarget("//hello:hello");
Artifact archive =
- FileType.filter(getFilesToBuild(hello), FileType.of(".lib")).iterator().next();
+ FileType.filter(getFilesToBuild(hello), FileType.of(".tweaked.a")).iterator().next();
CppLinkAction action = (CppLinkAction) getGeneratingAction(archive);
@@ -299,12 +298,12 @@ public class CcLibraryConfiguredTargetTest extends BuildViewTestCase {
.setupCrosstool(mockToolsConfig,
"artifact_name_pattern {"
+ " category_name: 'object_file'"
- + " pattern: 'object_%{base_name}.o'"
+ + " pattern: '%{output_name}.test.o'"
+ "}");
useConfiguration();
ConfiguredTarget hello = getConfiguredTarget("//hello:hello");
- assertThat(artifactByPath(getFilesToBuild(hello), ".a", "object_hello.o")).isNotNull();
+ assertThat(artifactByPath(getFilesToBuild(hello), ".a", ".test.o")).isNotNull();
}
@Test
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
index d81ca401a7..d16068eee6 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CppLinkActionTest.java
@@ -38,6 +38,7 @@ import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfig
import com.google.devtools.build.lib.rules.cpp.CppLinkActionConfigs.CppLinkPlatform;
import com.google.devtools.build.lib.rules.cpp.Link.LinkStaticness;
import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
+import com.google.devtools.build.lib.rules.cpp.Link.Staticness;
import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.io.IOException;
@@ -143,8 +144,10 @@ public class CppLinkActionTest extends BuildViewTestCase {
@Test
public void testComputeKeyNonStatic() throws Exception {
final RuleContext ruleContext = createDummyRuleContext();
- final PathFragment outputPath = new PathFragment("dummyRuleContext/output/path.xyz");
- final Artifact outputFile = getBinArtifactWithNoOwner(outputPath.getPathString());
+ final PathFragment exeOutputPath = new PathFragment("dummyRuleContext/output/path");
+ final PathFragment dynamicOutputPath = new PathFragment("dummyRuleContext/output/path.so");
+ final Artifact staticOutputFile = getBinArtifactWithNoOwner(exeOutputPath.getPathString());
+ final Artifact dynamicOutputFile = getBinArtifactWithNoOwner(dynamicOutputPath.getPathString());
final Artifact oFile = getSourceArtifact("cc/a.o");
final Artifact oFile2 = getSourceArtifact("cc/a2.o");
final Artifact interfaceSoBuilder = getBinArtifactWithNoOwner("foo/build_interface_so");
@@ -157,7 +160,8 @@ public class CppLinkActionTest extends BuildViewTestCase {
@Override
public Action generate(int i) {
CppLinkActionBuilder builder =
- new CppLinkActionBuilder(ruleContext, outputFile) {
+ new CppLinkActionBuilder(ruleContext, (i & 2) == 0
+ ? dynamicOutputFile : staticOutputFile) {
@Override
protected Artifact getInterfaceSoBuilder() {
return interfaceSoBuilder;
@@ -191,8 +195,10 @@ public class CppLinkActionTest extends BuildViewTestCase {
@Test
public void testComputeKeyStatic() throws Exception {
final RuleContext ruleContext = createDummyRuleContext();
- final PathFragment outputPath = new PathFragment("dummyRuleContext/output/path.xyz");
- final Artifact outputFile = getBinArtifactWithNoOwner(outputPath.getPathString());
+ final PathFragment staticOutputPath = new PathFragment("dummyRuleContext/output/path.a");
+ final PathFragment dynamicOutputPath = new PathFragment("dummyRuleContext/output/path.so");
+ final Artifact staticOutputFile = getBinArtifactWithNoOwner(staticOutputPath.getPathString());
+ final Artifact dynamicOutputFile = getBinArtifactWithNoOwner(dynamicOutputPath.getPathString());
final Artifact oFile = getSourceArtifact("cc/a.o");
final Artifact oFile2 = getSourceArtifact("cc/a2.o");
final Artifact interfaceSoBuilder = getBinArtifactWithNoOwner("foo/build_interface_so");
@@ -205,7 +211,8 @@ public class CppLinkActionTest extends BuildViewTestCase {
@Override
public Action generate(int i) {
CppLinkActionBuilder builder =
- new CppLinkActionBuilder(ruleContext, outputFile) {
+ new CppLinkActionBuilder(ruleContext, (i & 2) == 0
+ ? staticOutputFile : dynamicOutputFile) {
@Override
protected Artifact getInterfaceSoBuilder() {
return interfaceSoBuilder;
@@ -329,7 +336,7 @@ public class CppLinkActionTest extends BuildViewTestCase {
.setLinkType(type)
.setCrosstoolInputs(NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER))
.setLinkStaticness(
- type.isStaticLibraryLink()
+ type.staticness() == Staticness.STATIC
? LinkStaticness.FULLY_STATIC
: LinkStaticness.MOSTLY_STATIC)
.setFeatureConfiguration(featureConfiguration);
@@ -337,7 +344,7 @@ public class CppLinkActionTest extends BuildViewTestCase {
}
private CppLinkActionBuilder createLinkBuilder(Link.LinkTargetType type) throws Exception {
- PathFragment output = new PathFragment("dummyRuleContext/output/path.xyz");
+ PathFragment output = new PathFragment("dummyRuleContext/output/path.a");
return createLinkBuilder(
type,
output.getPathString(),