diff options
author | 2016-11-23 18:47:29 +0000 | |
---|---|---|
committer | 2016-11-23 19:13:30 +0000 | |
commit | afe6051cf78c086cd9e4771a1a28782d3548a0af (patch) | |
tree | 3cd1f209387875bcf34b538ed643646695cc6aa9 /src/main/java/com/google/devtools/build | |
parent | 5f59e1c43068861b07d72280859734c855a9b468 (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')
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)) |