diff options
author | Dan Kegel <dank@kegel.com> | 2020-06-19 08:50:13 -0700 |
---|---|---|
committer | Hans Kristian Rosbach <hk-github@circlestorm.org> | 2020-07-13 16:25:34 +0200 |
commit | 1e2877069fcd2d02802b00c0b65f0bf4d6ade63f (patch) | |
tree | aee7232113373c45680a06843ac34326e05cbe4c /test | |
parent | c7969f5ac724b47f1fee5fe17a140c8526c34f27 (diff) |
Make static libraries produced by cmake and configure identical.
Also make compat mode .pc files identical.
- cmake: don't do runtime feature checks when doing native builds.
- test/pkgcheck.sh: also compare .a, check compat mode, and handle mac better
- CMakeLists.txt: get Version right in compat mode .pc file
- .github/workflows/pkgcheck.sh: test on more systems, including mac
Fixes #681
Diffstat (limited to 'test')
-rw-r--r-- | test/pkgcheck.sh | 131 |
1 files changed, 117 insertions, 14 deletions
diff --git a/test/pkgcheck.sh b/test/pkgcheck.sh index 9a560b5..fa25e40 100644 --- a/test/pkgcheck.sh +++ b/test/pkgcheck.sh @@ -1,9 +1,92 @@ #!/bin/sh -# Verify that the various build systems produce identical results on a Unixlike system + +usage() { + cat <<"_EOF_" +Usage: sh test/pkgcheck.sh [--zlib-compat] + +Verifies that the various build systems produce identical results on a Unixlike system. +If --zlib-compat, tests with zlib compatible builds. + +To build the 32 bit version for the current 64 bit arch: + +$ sudo apt install ninja-build gcc-multilib +$ export CMAKE_ARGS="-DCMAKE_C_FLAGS=-m32" LDFLAGS=-m32 +$ sh test/pkgcheck.sh + +To cross-build, install the appropriate qemu and gcc packages, +and set the environment variables used by configure or cmake. +On Ubuntu, for example (values taken from .github/workflows/pkgconf.yml): + +arm HF: +$ sudo apt install ninja-build qemu gcc-arm-linux-gnueabihf libc6-dev-armhf-cross +$ export CHOST=arm-linux-gnueabihf +$ export CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-arm.cmake -DCMAKE_C_COMPILER_TARGET=${CHOST}" + +aarch64: +$ sudo apt install ninja-build qemu gcc-aarch64-linux-gnu libc6-dev-arm64-cross +$ export CHOST=aarch64-linux-gnu +$ export CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64.cmake -DCMAKE_C_COMPILER_TARGET=${CHOST}" + +ppc (32 bit big endian): +$ sudo apt install ninja-build qemu gcc-powerpc-linux-gnu libc6-dev-powerpc-cross +$ export CHOST=powerpc-linux-gnu +$ export CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc.cmake" + +ppc64le: +$ sudo apt install ninja-build qemu gcc-powerpc64le-linux-gnu libc6-dev-ppc64el-cross +$ export CHOST=powerpc64le-linux-gnu +$ export CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64le.cmake" + +then: +$ export CC=${CHOST}-gcc +$ sh test/pkgcheck.sh [--zlib-compat] + +Note: on Mac, you may also need to do 'sudo xcode-select -r' to get cmake to match configure/make's behavior (i.e. omit -isysroot). +_EOF_ +} + set -ex -# If suffix not set to "", default to -ng -suffix=${suffix--ng} +# Caller can also set CMAKE_ARGS or CONFIGURE_ARGS if desired +CMAKE_ARGS=${CMAKE_ARGS} +CONFIGURE_ARGS=${CONFIGURE_ARGS} + +case "$1" in +--zlib-compat) + suffix="" + CMAKE_ARGS="$CMAKE_ARGS -DZLIB_COMPAT=ON" + CONFIGURE_ARGS="$CONFIGURE_ARGS --zlib-compat" + ;; +"") + suffix="-ng" + ;; +*) + echo "Unknown arg '$1'" + usage + exit 1 + ;; +esac + +if ! test -f "configure" +then + echo "Please run from top of source tree" + exit 1 +fi + +# Tell GNU's ld etc. to use Jan 1 1970 when embedding timestamps +# Probably only needed on older systems (ubuntu 14.04, BSD?) +export SOURCE_DATE_EPOCH=0 +case $(uname) in +Darwin) + # Tell Apple's ar etc. to use zero timestamps + export ZERO_AR_DATE=1 + # What CPU are we running on, exactly? + sysctl -n machdep.cpu.brand_string + sysctl -n machdep.cpu.features + sysctl -n machdep.cpu.leaf7_features + sysctl -n machdep.cpu.extfeatures + ;; +esac # Use same compiler for make and cmake builds if test "$CC"x = ""x @@ -26,7 +109,7 @@ rm -rf btmp2 pkgtmp2 mkdir btmp2 pkgtmp2 export DESTDIR=$(pwd)/pkgtmp2 cd btmp2 - cmake -G Ninja .. + cmake -G Ninja ${CMAKE_ARGS} .. ninja -v ninja install cd .. @@ -40,24 +123,44 @@ cd btmp1 Darwin) export LDFLAGS="-Wl,-headerpad_max_install_names" ;; - Linux) - if grep -i fedora /etc/os-release > /dev/null - then - # Note: Fedora patches cmake to use -O2 in release, which - # does not match the -O3 configure sets :-( - export CFLAGS="-O2 -DNDEBUG" - fi - ;; esac - ../configure + # Use same flags as cmake did. + CFLAGS="$(awk -F= '/CMAKE_C_FLAGS:/ {print $2}' < ../btmp2/CMakeCache.txt | tr '\012' ' ')" + export CFLAGS + ../configure $CONFIGURE_ARGS make make install cd .. -if diff --exclude '*.so*' --exclude '*.a' -Nur pkgtmp1 pkgtmp2 +repack_ar() { + if ! cmp --silent pkgtmp1/usr/local/lib/libz$suffix.a pkgtmp2/usr/local/lib/libz$suffix.a + then + echo "libz$suffix.a does not match. Probably filenames differ (.o vs .c.o). Unpacking and renaming..." + # Note: %% is posix shell syntax meaning "Remove Largest Suffix Pattern", see + # https://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_02 + cd pkgtmp1; ar x usr/local/lib/libz$suffix.a; rm usr/local/lib/libz$suffix.a; cd .. + cd pkgtmp2; ar x usr/local/lib/libz$suffix.a; rm usr/local/lib/libz$suffix.a; for a in *.c.o; do mv $a ${a%%.c.o}.o; done; cd .. + # Also, remove __.SYMDEF SORTED if present, as it has those funky .c.o names embedded in it. + rm -f pkgtmp[12]/__.SYMDEF\ SORTED + fi +} + +# The ar on newer systems defaults to -D (i.e. deterministic), +# but FreeBSD 12.1, Debian 8, and Ubuntu 14.04 seem to not do that. +# I had trouble passing -D safely to the ar inside CMakeLists.txt, +# so punt and unpack the archive if needed before comparing. +# Also, cmake uses different .o suffix anyway... +repack_ar + +if diff --exclude '*.dylib*' --exclude '*.so*' -Nur pkgtmp1 pkgtmp2 then echo pkgcheck-cmake-bits-identical PASS else echo pkgcheck-cmake-bits-identical FAIL exit 1 fi + +rm -rf btmp1 btmp2 pkgtmp1 pkgtmp2 + +# any failure would have caused an early exit already +echo "pkgcheck: PASS" |