aboutsummaryrefslogtreecommitdiffstats
path: root/.github
diff options
context:
space:
mode:
authorCristian Adam <cristian.adam@qt.io>2019-12-20 15:18:52 +0100
committerCristian Adam <cristian.adam@qt.io>2019-12-20 14:42:24 +0000
commit00fb2421e733f9c6ecfa157996161506fe1261a8 (patch)
tree588dab61cd72888fe14b91b0137ebbd4ddc48fd4 /.github
parentd0b8e1a1aeecc930470e574fe3708f87833fc8a4 (diff)
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>
Diffstat (limited to '.github')
-rw-r--r--.github/workflows/build_cmake.yml365
1 files changed, 365 insertions, 0 deletions
diff --git a/.github/workflows/build_cmake.yml b/.github/workflows/build_cmake.yml
new file mode 100644
index 0000000000..b3da98d079
--- /dev/null
+++ b/.github/workflows/build_cmake.yml
@@ -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