diff options
author | 2016-05-23 19:23:24 +0000 | |
---|---|---|
committer | 2016-05-24 11:57:21 +0000 | |
commit | 1f67a7be7282310783728c636add4345ba8e2c16 (patch) | |
tree | 3b8fe8f98d915e31b278e6a25d2220e1c7c7f5a9 | |
parent | a385d760f27e38140181ec787e19fed9747617a0 (diff) |
libtool wrapper script to isolate the unfortunate hacks we must make to get around apple's buggy libtool tool
--
MOS_MIGRATED_REVID=123024674
12 files changed, 113 insertions, 8 deletions
@@ -74,6 +74,7 @@ genrule( OSX_DUMMY_TARGETS = [ "src/tools/xcode/actoolwrapper/actoolwrapper", "src/tools/xcode/ibtoolwrapper/ibtoolwrapper", + "src/tools/xcode/libtool/libtool", "src/tools/xcode/momcwrapper/momcwrapper", "src/tools/xcode/swiftstdlibtoolwrapper/swiftstdlibtoolwrapper", "src/tools/xcode/environment/environment_plist", @@ -100,6 +101,7 @@ filegroup( srcs = [ "//src/tools/xcode/actoolwrapper:actoolwrapper", "//src/tools/xcode/ibtoolwrapper:ibtoolwrapper", + "//src/tools/xcode/libtool:libtool", "//src/tools/xcode/momcwrapper:momcwrapper", "//src/tools/xcode/swiftstdlibtoolwrapper:swiftstdlibtoolwrapper", "//src/tools/xcode/environment:environment_plist", @@ -295,6 +297,7 @@ filegroup( "//src/tools/xcode/actoolwrapper:srcs", "//src/tools/xcode/environment:srcs", "//src/tools/xcode/ibtoolwrapper:srcs", + "//src/tools/xcode/libtool:srcs", "//src/tools/xcode/momcwrapper:srcs", "//src/tools/xcode/realpath:srcs", "//src/tools/xcode/stdredirect:srcs", diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java index 72cfe3c97e..48d31f5c7a 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java @@ -405,6 +405,7 @@ public class BazelRuleClassProvider { builder.addRuleDefinition(new ObjcRuleClasses.CompileDependencyRule()); builder.addRuleDefinition(new ObjcRuleClasses.ResourceToolsRule()); builder.addRuleDefinition(new ObjcRuleClasses.XcrunRule()); + builder.addRuleDefinition(new ObjcRuleClasses.LibtoolRule()); builder.addRuleDefinition(new ObjcRuleClasses.IpaRule()); builder.addRuleDefinition(new ObjcRuleClasses.ReleaseBundlingToolsRule()); builder.addRuleDefinition(new ObjcRuleClasses.WatchExtensionBundleRule()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java index 9ba7bb146a..80b056e56b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java @@ -90,6 +90,9 @@ public abstract class AbstractJ2ObjcProtoAspect extends NativeAspectClass .add(attr("$xcrunwrapper", LABEL).cfg(HOST).exec() .value(Label.parseAbsoluteUnchecked( toolsRepository + "//tools/objc:xcrunwrapper"))) + .add(attr(ObjcRuleClasses.LIBTOOL_ATTRIBUTE, LABEL).cfg(HOST).exec() + .value(Label.parseAbsoluteUnchecked( + toolsRepository + "//tools/objc:libtool"))) .add(attr(":xcode_config", LABEL) .allowedRuleClasses("xcode_config") .checkConstraints() diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java index 882faebbce..3fff5d53bd 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java @@ -38,7 +38,6 @@ import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.CLANG_PLU import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.COMPILABLE_SRCS_TYPE; import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.DSYMUTIL; import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.HEADERS; -import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.LIBTOOL; import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.NON_ARC_SRCS_TYPE; import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.PRECOMPILED_SRCS_TYPE; import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.SRCS_TYPE; @@ -143,7 +142,14 @@ public final class CompilationSupport { * Returns the location of the xcrunwrapper tool. */ public static final FilesToRunProvider xcrunwrapper(RuleContext ruleContext) { - return ruleContext.getExecutablePrerequisite("$xcrunwrapper", Mode.HOST); + return ruleContext.getExecutablePrerequisite("$xcrunwrapper", Mode.HOST); + } + + /** + * Returns the location of the libtool tool. + */ + public static final FilesToRunProvider libtool(RuleContext ruleContext) { + return ruleContext.getExecutablePrerequisite(ObjcRuleClasses.LIBTOOL_ATTRIBUTE, Mode.HOST); } /** @@ -719,9 +725,8 @@ public final class CompilationSupport { actions.add(ObjcRuleClasses.spawnAppleEnvActionBuilder( ruleContext, appleConfiguration.getIosCpuPlatform()) .setMnemonic("ObjcLink") - .setExecutable(xcrunwrapper(ruleContext)) + .setExecutable(libtool(ruleContext)) .setCommandLine(new CustomCommandLine.Builder() - .add(LIBTOOL) .add("-static") .add("-filelist").add(objList.getExecPathString()) .add("-arch_only").add(appleConfiguration.getIosCpu()) @@ -750,9 +755,8 @@ public final class CompilationSupport { ruleContext.registerAction(ObjcRuleClasses.spawnAppleEnvActionBuilder( ruleContext, appleConfiguration.getIosCpuPlatform()) .setMnemonic("ObjcLink") - .setExecutable(xcrunwrapper(ruleContext)) + .setExecutable(libtool(ruleContext)) .setCommandLine(new CustomCommandLine.Builder() - .add(LIBTOOL) .add("-static") .add("-arch_only").add(appleConfiguration.getIosCpu()) .add("-syslibroot").add(AppleToolchain.sdkDir()) diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java index 99bf4365b7..895312c30f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java @@ -115,6 +115,9 @@ public class J2ObjcAspect extends NativeAspectClass implements ConfiguredAspectF .add(attr("$xcrunwrapper", LABEL).cfg(HOST).exec() .value(Label.parseAbsoluteUnchecked( toolsRepository + "//tools/objc:xcrunwrapper"))) + .add(attr(ObjcRuleClasses.LIBTOOL_ATTRIBUTE, LABEL).cfg(HOST).exec() + .value(Label.parseAbsoluteUnchecked( + toolsRepository + "//tools/objc:libtool"))) .add(attr(":xcode_config", LABEL) .allowedRuleClasses("xcode_config") .checkConstraints() diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibraryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibraryRule.java index ec91db8b6c..2cb9f9cafc 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibraryRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibraryRule.java @@ -154,7 +154,8 @@ public class ObjcProtoLibraryRule implements RuleDefinition { return RuleDefinition.Metadata.builder() .name("objc_proto_library") .factoryClass(ObjcProtoLibrary.class) - .ancestors(BaseRuleClasses.RuleBase.class, ObjcRuleClasses.XcrunRule.class) + .ancestors(BaseRuleClasses.RuleBase.class, ObjcRuleClasses.LibtoolRule.class, + ObjcRuleClasses.XcrunRule.class) .build(); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java index bad5520b62..48981fbbe0 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java @@ -61,10 +61,15 @@ import com.google.devtools.build.lib.util.FileTypeSet; * Shared rule classes and associated utility code for Objective-C rules. */ public class ObjcRuleClasses { + + /** + * Name of the attribute used for implicit dependency on the libtool wrapper. + */ + public static final String LIBTOOL_ATTRIBUTE = "$libtool"; + static final String CLANG = "clang"; static final String CLANG_PLUSPLUS = "clang++"; static final String SWIFT = "swift"; - static final String LIBTOOL = "libtool"; static final String DSYMUTIL = "dsymutil"; static final String LIPO = "lipo"; static final String STRIP = "strip"; @@ -746,12 +751,34 @@ public class ObjcRuleClasses { BaseRuleClasses.RuleBase.class, CompileDependencyRule.class, CoptsRule.class, + LibtoolRule.class, XcrunRule.class) .build(); } } /** + * Common attributes for {@code objc_*} rules that need to call libtool. + */ + public static class LibtoolRule implements RuleDefinition { + @Override + public RuleClass build(Builder builder, RuleDefinitionEnvironment env) { + return builder + .add(attr(LIBTOOL_ATTRIBUTE, LABEL).cfg(HOST).exec() + .value(env.getToolsLabel("//tools/objc:libtool"))) + .build(); + } + @Override + public Metadata getMetadata() { + return RuleDefinition.Metadata.builder() + .name("$objc_libtool_rule") + .type(RuleClassType.ABSTRACT) + .ancestors(XcrunRule.class) + .build(); + } + } + + /** * Common attributes for {@code objc_*} rules that can optionally be set to {@code alwayslink}. */ public static class AlwaysLinkRule implements RuleDefinition { diff --git a/src/test/shell/bazel/BUILD b/src/test/shell/bazel/BUILD index 2b3578a237..4f5663eaa1 100644 --- a/src/test/shell/bazel/BUILD +++ b/src/test/shell/bazel/BUILD @@ -24,6 +24,7 @@ filegroup( "//src/tools/xcode/actoolwrapper", "//src/tools/xcode/environment:environment_plist", "//src/tools/xcode/ibtoolwrapper", + "//src/tools/xcode/libtool", "//src/tools/xcode/momcwrapper", "//src/tools/xcode/realpath", "//src/tools/xcode/stdredirect:StdRedirect.dylib", diff --git a/src/tools/xcode/libtool/BUILD b/src/tools/xcode/libtool/BUILD new file mode 100644 index 0000000000..1d7fb5878f --- /dev/null +++ b/src/tools/xcode/libtool/BUILD @@ -0,0 +1,14 @@ +package(default_visibility = ["//src:__subpackages__"]) + +filegroup( + name = "srcs", + srcs = glob(["**"]), +) + +sh_binary( + name = "libtool", + srcs = ["libtool.sh"], + data = [ + "//src/tools/xcode/xcrunwrapper", + ], +) diff --git a/src/tools/xcode/libtool/README b/src/tools/xcode/libtool/README new file mode 100644 index 0000000000..7b817537fb --- /dev/null +++ b/src/tools/xcode/libtool/README @@ -0,0 +1,9 @@ +libtool.sh runs the command passed to it using "xcrun libtool". + +It creates symbolic links for all input files with a content-hash appended +to their original name (foo.o becomes foo_{md5sum}.o). This is to circumvent +a bug in the original tool that arises when two input files have the same +base name (even if they are in different directories). + +xcrun only runs on Darwin, so libtool.sh only runs on Darwin. + diff --git a/src/tools/xcode/libtool/libtool.sh b/src/tools/xcode/libtool/libtool.sh new file mode 100755 index 0000000000..c72f229b00 --- /dev/null +++ b/src/tools/xcode/libtool/libtool.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# +# Copyright 2016 The Bazel Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# libtool.sh runs the command passed to it using "xcrunwrapper libtool". +# +# It creates symbolic links for all input files with a content-hash appended +# to their original name (foo.o becomes foo_{md5sum}.o). This is to circumvent +# a bug in the original tool that arises when two input files have the same +# base name (even if they are in different directories). + +set -eu + +MY_LOCATION=${MY_LOCATION:-"$0.runfiles/bazel_tools/tools/objc"} +WRAPPER="${MY_LOCATION}/xcrunwrapper.sh" + +# TODO(b/28347228): When all callers of "xcrunwrapper libtool" are migrated to +# using this script, move the symlinking behavior to this script. +"${WRAPPER}" libtool "$@" diff --git a/tools/objc/BUILD b/tools/objc/BUILD index 1fa4628c13..149a9bb4ff 100644 --- a/tools/objc/BUILD +++ b/tools/objc/BUILD @@ -64,6 +64,14 @@ sh_binary( ) sh_binary( + name = "libtool", + srcs = [":libtool.sh"], + data = [ + ":xcrunwrapper", + ], +) + +sh_binary( name = "actoolwrapper", srcs = [":actoolwrapper.sh"], data = [ |