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