From: Dan Kegel Date: Thu, 2 Jul 2020 17:21:50 +0000 (-0700) Subject: CMakeLists.txt, configure: match source order; .so's now identical on more platforms. X-Git-Tag: 1.9.9-b1~127 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c71ca170224f31a219513aa470f82aa50a3ded48;p=thirdparty%2Fzlib-ng.git CMakeLists.txt, configure: match source order; .so's now identical on more platforms. Also: - use same name for .so on CMake and configure in --zlib-compat case - configure: merge i686 and x86_64 sections, since they were essentially identical - pkgcheck.sh: verify resulting shared libraries are bit-for-bit identical - pkgcheck.sh: use diffoscope if present to show differences in shared libraries Don't install diffoscope in ci, since that slows down successful runs; we can add it later if failures become common. Fixes #638 (at least for the systems tested) --- diff --git a/CMakeLists.txt b/CMakeLists.txt index e18f3c0d..52902043 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -648,6 +648,13 @@ if(WITH_OPTIM) add_definitions(-DARM_CPUID) list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/arm.h) list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/armfeature.c) + if(WITH_ACLE AND NOT MSVC) + add_definitions(-DARM_ACLE_CRC_HASH) + set(ACLE_SRCS ${ARCHDIR}/crc32_acle.c ${ARCHDIR}/insert_string_acle.c) + set_property(SOURCE ${ACLE_SRCS} PROPERTY COMPILE_FLAGS "${ACLEFLAG}") + list(APPEND ZLIB_ARCH_SRCS ${ACLE_SRCS}) + add_feature_info(ACLE_CRC 1 "Support ACLE optimized CRC hash generation, using \"${ACLEFLAG}\"") + endif() if(WITH_NEON) add_definitions(-DARM_NEON_ADLER32 -DARM_NEON_CHUNKSET -DARM_NEON_SLIDEHASH) set(NEON_SRCS ${ARCHDIR}/adler32_neon.c ${ARCHDIR}/chunkset_neon.c ${ARCHDIR}/slide_neon.c) @@ -659,13 +666,6 @@ if(WITH_OPTIM) add_feature_info(NEON_ALDER32 1 "Support NEON instructions in adler32, using \"${NEONFLAG}\"") add_feature_info(NEON_SLIDEHASH 1 "Support NEON instructions in slide_hash, using \"${NEONFLAG}\"") endif() - if(WITH_ACLE AND NOT MSVC) - add_definitions(-DARM_ACLE_CRC_HASH) - set(ACLE_SRCS ${ARCHDIR}/crc32_acle.c ${ARCHDIR}/insert_string_acle.c) - set_property(SOURCE ${ACLE_SRCS} PROPERTY COMPILE_FLAGS "${ACLEFLAG}") - list(APPEND ZLIB_ARCH_SRCS ${ACLE_SRCS}) - add_feature_info(ACLE_CRC 1 "Support ACLE optimized CRC hash generation, using \"${ACLEFLAG}\"") - endif() elseif(BASEARCH_PPC_FOUND) if(WITH_POWER8 AND HAVE_POWER8) add_definitions(-DPOWER8) @@ -849,15 +849,15 @@ set(ZLIB_SRCS compress.c crc32.c deflate.c - deflate_quick.c deflate_fast.c deflate_medium.c + deflate_quick.c deflate_slow.c functable.c - inflate.c infback.c - inftrees.c inffast.c + inflate.c + inftrees.c insert_string.c trees.c uncompr.c diff --git a/configure b/configure index 09b9f73f..ee7fbf85 100755 --- a/configure +++ b/configure @@ -902,7 +902,7 @@ fi # Check for SSE2 intrinsics case "${ARCH}" in - i386 | i486 | i586 | i686) + i386 | i486 | i586 | i686 | x86_64) cat > $test.c << EOF #include int main(void) { @@ -1120,8 +1120,8 @@ ARCH_SHARED_OBJS='' # Set ARCH specific FLAGS case "${ARCH}" in - # x86 specific optimizations - i386 | i486 | i586 | i686) + # x86/amd64 specific optimizations + i386 | i486 | i586 | i686 |x86_64) ARCHDIR=arch/x86 CFLAGS="${CFLAGS} -DUNALIGNED_OK -DUNALIGNED64_OK" @@ -1135,31 +1135,11 @@ case "${ARCH}" in ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} x86.o" ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} x86.lo" - if test ${HAVE_SSE2_INTRIN} -eq 1; then - CFLAGS="${CFLAGS} -DX86_SSE2 -DX86_SSE2_CHUNKSET" - SFLAGS="${SFLAGS} -DX86_SSE2 -DX86_SSE2_CHUNKSET" - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} chunkset_sse.o slide_sse.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} chunkset_sse.lo slide_sse.lo" - - if test $forcesse2 -eq 1; then - CFLAGS="${CFLAGS} -DX86_NOCHECK_SSE2" - SFLAGS="${SFLAGS} -DX86_NOCHECK_SSE2" - fi - fi - - if test ${HAVE_SSSE3_INTRIN} -eq 1; then - CFLAGS="${CFLAGS} -DX86_SSSE3 -DX86_SSSE3_ADLER32" - SFLAGS="${SFLAGS} -DX86_SSSE3 -DX86_SSSE3_ADLER32" - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} adler32_ssse3.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} adler32_ssse3.lo" - fi - - if test ${HAVE_SSE42CMPSTR_INTRIN} -eq 1; then - CFLAGS="${CFLAGS} -DX86_SSE42_CMP_STR" - SFLAGS="${SFLAGS} -DX86_SSE42_CMP_STR" - - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} compare258_sse.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} compare258_sse.lo" + if test ${HAVE_AVX2_INTRIN} -eq 1; then + CFLAGS="${CFLAGS} -DX86_AVX2 -DX86_AVX2_ADLER32" + SFLAGS="${SFLAGS} -DX86_AVX2 -DX86_AVX2_ADLER32" + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} slide_avx.o compare258_avx.o adler32_avx.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} slide_avx.lo compare258_avx.lo adler32_avx.lo" fi if test ${HAVE_SSE42CRC_INTRIN} -eq 1 || test ${HAVE_SSE42CRC_INLINE_ASM} -eq 1; then @@ -1175,37 +1155,25 @@ case "${ARCH}" in ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} insert_string_sse.lo" fi - if test ${HAVE_AVX2_INTRIN} -eq 1; then - CFLAGS="${CFLAGS} -DX86_AVX2 -DX86_AVX2_ADLER32" - SFLAGS="${SFLAGS} -DX86_AVX2 -DX86_AVX2_ADLER32" - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} compare258_avx.o slide_avx.o adler32_avx.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} compare258_avx.lo slide_avx.lo adler32_avx.lo" - fi + if test ${HAVE_SSE42CMPSTR_INTRIN} -eq 1; then + CFLAGS="${CFLAGS} -DX86_SSE42_CMP_STR" + SFLAGS="${SFLAGS} -DX86_SSE42_CMP_STR" - if test ${HAVE_PCLMULQDQ_INTRIN} -eq 1; then - CFLAGS="${CFLAGS} -DX86_PCLMULQDQ_CRC" - SFLAGS="${SFLAGS} -DX86_PCLMULQDQ_CRC" - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} crc_folding.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} crc_folding.lo" + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} compare258_sse.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} compare258_sse.lo" fi - fi - ;; - - # x86_64 specific optimizations - x86_64) - ARCHDIR=arch/x86 - - CFLAGS="${CFLAGS} -DUNALIGNED_OK -DUNALIGNED64_OK" - SFLAGS="${SFLAGS} -DUNALIGNED_OK -DUNALIGNED64_OK" - - # Enable arch-specific optimizations - if test $without_optimizations -eq 0; then - CFLAGS="${CFLAGS} -DX86_CPUID -DX86_SSE2 -DX86_SSE2_CHUNKSET" - SFLAGS="${SFLAGS} -DX86_CPUID -DX86_SSE2 -DX86_SSE2_CHUNKSET" + if test ${HAVE_SSE2_INTRIN} -eq 1; then + CFLAGS="${CFLAGS} -DX86_SSE2 -DX86_SSE2_CHUNKSET" + SFLAGS="${SFLAGS} -DX86_SSE2 -DX86_SSE2_CHUNKSET" + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} chunkset_sse.o slide_sse.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} chunkset_sse.lo slide_sse.lo" - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} x86.o chunkset_sse.o slide_sse.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} x86.lo chunkset_sse.lo slide_sse.lo" + if test $forcesse2 -eq 1; then + CFLAGS="${CFLAGS} -DX86_NOCHECK_SSE2" + SFLAGS="${SFLAGS} -DX86_NOCHECK_SSE2" + fi + fi if test ${HAVE_SSSE3_INTRIN} -eq 1; then CFLAGS="${CFLAGS} -DX86_SSSE3 -DX86_SSSE3_ADLER32" @@ -1214,46 +1182,12 @@ case "${ARCH}" in ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} adler32_ssse3.lo" fi - if test ${HAVE_SSE42CRC_INTRIN} -eq 1; then - CFLAGS="${CFLAGS} -DX86_SSE42_CRC_INTRIN" - SFLAGS="${SFLAGS} -DX86_SSE42_CRC_INTRIN" - fi - if test ${HAVE_PCLMULQDQ_INTRIN} -eq 1; then CFLAGS="${CFLAGS} -DX86_PCLMULQDQ_CRC" SFLAGS="${SFLAGS} -DX86_PCLMULQDQ_CRC" ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} crc_folding.o" ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} crc_folding.lo" fi - - if test ${HAVE_AVX2_INTRIN} -eq 1; then - CFLAGS="${CFLAGS} -DX86_AVX2 -DX86_AVX2_ADLER32" - SFLAGS="${SFLAGS} -DX86_AVX2 -DX86_AVX2_ADLER32" - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} compare258_avx.o slide_avx.o adler32_avx.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} compare258_avx.lo slide_avx.lo adler32_avx.lo" - fi - - if test ${HAVE_SSE42CMPSTR_INTRIN} -eq 1; then - CFLAGS="${CFLAGS} -DX86_SSE42_CMP_STR" - SFLAGS="${SFLAGS} -DX86_SSE42_CMP_STR" - - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} compare258_sse.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} compare258_sse.lo" - fi - - if test ${HAVE_SSE42CRC_INTRIN} -eq 1 || test ${HAVE_SSE42CRC_INLINE_ASM} -eq 1; then - CFLAGS="${CFLAGS} -DX86_SSE42_CRC_HASH" - SFLAGS="${SFLAGS} -DX86_SSE42_CRC_HASH" - - if test ${HAVE_SSE42CRC_INTRIN} -eq 1; then - CFLAGS="${CFLAGS} -DX86_SSE42_CRC_INTRIN" - SFLAGS="${SFLAGS} -DX86_SSE42_CRC_INTRIN" - fi - - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} insert_string_sse.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} insert_string_sse.lo" - fi - fi ;; @@ -1444,8 +1378,8 @@ case "${ARCH}" in CFLAGS="${CFLAGS} -DPOWER8 -DPOWER_FEATURES -DPOWER8_VSX_ADLER32 -DPOWER8_VSX_SLIDEHASH" SFLAGS="${SFLAGS} -DPOWER8 -DPOWER_FEATURES -DPOWER8_VSX_ADLER32 -DPOWER8_VSX_SLIDEHASH" - ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} adler32_power8.o power.o slide_hash_power8.o" - ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} adler32_power8.lo power.lo slide_hash_power8.lo" + ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} power.o adler32_power8.o slide_hash_power8.o" + ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} power.lo adler32_power8.lo slide_hash_power8.lo" fi fi ;; diff --git a/test/pkgcheck.sh b/test/pkgcheck.sh index fa25e40d..4c757dff 100644 --- a/test/pkgcheck.sh +++ b/test/pkgcheck.sh @@ -9,8 +9,8 @@ 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 +$ sudo apt install ninja-build diffoscope gcc-multilib +$ export CMAKE_ARGS="-DCMAKE_C_FLAGS=-m32" CFLAGS=-m32 LDFLAGS=-m32 $ sh test/pkgcheck.sh To cross-build, install the appropriate qemu and gcc packages, @@ -18,22 +18,22 @@ 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 +$ sudo apt install ninja-build diffoscope 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 +$ sudo apt install ninja-build diffoscope 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 +$ sudo apt install ninja-build diffoscope 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 +$ sudo apt install ninja-build diffoscope qemu gcc-powerpc64le-linux-gnu libc6-dev-ppc64el-cross $ export CHOST=powerpc64le-linux-gnu $ export CMAKE_ARGS="-DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64le.cmake" @@ -124,9 +124,6 @@ cd btmp1 export LDFLAGS="-Wl,-headerpad_max_install_names" ;; esac - # 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 @@ -145,6 +142,16 @@ repack_ar() { fi } +case $(uname) in +Darwin) + # Remove the build uuid. + dylib1=$(find pkgtmp1 -type f -name '*.dylib*') + dylib2=$(find pkgtmp2 -type f -name '*.dylib*') + strip -x -no_uuid "$dylib1" + strip -x -no_uuid "$dylib2" + ;; +esac + # 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, @@ -152,11 +159,14 @@ repack_ar() { # Also, cmake uses different .o suffix anyway... repack_ar -if diff --exclude '*.dylib*' --exclude '*.so*' -Nur pkgtmp1 pkgtmp2 +if diff -Nur pkgtmp1 pkgtmp2 then echo pkgcheck-cmake-bits-identical PASS else echo pkgcheck-cmake-bits-identical FAIL + dylib1=$(find pkgtmp1 -type f -name '*.dylib*' -print -o -type f -name '*.so.*' -print) + dylib2=$(find pkgtmp2 -type f -name '*.dylib*' -print -o -type f -name '*.so.*' -print) + diffoscope $dylib1 $dylib2 | cat exit 1 fi