From 9c9d0f8623d0024abbe4a47a69e9b4fbeb22fa07 Mon Sep 17 00:00:00 2001 From: Maxim Biro Date: Sat, 30 Oct 2021 19:44:30 -0400 Subject: [PATCH] refactor(windows): simplify dll check logic Instead of checking every .exe separately, loop over all of them with the same checks. --- windows/cross-compile/build.sh | 132 ++++++++++++++------------------- 1 file changed, 57 insertions(+), 75 deletions(-) diff --git a/windows/cross-compile/build.sh b/windows/cross-compile/build.sh index b6024fa74..de8f21181 100644 --- a/windows/cross-compile/build.sh +++ b/windows/cross-compile/build.sh @@ -1460,72 +1460,6 @@ then fi winecfg -# qtox.exe dll checks -# (system32 contains 32-bit libraries on win32 prefix, but 64-bit on win64 -# prefix) -python3 $MINGW_LDD_PREFIX_DIR/bin/mingw-ldd.py $QTOX_PREFIX_DIR/qtox.exe --dll-lookup-dirs $QTOX_PREFIX_DIR ~/.wine/drive_c/windows/system32 > /tmp/$ARCH-qtox-ldd -find "$QTOX_PREFIX_DIR" -name '*.dll' > /tmp/$ARCH-qtox-dll-find -# dlls loded at run time that don't showup as a link time dependency -echo "$QTOX_PREFIX_DIR/libssl-1_1.dll -$QTOX_PREFIX_DIR/libssl-1_1-x64.dll -$QTOX_PREFIX_DIR/libsnore-qt5/libsnore_backend_windowstoast.dll -$QTOX_PREFIX_DIR/iconengines/qsvgicon.dll -$QTOX_PREFIX_DIR/imageformats/qgif.dll -$QTOX_PREFIX_DIR/imageformats/qico.dll -$QTOX_PREFIX_DIR/imageformats/qjpeg.dll -$QTOX_PREFIX_DIR/imageformats/qsvg.dll -$QTOX_PREFIX_DIR/platforms/qdirect2d.dll -$QTOX_PREFIX_DIR/platforms/qminimal.dll -$QTOX_PREFIX_DIR/platforms/qoffscreen.dll -$QTOX_PREFIX_DIR/platforms/qwindows.dll" > /tmp/$ARCH-qtox-dll-whitelist - - -# Check that all dlls are in place -if grep 'not found' /tmp/$ARCH-qtox-ldd -then - cat /tmp/$ARCH-qtox-ldd - echo "Error: Missing some dlls." - exit 1 -fi - -# Check that no extra dlls get bundled -while IFS= read -r line -do - # skip over whitelisted dlls - if grep "$line" /tmp/$ARCH-qtox-dll-whitelist - then - continue - fi - if ! grep "$line" /tmp/$ARCH-qtox-ldd - then - echo "Error: extra dll included: $line. If this is a mistake and the dll is actually needed (e.g. it's loaded at run-time), please add it to the whitelist." - exit 1 - fi -done < /tmp/$ARCH-qtox-dll-find - - -# SnoreToast.exe dll checks -# (always 32-bit as SnoreToast.exe is 32-bit itself, so check system32 on win32 -# prefix but syswow64 on win64 prefix) -if [[ "$ARCH" == "i686" ]] -then - SNORETOAST_WINE_DLLS=/root/.wine/drive_c/windows/system32 -elif [[ "$ARCH" == "x86_64" ]] -then - SNORETOAST_WINE_DLLS=/root/.wine/drive_c/windows/syswow64 -fi - -python3 $MINGW_LDD_PREFIX_DIR/bin/mingw-ldd.py $QTOX_PREFIX_DIR/SnoreToast.exe --dll-lookup-dirs $SNORETOAST_WINE_DLLS > /tmp/$ARCH-SnoreToast-ldd - -# Check that all dlls are in place -if grep 'not found' /tmp/$ARCH-SnoreToast-ldd -then - cat /tmp/$ARCH-SnoreToast-ldd - echo "Error: Missing some dlls." - exit 1 -fi - - # Run tests (only on Travis) set +u if [[ -n "$TRAVIS_CI_STAGE" ]] @@ -1549,15 +1483,6 @@ then # Get debug scripts cp -r $MINGW_W64_DEBUG_SCRIPTS_PREFIX_DIR/bin/* "$QTOX_PREFIX_DIR/" cp -r $GDB_PREFIX_DIR/bin/gdb.exe "$QTOX_PREFIX_DIR/" - - # Check that all dlls are in place - python3 $MINGW_LDD_PREFIX_DIR/bin/mingw-ldd.py $QTOX_PREFIX_DIR/gdb.exe --dll-lookup-dirs $QTOX_PREFIX_DIR ~/.wine/drive_c/windows/system32 > /tmp/$ARCH-gdb-ldd - if grep 'not found' /tmp/$ARCH-gdb-ldd - then - cat /tmp/$ARCH-gdb-ldd - echo "Error: Missing some dlls." - exit 1 - fi fi # Strip @@ -1598,6 +1523,63 @@ then cd .. fi +# dll check +# Create lists of all .exe and .dll files +find "$QTOX_PREFIX_DIR" -iname '*.dll' > dlls +find "$QTOX_PREFIX_DIR" -iname '*.exe' > exes + +# Create a list of dlls that are loaded during the runtime (not listed in the PE +# import table, thus ldd doesn't print those) +echo "$QTOX_PREFIX_DIR/libsnore-qt5/libsnore_backend_windowstoast.dll +$QTOX_PREFIX_DIR/iconengines/qsvgicon.dll +$QTOX_PREFIX_DIR/imageformats/qgif.dll +$QTOX_PREFIX_DIR/imageformats/qico.dll +$QTOX_PREFIX_DIR/imageformats/qjpeg.dll +$QTOX_PREFIX_DIR/imageformats/qsvg.dll +$QTOX_PREFIX_DIR/platforms/qdirect2d.dll +$QTOX_PREFIX_DIR/platforms/qminimal.dll +$QTOX_PREFIX_DIR/platforms/qoffscreen.dll +$QTOX_PREFIX_DIR/platforms/qwindows.dll" > runtime-dlls +if [[ "$ARCH" == "i686" ]] +then + echo "$QTOX_PREFIX_DIR/libssl-1_1.dll" >> runtime-dlls +elif [[ "$ARCH" == "x86_64" ]] +then + echo "$QTOX_PREFIX_DIR/libssl-1_1-x64.dll" >> runtime-dlls +fi + +# Create a tree of all required dlls +# Assumes all .exe files are directly in $QTOX_PREFIX_DIR, not in subdirs +while IFS= read -r line +do + if [[ "$ARCH" == "i686" ]] + then + WINE_DLL_DIR="/root/.wine/drive_c/windows/system32" + elif [[ "$ARCH" == "x86_64" ]] + then + WINE_DLL_DIR="/root/.wine/drive_c/windows/system32 /root/.wine/drive_c/windows/syswow64" + fi + python3 $MINGW_LDD_PREFIX_DIR/bin/mingw-ldd.py $line --dll-lookup-dirs $QTOX_PREFIX_DIR $WINE_DLL_DIR --output-format tree >> dlls-required +done < <(cat exes runtime-dlls) + +# Check that no extra dlls get bundled +while IFS= read -r line +do + if ! grep -q "$line" dlls-required + then + echo "Error: extra dll included: $line. If this is a mistake and the dll is actually needed (e.g. it's loaded at runtime), please add it to the runtime dll list." + exit 1 + fi +done < dlls + +# Check that no dll is missing +if grep -q 'not found' dlls-required +then + cat dlls-required + echo "Error: Missing some dlls." + exit 1 +fi + cd .. rm -rf ./qtox