diff --git a/src/Makefile.am b/src/Makefile.am index effb6bc85..81802252f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -329,6 +329,7 @@ test_buffer_serialize_LDADD = libharfbuzz.la $(HBLIBS) dist_check_SCRIPTS = \ check-c-linkage-decls.sh \ + check-defs.sh \ check-header-guards.sh \ check-includes.sh \ check-libstdc++.sh \ diff --git a/src/check-defs.sh b/src/check-defs.sh new file mode 100755 index 000000000..d7a8ec281 --- /dev/null +++ b/src/check-defs.sh @@ -0,0 +1,44 @@ +#!/bin/sh + +LC_ALL=C +export LC_ALL + +test -z "$srcdir" && srcdir=. +test -z "$MAKE" && MAKE=make +stat=0 + +if which nm 2>/dev/null >/dev/null; then + : +else + echo "check-defs.sh: 'nm' not found; skipping test" + exit 77 +fi + +defs="harfbuzz.def" +$MAKE $defs > /dev/null +tested=false +for def in $defs; do + lib=`echo "$def" | sed 's/[.]def$//;s@.*/@@'` + so=.libs/lib${lib}.so + + EXPORTED_SYMBOLS="`nm "$so" | grep ' [BCDGINRSTVW] ' | grep -v ' _fini\>\| _init\>\| _fdata\>\| _ftext\>\| __bss_start\>\| __bss_start__\>\| __bss_end__\>\| _edata\>\| _end\>\| _bss_end__\>\| __end__\>' | cut -d' ' -f3`" + + if test -f "$so"; then + + echo "Checking that $so has the same symbol list as $def" + { + echo EXPORTS + echo "$EXPORTED_SYMBOLS" + # cheat: copy the last line from the def file! + tail -n1 "$def" + } | diff "$def" - >&2 || stat=1 + + tested=true + fi +done +if ! $tested; then + echo "check-defs.sh: libharfbuzz shared library not found; skipping test" + exit 77 +fi + +exit $stat diff --git a/src/check-symbols.sh b/src/check-symbols.sh index 73bfc9e9b..67bdf71e1 100755 --- a/src/check-symbols.sh +++ b/src/check-symbols.sh @@ -4,9 +4,9 @@ LC_ALL=C export LC_ALL test -z "$srcdir" && srcdir=. -test -z "$MAKE" && MAKE=make stat=0 + if which nm 2>/dev/null >/dev/null; then : else @@ -14,36 +14,23 @@ else exit 77 fi -defs="harfbuzz.def" -$MAKE $defs > /dev/null +echo "Checking that we are not exposing internal symbols" tested=false -for def in $defs; do - lib=`echo "$def" | sed 's/[.]def$//;s@.*/@@'` - so=.libs/lib${lib}.so - +for so in `ls .libs/lib*.so .libs/lib*.dylib 2>/dev/null` ; do + EXPORTED_SYMBOLS="`nm "$so" | grep ' [BCDGINRSTVW] ' | grep -v ' _fini\>\| _init\>\| _fdata\>\| _ftext\>\| __bss_start\>\| __bss_start__\>\| __bss_end__\>\| _edata\>\| _end\>\| _bss_end__\>\| __end__\>' | cut -d' ' -f3`" + prefix=`basename "$so" | sed 's/libharfbuzz/hb/; s/-/_/g; s/[.].*//'` - if test -f "$so"; then - - echo "Checking that $so has the same symbol list as $def" - { - echo EXPORTS - echo "$EXPORTED_SYMBOLS" - # cheat: copy the last line from the def file! - tail -n1 "$def" - } | diff "$def" - >&2 || stat=1 - - echo "Checking that we are not exposing internal symbols" - if echo "$EXPORTED_SYMBOLS" | grep -v 'hb_'; then - echo "Ouch, internal symbols exposed" - stat=1 - fi - - tested=true + echo "Processing $so" + if echo "$EXPORTED_SYMBOLS" | grep -v "^${prefix}_"; then + echo "Ouch, internal symbols exposed" + stat=1 fi + + tested=true done if ! $tested; then - echo "check-exported-symbols.sh: libharfbuzz shared library not found; skipping test" + echo "check-symbols.sh: no shared library found; skipping test" exit 77 fi