From 9887b96f08f2583155108c9966c585d59b50b784 Mon Sep 17 00:00:00 2001 From: Adam Celarek <5292991+adam-ce@users.noreply.github.com> Date: Wed, 25 Dec 2024 09:16:23 +0100 Subject: [PATCH] try if wasm works when resetting everything --- .github/workflows/deploy.yml | 134 ++++++++++++++++++----------------- misc/qt_lite.txt | 9 ++- 2 files changed, 77 insertions(+), 66 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 327f2707..5e3c4227 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -16,52 +16,62 @@ concurrency: cancel-in-progress: true jobs: - build-android: + build: runs-on: ubuntu-latest strategy: fail-fast: false matrix: - qtarch: [android_arm64_v8a, android_armv7] + qtarch: [wasm_singlethread, wasm_multithread, android_arm64_v8a, android_armv7] + qtversion: ['6.6.1'] include: + - qtarch: wasm_singlethread + qttarget: 'desktop' + qtmodules: '' + additional_build_flags: '--target install' + - qtarch: wasm_multithread + qttarget: 'desktop' + qtmodules: '' + additional_cmake_flags: '-DALP_ENABLE_THREADING=ON' + additional_build_flags: '--target install' - qtarch: android_arm64_v8a qttarget: 'android' - qtversion: '6.8.1' qtmodules: 'qtcharts qtpositioning' - qtarch: android_armv7 qttarget: 'android' - qtversion: '6.8.1' qtmodules: 'qtcharts qtpositioning' steps: - name: Install dependencies run: | sudo apt-get update - sudo apt-get install -y build-essential ninja-build openjdk-17-jdk - echo "JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/" >> $GITHUB_ENV - # dpkg-query -L openjdk-17-jdk-headless + sudo apt-get install -y build-essential ninja-build - uses: actions/checkout@v4 with: fetch-depth: 0 fetch-tags: true + + - uses: mymindstorm/setup-emsdk@v13 + if: matrix.qttarget == 'desktop' + with: + version: 3.1.37 - - name: Install Qt native version (the one provided by aqt doesn't seem to work) - uses: jurplel/install-qt-action@v4 + - name: Install Qt native version (required by android version) + uses: jurplel/install-qt-action@v3 with: aqtversion: '==3.1.*' version: ${{ matrix.qtversion }} - host: 'linux' + host: linux target: 'desktop' - arch: 'linux_gcc_64' + arch: gcc_64 dir: '${{github.workspace}}/qt' install-deps: 'true' - cache: true - - name: Set QT_HOST_ROOT_DIR - run: echo "QT_HOST_ROOT_DIR=${QT_ROOT_DIR}" >> "$GITHUB_ENV" - + - name: Set QT_HOST_PATH + run: echo "QT_HOST_PATH=${Qt6_DIR}" >> "$GITHUB_ENV" + - name: Install Qt crosscompile target version - uses: jurplel/install-qt-action@v4 + uses: jurplel/install-qt-action@v3 with: aqtversion: '==3.1.*' version: ${{ matrix.qtversion }} @@ -71,11 +81,14 @@ jobs: dir: '${{github.workspace}}/qt' install-deps: 'true' modules: ${{ matrix.qtmodules }} - cache: true - name: Make qt cross binaries executable run: | - chmod u+x ${QT_ROOT_DIR}/bin/* + chmod u+x ${Qt6_DIR}/bin/* + + - name: Verify emcc + if: matrix.qttarget == 'desktop' + run: emcc -v - name: Set reusable strings shell: bash @@ -89,15 +102,18 @@ jobs: echo "APK_DIR=$BUILD_DIR/$APK_TARGET/android-build/build/outputs/apk/" >> $GITHUB_ENV echo "ANDROID_BUILD_DIR=$BUILD_DIR/$APK_TARGET/android-build/" >> $GITHUB_ENV echo "DEPLOYMENT_SETTINGS=$BUILD_DIR/$APK_TARGET/android-alpineapp-deployment-settings.json" >> $GITHUB_ENV + + - name: Remove StatsWindow, otherwise the webassembly will link against qtwidgets and charts. + if: matrix.qttarget == 'desktop' + run: rm ./app/StatsWindow.qml - name: Configure CMake env: - CMAKE_PREFIX_PATH: ${{env.QT_ROOT_DIR}}/lib/cmake + CMAKE_PREFIX_PATH: ${{env.Qt6_DIR}}/lib/cmake run: > - ${QT_ROOT_DIR}/bin/qt-cmake + ${Qt6_DIR}/bin/qt-cmake -G Ninja -B $BUILD_DIR - -DQT_HOST_PATH=${QT_HOST_ROOT_DIR} -DCMAKE_BUILD_TYPE=Release -DALP_WWW_INSTALL_DIR=$INSTALL_DIR -DALP_ENABLE_ASSERTS=ON @@ -115,7 +131,7 @@ jobs: run: | echo ${{ secrets.SIGNINGKEYBASE64 }} > release.keystore.base64 base64 -d release.keystore.base64 > release.keystore - $QT_HOST_ROOT_DIR/bin/androiddeployqt --input $DEPLOYMENT_SETTINGS --output $ANDROID_BUILD_DIR --android-platform android-35 --gradle --release --sign release.keystore alpinemaps --storepass ${{ secrets.KEYSTOREPASSWORD }} + $QT_HOST_PATH/bin/androiddeployqt --input $DEPLOYMENT_SETTINGS --output $ANDROID_BUILD_DIR --android-platform android-33 --gradle --release --sign release.keystore alpinemaps --storepass ${{ secrets.KEYSTOREPASSWORD }} - name: Signing Android packages with generated key env: @@ -123,7 +139,7 @@ jobs: if: matrix.qttarget == 'android' && env.secret_test == '' run: | keytool -genkey -v -keystore release.keystore -alias alpinemaps -keyalg RSA -sigalg SHA1withRSA -keysize 2048 -validity 10000 -keypass asdfasdf -storepass asdfasdf -dname "CN=Franz, OU=IT, O=Furz, L=Rattenberg, ST=Tirol, C=AT" - $QT_HOST_ROOT_DIR/bin/androiddeployqt --input $DEPLOYMENT_SETTINGS --output $ANDROID_BUILD_DIR --android-platform android-35 --gradle --release --sign release.keystore alpinemaps --storepass asdfasdf + $QT_HOST_PATH/bin/androiddeployqt --input $DEPLOYMENT_SETTINGS --output $ANDROID_BUILD_DIR --android-platform android-33 --gradle --release --sign release.keystore alpinemaps --storepass asdfasdf README_PATH=$APK_DIR/read_me.txt echo "The apk was signed with a generated key which changes every time the apk is generated. This means, that android might refuse to install it if another apk with the same app was installed previously. You'll have to deinstall it. Doing so will delete all settings and cache." >> $README_PATH @@ -156,28 +172,11 @@ jobs: if-no-files-found: error - build-wasm: + build-wasm-release: runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - config: [wasm_mt, wasm_st] - include: - - config: wasm_mt - qtflags: '-ltcg $(cat $QT_LITE_CONFIG) -feature-thread' - cmakeflags: '-DALP_ENABLE_THREADING=ON -DALP_ENABLE_ASSERTS=OFF' - qtversion: '6.8.1' - webassembly_version: "3.1.56" - - config: wasm_st - qtflags: '-ltcg $(cat $QT_LITE_CONFIG) -no-feature-thread' - cmakeflags: '-DALP_ENABLE_THREADING=OFF -DALP_ENABLE_ASSERTS=OFF' - qtversion: '6.8.1' - webassembly_version: "3.1.56" - - config: wasm_st_debug - qtflags: '-no-feature-thread' - cmakeflags: '-DALP_ENABLE_THREADING=OFF -DALP_ENABLE_ASSERTS=ON' - qtversion: '6.8.1' - webassembly_version: "3.1.56" + env: + QT_VERSION: "6.8.0" + WEBASSEMBLY_VERSION: "3.1.56" steps: - name: Install dependencies run: | @@ -191,26 +190,26 @@ jobs: - uses: mymindstorm/setup-emsdk@v13 with: - version: ${{matrix.webassembly_version}} + version: ${{env.WEBASSEMBLY_VERSION}} - name: Install Qt native version (required for cross building) uses: jurplel/install-qt-action@v4 with: aqtversion: '==3.1.*' - version: ${{matrix.qtversion}} + version: ${{env.QT_VERSION}} host: linux target: 'desktop' arch: linux_gcc_64 dir: '${{github.workspace}}/qt_host' install-deps: 'true' modules: 'qtshadertools' - cache: true - name: Set reusable strings shell: bash run: | + echo "QT_HOST_PATH=${QT_ROOT_DIR}" >> "$GITHUB_ENV" echo "BUILD_DIR="$(pwd)/build"" >> $GITHUB_ENV - echo "INSTALL_DIR=install/${{ matrix.config}}" >> $GITHUB_ENV + echo "INSTALL_DIR=install/wasm_release" >> $GITHUB_ENV echo "QT_WASM_ROOT_DIR=$(pwd)/qt_wasm_lite" >> $GITHUB_ENV echo "QT_SRC_CONFIGURE=$(pwd)/qt_src/configure" >> $GITHUB_ENV echo "QT_LITE_CONFIG=$(pwd)/misc/qt_lite.txt" >> $GITHUB_ENV @@ -220,40 +219,38 @@ jobs: - name: Cache Qt WebAssembly build id: qt-cache - uses: actions/cache@v4 + uses: actions/cache@v3 with: path: qt_wasm_lite - key: ${{ matrix.config }}_qt-${{ matrix.qtversion }}_emcc-${{ matrix.webassembly_version }} + key: wasm-qt-${{ env.QT_VERSION }}-${{ env.WEBASSEMBLY_VERSION }} - name: Download and patch Qt if: steps.qt-cache.outputs.cache-hit != 'true' shell: bash run: | - git clone --branch v${{matrix.qtversion}} git://code.qt.io/qt/qt5.git qt_src + git clone --branch v$QT_VERSION git://code.qt.io/qt/qt5.git qt_src $QT_SRC_CONFIGURE -init-submodules -submodules qtdeclarative,qtbase -skip qtlanguageserver,qtquicktimeline,qtimageformats,qtsvg cd qt_src/qtbase git apply ../../misc/qt_68_qtbase_remove_dejavu_fonts.patch - - name: Build Qt for Webassembly (custom version) + - name: Build Qt for Webassembly (custom lightweight LTO version) if: steps.qt-cache.outputs.cache-hit != 'true' shell: bash run: | dest_dir="${{env.QT_WASM_ROOT_DIR}}" mkdir qt_wasm_build cd qt_wasm_build - ${{env.QT_SRC_CONFIGURE}} -qt-host-path $QT_ROOT_DIR -release -optimize-size -platform wasm-emscripten -submodules qtdeclarative,qtbase -skip qtlanguageserver,qtquicktimeline,qtimageformats,qtsvg -make libs -gui ${{ matrix.qtflags }} -prefix "${QT_WASM_ROOT_DIR}/" - cat ./build.ninja + ${{env.QT_SRC_CONFIGURE}} -qt-host-path $QT_HOST_PATH -release -ltcg $(cat ${{env.QT_LITE_CONFIG}}) -prefix "${QT_WASM_ROOT_DIR}/" sed -i 's/-flto=thin/-flto/g' ./build.ninja - echo "==============================================================================================================================================" - cat ./build.ninja cmake --build . --parallel && cmake --install . # Fail if the directory is not created or is empty [ -d "$QT_WASM_ROOT_DIR" ] && [ "$(ls -A $QT_WASM_ROOT_DIR)" ] || exit 1 + - name: Remove StatsWindow, otherwise the webassembly will link against qtwidgets and charts. run: rm ./app/StatsWindow.qml - - name: Configure + - name: Configure CMake env: CMAKE_PREFIX_PATH: ${{env.Qt6_DIR}}/lib/cmake run: > @@ -262,10 +259,11 @@ jobs: -B $BUILD_DIR -DCMAKE_BUILD_TYPE=MinSizeRel -DALP_WWW_INSTALL_DIR=$INSTALL_DIR + -DALP_ENABLE_ASSERTS=OFF -DALP_ENABLE_LTO=ON -DFMT_INSTALL=OFF - ${{ matrix.cmakeflags }} - -S ${{ github.workspace }} && cat $BUILD_DIR/build.ninja + -DALP_ENABLE_THREADING=ON + -S ${{ github.workspace }} - name: Build run: cmake --build $BUILD_DIR --target install @@ -273,15 +271,15 @@ jobs: - name: Create artifact uses: actions/upload-artifact@v4 with: - name: files_${{ matrix.config}} + name: files_wasm_release path: ${{ github.workspace }}/install/ if-no-files-found: error deploy: if: github.event_name == 'push' needs: - - build-android - - build-wasm + - build + - build-wasm-release environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} @@ -321,12 +319,19 @@ jobs: mirror -R -e -v -n $GITHUB_WORKSPACE/github_page/. ./${reponame}_$(git describe --tags --dirty=-d --abbrev=1); " - - name: Fix headers for wasm multithread + - name: Fix headers for wasm_multithread run: | - cd $GITHUB_WORKSPACE/github_page/wasm_mt + cd $GITHUB_WORKSPACE/github_page/wasm_multithread wget https://raw.githubusercontent.com/gzuidhof/coi-serviceworker/master/coi-serviceworker.min.js sed -i -e 's#
##g' alpineapp.html + - name: Fix headers for wasm_release + run: | + cd $GITHUB_WORKSPACE/github_page/wasm_release + wget https://raw.githubusercontent.com/gzuidhof/coi-serviceworker/master/coi-serviceworker.min.js + cp alpineapp.html alpineapp_orig.html + sed -i -e 's###g' alpineapp.html + - name: Generate Directory Listings uses: jayanta525/github-pages-directory-listing@v4.0.0 with: @@ -343,4 +348,3 @@ jobs: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 - diff --git a/misc/qt_lite.txt b/misc/qt_lite.txt index 7d75fd17..a7c92cd1 100644 --- a/misc/qt_lite.txt +++ b/misc/qt_lite.txt @@ -1,4 +1,10 @@ +-optimize-size -static -reduce-exports -gc-binaries +-platform wasm-emscripten +-submodules qtdeclarative,qtbase +-skip qtlanguageserver,qtquicktimeline,qtimageformats,qtsvg +-make libs +-gui -disable-deprecated-up-to 0x070000 -no-dbus -no-sql-sqlite @@ -69,7 +75,8 @@ -no-feature-itemmodeltester -no-feature-opensslv30 -no-feature-schannel --no-feature-wasm-exceptions +-no-feature-wasm-exceptions +-feature-thread -feature-wasm-simd128 -feature-opengles3 -feature-quick-canvas