blob: a09f80b60803d474cf2fc74365a98b6b0f483505 [file] [log] [blame]
From 5f655475e956af645508076e3906385dfd414a11 Mon Sep 17 00:00:00 2001
From: UebelAndre <github@uebelandre.com>
Date: Tue, 19 Aug 2025 07:29:30 -0700
Subject: [PATCH] Update cc_wrapper templates to posix shell.
---
cc/private/toolchain/linux_cc_wrapper.sh.tpl | 41 +++---
cc/private/toolchain/osx_cc_wrapper.sh.tpl | 145 +++++++++++--------
2 files changed, 109 insertions(+), 77 deletions(-)
diff --git a/cc/private/toolchain/linux_cc_wrapper.sh.tpl b/cc/private/toolchain/linux_cc_wrapper.sh.tpl
index 1d030d4a..29fb3794 100644
--- a/cc/private/toolchain/linux_cc_wrapper.sh.tpl
+++ b/cc/private/toolchain/linux_cc_wrapper.sh.tpl
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/bin/sh
#
# Copyright 2015 The Bazel Authors. All rights reserved.
#
@@ -20,26 +20,31 @@ set -eu
OUTPUT=
-function parse_option() {
- local -r opt="$1"
- if [[ "${OUTPUT}" = "1" ]]; then
+parse_option() {
+ opt=$1
+ if [ "$OUTPUT" = "1" ]; then
OUTPUT=$opt
- elif [[ "$opt" = "-o" ]]; then
+ elif [ "$opt" = "-o" ]; then
# output is coming
OUTPUT=1
fi
}
-# let parse the option list
+# parse the option list
for i in "$@"; do
- if [[ "$i" = @* && -r "${i:1}" ]]; then
- while IFS= read -r opt
- do
- parse_option "$opt"
- done < "${i:1}" || exit 1
- else
- parse_option "$i"
- fi
+ case $i in
+ @*)
+ file=${i#@}
+ if [ -r "$file" ]; then
+ while IFS= read -r opt; do
+ parse_option "$opt"
+ done < "$file" || exit 1
+ fi
+ ;;
+ *)
+ parse_option "$i"
+ ;;
+ esac
done
# Set-up the environment
@@ -49,6 +54,8 @@ done
%{cc} "$@"
# Generate an empty file if header processing succeeded.
-if [[ "${OUTPUT}" == *.h.processed ]]; then
- echo -n > "${OUTPUT}"
-fi
+case $OUTPUT in
+ *.h.processed)
+ : > "$OUTPUT"
+ ;;
+esac
diff --git a/cc/private/toolchain/osx_cc_wrapper.sh.tpl b/cc/private/toolchain/osx_cc_wrapper.sh.tpl
index 0a2d5689..62f5ff68 100644
--- a/cc/private/toolchain/osx_cc_wrapper.sh.tpl
+++ b/cc/private/toolchain/osx_cc_wrapper.sh.tpl
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/bin/sh
#
# Copyright 2015 The Bazel Authors. All rights reserved.
#
@@ -33,21 +33,36 @@ LIB_DIRS=
RPATHS=
OUTPUT=
-function parse_option() {
- local -r opt="$1"
- if [[ "${OUTPUT}" = "1" ]]; then
+XCRUN=/usr/bin/xcrun
+[ -x "$XCRUN" ] || XCRUN="xcrun"
+
+DIRNAME=/usr/bin/dirname
+[ -x "$DIRNAME" ] || DIRNAME="dirname"
+
+BASENAME=/usr/bin/basename
+[ -x "$BASENAME" ] || BASENAME="basename"
+
+READLINK=/usr/bin/readlink
+[ -x "$READLINK" ] || READLINK="readlink"
+
+SED=/usr/bin/sed
+[ -x "$SED" ] || SED="sed"
+
+parse_option() {
+ opt=$1
+ if [ "$OUTPUT" = "1" ]; then
OUTPUT=$opt
- elif [[ "$opt" =~ ^-l(.*)$ ]]; then
- LIBS="${BASH_REMATCH[1]} $LIBS"
- elif [[ "$opt" =~ ^(.*)\.so$ ]]; then
- LIB_PATHS="${opt} $LIB_PATHS"
- elif [[ "$opt" =~ ^(.*)\.dylib$ ]]; then
- LIB_PATHS="${opt} $LIB_PATHS"
- elif [[ "$opt" =~ ^-L(.*)$ ]]; then
- LIB_DIRS="${BASH_REMATCH[1]} $LIB_DIRS"
- elif [[ "$opt" =~ ^\@loader_path/(.*)$ ]]; then
- RPATHS="${BASH_REMATCH[1]} ${RPATHS}"
- elif [[ "$opt" = "-o" ]]; then
+ elif [ "${opt#-l}" != "$opt" ]; then
+ LIBS="${opt#-l} $LIBS"
+ elif [ "${opt%.so}" != "$opt" ]; then
+ LIB_PATHS="$opt $LIB_PATHS"
+ elif [ "${opt%.dylib}" != "$opt" ]; then
+ LIB_PATHS="$opt $LIB_PATHS"
+ elif [ "${opt#-L}" != "$opt" ]; then
+ LIB_DIRS="${opt#-L} $LIB_DIRS"
+ elif [ "${opt#@loader_path/}" != "$opt" ]; then
+ RPATHS="${opt#@loader_path/} $RPATHS"
+ elif [ "$opt" = "-o" ]; then
# output is coming
OUTPUT=1
fi
@@ -55,14 +70,19 @@ function parse_option() {
# let parse the option list
for i in "$@"; do
- if [[ "$i" = @* && -r "${i:1}" ]]; then
- while IFS= read -r opt
- do
- parse_option "$opt"
- done < "${i:1}" || exit 1
- else
- parse_option "$i"
- fi
+ case $i in
+ @*)
+ file=${i#@}
+ if [ -r "$file" ]; then
+ while IFS= read -r opt; do
+ parse_option "$opt"
+ done < "$file" || exit 1
+ fi
+ ;;
+ *)
+ parse_option "$i"
+ ;;
+ esac
done
# Set-up the environment
@@ -72,66 +92,71 @@ done
%{cc} "$@"
# Generate an empty file if header processing succeeded.
-if [[ "${OUTPUT}" == *.h.processed ]]; then
- echo -n > "${OUTPUT}"
-fi
-
-function get_library_path() {
- for libdir in ${LIB_DIRS}; do
- if [ -f ${libdir}/lib$1.so ]; then
- echo "${libdir}/lib$1.so"
- elif [ -f ${libdir}/lib$1.dylib ]; then
- echo "${libdir}/lib$1.dylib"
+case $OUTPUT in
+ *.h.processed)
+ : > "$OUTPUT"
+ ;;
+esac
+
+get_library_path() {
+ lib=$1
+ for libdir in $LIB_DIRS; do
+ if [ -f "$libdir/lib$lib.so" ]; then
+ echo "$libdir/lib$lib.so"
+ return
+ elif [ -f "$libdir/lib$lib.dylib" ]; then
+ echo "$libdir/lib$lib.dylib"
+ return
fi
done
}
# A convenient method to return the actual path even for non symlinks
# and multi-level symlinks.
-function get_realpath() {
- local previous="$1"
- local next=$(readlink "${previous}")
- while [ -n "${next}" ]; do
- previous="${next}"
- next=$(readlink "${previous}")
+get_realpath() {
+ previous=$1
+ next=$($READLINK "$previous" 2>/dev/null || true)
+ while [ -n "$next" ]; do
+ previous=$next
+ next=$($READLINK "$previous" 2>/dev/null || true)
done
- echo "${previous}"
+ echo "$previous"
}
# Get the path of a lib inside a tool
-function get_otool_path() {
+get_otool_path() {
# the lib path is the path of the original lib relative to the workspace
- get_realpath $1 | sed 's|^.*/bazel-out/|bazel-out/|'
+ get_realpath "$1" | $SED 's|^.*/bazel-out/|bazel-out/|'
}
-function call_install_name() {
- /usr/bin/xcrun install_name_tool -change $(get_otool_path "$1") \
- "@loader_path/$2/$3" "${OUTPUT}"
+call_install_name() {
+ $XCRUN install_name_tool -change "$(get_otool_path "$1")" \
+ "@loader_path/$2/$3" "$OUTPUT"
}
# Do replacements in the output
-for rpath in ${RPATHS}; do
- for lib in ${LIBS}; do
- unset libname
- if [ -f "$(/usr/bin/dirname ${OUTPUT})/${rpath}/lib${lib}.so" ]; then
- libname="lib${lib}.so"
- elif [ -f "$(/usr/bin/dirname ${OUTPUT})/${rpath}/lib${lib}.dylib" ]; then
- libname="lib${lib}.dylib"
+for rpath in $RPATHS; do
+ for lib in $LIBS; do
+ libname=
+ if [ -f "$($DIRNAME "$OUTPUT")/$rpath/lib$lib.so" ]; then
+ libname="lib$lib.so"
+ elif [ -f "$($DIRNAME "$OUTPUT")/$rpath/lib$lib.dylib" ]; then
+ libname="lib$lib.dylib"
fi
# ${libname-} --> return $libname if defined, or undefined otherwise. This is to make
# this set -e friendly
- if [[ -n "${libname-}" ]]; then
- libpath=$(get_library_path ${lib})
- if [ -n "${libpath}" ]; then
- call_install_name "${libpath}" "${rpath}" "${libname}"
+ if [ -n "$libname" ]; then
+ libpath=$(get_library_path "$lib")
+ if [ -n "$libpath" ]; then
+ call_install_name "$libpath" "$rpath" "$libname"
fi
fi
done
- for libpath in ${LIB_PATHS}; do
+ for libpath in $LIB_PATHS; do
if [ -f "$libpath" ]; then
- libname=$(/usr/bin/basename "$libpath")
- if [ -f "$(/usr/bin/dirname ${OUTPUT})/${rpath}/${libname}" ]; then
- call_install_name "${libpath}" "${rpath}" "${libname}"
+ libname=$($BASENAME "$libpath")
+ if [ -f "$($DIRNAME "$OUTPUT")/$rpath/$libname" ]; then
+ call_install_name "$libpath" "$rpath" "$libname"
fi
fi
done