| 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 |