1
- #! /bin/bash
1
+ #! /bin/sh
2
2
#
3
3
# Copyright 2021 The Bazel Authors. All rights reserved.
4
4
#
16
16
17
17
# shellcheck disable=SC1083
18
18
19
- set -euo pipefail
19
+ set -euo
20
20
21
- CLEANUP_FILES=()
22
-
23
- function cleanup() {
24
- if [[ ${# CLEANUP_FILES[@]} -gt 0 ]]; then
25
- rm -f " ${CLEANUP_FILES[@]} "
26
- fi
21
+ cleanup () {
22
+ while read -r f; do
23
+ rm -f " ${f} " ;
24
+ done < " ${CLEANUP_FILES} "
27
25
}
28
26
29
27
trap cleanup EXIT
@@ -50,13 +48,13 @@ trap cleanup EXIT
50
48
#
51
49
52
50
dirname_shim () {
53
- local path=" $1 "
51
+ path=" $1 "
54
52
55
53
# Remove trailing slashes
56
54
path=" ${path%/ } "
57
55
58
56
# If there's no slash, return "."
59
- if [[ " ${path} " != * /* ] ]; then
57
+ if [ " ${path} " != " */*" ]; then
60
58
echo " ."
61
59
return
62
60
fi
@@ -68,74 +66,85 @@ dirname_shim() {
68
66
echo " ${path:-/ } "
69
67
}
70
68
71
- script_dir=$( dirname_shim " ${BASH_SOURCE[0]} " )
69
+ script_dir=$( dirname_shim " $0 " )
72
70
toolchain_path_prefix=" %{toolchain_path_prefix}"
73
71
74
72
# Sometimes this path may be an absolute path in which case we dont do anything because
75
73
# This is using the host toolchain to build.
76
- if [[ ${toolchain_path_prefix} != / * ] ]; then
74
+ if [ " ${toolchain_path_prefix} " != " /* " ]; then
77
75
toolchain_path_prefix=" ${script_dir} /../../${toolchain_path_prefix# external/ } "
78
76
fi
79
77
80
- if [[ ! -f ${toolchain_path_prefix} bin/clang ] ]; then
78
+ if [ ! -f " ${toolchain_path_prefix} bin/clang" ]; then
81
79
echo >&2 " ERROR: could not find clang; PWD=\" ${PWD} \" ; PATH=\" ${PATH} \" ; toolchain_path_prefix=${toolchain_path_prefix} ."
82
80
exit 5
83
81
fi
84
82
85
83
OUTPUT=
86
84
87
- function parse_option() {
88
- local -r opt =" $1 "
89
- if [[ " ${OUTPUT} " = " 1" ] ]; then
90
- OUTPUT=${opt }
91
- elif [[ " ${opt } " = " -o" ] ]; then
85
+ parse_option () {
86
+ po_opt =" $1 "
87
+ if [ " ${OUTPUT} " = " 1" ]; then
88
+ OUTPUT=${po_opt }
89
+ elif [ " ${po_opt } " = " -o" ]; then
92
90
# output is coming
93
91
OUTPUT=1
94
92
fi
95
93
}
96
94
97
- function sanitize_option() {
98
- local -r opt= $1
99
- if [[ ${opt} == * /cc_wrapper.sh ] ]; then
95
+ sanitize_option () {
96
+ so_opt= " $1 "
97
+ if [ " ${so_opt} " = " */cc_wrapper.sh" ]; then
100
98
printf " %s" " ${toolchain_path_prefix} bin/clang"
101
- elif [[ ${opt} =~ ^-fsanitize-(ignore| black)list= [^/] ]] && [[ ${script_dir} == /* ]]; then
99
+ elif eval " case $so_opt in *^-fsanitize-(ignore|black)list=[^/]*) [ $script_dir == /* ] ;; esac" ; then
100
+ # Split flag name and value.
101
+ #
102
102
# shellcheck disable=SC2206
103
- parts=(${opt/ =/ } ) # Split flag name and value into array.
104
- printf " %s" " ${parts[0]} =${script_dir} /../../../${parts[1]} "
103
+ part0=$( echo " $so_opt " | cut -d ' =' -f 1)
104
+ part1=$( echo " $so_opt " | cut -d ' =' -f 2)
105
+ printf " %s" " ${part0} =${script_dir} /../../../${part1} "
105
106
else
106
- printf " %s" " ${opt } "
107
+ printf " %s" " ${so_opt } "
107
108
fi
108
109
}
109
110
110
- cmd=()
111
- for (( i = 0 ; i <= $# ; i++ )) ; do
112
- if [[ ${! i} == @* && -r " ${i: 1} " ]]; then
111
+ COUNT=$#
112
+ i=0
113
+ while [ $i -le $COUNT ]; do
114
+ temp=" "
115
+ eval " temp=\$ {$i }"
116
+ substr=" ${temp# ?} "
117
+ if eval " case $temp in @*) [ -r $substr ] ;; esac" ; then
113
118
# Create a new, sanitized file.
114
119
tmpfile=$( mktemp)
115
- CLEANUP_FILES+=(" ${tmpfile} " )
120
+ # POSIX shell does not support arrays, so we write the cleanup files as an
121
+ # array-separated list. We do not need to worry about spaces in filenames,
122
+ # because `mktemp` cannot use them when using the default template.
123
+ CLEANUP_FILES=" ${CLEANUP_FILES} ${tmpfile} "
116
124
while IFS= read -r opt; do
117
125
opt=" $(
118
126
set -e
119
127
sanitize_option " ${opt} "
120
128
) "
121
129
parse_option " ${opt} "
122
130
echo " ${opt} " >> " ${tmpfile} "
123
- done < " ${ ! i : 1} "
124
- cmd+=( " @ ${ tmpfile}" )
131
+ done < " $substr "
132
+ cmd= " ${cmd} ${ tmpfile}"
125
133
else
126
134
opt=" $(
127
135
set -e
128
- sanitize_option " ${! i } "
136
+ sanitize_option " ${temp } "
129
137
) "
130
138
parse_option " ${opt} "
131
- cmd+=( " $ {opt}" )
139
+ cmd= " $cmd $ {opt}"
132
140
fi
141
+ i=$(( i + 1 ))
133
142
done
134
143
135
144
# Call the C++ compiler.
136
- " ${cmd[@]} "
145
+ ${cmd}
137
146
138
147
# Generate an empty file if header processing succeeded.
139
- if [[ " ${OUTPUT} " == * .h.processed ] ]; then
140
- echo -n > " ${OUTPUT} "
148
+ if [ " ${OUTPUT} " = " *.h.processed" ]; then
149
+ true > " ${OUTPUT} "
141
150
fi
0 commit comments