Skip to content

Revert to set-output because can't use GITHUB_OUTPUT #38

Revert to set-output because can't use GITHUB_OUTPUT

Revert to set-output because can't use GITHUB_OUTPUT #38

name: Build SIGBUILD on multiple platforms
on:
push:
branches: [ "master" ]
env:
PLUGIN_NAME: SIGBUILD
QT_VERSION: 6.4.3
QT_CREATOR_VERSION: 11.0.3
QT_CREATOR_SNAPSHOT: NO
CMAKE_VERSION: 3.24.2
NINJA_VERSION: 1.10.2
jobs:
build:
name: ${{ matrix.name }}
runs-on: ${{ matrix.os }}
strategy:
# Set fail-fast to false to ensure that feedback is delivered for all matrix combinations. Consider changing this to true when your workflow is stable.
fail-fast: true
# Set up a matrix to run the following 2 configurations:
# 1. <Windows, Release, latest MSVC compiler toolchain on the default runner image, default generator>
# 2. <Linux, Release, latest GCC compiler toolchain on the default runner image, default generator>
matrix:
os: [ubuntu-latest, windows-latest]
c_compiler: [gcc, cl]
include:
- name: "Windows x64"
os: windows-latest
c_compiler: cl
cpp_compiler: cl
artifact: "win-x64"
- name: "Linux x64"
os: ubuntu-latest
c_compiler: gcc
cpp_compiler: g++
artifact: "linux-x64"
exclude:
- os: windows-latest
c_compiler: gcc
- os: ubuntu-latest
c_compiler: cl
steps:
- uses: actions/checkout@v3
- 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 "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")
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)
# 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 libgl1-mesa-dev
RESULT_VARIABLE result
)
if (NOT result EQUAL 0)
message(FATAL_ERROR "Failed to install dependencies")
endif()
endif()
- name: Download Qt
id: qt
shell: cmake -P {0}
run: |
set(qt_version "$ENV{QT_VERSION}")
function(print_var var)
message("${var}: ${${var}}")
endfunction()
string(REGEX MATCH "^[0-9]+" qt_version_major "${qt_version}")
string(REPLACE "." "" qt_version_dotless "${qt_version}")
if ("${{ runner.os }}" STREQUAL "Windows")
set(url_os "windows_x86")
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")
elseif ("${{ runner.os }}" STREQUAL "Linux")
set(url_os "linux_x64")
set(qt_package_arch_suffix "gcc_64")
set(qt_dir_prefix "${qt_version}/gcc_64")
if("${qt_version_major}" STREQUAL "5")
set(qt_package_suffix "-Linux-RHEL_7_6-GCC-Linux-RHEL_7_6-X86_64")
else()
set(qt_package_suffix "-Linux-RHEL_8_4-GCC-Linux-RHEL_8_4-X86_64")
endif()
endif()
set(qt_base_url "https://download.qt.io/online/qtsdkrepository/${url_os}/desktop/qt${qt_version_major}_${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.qt${qt_version_major}.*<Version>([0-9+-.]+)</Version>" updates_xml_output "${updates_xml}")
set(qt_package_version ${CMAKE_MATCH_1})
file(MAKE_DIRECTORY qt)
# Save the path for other steps
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}/qt/${qt_dir_prefix}" qt_dir)
message("::set-output name=qt_dir::${qt_dir}")
message("[DBG] qt_dir=${qt_dir}")
# download Qt
message("Downloading Qt to ${qt_dir}")
function(downloadAndExtract url archive)
message("=======================================")
message("Downloading ${url}")
file(DOWNLOAD "${url}" ./${archive} SHOW_PROGRESS LOG DOWN_LOG STATUS DOWN_STATUS)
list(GET DOWN_STATUS 0 ERROR_NO)
list(GET DOWN_STATUS 1 ERROR_TEXT)
print_var(ERROR_NO)
print_var(ERROR_TEXT)
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xvf ../${archive} WORKING_DIRECTORY qt)
message("---------------------------------------")
endfunction()
# download Qt packages
message("Downloading Qt packages")
foreach(package qtbase qtdeclarative)
print_var(qt_base_url)
print_var(qt_version_major)
print_var(qt_version_dotless)
print_var(qt_package_arch_suffix)
print_var(qt_package_version)
print_var(package)
print_var(qt_package_suffix)
downloadAndExtract(
"${qt_base_url}/qt.qt${qt_version_major}.${qt_version_dotless}.${qt_package_arch_suffix}/${qt_package_version}${package}${qt_package_suffix}.7z"
${package}.7z
)
endforeach()
# download Qt 6 packages
if("${qt_version_major}" STREQUAL "6")
message("Downloading Qt 6 packages")
foreach(package qt5compat qtshadertools)
print_var(qt_base_url)
print_var(qt_version_dotless)
print_var(package)
print_var(qt_package_arch_suffix)
print_var(qt_package_version)
print_var(package)
print_var(qt_package_suffix)
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()
# download Qt 6 addons
message("Downloading Qt 6 addons")
foreach(addon qtmultimedia)
print_var(qt_base_url)
print_var(qt_version_dotless)
print_var(addon)
print_var(qt_package_arch_suffix)
print_var(qt_package_version)
print_var(addon)
print_var(qt_package_suffix)
downloadAndExtract(
"${qt_base_url}/qt.qt6.${qt_version_dotless}.addons.${addon}.${qt_package_arch_suffix}/${qt_package_version}${addon}${qt_package_suffix}.7z"
${package}.7z
)
endforeach()
endif()
# uic depends on libicu56.so
if ("${{ runner.os }}" STREQUAL "Linux")
downloadAndExtract(
"${qt_base_url}/qt.qt${qt_version_major}.${qt_version_dotless}.${qt_package_arch_suffix}/${qt_package_version}icu-linux-Rhel7.2-x64.7z"
icu.7z
)
endif()
- name: Download Qt Creator
id: qt_creator
shell: cmake -P {0}
run: |
string(REGEX MATCH "([0-9]+.[0-9]+).[0-9]+" outvar "$ENV{QT_CREATOR_VERSION}")
set(qtc_base_url "https://download.qt.io/official_releases/qtcreator/${CMAKE_MATCH_1}/$ENV{QT_CREATOR_VERSION}/installer_source")
set(qtc_snapshot "$ENV{QT_CREATOR_SNAPSHOT}")
if (qtc_snapshot)
set(qtc_base_url "https://download.qt.io/snapshots/qtcreator/${CMAKE_MATCH_1}/$ENV{QT_CREATOR_VERSION}/installer_source/${qtc_snapshot}")
endif()
if ("${{ runner.os }}" STREQUAL "Windows")
set(qtc_platform "windows_x64")
elseif ("${{ runner.os }}" STREQUAL "Linux")
set(qtc_platform "linux_x64")
endif()
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}/qtcreator" qtc_dir)
# Save the path for other steps
message("::set-output name=qtc_dir::${qtc_dir}")
message("[DBG] qtc_dir=${qtc_dir}")
file(MAKE_DIRECTORY qtcreator)
message("Downloading Qt Creator from ${qtc_base_url}/${qtc_platform}/")
foreach(package qtcreator qtcreator_dev)
message("Downloading ${qtc_base_url}/${qtc_platform}/${package}.7z")
file(DOWNLOAD
"${qtc_base_url}/${qtc_platform}/${package}.7z" ./${package}.7z SHOW_PROGRESS)
message("Extract: ${package}")
execute_process(COMMAND
${CMAKE_COMMAND} -E tar xvf ../${package}.7z WORKING_DIRECTORY qtcreator)
endforeach()
- name: Configure & Build
shell: cmake -P {0}
run: |
set(ENV{CC} ${{ matrix.c_compiler }})
set(ENV{CXX} ${{ matrix.cpp_compiler }})
# run environment script on Windows
if ("${{ runner.os }}" STREQUAL "Windows")
execute_process(
COMMAND "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat" && 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] ")
set(build_plugin_py "build_plugin.py")
message("[DBG] qtc_dir = ${{ steps.qt_creator.outputs.qtc_dir }}")
message("[DBG] build_plugin_py = ${build_plugin_py}")
foreach(dir "scripts" "share/qtcreator/scripts" "Contents/Resources/scripts")
message("[DBG] trying dir ${dir}")
if(EXISTS "${{ steps.qt_creator.outputs.qtc_dir }}/${dir}/build_plugin.py")
set(build_plugin_py "${dir}/build_plugin.py")
message("[DBG] build_plugin_py SET to ${build_plugin_py}")
break()
endif()
endforeach()
message("[DBG] build_plugin_py = ${build_plugin_py}")
execute_process(
COMMAND python
-u
"${{ steps.qt_creator.outputs.qtc_dir }}/${build_plugin_py}"
--name "$ENV{PLUGIN_NAME}-$ENV{QT_CREATOR_VERSION}-${{ matrix.artifact }}"
--src .
--build build
--qt-path "${{ steps.qt.outputs.qt_dir }}"
--qtc-path "${{ steps.qt_creator.outputs.qtc_dir }}"
--output-path "$ENV{GITHUB_WORKSPACE}"
RESULT_VARIABLE result
)
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: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: ${{ env.PLUGIN_NAME}}-${{ env.QT_CREATOR_VERSION }}-${{ matrix.artifact }}
path: ./${{ env.PLUGIN_NAME}}-${{ env.QT_CREATOR_VERSION }}-${{ matrix.artifact }}.7z
publish:
needs: build
name: ${{ matrix.name }}
runs-on: ${{ matrix.os }}
strategy:
# Set fail-fast to false to ensure that feedback is delivered for all matrix combinations. Consider changing this to true when your workflow is stable.
fail-fast: true
# Set up a matrix to run the following 2 configurations:
# 1. <Windows, Release, latest MSVC compiler toolchain on the default runner image, default generator>
# 2. <Linux, Release, latest GCC compiler toolchain on the default runner image, default generator>
matrix:
os: [ubuntu-latest, windows-latest]
include:
- name: "Windows x64"
os: windows-latest
artifact: "win-x64"
- name: "Linux x64"
os: ubuntu-latest
artifact: "linux-x64"
steps:
- name: Download artifact
uses: actions/download-artifact@v3
with:
name: ${{ env.PLUGIN_NAME }}-${{ env.QT_CREATOR_VERSION }}-${{ matrix.artifact }}