aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/tools/xcode
diff options
context:
space:
mode:
authorGravatar Chris Parsons <cparsons@google.com>2016-05-03 17:36:04 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2016-05-03 21:32:23 +0000
commitc9f2881f2540a7aa7c5f6d76f4bdad5d35d1c3b6 (patch)
treed4453e7db9c04960271d89e42f98861b4f01a5e1 /src/tools/xcode
parentc7e51046dc8cc250a304303edc28c0b4f6aaf776 (diff)
Rollforward of "Workaround for duplicate input basename bug in apple's libtool", with regex fix
-- MOS_MIGRATED_REVID=121390817
Diffstat (limited to 'src/tools/xcode')
-rwxr-xr-xsrc/tools/xcode/xcrunwrapper/xcrunwrapper.sh76
1 files changed, 71 insertions, 5 deletions
diff --git a/src/tools/xcode/xcrunwrapper/xcrunwrapper.sh b/src/tools/xcode/xcrunwrapper/xcrunwrapper.sh
index dfb36aa4ef..ae5772255c 100755
--- a/src/tools/xcode/xcrunwrapper/xcrunwrapper.sh
+++ b/src/tools/xcode/xcrunwrapper/xcrunwrapper.sh
@@ -14,14 +14,29 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
-# xcrunwrapper runs the command passed to it using xcrun.
-# It replaces __BAZEL_XCODE_DEVELOPER_DIR__ with $DEVELOPER_DIR (or reasonable
-# default) and __BAZEL_XCODE_SDKROOT__ with a valid path based on SDKROOT (or
-# reasonable default).
+# xcrunwrapper runs the command passed to it using xcrun. The first arg
+# passed is the name of the tool to be invoked via xcrun. (For example, libtool
+# or clang).
+# xcrunwrapper replaces __BAZEL_XCODE_DEVELOPER_DIR__ with $DEVELOPER_DIR (or
+# reasonable default) and __BAZEL_XCODE_SDKROOT__ with a valid path based on
+# SDKROOT (or reasonable default).
# These values (__BAZEL_XCODE_*) are a shared secret withIosSdkCommands.java.
set -eu
+TOOLNAME=$1
+shift
+
+# Creates a symbolic link to the input argument file and returns the symlink
+# file path.
+function hash_objfile() {
+ ORIGINAL_NAME="$1"
+ ORIGINAL_HASH="$(/sbin/md5 -q "${ORIGINAL_NAME}")"
+ SYMLINK_NAME="${ORIGINAL_NAME%.o}_${ORIGINAL_HASH}.o"
+ ln -s "$(basename "$ORIGINAL_NAME")" "$SYMLINK_NAME"
+ echo "$SYMLINK_NAME"
+}
+
# Pick values for DEVELOPER_DIR and SDKROOT as appropriate (if they weren't set)
WRAPPER_DEVDIR="${DEVELOPER_DIR:-}"
@@ -47,8 +62,59 @@ if [[ -z "${WRAPPER_SDKROOT:-}" ]] ; then
WRAPPER_SDKROOT="$(/usr/bin/xcrun --show-sdk-path --sdk ${WRAPPER_SDK})"
fi
+ARGS=("$TOOLNAME")
+while [[ $# -gt 0 ]]; do
+ ARG="$1"
+ shift
+
+ # Libtool artifact symlinking. Apple's libtool has a bug when there are two
+ # input files with the same basename. We thus create symlinks that are named
+ # with a hash suffix for each input, and pass them to libtool.
+ # See b/28186497.
+ # TODO(b/28347228): Handle this in a separate wrapper.
+ if [ "$TOOLNAME" = "libtool" ] ; then
+ case "${ARG}" in
+ # Filelist flag, need to symlink each input in the contents of file and
+ # pass a new filelist which contains the symlinks.
+ -filelist)
+ ARGS+=("${ARG}")
+ ARG="$1"
+ shift
+ HASHED_FILELIST="${ARG//.objlist/_hashes.objlist}"
+ while read INPUT_FILE || [ -n "$INPUT_FILE" ]; do
+ echo "$(hash_objfile "${INPUT_FILE}")" >> "$HASHED_FILELIST"
+ done < "${ARG}"
+ ARGS+=("${HASHED_FILELIST}")
+ ;;
+ # Flags with no args
+ -static|-s|-a|-c|-L|-T|-no_warning_for_no_symbols)
+ ARGS+=("${ARG}")
+ ;;
+ # Single-arg flags
+ -o|-arch_only|-syslibroot)
+ ARGS+=("${ARG}")
+ ARG="$1"
+ shift
+ ARGS+=("${ARG}")
+ ;;
+ # Any remaining flags are unexpected and may ruin flag parsing.
+ -*)
+ echo "Unrecognized libtool flag ${ARG}"
+ exit 1
+ ;;
+ # Remaining args are input objects
+ *)
+ ARGS+=("$(echo "$(hash_objfile "${ARG}")")")
+ ;;
+ esac
+ else
+ ARGS+=("${ARG}")
+ fi
+done
+
+# Subsitute toolkit path placeholders.
UPDATEDARGS=()
-for ARG in "$@" ; do
+for ARG in "${ARGS[@]}" ; do
ARG="${ARG//__BAZEL_XCODE_DEVELOPER_DIR__/${WRAPPER_DEVDIR}}"
ARG="${ARG//__BAZEL_XCODE_SDKROOT__/${WRAPPER_SDKROOT}}"
UPDATEDARGS+=("${ARG}")