Add collapse recursive feature to project trees (2) #803
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CMake Build Matrix | |
on: | |
push: | |
paths-ignore: | |
- 'dist/**' | |
- 'doc/**' | |
env: | |
QT_VERSION: "6.7.2" | |
MACOS_DEPLOYMENT_TARGET: "11.0" | |
CLANG_VERSION: "19.1.0" | |
ELFUTILS_VERSION: "0.175" | |
CMAKE_VERSION: "3.30.4" | |
NINJA_VERSION: "1.12.1" | |
BUILD_TYPE: Release | |
CCACHE_VERSION: "4.10.2" | |
QT_MIRRORS: download.qt.io;mirrors.ocf.berkeley.edu/qt;ftp.fau.de/qtproject;mirror.bit.edu.cn/qtproject | |
jobs: | |
build: | |
name: ${{ matrix.config.name }} | |
runs-on: ${{ matrix.config.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
config: | |
- { | |
name: "Windows Latest MSVC", artifact: "windows-x64-msvc", | |
os: windows-latest, | |
cc: "cl", cxx: "cl", | |
environment_script: "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat", | |
is_msvc: true | |
} | |
- { | |
name: "Windows Latest MinGW", artifact: "windows-x64-mingw", | |
os: windows-latest, | |
toolchain: "https://github.com/cristianadam/mingw-builds/releases/download/v11.2.0-rev1/x86_64-11.2.0-release-posix-seh-rt_v9-rev1.7z", | |
toolchain_path: "mingw64/bin", | |
cc: "gcc", cxx: "g++", | |
is_msvc: false | |
} | |
- { | |
name: "Ubuntu Latest GCC", artifact: "linux-x64", | |
os: ubuntu-latest, | |
cc: "gcc", cxx: "g++" | |
} | |
- { | |
name: "macOS Latest Clang", artifact: "macos-universal", | |
os: macos-latest, | |
cc: "clang", cxx: "clang++" | |
} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Checkout submodules | |
id: git | |
shell: cmake -P {0} | |
run: | | |
execute_process(COMMAND git submodule set-url -- src/tools/perfparser https://code.qt.io/qt-creator/perfparser.git) | |
execute_process(COMMAND git submodule set-url -- src/shared/qbs https://github.com/hicknhack-software/Qt-Qbs.git) | |
execute_process(COMMAND git submodule update --init --recursive) | |
file(MAKE_DIRECTORY release) | |
if (${{github.ref}} MATCHES "tags/v(([0-9.]+).*)") | |
file(APPEND "$ENV{GITHUB_OUTPUT}" "tag=${CMAKE_MATCH_1}\n") | |
if (EXISTS "dist/changelog/changes-${CMAKE_MATCH_2}.md") | |
file(READ "dist/changelog/changes-${CMAKE_MATCH_2}.md" changelog_md) | |
endif() | |
file(WRITE "release/changelog.md" "These packages are not officially supported, for official packages please check out https://download.qt.io/official_releases/qtcreator\n\n") | |
file(APPEND "release/changelog.md" "${changelog_md}") | |
else() | |
file(APPEND "$ENV{GITHUB_OUTPUT}" "tag=${{github.run_id}}\n") | |
endif() | |
- name: Setup Go 1.22.x | |
uses: actions/setup-go@v5 | |
with: | |
go-version: 1.22.x | |
- name: Install UPX | |
if: ${{ !startsWith(matrix.config.os, 'macos') }} | |
uses: crazy-max/ghaction-upx@v3 | |
with: | |
install-only: true | |
- name: Install UPX (macOS) | |
if: ${{ startsWith(matrix.config.os, 'macos') }} | |
run: | | |
brew update | |
brew install upx | |
- name: Download Ninja and CMake | |
shell: cmake -P {0} | |
run: | | |
set(cmake_version "$ENV{CMAKE_VERSION}") | |
set(ninja_version "$ENV{NINJA_VERSION}") | |
if ("${{ runner.os }}" STREQUAL "Windows") | |
set(ninja_suffix "win.zip") | |
set(cmake_suffix "windows-x86_64.zip") | |
set(cmake_dir "cmake-${cmake_version}-windows-x86_64/bin") | |
elseif ("${{ runner.os }}" STREQUAL "Linux") | |
set(ninja_suffix "linux.zip") | |
set(cmake_suffix "linux-x86_64.tar.gz") | |
set(cmake_dir "cmake-${cmake_version}-linux-x86_64/bin") | |
elseif ("${{ runner.os }}" STREQUAL "macOS") | |
set(ninja_suffix "mac.zip") | |
set(cmake_suffix "macos-universal.tar.gz") | |
set(cmake_dir "cmake-${cmake_version}-macos-universal/CMake.app/Contents/bin") | |
endif() | |
set(ninja_url "https://github.com/ninja-build/ninja/releases/download/v${ninja_version}/ninja-${ninja_suffix}") | |
foreach(retry RANGE 10) | |
file(DOWNLOAD "${ninja_url}" ./ninja.zip SHOW_PROGRESS) | |
file(SIZE ./ninja.zip fileSize) | |
if (fileSize GREATER 0) | |
break() | |
endif() | |
endforeach() | |
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ./ninja.zip) | |
set(cmake_url "https://github.com/Kitware/CMake/releases/download/v${cmake_version}/cmake-${cmake_version}-${cmake_suffix}") | |
foreach(retry RANGE 10) | |
file(DOWNLOAD "${cmake_url}" ./cmake.zip SHOW_PROGRESS) | |
file(SIZE ./cmake.zip fileSize) | |
if (fileSize GREATER 0) | |
break() | |
endif() | |
endforeach() | |
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ./cmake.zip) | |
# Add to PATH environment variable | |
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}/${cmake_dir}" cmake_dir) | |
set(path_separator ":") | |
if ("${{ runner.os }}" STREQUAL "Windows") | |
set(path_separator ";") | |
endif() | |
file(APPEND "$ENV{GITHUB_PATH}" "$ENV{GITHUB_WORKSPACE}${path_separator}${cmake_dir}") | |
if (NOT "${{ runner.os }}" STREQUAL "Windows") | |
execute_process( | |
COMMAND chmod +x ninja | |
COMMAND chmod +x ${cmake_dir}/cmake | |
) | |
endif() | |
- name: Install system libs | |
shell: cmake -P {0} | |
run: | | |
if ("${{ runner.os }}" STREQUAL "Linux") | |
execute_process( | |
COMMAND sudo apt update | |
) | |
execute_process( | |
COMMAND | |
sudo apt install chrpath | |
libgl1-mesa-dev libvulkan-dev libxcb-xinput-dev libxcb-xinerama0-dev libxkbcommon-dev libxkbcommon-x11-dev | |
libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xkb1 libxcb-randr0 libxcb-icccm4 libsecret-1-dev libpulse0 | |
xvfb | |
RESULT_VARIABLE result | |
) | |
if (NOT result EQUAL 0) | |
message(FATAL_ERROR "Failed to install dependencies") | |
endif() | |
endif() | |
if ("${{ runner.os }}" STREQUAL "Windows") | |
file(MAKE_DIRECTORY build/build/bin) | |
foreach(retry RANGE 10) | |
file(DOWNLOAD "https://download.qt.io/development_releases/prebuilt/llvmpipe/windows/opengl32sw-64.7z" ./opengl32sw-64.7z SHOW_PROGRESS) | |
file(SIZE ./opengl32sw-64.7z fileSize) | |
if (fileSize GREATER 0) | |
break() | |
endif() | |
endforeach() | |
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ../../../opengl32sw-64.7z WORKING_DIRECTORY build/build/bin) | |
endif() | |
if (NOT "x${{ matrix.config.toolchain }}" STREQUAL "x") | |
foreach(retry RANGE 10) | |
file(DOWNLOAD "${{ matrix.config.toolchain }}" ./toolchain.7z SHOW_PROGRESS) | |
file(SIZE ./toolchain.7z fileSize) | |
if (fileSize GREATER 0) | |
break() | |
endif() | |
endforeach() | |
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ./toolchain.7z) | |
endif() | |
# For tests update the docker image | |
find_program(docker_executable docker) | |
if (docker_executable) | |
execute_process(COMMAND ${docker_executable} pull alpine:latest COMMAND_ECHO STDOUT) | |
endif() | |
- name: Download Qt | |
id: qt | |
shell: cmake -P {0} | |
run: | | |
set(qt_version "$ENV{QT_VERSION}") | |
string(REPLACE "." "" qt_version_dotless "${qt_version}") | |
if ("${{ runner.os }}" STREQUAL "Windows") | |
set(url_os "windows_x86") | |
if ("x${{ matrix.config.environment_script }}" STREQUAL "x") | |
set(qt_package_arch_suffix "win64_mingw") | |
set(qt_dir_prefix "${qt_version}/mingw_64") | |
set(qt_package_suffix "-Windows-Windows_10_22H2-Mingw-Windows-Windows_10_22H2-X86_64") | |
elseif ("${{ matrix.config.environment_script }}" MATCHES "vcvars64.bat") | |
set(qt_package_arch_suffix "win64_msvc2019_64") | |
set(qt_dir_prefix "${qt_version}/msvc2019_64") | |
set(qt_package_suffix "-Windows-Windows_10_22H2-MSVC2019-Windows-Windows_10_22H2-X86_64") | |
endif() | |
elseif ("${{ runner.os }}" STREQUAL "Linux") | |
set(url_os "linux_x64") | |
set(qt_package_arch_suffix "linux_gcc_64") | |
set(qt_dir_prefix "${qt_version}/gcc_64") | |
set(qt_package_suffix "-Linux-RHEL_8_8-GCC-Linux-RHEL_8_8-X86_64") | |
elseif ("${{ runner.os }}" STREQUAL "macOS") | |
set(url_os "mac_x64") | |
set(qt_package_arch_suffix "clang_64") | |
set(qt_dir_prefix "${qt_version}/macos") | |
set(qt_package_suffix "-MacOS-MacOS_13-Clang-MacOS-MacOS_13-X86_64-ARM64") | |
endif() | |
set(qt_base_url "https://\${qt_mirror}/online/qtsdkrepository/${url_os}/desktop/qt6_${qt_version_dotless}") | |
foreach(qt_mirror $ENV{QT_MIRRORS}) | |
cmake_language(EVAL CODE " | |
message(\"Downloading: ${qt_base_url}/Updates.xml\") | |
file(DOWNLOAD \"${qt_base_url}/Updates.xml\" ./Updates.xml) | |
") | |
file(SIZE ./Updates.xml fileSize) | |
if (fileSize GREATER 0) | |
break() | |
endif() | |
endforeach() | |
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}) | |
file(MAKE_DIRECTORY qt6) | |
# Save the path for other steps | |
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}/qt6/${qt_dir_prefix}" qt_dir) | |
file(APPEND "$ENV{GITHUB_OUTPUT}" "qt_dir=${qt_dir}") | |
function(downloadAndExtract url archive) | |
foreach(qt_mirror $ENV{QT_MIRRORS}) | |
cmake_language(EVAL CODE " | |
message(\"Downloading ${url}\") | |
file(DOWNLOAD \"${url}\" ./${archive}) | |
") | |
file(SIZE ./${archive} fileSize) | |
if (fileSize GREATER 0) | |
break() | |
endif() | |
endforeach() | |
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ../${archive} WORKING_DIRECTORY qt6) | |
endfunction() | |
foreach(package qtbase qtdeclarative qttools qtsvg qttranslations) | |
downloadAndExtract( | |
"${qt_base_url}/qt.qt6.${qt_version_dotless}.${qt_package_arch_suffix}/${qt_package_version}${package}${qt_package_suffix}.7z" | |
${package}.7z | |
) | |
endforeach() | |
foreach(package qtimageformats qtserialport qtmultimedia) | |
downloadAndExtract( | |
"${qt_base_url}/qt.qt6.${qt_version_dotless}.addons.${package}.${qt_package_arch_suffix}/${qt_package_version}${package}${qt_package_suffix}.7z" | |
${package}.7z | |
) | |
endforeach() | |
foreach(package qtquicktimeline qtquick3d qt5compat qtshadertools) | |
downloadAndExtract( | |
"${qt_base_url}/qt.qt6.${qt_version_dotless}.${package}.${qt_package_arch_suffix}/${qt_package_version}${package}${qt_package_suffix}.7z" | |
${package}.7z | |
) | |
endforeach() | |
# uic, qmake depend on libicu*.so libraries | |
if ("${{ runner.os }}" STREQUAL "Linux") | |
downloadAndExtract( | |
"${qt_base_url}/qt.qt6.${qt_version_dotless}.${qt_package_arch_suffix}/${qt_package_version}icu-linux-Rhel8.6-x86_64.7z" | |
icu.7z | |
) | |
endif() | |
file(READ "qt6/${qt_dir_prefix}/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 "qt6/${qt_dir_prefix}/mkspecs/qconfig.pri" "${qtconfig}") | |
if ("${{ runner.os }}" STREQUAL "Windows") | |
# deploy "system" runtimes into Qt, so they get deployed as well | |
if ("x${{ matrix.config.environment_script }}" STREQUAL "x") | |
# deploy MinGW | |
foreach(file libwinpthread-1.dll libstdc++-6.dll libgcc_s_seh-1.dll) | |
file(INSTALL "$ENV{GITHUB_WORKSPACE}/${{ matrix.config.toolchain_path }}/${file}" | |
DESTINATION "qt6/${qt_dir_prefix}/bin" | |
USE_SOURCE_PERMISSIONS) | |
endforeach() | |
else() | |
# deploy MSVC | |
foreach(file vcruntime140.dll concrt140.dll msvcp140_1.dll msvcp140_2.dll | |
msvcp140_codecvt_ids.dll vcruntime140_1.dll msvcp140.dll) | |
file(INSTALL "C:/Windows/System32/${file}" | |
DESTINATION "qt6/${qt_dir_prefix}/bin") | |
endforeach() | |
endif() | |
endif() | |
- name: Download OpenSSL | |
shell: cmake -P {0} | |
run: | | |
if ("${{ runner.os }}" STREQUAL "Windows") | |
set(url_os "windows_x86") | |
set(openssl_localdir "Tools/OpenSSL/Win_x64/bin") | |
set(openssl_dest_dir "${{ steps.qt.outputs.qt_dir }}/bin") | |
set(shared_suffix ".dll") | |
elseif ("${{ runner.os }}" STREQUAL "Linux") | |
set(url_os "linux_x64") | |
set(openssl_localdir "Tools/OpenSSL/binary/lib") | |
set(openssl_dest_dir "${{ steps.qt.outputs.qt_dir }}/lib/Qt/lib") | |
set(shared_suffix ".so*") | |
elseif ("${{ runner.os }}" STREQUAL "macOS") | |
# Not needed on macOS | |
return() | |
endif() | |
set(openssl_base_url "https://\${qt_mirror}/online/qtsdkrepository/${url_os}/desktop/tools_openssl_x64") | |
foreach(qt_mirror $ENV{QT_MIRRORS}) | |
cmake_language(EVAL CODE " | |
message(\"Downloading ${openssl_base_url}/Updates.xml}\") | |
file(DOWNLOAD \"${openssl_base_url}/Updates.xml\" ./Updates.xml) | |
") | |
file(SIZE ./Updates.xml fileSize) | |
if (fileSize GREATER 0) | |
break() | |
endif() | |
endforeach() | |
file(READ ./Updates.xml updates_xml) | |
string(REGEX MATCH | |
"<Name>(qt.tools.openssl.*)</Name>.*<Version>([0-9+-.]+)</Version>.*<DownloadableArchives>(.*)</DownloadableArchives>" updates_xml_output "${updates_xml}") | |
set(openssl_directory ${CMAKE_MATCH_1}) | |
set(openssl_version ${CMAKE_MATCH_2}) | |
set(openssl_archive ${CMAKE_MATCH_3}) | |
set(url "${openssl_base_url}/${openssl_directory}/${openssl_version}${openssl_archive}") | |
file(MAKE_DIRECTORY openssl) | |
file(MAKE_DIRECTORY ${openssl_dest_dir}) | |
foreach(qt_mirror $ENV{QT_MIRRORS}) | |
cmake_language(EVAL CODE " | |
message(\"Downloading ${url}\") | |
file(DOWNLOAD \"${url}\" ./openssl.7z) | |
") | |
file(SIZE ./openssl.7z fileSize) | |
if (fileSize GREATER 0) | |
break() | |
endif() | |
endforeach() | |
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ../openssl.7z WORKING_DIRECTORY openssl) | |
file(GLOB openssl_shared_objects "openssl/${openssl_localdir}/*${shared_suffix}") | |
execute_process( | |
COMMAND ${CMAKE_COMMAND} -E copy ${openssl_shared_objects} ${openssl_dest_dir}) | |
- name: Download libclang | |
id: libclang | |
shell: cmake -P {0} | |
run: | | |
set(clang_version "$ENV{CLANG_VERSION}") | |
if ("${{ runner.os }}" STREQUAL "Windows") | |
if ("x${{ matrix.config.environment_script }}" STREQUAL "x") | |
set(libclang "libclang-release_${clang_version}-based-windows-mingw_64.7z") | |
elseif ("${{ matrix.config.environment_script }}" MATCHES "vcvars64.bat") | |
set(libclang "libclang-release_${clang_version}-based-windows-vs2019_64.7z") | |
elseif ("${{ matrix.config.environment_script }}" MATCHES "vcvars32.bat") | |
set(libclang "libclang-release_${clang_version}-based-windows-vs2019_32.7z") | |
endif() | |
elseif ("${{ runner.os }}" STREQUAL "Linux") | |
set(libclang "libclang-release_${clang_version}-based-linux-Ubuntu22.04-gcc11.4-x86_64.7z") | |
elseif ("${{ runner.os }}" STREQUAL "macOS") | |
set(libclang "libclang-release_${clang_version}-based-macos-universal.7z") | |
endif() | |
set(libclang_url "https://\${qt_mirror}/development_releases/prebuilt/libclang/${libclang}") | |
foreach(qt_mirror $ENV{QT_MIRRORS}) | |
cmake_language(EVAL CODE " | |
message(\"Downloading ${libclang_url}\") | |
file(DOWNLOAD \"${libclang_url}\" ./libclang.7z) | |
") | |
file(SIZE ./libclang.7z fileSize) | |
if (fileSize GREATER 0) | |
break() | |
endif() | |
endforeach() | |
# Comes with libclang inside the archive | |
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ./libclang.7z) | |
# Save the path for other steps | |
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}/libclang" libclang_dir) | |
file(APPEND "$ENV{GITHUB_OUTPUT}" "libclang_dir=${libclang_dir}") | |
- name: Download elfutils | |
if: runner.os == 'Windows' && matrix.config.is_msvc || runner.os == 'Linux' | |
id: elfutils | |
shell: cmake -P {0} | |
run: | | |
set(elfutils_version "$ENV{ELFUTILS_VERSION}") | |
if ("${{ runner.os }}" STREQUAL "Windows") | |
if ("${{ matrix.config.environment_script }}" MATCHES "vcvars64.bat") | |
set(elfutils "elfutils-release_${elfutils_version}qt-windows-x86_64.7z") | |
elseif ("${{ matrix.config.environment_script }}" MATCHES "vcvars32.bat") | |
set(elfutils "elfutils-release_${elfutils_version}qt-windows-i686.7z") | |
endif() | |
elseif ("${{ runner.os }}" STREQUAL "Linux") | |
set(elfutils "elfutils-release_${elfutils_version}qt-linux-x86_64.7z") | |
endif() | |
set(elfutils_url "https://\${qt_mirror}/development_releases/prebuilt/elfutils/${elfutils}") | |
foreach(qt_mirror $ENV{QT_MIRRORS}) | |
cmake_language(EVAL CODE " | |
message(\"Downloading ${elfutils_url}\") | |
file(DOWNLOAD \"${elfutils_url}\" ./elfutils.7z) | |
") | |
file(SIZE ./elfutils.7z fileSize) | |
if (fileSize GREATER 0) | |
break() | |
endif() | |
endforeach() | |
file(MAKE_DIRECTORY elfutils) | |
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ../elfutils.7z WORKING_DIRECTORY elfutils) | |
# Save the path for other steps | |
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}/elfutils" elfutils_dir) | |
file(APPEND "$ENV{GITHUB_OUTPUT}" "elfutils_dir=${elfutils_dir}") | |
- name: Download ccache | |
shell: cmake -P {0} | |
run: | | |
if ("${{ runner.os }}" STREQUAL "Windows") | |
set(ccache_dir "ccache-$ENV{CCACHE_VERSION}-windows-x86_64") | |
set(ccache_archive "${ccache_dir}.zip") | |
elseif ("${{ runner.os }}" STREQUAL "Linux") | |
set(ccache_dir "ccache-$ENV{CCACHE_VERSION}-linux-x86_64") | |
set(ccache_archive "${ccache_dir}.tar.xz") | |
elseif ("${{ runner.os }}" STREQUAL "macOS") | |
set(ccache_dir "ccache-$ENV{CCACHE_VERSION}-darwin") | |
set(ccache_archive "${ccache_dir}.tar.gz") | |
endif() | |
set(ccache_url "https://github.com/ccache/ccache/releases/download/v$ENV{CCACHE_VERSION}/${ccache_archive}") | |
file(DOWNLOAD "${ccache_url}" ./${ccache_archive} SHOW_PROGRESS) | |
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ./${ccache_archive}) | |
# Add to PATH environment variable | |
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}/${ccache_dir}" ccache_dir) | |
set(path_separator ":") | |
if ("${{ runner.os }}" STREQUAL "Windows") | |
set(path_separator ";") | |
endif() | |
file(APPEND "$ENV{GITHUB_PATH}" "$ENV{GITHUB_WORKSPACE}${path_separator}${ccache_dir}") | |
if (NOT "${{ runner.os }}" STREQUAL "Windows") | |
execute_process(COMMAND chmod +x ${ccache_dir}/ccache) | |
endif() | |
- name: Prepare ccache archive name | |
id: ccache | |
shell: cmake -P {0} | |
run: | | |
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}" github_workspace) | |
include(${github_workspace}/cmake/QtCreatorIDEBranding.cmake) | |
string(REPLACE "." ";" IDE_VERSION_LIST ${IDE_VERSION_DISPLAY}) | |
list(GET IDE_VERSION_LIST 0 IDE_VERSION_MAJOR) | |
file(APPEND "$ENV{GITHUB_OUTPUT}" "archive_name=ccache-${{ matrix.config.os }}-${{ matrix.config.cc }}-qtc${IDE_VERSION_MAJOR}") | |
- name: Download ccache archive | |
shell: cmake -P {0} | |
run: | | |
foreach(page_id RANGE 1 10) | |
file( | |
DOWNLOAD "https://api.github.com/repos/${{ github.repository }}/actions/artifacts?per_page=100&page=${page_id}" | |
HTTPHEADER "Accept: application/vnd.github+json" | |
HTTPHEADER "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" | |
HTTPHEADER "X-GitHub-Api-Version: 2022-11-28" | |
SHOW_PROGRESS | |
artifacts.json) | |
file(READ artifacts.json artifacts_json) | |
string(JSON artifacts_length LENGTH "${artifacts_json}" "artifacts") | |
math(EXPR artifacts_length "${artifacts_length} - 1") | |
if(${artifacts_length} GREATER_EQUAL 0) | |
foreach(idx RANGE 0 ${artifacts_length}) | |
string(JSON artifact_js GET "${artifacts_json}" "artifacts" ${idx}) | |
string(JSON name GET "${artifact_js}" "name") | |
if ("${name}" STREQUAL "${{ steps.ccache.outputs.archive_name }}") | |
string(JSON download_url GET "${artifact_js}" "archive_download_url") | |
foreach(retry RANGE 10) | |
file(DOWNLOAD "${download_url}" | |
"${{ steps.ccache.outputs.archive_name }}.zip" | |
HTTPHEADER "Accept: application/vnd.github+json" | |
HTTPHEADER "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" | |
HTTPHEADER "X-GitHub-Api-Version: 2022-11-28" | |
SHOW_PROGRESS) | |
file(SIZE "${{ steps.ccache.outputs.archive_name }}.zip" fileSize) | |
if (fileSize GREATER 0) | |
break() | |
endif() | |
endforeach() | |
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf "${{ steps.ccache.outputs.archive_name }}.zip") | |
file(MAKE_DIRECTORY .ccache) | |
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "../${{ steps.ccache.outputs.archive_name }}.tar" WORKING_DIRECTORY .ccache) | |
return() | |
endif() | |
endforeach() | |
endif() | |
endforeach() | |
- name: Build | |
shell: cmake -P {0} | |
run: | | |
set(ENV{CC} ${{ matrix.config.cc }}) | |
set(ENV{CXX} ${{ matrix.config.cxx }}) | |
set(ENV{MACOSX_DEPLOYMENT_TARGET} "${{ env.MACOS_DEPLOYMENT_TARGET }}") | |
if ("${{ runner.os }}" STREQUAL "Windows" AND NOT "x${{ matrix.config.environment_script }}" STREQUAL "x") | |
execute_process( | |
COMMAND "${{ matrix.config.environment_script }}" && set | |
OUTPUT_FILE environment_script_output.txt | |
) | |
file(STRINGS environment_script_output.txt output_lines) | |
foreach(line IN LISTS output_lines) | |
if (line MATCHES "^([a-zA-Z0-9_-]+)=(.*)$") | |
set(ENV{${CMAKE_MATCH_1}} "${CMAKE_MATCH_2}") | |
endif() | |
endforeach() | |
endif() | |
set(ENV{NINJA_STATUS} "[%f/%t %o/sec] ") | |
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}" ccache_basedir) | |
set(ENV{CCACHE_BASEDIR} "${ccache_basedir}") | |
set(ENV{CCACHE_DIR} "${ccache_basedir}/.ccache") | |
set(ENV{CCACHE_SLOPPINESS} "pch_defines,time_macros") | |
set(ENV{CCACHE_COMPRESS} "true") | |
set(ENV{CCACHE_COMPRESSLEVEL} "9") | |
set(ENV{CCACHE_MAXSIZE} "400M") | |
if ("${{ matrix.config.cxx }}" STREQUAL "cl") | |
set(ENV{CCACHE_MAXSIZE} "600M") | |
endif() | |
execute_process( | |
COMMAND git log --format=%B -n 1 ${{ github.event.after }} | |
OUTPUT_VARIABLE git_commit_msg | |
) | |
if ("${git_commit_msg}" MATCHES "ccache:[ ]*clea[r|n]") | |
execute_process(COMMAND ccache --clear COMMAND_ECHO STDOUT) | |
endif() | |
execute_process(COMMAND ccache -p) | |
execute_process(COMMAND ccache -z) | |
if ("x${{ matrix.config.environment_script }}" STREQUAL "x") | |
set(CDB_OPTION "--no-cdb") | |
else() | |
set(CDB_OPTION) | |
endif() | |
if (NOT "${{ steps.elfutils.outputs.elfutils_dir }}" STREQUAL "") | |
set(ELFUTILS_OPTION "--elfutils-path;${{ steps.elfutils.outputs.elfutils_dir }}") | |
else() | |
set(ELFUTILS_OPTION) | |
endif() | |
find_package(Python3 REQUIRED COMPONENTS Interpreter) | |
string(REPLACE "x86" "x64" Python3_EXECUTABLE "${Python3_EXECUTABLE}") | |
set(WITH_TESTS "--with-tests") | |
set(NO_DMG "--no-dmg") | |
if (${{github.ref}} MATCHES "tags/v") | |
unset(WITH_TESTS) | |
unset(NO_DMG) | |
endif() | |
if (NOT "x${{ matrix.config.toolchain_path }}" STREQUAL "x") | |
set(path_separator ":") | |
if ("${{ runner.os }}" STREQUAL "Windows") | |
set(path_separator ";") | |
endif() | |
set(ENV{PATH} "$ENV{GITHUB_WORKSPACE}/${{ matrix.config.toolchain_path }}${path_separator}$ENV{PATH}") | |
endif() | |
if ("${{ runner.os }}" STREQUAL "macOS") | |
if (${{github.ref}} MATCHES "tags/v(.*)") | |
set(ENV{CMAKE_OSX_ARCHITECTURES} "x86_64;arm64") | |
else() | |
set(ENV{CMAKE_OSX_ARCHITECTURES} "x86_64") | |
endif() | |
endif() | |
find_program(llvm_link_exe llvm-link PATHS "${{ steps.libclang.outputs.libclang_dir }}/bin") | |
set(WITH_LLVM_LINK --add-config=-DCMAKE_LINKER=${llvm_link_exe}) | |
# Not for MSVC | |
if ("${{ runner.os }}" STREQUAL "Windows" AND NOT "x${{ matrix.config.environment_script }}" STREQUAL "x") | |
unset(WITH_LLVM_LINK) | |
endif() | |
execute_process( | |
COMMAND python | |
-u | |
scripts/build.py | |
--build-type Release | |
--src . | |
--build build | |
--qt-path "${{ steps.qt.outputs.qt_dir }}" | |
--llvm-path "${{ steps.libclang.outputs.libclang_dir }}" | |
--python3 "${Python3_EXECUTABLE}" | |
${WITH_TESTS} | |
${CDB_OPTION} | |
${ELFUTILS_OPTION} | |
${NO_DMG} | |
${WITH_LLVM_LINK} | |
--add-config=-DCMAKE_C_COMPILER_LAUNCHER=ccache | |
--add-config=-DCMAKE_CXX_COMPILER_LAUNCHER=ccache | |
--add-config=-DIDE_REVISION_URL=https://github.com/$ENV{GITHUB_REPOSITORY}/commits/$ENV{GITHUB_SHA} | |
--zip-infix=-${{ matrix.config.artifact }}-${{ github.run_id }} | |
--with-cpack | |
RESULT_VARIABLE result | |
COMMAND_ECHO STDOUT | |
OUTPUT_VARIABLE output | |
ERROR_VARIABLE output | |
ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE | |
) | |
if (NOT result EQUAL 0) | |
string(REGEX MATCH "FAILED:.*$" error_message "${output}") | |
string(REPLACE "\n" "%0A" error_message "${error_message}") | |
message("::error::${error_message}") | |
message(FATAL_ERROR "Build failed") | |
endif() | |
- name: ccache statistics | |
shell: cmake -P {0} | |
run: | | |
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}" ccache_basedir) | |
set(ENV{CCACHE_BASEDIR} "${ccache_basedir}") | |
set(ENV{CCACHE_DIR} "${ccache_basedir}/.ccache") | |
set(ENV{CCACHE_SLOPPINESS} "pch_defines,time_macros") | |
set(ENV{CCACHE_COMPRESS} "true") | |
set(ENV{CCACHE_COMPRESSLEVEL} "9") | |
set(ENV{CCACHE_MAXSIZE} "400M") | |
if ("${{ matrix.config.cxx }}" STREQUAL "cl") | |
set(ENV{CCACHE_MAXSIZE} "600M") | |
endif() | |
execute_process(COMMAND ccache -s) | |
- name: Run tests | |
shell: cmake -P {0} | |
continue-on-error: true # ignore test results | |
run: | | |
include(ProcessorCount) | |
ProcessorCount(N) | |
set(ENV{CTEST_OUTPUT_ON_FAILURE} "ON") | |
if ("${{ runner.os }}" STREQUAL "Linux") | |
set(ENV{DISPLAY} ":1") | |
set(ENV{LIBGL_ALWAYS_SOFTWARE} "1") | |
set(ctest_launcher xvfb-run --auto-servernum --server-num=1) | |
elseif ("${{ runner.os }}" STREQUAL "Windows") | |
set(ENV{QT_OPENGL} "software") | |
set(ENV{QT_ASSUME_STDERR_HAS_CONSOLE} "1") | |
endif() | |
execute_process( | |
COMMAND ${ctest_launcher} ctest -j ${N} --timeout 300 --label-exclude exclude_from_precheck --exclude-regex tst_perfdata | |
WORKING_DIRECTORY build/build | |
RESULT_VARIABLE result | |
OUTPUT_VARIABLE output | |
ERROR_VARIABLE output | |
ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE | |
TIMEOUT 600 | |
) | |
if (NOT result EQUAL 0) | |
string(REGEX MATCH "[0-9]+% tests.*[0-9.]+ sec.*$" test_results "${output}") | |
string(REPLACE "\n" "%0A" test_results "${test_results}") | |
message("::error::${test_results}") | |
message(FATAL_ERROR "Tests failed") | |
endif() | |
- name: Upload | |
uses: actions/upload-artifact@v4 | |
with: | |
path: build/qtcreator-${{ matrix.config.artifact }}-${{ steps.git.outputs.tag }}.7z | |
name: qtcreator-${{ matrix.config.artifact }}-${{ steps.git.outputs.tag }}.7z | |
- name: Upload Devel | |
uses: actions/upload-artifact@v4 | |
with: | |
path: build/qtcreator-${{ matrix.config.artifact }}-${{ steps.git.outputs.tag }}_dev.7z | |
name: qtcreator-${{ matrix.config.artifact }}-${{ steps.git.outputs.tag }}_dev.7z | |
- name: Upload wininterrupt | |
if: runner.os == 'Windows' | |
uses: actions/upload-artifact@v4 | |
with: | |
path: build/wininterrupt-${{ matrix.config.artifact }}-${{ steps.git.outputs.tag }}.7z | |
name: wininterrupt-${{ matrix.config.artifact }}-${{ steps.git.outputs.tag }}.7z | |
- name: Upload qtcreatorcdbext | |
if: runner.os == 'Windows' && matrix.config.is_msvc | |
uses: actions/upload-artifact@v4 | |
with: | |
path: build/qtcreatorcdbext-${{ matrix.config.artifact }}-${{ steps.git.outputs.tag }}.7z | |
name: qtcreatorcdbext-${{ matrix.config.artifact }}-${{ steps.git.outputs.tag }}.7z | |
- name: Upload Debian package | |
if: runner.os == 'Linux' | |
uses: actions/upload-artifact@v4 | |
with: | |
path: build/build/qtcreator-${{ matrix.config.artifact }}-${{ steps.git.outputs.tag }}.deb | |
name: qtcreator-${{ matrix.config.artifact }}-${{ steps.git.outputs.tag }}.deb | |
- name: Upload disk image | |
if: runner.os == 'macOS' && contains(github.ref, 'tags/v') | |
uses: actions/upload-artifact@v4 | |
with: | |
path: build/qt-creator-${{ matrix.config.artifact }}-${{ steps.git.outputs.tag }}.dmg | |
name: qt-creator-${{ matrix.config.artifact }}-${{ steps.git.outputs.tag }}.dmg | |
- name: Create ccache archive | |
working-directory: .ccache | |
run: cmake -E tar cf ../${{ steps.ccache.outputs.archive_name }}.tar . | |
- name: Upload ccache archive | |
uses: actions/upload-artifact@v4 | |
with: | |
path: ./${{ steps.ccache.outputs.archive_name }}.tar | |
name: ${{ steps.ccache.outputs.archive_name }} | |
- name: Upload binaries to release | |
if: contains(github.ref, 'tags/v') | |
uses: svenstaro/upload-release-action@v2 | |
with: | |
tag: ${{ github.ref }} | |
repo_token: ${{ secrets.GITHUB_TOKEN }} | |
release_name: Release ${{ github.ref }} | |
# body: ${{ github.event.head_commit.message }} | |
overwrite: true | |
file_glob: true | |
file: build/*.@(7z|dmg|deb) |