aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build
diff options
context:
space:
mode:
authorGravatar Cal Peyser <cpeyser@google.com>2016-11-23 18:47:29 +0000
committerGravatar Klaus Aehlig <aehlig@google.com>2016-11-23 19:13:30 +0000
commitafe6051cf78c086cd9e4771a1a28782d3548a0af (patch)
tree3cd1f209387875bcf34b538ed643646695cc6aa9 /src/main/java/com/google/devtools/build
parent5f59e1c43068861b07d72280859734c855a9b468 (diff)
Implement objc++ linking semantics in crosstool. Sematics in question are:
1) Uses clang++ instead of clang. 2) Add -stdlib=libc++ and -std=gnu++11 linker args -- MOS_MIGRATED_REVID=140049151
Diffstat (limited to 'src/main/java/com/google/devtools/build')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/Link.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/LinkCommandLine.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java11
3 files changed, 20 insertions, 6 deletions
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 74f33ab913..bddde77baf 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
@@ -16,7 +16,6 @@ package com.google.devtools.build.lib.rules.cpp;
import com.google.common.collect.AbstractIterator;
import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.collect.CollectionUtils;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
@@ -152,7 +151,16 @@ public abstract class Link {
Picness.NOPIC,
ArtifactCategory.EXECUTABLE,
Executable.EXECUTABLE),
-
+
+ /** An objc executable that includes objc++/c++ source. */
+ OBJCPP_EXECUTABLE(
+ "",
+ Staticness.STATIC,
+ "objc++-executable",
+ Picness.NOPIC,
+ ArtifactCategory.EXECUTABLE,
+ Executable.EXECUTABLE),
+
/** A static archive with .pic.o object files (compiled with -fPIC). */
PIC_STATIC_LIBRARY(
".pic.a",
@@ -357,8 +365,6 @@ public abstract class Link {
while (inputs.hasNext()) {
LibraryToLink inputLibrary = inputs.next();
- Artifact input = inputLibrary.getArtifact();
- String name = input.getFilename();
// True if the linker might use the members of this file, i.e., if the file is a thin or
// start_end_lib archive (aka static library). Also check if the library contains object
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 6a95202423..5522fe5d26 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
@@ -409,6 +409,7 @@ public final class LinkCommandLine extends CommandLine {
case OBJC_ARCHIVE:
case OBJC_FULLY_LINKED_ARCHIVE:
case OBJC_EXECUTABLE:
+ case OBJCPP_EXECUTABLE:
argv.add(toolPath);
argv.addAll(featureConfiguration.getCommandLine(actionName, variables));
break;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java
index 21d7cd3849..ada735b27d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java
@@ -44,6 +44,7 @@ import com.google.devtools.build.lib.rules.cpp.CppRuleClasses;
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.PrecompiledFiles;
+import com.google.devtools.build.lib.rules.objc.ObjcProvider.Flag;
import com.google.devtools.build.lib.rules.objc.ObjcVariablesExtension.VariableCategory;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.util.Collection;
@@ -67,6 +68,7 @@ public class CrosstoolCompilationSupport extends CompilationSupport {
"objc-archive",
"objc-fully-link",
"objc-executable",
+ "objc++-executable",
"assemble",
"preprocess-assemble",
"c-compile",
@@ -188,6 +190,10 @@ public class CrosstoolCompilationSupport extends CompilationSupport {
registerObjFilelistAction(objFiles, inputFileList);
+ LinkTargetType linkType = (objcProvider.is(Flag.USES_CPP))
+ ? LinkTargetType.OBJCPP_EXECUTABLE
+ : LinkTargetType.OBJC_EXECUTABLE;
+
ObjcVariablesExtension extension = new ObjcVariablesExtension.Builder()
.setRuleContext(ruleContext)
.setObjcProvider(objcProvider)
@@ -199,7 +205,7 @@ public class CrosstoolCompilationSupport extends CompilationSupport {
.setAttributeLinkopts(attributes.linkopts())
.addVariableCategory(VariableCategory.EXECUTABLE_LINKING_VARIABLES)
.build();
-
+
Artifact binaryToLink = getBinaryToLink();
CppLinkAction executableLinkAction =
new CppLinkActionBuilder(ruleContext, binaryToLink)
@@ -209,9 +215,10 @@ public class CrosstoolCompilationSupport extends CompilationSupport {
.addTransitiveActionInputs(objcProvider.get(IMPORTED_LIBRARY))
.addTransitiveActionInputs(objcProvider.get(STATIC_FRAMEWORK_FILE))
.addTransitiveActionInputs(objcProvider.get(DYNAMIC_FRAMEWORK_FILE))
+ .setCrosstoolInputs(CppHelper.getToolchain(ruleContext).getLink())
.addActionInputs(prunedJ2ObjcArchives)
.addActionInput(inputFileList)
- .setLinkType(LinkTargetType.OBJC_EXECUTABLE)
+ .setLinkType(linkType)
.setLinkStaticness(LinkStaticness.FULLY_STATIC)
.addVariablesExtension(extension)
.setFeatureConfiguration(getFeatureConfiguration(ruleContext))