refactor: adjusting discord-rpc dependencies to work with windows #113
Workflow file for this run
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: Build CuteDiscordPresence on multiple platforms | |
on: [push] | |
# The version of Qt must be the same as the one used to build Qt Creator. | |
# To check this: Help -> System Information within Qt Creator | |
env: | |
PLUGIN_NAME: CuteDiscordPresence | |
QT_VERSION: 6.6.2 | |
QT_CREATOR_VERSION: 13.0.0 | |
QT_CREATOR_SNAPSHOT: NO | |
QT_MIRRORS: download.qt.io;mirrors.ocf.berkeley.edu/qt;ftp.fau.de/qtproject;mirror.bit.edu.cn/qtproject | |
CMAKE_VERSION: 3.28.1 | |
NINJA_VERSION: 1.10.2 | |
jobs: | |
# The release job. | |
# If the github.ref contains /tags/v a release will be set up. | |
# This is done before the builds to simplify the logic to upload the build artifacts to the release. | |
# The release stage a file that contains the URL of where the build artifacts must go. | |
# It is also executed only once, on one agent. | |
release: | |
name: Create release | |
if: contains(github.ref, '/tags/v') | |
runs-on: ubuntu-latest | |
steps: | |
- name: Create release | |
if: contains(github.ref, '/tags/v') | |
id: create_release | |
uses: actions/create-release@latest | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
with: | |
tag_name: ${{ github.ref }} | |
release_name: ${{ github.ref }} | |
body: | | |
Release for **Qt Creator ${{env.QT_CREATOR_VERSION}}.** | |
Download the correct file based on operating system and architecture of Qt Creator. | |
[How to install the plugin by Qt Creator](https://doc.qt.io/qtcreator/creator-how-to-install-plugins.html) | |
Please refer to the main page of the project for usage information. | |
On Windows, make sure to download the correct version for the Qt Creator used, not the architecture of the Operating System. | |
To check this: From Qt Creator, go to "Help" -> "About Qt Creator..." | |
**Warning:** The plugin has not been thoroughly tested on Windows and may not function optimally due to library dependencies on discord-rpc. | |
Please feel free to test it on Windows and contribute any necessary adjustments. | |
draft: false | |
prerelease: false | |
- name: Store release url | |
shell: pwsh | |
run: Write-Output "${{ steps.create_release.outputs.upload_url }}" > ./release_upload_url.txt | |
- name: Upload release url | |
uses: actions/upload-artifact@v2 | |
with: | |
path: ./release_upload_url.txt | |
name: release_upload_url.txt | |
build: | |
name: Build ${{ matrix.config.name }} | |
runs-on: ${{ matrix.config.os }} | |
env: | |
OS: ${{ matrix.config.name }} | |
strategy: | |
matrix: | |
config: | |
- { | |
name: "win64", | |
os: windows-latest, | |
sys: "windows", | |
arch: "x64", | |
qt_arch: "win64_msvc2019_64", | |
qtc_platform: "windows_x64", | |
environment_script: "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Auxiliary/Build/vcvars64.bat", | |
is_msvc: true, | |
c_compiler: cl, | |
cpp_compiler: cl, | |
artifact: "win-x64" | |
} | |
- { | |
name: "linux", | |
os: ubuntu-latest, | |
sys: "linux", | |
arch: "x64", | |
qt_arch: "", | |
qtc_platform: "linux_x64", | |
c_compiler: gcc, | |
cpp_compiler: g++, | |
artifact: "linux-x64" | |
} | |
fail-fast: false | |
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}") | |
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 "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") | |
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) | |
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 depends on libicu56.so | |
if ("${{ runner.os }}" STREQUAL "Linux") | |
downloadAndExtract( | |
"${qt_base_url}/qt.qt6.${qt_version_dotless}.${qt_package_arch_suffix}/${qt_package_version}icu-linux-Rhel7.2-x64.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 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("qtc_dir=${qtc_dir}" >> "$GITHUB_OUTPUT") | |
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: test | |
shell: pwsh | |
run: dir | |
- name: Configure & Build | |
shell: cmake -P {0} | |
run: | | |
set(ENV{CC} ${{ matrix.config.c_compiler }}) | |
set(ENV{CXX} ${{ matrix.config.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.config.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: Collect Binaries | |
shell: pwsh | |
run: | | |
${PLUGIN_DIR_BASE} = "Plugin/" | |
${PLUGIN_ARCHIVE} = "CuteDiscordPresence-Plugin_QtC${env:QT_CREATOR_VERSION}_${env:OS}_${{matrix.config.arch}}" | |
switch ("${{runner.os}}") | |
{ | |
"Windows" { | |
dir | |
cd build | |
dir | |
$PLUGIN_DIR_OUT = "${PLUGIN_DIR_BASE}/lib/qtcreator/plugins" | |
New-Item -ItemType Directory -Path $PLUGIN_DIR_OUT -Force | |
$PLUGIN_OBJ = (Get-ChildItem -Path . -Filter CuteDiscordPresence.dll -Recurse -ErrorAction SilentlyContinue -Force | Select-Object -First 1).FullName | |
Write-Output "PLUGIN_OBJ: $PLUGIN_OBJ" | |
Copy-Item -Path $PLUGIN_OBJ -Destination $PLUGIN_DIR_OUT | |
Push-Location $PLUGIN_DIR_BASE | |
$env:PLUGIN_ARCHIVE_NAME = "${PLUGIN_ARCHIVE}.zip" | |
7z a $env:PLUGIN_ARCHIVE_NAME lib | |
Pop-Location | |
} | |
"Linux" { | |
${PLUGIN_DIR_OUT} = "${PLUGIN_DIR_BASE}/lib/qtcreator/plugins" | |
New-Item -ItemType Directory "${PLUGIN_DIR_OUT}" -Force | |
${PLUGIN_OBJ} = Get-ChildItem -Path . -Filter libCuteDiscordPresence.so -Recurse -ErrorAction SilentlyContinue -Force | %{$_.FullName} | |
Write-Output "PLUGIN_OBJ: ${PLUGIN_OBJ}" | |
Copy-Item -Path "${PLUGIN_OBJ}" -Destination "${PLUGIN_DIR_OUT}/" | |
Push-Location ${PLUGIN_DIR_BASE} | |
${env:PLUGIN_ARCHIVE_NAME} = "${PLUGIN_ARCHIVE}.tar.gz" | |
7z a -ttar "${PLUGIN_ARCHIVE}.tar" lib | |
7z a -tgzip "${env:PLUGIN_ARCHIVE_NAME}" "${PLUGIN_ARCHIVE}.tar" | |
Pop-Location | |
} | |
} | |
${env:PLUGIN_ARCHIVE_FULL} = "${PLUGIN_DIR_BASE}/${env:PLUGIN_ARCHIVE_NAME}" | |
Write-Output "PLUGIN_ARCHIVE_FULL=${{github.workspace}}/${env:PLUGIN_ARCHIVE_FULL}" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append | |
Write-Output "PLUGIN_ARCHIVE_NAME=${env:PLUGIN_ARCHIVE_NAME}" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append | |
- uses: actions/upload-artifact@v2 | |
id: upload_artifact | |
with: | |
path: ${{env.PLUGIN_ARCHIVE_FULL}} | |
name: ${{env.PLUGIN_ARCHIVE_NAME}} | |
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: Checkout code | |
uses: actions/checkout@v2 | |
- name: Download release url | |
if: contains(github.ref, '/tags/v') | |
uses: actions/download-artifact@v2 | |
with: | |
name: release_upload_url.txt | |
path: ./ | |
- name: Download artifact | |
uses: actions/download-artifact@v3 | |
with: | |
name: ${{env.PLUGIN_ARCHIVE_FULL}} | |
- name: Set Release Var | |
if: contains(github.ref, '/tags/v') | |
shell: pwsh | |
run: | | |
${RELEASE_URL} = Get-Content ./release_upload_url.txt | |
Write-Output "Release URL: ${RELEASE_URL}" | |
Write-Output "RELEASE_URL=${RELEASE_URL}" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append | |
- name: Upload release artifacts | |
if: contains(github.ref, '/tags/v') | |
uses: actions/upload-release-asset@v1 | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
with: | |
upload_url: ${{env.RELEASE_URL}} | |
asset_path: ${{env.PLUGIN_ARCHIVE_FULL}} | |
asset_name: ${{env.PLUGIN_ARCHIVE_NAME}} | |
asset_content_type: application/zip |