aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Chris Parsons <cparsons@google.com>2016-05-23 19:23:24 +0000
committerGravatar Yue Gan <yueg@google.com>2016-05-24 11:57:21 +0000
commit1f67a7be7282310783728c636add4345ba8e2c16 (patch)
tree3b8fe8f98d915e31b278e6a25d2220e1c7c7f5a9
parenta385d760f27e38140181ec787e19fed9747617a0 (diff)
libtool wrapper script to isolate the unfortunate hacks we must make to get around apple's buggy libtool tool
-- MOS_MIGRATED_REVID=123024674
-rw-r--r--src/BUILD3
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibraryRule.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java29
-rw-r--r--src/test/shell/bazel/BUILD1
-rw-r--r--src/tools/xcode/libtool/BUILD14
-rw-r--r--src/tools/xcode/libtool/README9
-rwxr-xr-xsrc/tools/xcode/libtool/libtool.sh31
-rw-r--r--tools/objc/BUILD8
12 files changed, 113 insertions, 8 deletions
diff --git a/src/BUILD b/src/BUILD
index de25d30370..6604f6f525 100644
--- a/src/BUILD
+++ b/src/BUILD
@@ -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 = [