forked from qt-creator/qt-creator
CMake Build: Add GitHub Actions build file
This will use GitHub Actions CI infrastructure to do a CMake build for Windows, Linux, and macOS. Change-Id: If2cfae935c5392b4a9f85ac3026d577217d91162 Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
365
.github/workflows/build_cmake.yml
vendored
Normal file
365
.github/workflows/build_cmake.yml
vendored
Normal file
@@ -0,0 +1,365 @@
|
||||
name: CMake Build Matrix
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: ${{ matrix.config.name }}
|
||||
runs-on: ${{ matrix.config.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
config:
|
||||
- {
|
||||
name: "Windows Latest MSVC", artifact: "Windows-MSVC.tar.xz",
|
||||
os: windows-latest,
|
||||
build_type: "Release", cc: "cl", cxx: "cl",
|
||||
environment_script: "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Auxiliary/Build/vcvars64.bat"
|
||||
}
|
||||
- {
|
||||
name: "Windows Latest MinGW", artifact: "Windows-MinGW.tar.xz",
|
||||
os: windows-latest,
|
||||
build_type: "Release", cc: "gcc", cxx: "g++"
|
||||
}
|
||||
- {
|
||||
name: "Ubuntu Latest GCC", artifact: "Linux.tar.xz",
|
||||
os: ubuntu-latest,
|
||||
build_type: "Release", cc: "gcc", cxx: "g++"
|
||||
}
|
||||
- {
|
||||
name: "macOS Latest Clang", artifact: "macOS.tar.xz",
|
||||
os: macos-latest,
|
||||
build_type: "Release", cc: "clang", cxx: "clang++"
|
||||
}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
- name: Download Ninja and CMake
|
||||
id: cmake_and_ninja
|
||||
shell: cmake -P {0}
|
||||
run: |
|
||||
set(ninja_version "1.9.0")
|
||||
set(cmake_version "3.16.0")
|
||||
|
||||
if ("${{ runner.os }}" STREQUAL "Windows")
|
||||
set(ninja_suffix "win.zip")
|
||||
set(cmake_suffix "win64-x64.zip")
|
||||
set(cmake_dir "cmake-${cmake_version}-win64-x64/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 "Darwin-x86_64.tar.gz")
|
||||
set(cmake_dir "cmake-${cmake_version}-Darwin-x86_64/CMake.app/Contents/bin")
|
||||
endif()
|
||||
|
||||
set(ninja_url "https://github.com/ninja-build/ninja/releases/download/v${ninja_version}/ninja-${ninja_suffix}")
|
||||
file(DOWNLOAD "${ninja_url}" ./ninja.zip SHOW_PROGRESS)
|
||||
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}")
|
||||
file(DOWNLOAD "${cmake_url}" ./cmake.zip SHOW_PROGRESS)
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ./cmake.zip)
|
||||
|
||||
# Save the path for other steps
|
||||
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}/${cmake_dir}" cmake_dir)
|
||||
message("::set-output name=cmake_dir::${cmake_dir}")
|
||||
|
||||
if (NOT "${{ runner.os }}" STREQUAL "Windows")
|
||||
execute_process(
|
||||
COMMAND chmod +x ninja
|
||||
COMMAND chmod +x ${cmake_dir}/cmake
|
||||
)
|
||||
endif()
|
||||
|
||||
- name: Download Qt
|
||||
id: qt
|
||||
shell: cmake -P {0}
|
||||
run: |
|
||||
set(qt_version "5.14.0")
|
||||
|
||||
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_name "qt.qt5.${qt_version_dotless}.win64_mingw73")
|
||||
set(qt_dir_prefix "${qt_version}/mingw73_64")
|
||||
set(qt_package_suffix "-Windows-Windows_10-Mingw73-Windows-Windows_10-X86_64")
|
||||
elseif ("${{ matrix.config.environment_script }}" MATCHES "vcvars64.bat")
|
||||
set(qt_package_name "qt.qt5.${qt_version_dotless}.win64_msvc2017_64")
|
||||
set(qt_dir_prefix "${qt_version}/msvc2017_64")
|
||||
set(qt_package_suffix "-Windows-Windows_10-MSVC2017-Windows-Windows_10-X86_64")
|
||||
elseif ("${{ matrix.config.environment_script }}" MATCHES "vcvars32.bat")
|
||||
set(qt_package_name "qt.qt5.${qt_version_dotless}.win32_msvc2017")
|
||||
set(qt_dir_prefix "${qt_version}/msvc2017")
|
||||
set(qt_package_suffix "-Windows-Windows_10-MSVC2017-Windows-Windows_10-X86")
|
||||
endif()
|
||||
elseif ("${{ runner.os }}" STREQUAL "Linux")
|
||||
set(url_os "linux_x64")
|
||||
set(qt_package_name "qt.qt5.${qt_version_dotless}.gcc_64")
|
||||
set(qt_dir_prefix "${qt_version}/gcc_64")
|
||||
set(qt_package_suffix "-Linux-RHEL_7_6-GCC-Linux-RHEL_7_6-X86_64")
|
||||
elseif ("${{ runner.os }}" STREQUAL "macOS")
|
||||
set(url_os "mac_x64")
|
||||
set(qt_package_name "qt.qt5.${qt_version_dotless}.clang_64")
|
||||
set(qt_dir_prefix "${qt_version}/clang_64")
|
||||
set(qt_package_suffix "-MacOS-MacOS_10_13-Clang-MacOS-MacOS_10_13-X86_64")
|
||||
endif()
|
||||
|
||||
set(qt_base_url "https://download.qt.io/online/qtsdkrepository/${url_os}/desktop/qt5_${qt_version_dotless}")
|
||||
file(DOWNLOAD "${qt_base_url}/Updates.xml" ./Updates.xml SHOW_PROGRESS)
|
||||
|
||||
file(READ ./Updates.xml updates_xml)
|
||||
string(REGEX MATCH "<Name>${qt_package_name}.*<Version>([0-9+-.]+)</Version>" updates_xml_output "${updates_xml}")
|
||||
set(qt_package_version ${CMAKE_MATCH_1})
|
||||
|
||||
file(MAKE_DIRECTORY qt5)
|
||||
|
||||
# Save the path for other steps
|
||||
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}/qt5/${qt_dir_prefix}" qt_dir)
|
||||
message("::set-output name=qt_dir::${qt_dir}")
|
||||
|
||||
foreach(package qtbase qtdeclarative qttools qtsvg)
|
||||
file(DOWNLOAD
|
||||
"${qt_base_url}/${qt_package_name}/${qt_package_version}${package}${qt_package_suffix}.7z" ./${package}.7z
|
||||
SHOW_PROGRESS
|
||||
)
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ../${package}.7z WORKING_DIRECTORY qt5)
|
||||
endforeach()
|
||||
|
||||
# uic depends on libicu56.so
|
||||
if ("${{ runner.os }}" STREQUAL "Linux")
|
||||
file(DOWNLOAD
|
||||
"${qt_base_url}/${qt_package_name}/${qt_package_version}icu-linux-Rhel7.2-x64.7z" ./icu.7z
|
||||
SHOW_PROGRESS
|
||||
)
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ../icu.7z WORKING_DIRECTORY qt5)
|
||||
endif()
|
||||
|
||||
file(READ "qt5/${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 "qt5/${qt_dir_prefix}/mkspecs/qconfig.pri" "${qtconfig}")
|
||||
|
||||
|
||||
- name: Download libclang
|
||||
id: libclang
|
||||
shell: cmake -P {0}
|
||||
run: |
|
||||
set(clang_version "80")
|
||||
|
||||
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-vs2017_64.7z")
|
||||
elseif ("${{ matrix.config.environment_script }}" MATCHES "vcvars32.bat")
|
||||
set(libclang "libclang-release_${clang_version}-based-windows-vs2017_32.7z")
|
||||
endif()
|
||||
elseif ("${{ runner.os }}" STREQUAL "Linux")
|
||||
set(libclang "libclang-release_${clang_version}-based-linux-Ubuntu16.04-gcc5.3-x86_64.7z")
|
||||
elseif ("${{ runner.os }}" STREQUAL "macOS")
|
||||
set(libclang "libclang-release_${clang_version}-based-mac.7z")
|
||||
endif()
|
||||
|
||||
set(libclang_url "https://download.qt.io/development_releases/prebuilt/libclang/${libclang}")
|
||||
file(DOWNLOAD "${libclang_url}" ./libclang.7z SHOW_PROGRESS)
|
||||
|
||||
# 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)
|
||||
message("::set-output name=libclang_dir::${libclang_dir}")
|
||||
|
||||
- name: Install system libs
|
||||
shell: cmake -P {0}
|
||||
run: |
|
||||
if ("${{ runner.os }}" STREQUAL "Linux")
|
||||
execute_process(
|
||||
COMMAND sudo apt install libgl1-mesa-dev
|
||||
)
|
||||
endif()
|
||||
|
||||
- name: Configure
|
||||
shell: cmake -P {0}
|
||||
run: |
|
||||
set(ENV{CC} ${{ matrix.config.cc }})
|
||||
set(ENV{CXX} ${{ matrix.config.cxx }})
|
||||
|
||||
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()
|
||||
|
||||
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}/ninja" ninja_program)
|
||||
|
||||
# Workaround https://gitlab.kitware.com/cmake/cmake/issues/20119
|
||||
set(BUILD_WITH_PCH ON)
|
||||
if ( "${{ matrix.config.cc }}" MATCHES "gcc")
|
||||
set(BUILD_WITH_PCH OFF)
|
||||
endif()
|
||||
|
||||
execute_process(
|
||||
COMMAND ${{ steps.cmake_and_ninja.outputs.cmake_dir }}/cmake
|
||||
-S .
|
||||
-B build
|
||||
-D CMAKE_BUILD_TYPE=${{ matrix.config.build_type }}
|
||||
-D "CMAKE_PREFIX_PATH=${{ steps.libclang.outputs.libclang_dir }};${{ steps.qt.outputs.qt_dir }}"
|
||||
-G Ninja
|
||||
-D CMAKE_MAKE_PROGRAM=${ninja_program}
|
||||
-D CMAKE_FIND_PACKAGE_PREFER_CONFIG=TRUE
|
||||
-D BUILD_WITH_PCH=${BUILD_WITH_PCH}
|
||||
RESULT_VARIABLE result
|
||||
)
|
||||
if (NOT result EQUAL 0)
|
||||
message(FATAL_ERROR "Bad exit status")
|
||||
endif()
|
||||
|
||||
|
||||
- name: Build
|
||||
shell: cmake -P {0}
|
||||
run: |
|
||||
set(ENV{NINJA_STATUS} "[%f/%t %o/sec] ")
|
||||
|
||||
if ("${{ runner.os }}" STREQUAL "Windows" AND NOT "x${{ matrix.config.environment_script }}" STREQUAL "x")
|
||||
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()
|
||||
|
||||
execute_process(
|
||||
COMMAND ${{ steps.cmake_and_ninja.outputs.cmake_dir }}/cmake --build build
|
||||
RESULT_VARIABLE result
|
||||
)
|
||||
if (NOT result EQUAL 0)
|
||||
message(FATAL_ERROR "Bad exit status")
|
||||
endif()
|
||||
|
||||
|
||||
- name: Run tests
|
||||
shell: cmake -P {0}
|
||||
run: |
|
||||
include(ProcessorCount)
|
||||
ProcessorCount(N)
|
||||
|
||||
execute_process(
|
||||
COMMAND ${{ steps.cmake_and_ninja.outputs.cmake_dir }}/ctest -j ${N}
|
||||
WORKING_DIRECTORY build
|
||||
RESULT_VARIABLE result
|
||||
)
|
||||
if (NOT result EQUAL 0)
|
||||
message(FATAL_ERROR "Running tests failed!")
|
||||
endif()
|
||||
|
||||
|
||||
- name: Install Strip
|
||||
run: ${{ steps.cmake_and_ninja.outputs.cmake_dir }}/cmake --install build --prefix instdir --strip
|
||||
|
||||
|
||||
- name: Pack
|
||||
working-directory: instdir
|
||||
run: ${{ steps.cmake_and_ninja.outputs.cmake_dir }}/cmake -E tar cJfv ../${{ matrix.config.artifact }} .
|
||||
|
||||
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v1
|
||||
with:
|
||||
path: ./${{ matrix.config.artifact }}
|
||||
name: ${{ matrix.config.artifact }}
|
||||
|
||||
release:
|
||||
if: contains(github.ref, 'tags/v')
|
||||
runs-on: ubuntu-latest
|
||||
needs: build
|
||||
|
||||
steps:
|
||||
- name: Create Release
|
||||
id: create_release
|
||||
uses: actions/create-release@v1.0.0
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag_name: ${{ github.ref }}
|
||||
release_name: Release ${{ github.ref }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
|
||||
- name: Store Release url
|
||||
run: |
|
||||
echo "${{ steps.create_release.outputs.upload_url }}" > ./upload_url
|
||||
|
||||
- uses: actions/upload-artifact@v1
|
||||
with:
|
||||
path: ./upload_url
|
||||
name: upload_url
|
||||
|
||||
publish:
|
||||
if: contains(github.ref, 'tags/v')
|
||||
name: ${{ matrix.config.name }}
|
||||
runs-on: ${{ matrix.config.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
config:
|
||||
- {
|
||||
name: "Windows Latest MSVC", artifact: "Windows-MSVC.tar.xz",
|
||||
os: ubuntu-latest
|
||||
}
|
||||
- {
|
||||
name: "Windows Latest MinGW", artifact: "Windows-MinGW.tar.xz",
|
||||
os: ubuntu-latest
|
||||
}
|
||||
- {
|
||||
name: "Ubuntu Latest GCC", artifact: "Linux.tar.xz",
|
||||
os: ubuntu-latest
|
||||
}
|
||||
- {
|
||||
name: "macOS Latest Clang", artifact: "macOS.tar.xz",
|
||||
os: ubuntu-latest
|
||||
}
|
||||
needs: release
|
||||
|
||||
steps:
|
||||
- name: Download artifact
|
||||
uses: actions/download-artifact@v1
|
||||
with:
|
||||
name: ${{ matrix.config.artifact }}
|
||||
path: ./
|
||||
|
||||
- name: Download URL
|
||||
uses: actions/download-artifact@v1
|
||||
with:
|
||||
name: upload_url
|
||||
path: ./
|
||||
- id: set_upload_url
|
||||
run: |
|
||||
upload_url=`cat ./upload_url`
|
||||
echo ::set-output name=upload_url::$upload_url
|
||||
|
||||
- name: Upload to Release
|
||||
id: upload_to_release
|
||||
uses: actions/upload-release-asset@v1.0.1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ steps.set_upload_url.outputs.upload_url }}
|
||||
asset_path: ./${{ matrix.config.artifact }}
|
||||
asset_name: ${{ matrix.config.artifact }}
|
||||
asset_content_type: application/x-gtar
|
||||
Reference in New Issue
Block a user