#!/bin/sh LC_ALL=C export LC_ALL test -z "$srcdir" && srcdir=. test -z "$libs" && libs=.libs stat=0 IGNORED_SYMBOLS='_fini\|_init\|_fdata\|_ftext\|_fbss\|__bss_start\|__bss_start__\|__bss_end__\|_edata\|_end\|_bss_end__\|__end__\|__gcov_flush\|llvm_.*' if which nm 2>/dev/null >/dev/null; then : else echo "check-symbols.sh: 'nm' not found; skipping test" exit 77 fi tested=false for soname in harfbuzz harfbuzz-subset harfbuzz-icu harfbuzz-gobject; do for suffix in so dylib; do so=$libs/lib$soname.$suffix if ! test -f "$so"; then continue; fi # On macOS, C symbols are prefixed with _ symprefix= if test $suffix = dylib; then symprefix=_; fi EXPORTED_SYMBOLS="`nm "$so" | grep ' [BCDGINRST] .' | grep -v " $symprefix\\($IGNORED_SYMBOLS\\>\\)" | cut -d' ' -f3 | c++filt`" prefix=$symprefix`basename "$so" | sed 's/libharfbuzz/hb/; s/-/_/g; s/[.].*//'` echo "Checking that $so does not expose internal symbols" if echo "$EXPORTED_SYMBOLS" | grep -v "^${prefix}\(_\|$\)"; then echo "Ouch, internal symbols exposed" stat=1 fi def=$soname.def if ! test -f "$def"; then echo "'$def' not found; skipping" else echo "Checking that $so has the same symbol list as $def" { echo EXPORTS echo "$EXPORTED_SYMBOLS" | sed -e "s/^${symprefix}hb/hb/g" # cheat: copy the last line from the def file! tail -n1 "$def" } | c++filt | diff "$def" - >&2 || stat=1 fi tested=true done done if ! $tested; then echo "check-symbols.sh: no shared libraries found; skipping test" exit 77 fi exit $stat