On Wed, Aug 3, 2022 at 3:49 AM Owen Rafferty <owen@xxxxxxxxxxxxxxxx> wrote: > > Remove the bash build dependency for those who otherwise do not have it > installed. This should also provide a slight speedup. I do not know if this is worth the effort, but do you have any benchmark on how fast it is? > > Signed-off-by: Owen Rafferty <owen@xxxxxxxxxxxxxxxx> > --- > scripts/check-local-export | 62 +++++++++++++++++--------------------- > 1 file changed, 28 insertions(+), 34 deletions(-) > > diff --git a/scripts/check-local-export b/scripts/check-local-export > index 6ccc2f467416..08fa4c989244 100755 > --- a/scripts/check-local-export > +++ b/scripts/check-local-export > @@ -1,4 +1,4 @@ > -#!/usr/bin/env bash > +#!/bin/sh > # SPDX-License-Identifier: GPL-2.0-only > # > # Copyright (C) 2022 Masahiro Yamada <masahiroy@xxxxxxxxxx> > @@ -8,31 +8,11 @@ > > set -e > > -# catch errors from ${NM} > -set -o pipefail > - > -# Run the last element of a pipeline in the current shell. > -# Without this, the while-loop would be executed in a subshell, and > -# the changes made to 'symbol_types' and 'export_symbols' would be lost. > -shopt -s lastpipe > - > -declare -A symbol_types > -declare -a export_symbols > +symbol_types="" > +export_symbols="" > > exit_code=0 > > -# If there is no symbol in the object, ${NM} (both GNU nm and llvm-nm) shows > -# 'no symbols' diagnostic (but exits with 0). It is harmless and hidden by > -# '2>/dev/null'. However, it suppresses real error messages as well. Add a > -# hand-crafted error message here. > -# > -# TODO: > -# Use --quiet instead of 2>/dev/null when we upgrade the minimum version of > -# binutils to 2.37, llvm to 13.0.0. > -# Then, the following line will be really simple: > -# ${NM} --quiet ${1} | > - > -{ ${NM} ${1} 2>/dev/null || { echo "${0}: ${NM} failed" >&2; false; } } | > while read value type name > do > # Skip the line if the number of fields is less than 3. > @@ -46,26 +26,40 @@ do > # case 2) > # For Clang LTO, llvm-nm outputs a line with type 't' but empty name: > # "---------------- t" > - if [[ -z ${name} ]]; then > + if [ -z ${name} ]; then > continue > fi > > - # save (name, type) in the associative array > - symbol_types[${name}]=${type} > + # save (name, type) in "associative array" > + symbol_types="$symbol_types ${name},${type}" > > # append the exported symbol to the array > - if [[ ${name} == __ksymtab_* ]]; then > - export_symbols+=(${name#__ksymtab_}) > - fi > -done > + case ${name} in __ksymtab_*) > + export_symbols="$export_symbols ${name#__ksymtab_}" > + esac > > -for name in "${export_symbols[@]}" > +# If there is no symbol in the object, ${NM} (both GNU nm and llvm-nm) shows > +# 'no symbols' diagnostic (but exits with 0). It is harmless and hidden by > +# '2>/dev/null'. However, it suppresses real error messages as well. Add a > +# hand-crafted error message here. > +# > +# TODO: > +# Use --quiet instead of 2>/dev/null when we upgrade the minimum version of > +# binutils to 2.37, llvm to 13.0.0. > +# Then, the following line will be simple: > +# $(${NM} --quiet ${1} || kill -INT $$) > +done <<EOF > +$( ${NM} ${1} 2>/dev/null || { echo "${0}: ${NM} failed" >&2; kill -INT $$; }) > +EOF > + > +for name in $export_symbols > do > - # nm(3) says "If lowercase, the symbol is usually local" > - if [[ ${symbol_types[$name]} =~ [a-z] ]]; then > + type="${symbol_types##* $name,}" > + type="${type%% *}" > + case ${type} in [a-z]) > echo "$@: error: local symbol '${name}' was exported" >&2 > exit_code=1 > - fi > + esac > done > > exit ${exit_code} > -- > 2.37.1 > -- Best Regards Masahiro Yamada