aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Gruendl <henning.gruendl@qt.io>2021-12-01 11:10:58 +0100
committerHenning Gründl <henning.gruendl@qt.io>2021-12-01 11:12:23 +0000
commitb8634bfb213c0d87cb94e7fbb9c64b16b91233a6 (patch)
tree822c40969e8865f42c559f76dc1691c67ff5d3d4
parent2a83f190d44931ade66534013080c5eedaff2131 (diff)
Add github workflow building apks on dev branch
Change-Id: I431e4f3316e6fc2468eb42d2b14e53528ba2a040 Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
-rw-r--r--.github/workflows/build-apks.yml268
1 files changed, 268 insertions, 0 deletions
diff --git a/.github/workflows/build-apks.yml b/.github/workflows/build-apks.yml
new file mode 100644
index 0000000..ae2d8ba
--- /dev/null
+++ b/.github/workflows/build-apks.yml
@@ -0,0 +1,268 @@
+name: Build Android Packages
+on:
+ push:
+ branches:
+ - dev
+
+env:
+ QT_VERSION: 6.2.1
+ APP_PRO: qtdesignviewer.pro
+ APP_DIR: qtdesignviewer
+ APP_NAME: qtdesignviewer
+
+jobs:
+ build:
+ name: Ubuntu Latest
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ abi:
+ - { arch: "x86_64", suffix: "X86_64", name: "x86_64" }
+ - { arch: "x86", suffix: "X86", name: "x86" }
+ - { arch: "armv7", suffix: "ARMv7", name: "armeabi-v7a" }
+ - { arch: "arm64_v8a", suffix: "ARM64", name: "arm64-v8a" }
+
+ steps:
+ - uses: actions/checkout@v2
+ with:
+ ref: dev
+ path: ${{ env.APP_DIR }}
+
+ - name: Download Qt
+ id: qt
+ shell: cmake -P {0}
+ run: |
+ set(qt_version "$ENV{QT_VERSION}")
+ string(REPLACE "." "" qt_version_dotless "${qt_version}")
+
+ set(qt_package_arch_suffix "gcc_64")
+ set(qt_package_suffix_desktop "-Linux-RHEL_8_2-GCC-Linux-RHEL_8_2-X86_64")
+
+ set(abi ${{ matrix.abi.arch }})
+ set(qt_package_suffix_android "-Linux-RHEL_8_2-Clang-Android-Android_ANY-${{ matrix.abi.suffix }}")
+
+ set(qt_base_url "https://download.qt.io/online/qtsdkrepository/linux_x64")
+
+ # Prepare directories
+ set(working_dir $ENV{GITHUB_WORKSPACE}/Qt)
+ file(MAKE_DIRECTORY ${working_dir})
+
+ function(downloadAndExtract url download_dir archive)
+ message("Downloading ${url}")
+ file(DOWNLOAD "${url}" ./${download_dir}/${archive} SHOW_PROGRESS)
+ execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ../${download_dir}/${archive} WORKING_DIRECTORY ${working_dir})
+ endfunction()
+
+ # Download Desktop Qt
+ set(qt_base_url_desktop "${qt_base_url}/desktop/qt6_${qt_version_dotless}")
+ message("Downloading ${qt_base_url_desktop}/Updates.xml")
+
+ file(DOWNLOAD "${qt_base_url_desktop}/Updates.xml" ./Updates.xml SHOW_PROGRESS)
+ file(READ ./Updates.xml updates_xml)
+ string(REGEX MATCH "<Name>qt.qt6.*<Version>([0-9+-.]+)</Version>" updates_xml_output "${updates_xml}")
+ set(qt_package_version ${CMAKE_MATCH_1})
+
+ set(download_dir $ENV{GITHUB_WORKSPACE}/qt6-download-desktop-${qt_package_version})
+ file(MAKE_DIRECTORY ${download_dir})
+
+ file(RENAME ./Updates.xml ${download_dir}/Updates.xml)
+
+ # Needs qtdeclarative for qmlimportscanner
+ foreach(package qtbase qtdeclarative)
+ downloadAndExtract(
+ "${qt_base_url_desktop}/qt.qt6.${qt_version_dotless}.${qt_package_arch_suffix}/${qt_package_version}${package}${qt_package_suffix_desktop}.7z"
+ ${download_dir}
+ ${package}.7z
+ )
+ endforeach()
+
+ # uic depends on libicu56.so
+ if (NOT WIN32 AND NOT APPLE)
+ downloadAndExtract(
+ "${qt_base_url_desktop}/qt.qt6.${qt_version_dotless}.${qt_package_arch_suffix}/${qt_package_version}icu-linux-Rhel7.2-x64.7z"
+ ${download_dir}
+ icu.7z
+ )
+ endif()
+
+ set(qt_dir_desktop ${working_dir}/${qt_version}/gcc_64)
+
+ file(READ "${qt_dir_desktop}/mkspecs/qconfig.pri" qtconfig)
+ string(REPLACE "Enterprise" "OpenSource" qtconfig "${qtconfig}")
+ string(REPLACE "licheck.exe" "" qtconfig "${qtconfig}")
+ string(REPLACE "licheck64" "" qtconfig "${qtconfig}")
+ string(REPLACE "licheck_mac" "" qtconfig "${qtconfig}")
+ file(WRITE "${qt_dir_desktop}/mkspecs/qconfig.pri" "${qtconfig}")
+
+ # Save the path for other steps
+ message("::set-output name=qt_dir_desktop::${qt_dir_desktop}")
+
+ # Download Android Qt
+ set(qt_base_url_android "${qt_base_url}/android/qt6_${qt_version_dotless}_${abi}")
+ message("Downloading ${qt_base_url_android}/Updates.xml")
+
+ file(DOWNLOAD "${qt_base_url_android}/Updates.xml" ./Updates.xml SHOW_PROGRESS)
+ file(READ ./Updates.xml updates_xml)
+ string(REGEX MATCH "<Name>qt.qt6.*<Version>([0-9+-.]+)</Version>" updates_xml_output "${updates_xml}")
+ set(qt_package_version ${CMAKE_MATCH_1})
+
+ set(download_dir $ENV{GITHUB_WORKSPACE}/qt6-download-android-${qt_package_version})
+ file(MAKE_DIRECTORY ${download_dir})
+
+ file(RENAME ./Updates.xml ${download_dir}/Updates.xml)
+
+ foreach(package qttranslations qttools qtsvg qtdeclarative qtbase)
+ downloadAndExtract(
+ "${qt_base_url_android}/qt.qt6.${qt_version_dotless}.android_${abi}/${qt_package_version}${package}${qt_package_suffix_android}.7z"
+ ${download_dir}
+ ${package}.7z
+ )
+ endforeach()
+
+ foreach(package qtwebview qtwebsockets qtwebchannel qtvirtualkeyboard qtsensors qtscxml qtmultimedia qtimageformats qtdatavis3d qtconnectivity qtcharts qt3d)
+ downloadAndExtract(
+ "${qt_base_url_android}/qt.qt6.${qt_version_dotless}.addons.${package}.android_${abi}/${qt_package_version}${package}${qt_package_suffix_android}.7z"
+ ${download_dir}
+ ${package}.7z
+ )
+ endforeach()
+
+ # Special case for qtpositioning as the package is called qtlocation
+ set(url "${qt_base_url_android}/qt.qt6.${qt_version_dotless}.addons.qtpositioning.android_${abi}/${qt_package_version}qtlocation${qt_package_suffix_android}.7z")
+ message("Downloading ${url}")
+ file(DOWNLOAD "${url}" ./${download_dir}/qtpositioning.7z SHOW_PROGRESS)
+ execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ../${download_dir}/qtpositioning.7z WORKING_DIRECTORY ${working_dir})
+
+ foreach(package qtshadertools qtquicktimeline qtquick3d qt5compat)
+ downloadAndExtract(
+ "${qt_base_url_android}/qt.qt6.${qt_version_dotless}.${package}.android_${abi}/${qt_package_version}${package}${qt_package_suffix_android}.7z"
+ ${download_dir}
+ ${package}.7z
+ )
+ endforeach()
+
+ set(qt_dir_android ${working_dir}/${qt_version}/android_${abi})
+
+ # Save the path for other steps
+ message("::set-output name=qt_dir_android::${qt_dir_android}")
+
+ # Modify target_qt.conf
+ set(conf_content "\
+ [Paths]
+ Prefix=../
+ HostPrefix=../../${qt_package_arch_suffix}
+ HostData=../android_${abi}
+ Sysroot=
+ SysrootifyPrefix=false
+ TargetSpec=android-clang
+ HostSpec=linux-g++
+ ")
+
+ file(WRITE ${qt_dir_android}/bin/target_qt.conf ${conf_content})
+
+ - name: Checkout qtquickdesigner-components
+ uses: actions/checkout@v2
+ with:
+ repository: qt-labs/qtquickdesigner-components
+ ref: dev
+ path: qtquickdesigner-components
+
+ - name: Configure, build and install qtquickdesigner-components
+ run: |
+ cd qtquickdesigner-components
+ ${{ steps.qt.outputs.qt_dir_desktop }}/bin/qmake -qtconf ${{ steps.qt.outputs.qt_dir_android }}/bin/target_qt.conf && make && make install
+
+ - name: Configure
+ shell: cmake -P {0}
+ run: |
+ execute_process(
+ COMMAND ${{ steps.qt.outputs.qt_dir_desktop }}/bin/qmake
+ -qtconf ${{ steps.qt.outputs.qt_dir_android }}/bin/target_qt.conf
+ $ENV{APP_PRO}
+ -spec android-clang
+ CONFIG+=debug
+ CONFIG+=qml_debug
+ WORKING_DIRECTORY $ENV{APP_DIR}
+ RESULT_VARIABLE result
+ )
+ if (NOT result EQUAL 0)
+ message(FATAL_ERROR "Bad exit status")
+ endif()
+
+ # https://github.com/actions/virtual-environments/issues/3757
+ - name: Fix Android Build Tools
+ run: |
+ ln -s ${ANDROID_HOME}/build-tools/31.0.0/d8 ${ANDROID_HOME}/build-tools/31.0.0/dx
+ ln -s ${ANDROID_HOME}/build-tools/31.0.0/lib/d8.jar ${ANDROID_HOME}/build-tools/31.0.0/lib/dx.jar
+
+ - name: Build
+ id: build
+ shell: cmake -P {0}
+ run: |
+ include(ProcessorCount)
+ ProcessorCount(N)
+
+ execute_process(
+ COMMAND $ENV{ANDROID_NDK_HOME}/prebuilt/linux-x86_64/bin/make
+ -f Makefile
+ qmake_all
+ WORKING_DIRECTORY $ENV{APP_DIR}
+ RESULT_VARIABLE result
+ )
+ if (NOT result EQUAL 0)
+ message(FATAL_ERROR "Bad exit status")
+ endif()
+
+ execute_process(
+ COMMAND $ENV{ANDROID_NDK_HOME}/prebuilt/linux-x86_64/bin/make
+ -j ${N}
+ WORKING_DIRECTORY $ENV{APP_DIR}
+ RESULT_VARIABLE result
+ )
+ if (NOT result EQUAL 0)
+ message(FATAL_ERROR "Bad exit status")
+ endif()
+
+ execute_process(
+ COMMAND $ENV{ANDROID_NDK_HOME}/prebuilt/linux-x86_64/bin/make
+ INSTALL_ROOT=android-build install
+ WORKING_DIRECTORY $ENV{APP_DIR}
+ RESULT_VARIABLE result
+ )
+ if (NOT result EQUAL 0)
+ message(FATAL_ERROR "Bad exit status")
+ endif()
+
+ execute_process(
+ COMMAND ${{ steps.qt.outputs.qt_dir_desktop }}/bin/androiddeployqt
+ --input android-qtdesignviewer-deployment-settings.json
+ --output android-build
+ --android-platform android-31
+ --jdk $ENV{JAVA_HOME_11_X64}
+ --gradle
+ WORKING_DIRECTORY $ENV{APP_DIR}
+ RESULT_VARIABLE result
+ )
+ if (NOT result EQUAL 0)
+ message(FATAL_ERROR "Bad exit status")
+ endif()
+
+ # Rename APK
+ set(apk_dir $ENV{APP_DIR}/android-build/build/outputs/apk/debug)
+ set(apk_path ${apk_dir}/$ENV{APP_NAME}_${{ matrix.abi.name }}.apk)
+
+ file(
+ RENAME ${apk_dir}/android-build-debug.apk ${apk_path}
+ RESULT result
+ )
+ if (NOT result EQUAL 0)
+ message(FATAL_ERROR "Bad exit status")
+ endif()
+
+ message("::set-output name=apk_path::${apk_path}")
+
+ - uses: actions/upload-artifact@v2
+ with:
+ name: ${{ env.APP_NAME }}_${{ matrix.abi.name }}
+ path: ${{ steps.build.outputs.apk_path }}
+