Skip to content

CMakeLists.txt: prepare for 0.0.97 beta #741

CMakeLists.txt: prepare for 0.0.97 beta

CMakeLists.txt: prepare for 0.0.97 beta #741

Workflow file for this run

name: CI
on:
push:
pull_request:
types: [opened, reopened]
defaults:
run:
shell: bash
# A note on bash code style (specifically if's)
# - No attempt to be POSIX-compliant, it's Bash (4.x+) here
# - In if's, use [[ ... ]] instead of [ ... ]; BUT quote strings around and next
# to ${{ }} expansions to make it clear those are strings and not,
# accidentally, numbers
# - Quotes: use "" only where shell "$VARIABLES" should be expanded, everywhere
# else '' is the way to go; ${{ }} is expanded before even feeding the script
# to Bash, so always use single quotes (or no quotes - except if's, see above)
# around them
jobs:
Prepare:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.generate.outputs.version }}
reftype: ${{ steps.generate.outputs.reftype }}
steps:
- id: generate
run: |
IFS=/ read -r ign type name merge <<<'${{ github.ref }}' # leading refs is (ign)ored
case $type in
heads) VERSION="${name:+$name-}ci${{ github.run_number }}" ;;
pull) VERSION="merge$name" ;;
tags) VERSION="$name" ;;
*) VERSION='ci{{ github.run_number }}'
esac
echo "Version string: $VERSION, ref type $type"
echo "version=$VERSION" >>$GITHUB_OUTPUT
echo "reftype=$type" >>$GITHUB_OUTPUT
Build:
runs-on: ${{ matrix.os }}
needs: Prepare
strategy:
fail-fast: false
matrix:
os: [ ubuntu-24.04, macos-latest, windows-latest ]
qt-version: [ 6 ]
override-compiler: [ '', GCC ] # Defaults: MSVC on Windows, Clang elsewhere
composition: [ own-quotient, static, dynamic ]
exclude:
# Unsupported combinations
- os: windows-latest
composition: dynamic
- os: macos-latest
composition: dynamic
- os: windows-latest
override-compiler: GCC
- os: macos-latest
override-compiler: GCC
include:
- os: ubuntu-24.04
composition: own-quotient
check: appstream # Use one of faster paths for validation
- os: ubuntu-24.04
# Use the variation with external libQuotient to do CodeQL analysis
# (libQuotient is analysed in its own repo)
composition: dynamic
check: codeql
env:
QTKEYCHAIN_REF: 0.14.3
QUOTIENT_REF: dev
VERSION: ${{ needs.Prepare.outputs.version }}
steps:
- uses: actions/checkout@v4
with:
submodules: ${{ matrix.composition == 'own-quotient' }}
- name: Install Qt (non-Linux)
if: "!startsWith(matrix.os, 'ubuntu')"
uses: jurplel/[email protected]
with:
version: "6.6"
cache: true
cache-key-prefix: Qt
modules: 'qtmultimedia'
tools: "tools_ninja${{ startsWith(matrix.os, 'windows') && ' tools_opensslv3_x64' || '' }}"
# Install on Linux via apt to test against Qt coming from the package manager
- name: Install dependencies (Linux)
if: startsWith(matrix.os, 'ubuntu')
run: |
sudo apt-get -qq install libolm-dev ninja-build \
qt6-declarative-dev qt6-base-private-dev qt6-tools-dev qt6-tools-dev-tools \
qt6-l10n-tools qml6-module-qtquick-controls qt6-multimedia-dev qtkeychain-qt6-dev
- name: Setup environment
run: |
if [[ '${{ matrix.override-compiler }}' == 'GCC' ]]; then
echo "CC=gcc" >>$GITHUB_ENV
echo "CXX=g++" >>$GITHUB_ENV
elif [[ '${{ runner.os }}' == 'Linux' ]]; then
echo "CC=clang" >>$GITHUB_ENV
echo "CXX=clang++" >>$GITHUB_ENV
fi
echo "CMAKE_ARGS=-GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo \
${{ runner.os != 'Linux' && '-DCMAKE_MAKE_PROGRAM=$IQTA_TOOLS/Ninja/ninja' || '' }} \
-DCMAKE_PREFIX_PATH=~/.local \
${{ runner.os == 'macOS' && '-DOPENSSL_ROOT_DIR=`brew --prefix openssl`' ||
runner.os == 'Windows' && '-DOPENSSL_ROOT_DIR=$IQTA_TOOLS/OpenSSLv3/Win_x64/' || '' }} \
-DBUILD_SHARED_LIBS=${{ matrix.composition == 'dynamic' }}" \
>>$GITHUB_ENV
- name: Setup MSVC environment
uses: ilammy/msvc-dev-cmd@v1
if: startsWith(matrix.os, 'windows')
with:
arch: x64
- name: Get, build and install QtKeychain
if: "!startsWith(matrix.os, 'ubuntu')"
run: |
git clone --depth=1 -b $QTKEYCHAIN_REF https://github.com/frankosterfeld/qtkeychain
cd qtkeychain
cmake -S . -B build $CMAKE_ARGS -DBUILD_WITH_QT6=ON -DCMAKE_INSTALL_PREFIX=~/.local
cmake --build build --target install
if [[ '${{ matrix.composition }}' == 'dynamic' ]]; then
QTKEYCHAIN_SO_PATH=$(dirname $(find ~/.local/lib* -name 'libqt?keychain.so'))
test -n "$QTKEYCHAIN_SO_PATH"
fi
- name: Get, build and install Olm
if: "!startsWith(matrix.os, 'ubuntu')"
run: |
git clone --depth=1 https://gitlab.matrix.org/matrix-org/olm.git
cmake -S olm -B olm/build $CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=~/.local
cmake --build olm/build --target install
- name: Get, build and install libQuotient
if: matrix.composition != 'own-quotient'
run: |
git clone --depth=1 -b $QUOTIENT_REF https://github.com/quotient-im/libQuotient
cd libQuotient
cmake -S . -B build $CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=~/.local -DCMAKE_PREFIX_PATH=~/.local
cmake --build build --target install
if [[ '${{ matrix.composition }}' == 'dynamic' ]]; then
QUOTIENT_SO_PATH=$(dirname $(find ~/.local/lib* -name libQuotient*.so))
test -n "$QUOTIENT_SO_PATH"
echo "DEP_SO_PATH=$DEP_SO_PATH:$QUOTIENT_SO_PATH" >>$GITHUB_ENV
fi
- name: Initialize CodeQL tools
if: matrix.check == 'codeql'
uses: github/codeql-action/init@v3
with:
languages: cpp
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
- name: Configure Quaternion
run: |
if [[ '${{ runner.os }}' == 'Windows' ]]; then
# DESTDIR doesn't work (and is not necessary) on Windows, see
# https://cmake.org/cmake/help/latest/envvar/DESTDIR.html
# NB: Using ${{ runner.temp }} (or any absolute path?) for install
# root on Windows somehow confuses the shell code using it
# (because of the volume letter?) - therefore relative path here.
INSTALL_PATH=Quaternion-$VERSION
else
INSTALL_PATH=/usr
DESTDIR=$GITHUB_WORKSPACE/install
echo "DESTDIR=$DESTDIR" >>$GITHUB_ENV
fi
cmake -LA -S $GITHUB_WORKSPACE -B build $CMAKE_ARGS -DDEPLOY_VERBOSITY=$DEPLOY_VERBOSITY \
-DCMAKE_INSTALL_PREFIX=$INSTALL_PATH
echo "FULL_INSTALL_PATH=$DESTDIR$INSTALL_PATH" >>$GITHUB_ENV
- name: Build and install Quaternion
run: cmake --build build --target install
- name: Perform CodeQL analysis
if: matrix.check == 'codeql'
uses: github/codeql-action/analyze@v3
- name: Validate installation (Linux)
if: startsWith(matrix.os, 'ubuntu')
run: |
find $FULL_INSTALL_PATH -name 'quaternion_*.qm'
LD_LIBRARY_PATH=$DEP_SO_PATH \
$FULL_INSTALL_PATH/bin/quaternion -platform offscreen --version
if [[ '${{ matrix.check }}' == 'appstream' ]]; then
sudo apt-get -qq install flatpak
flatpak install --user -y https://flathub.org/repo/appstream/org.freedesktop.appstream-glib.flatpakref
flatpak run org.freedesktop.appstream-glib validate $FULL_INSTALL_PATH/share/metainfo/*.appdata.xml
fi
- name: Make a package
if: matrix.composition == 'own-quotient' && matrix.override-compiler == ''
id: package
env:
DEPLOY_VERBOSITY: 1
run: |
PACKAGE_STEM=quaternion-${{ needs.Prepare.outputs.version }}
case ${{ runner.os }} in
Linux)
sudo apt-get -qq install appstream libgstreamer-plugins-base1.0.0 \
libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 \
libxcb-render-util0 libxcb-shape0 libxcb-xinerama0 libxkbcommon-x11-0 \
libfuse2
# Make sure OpenSSL ends up in AppImage - linuxdeploy doesn't
# copy it automatically
cp /usr/lib/*/libssl.so.* $DESTDIR/usr/lib/
for f in linuxdeploy linuxdeploy-plugin-qt; do
wget -c -nv --directory-prefix=linuxdeploy \
https://github.com/linuxdeploy/$f/releases/download/continuous/$f-x86_64.AppImage
chmod +x linuxdeploy/$f-x86_64.AppImage
done
# NB: $OUTPUT is both used in this script further below and
# propagated by linuxdeploy to appimagetool as the target path
export OUTPUT=$PACKAGE_STEM.AppImage
QMAKE=/usr/bin/qmake${{ matrix.qt-version }} \
QML_SOURCES_PATHS=$GITHUB_WORKSPACE/client/qml \
linuxdeploy/linuxdeploy-x86_64.AppImage --appdir $DESTDIR \
--plugin qt --output appimage
;;
macOS)
OUTPUT=$PACKAGE_STEM.dmg
cmake --build build --target image
mv build/quaternion.dmg $OUTPUT
;;
Windows)
ls -l $FULL_INSTALL_PATH/quaternion.exe # Fail if it's not there
rm -rf $FULL_INSTALL_PATH/{include,lib/cmake,share,qmltooling}
OUTPUT=$PACKAGE_STEM.zip
7z a $OUTPUT $FULL_INSTALL_PATH
;;
esac
find $OUTPUT -size +10M
echo "path=$OUTPUT" >>$GITHUB_OUTPUT
- name: Store artefacts
if: steps.package.outputs.path != ''
uses: actions/upload-artifact@v4
with:
name: quaternion-${{ env.VERSION }}-${{ runner.os }}
path: ${{ steps.package.outputs.path }}
retention-days: 7
Publish:
runs-on: ubuntu-latest
needs: [ Prepare, Build ]
strategy:
fail-fast: false
matrix:
type: [ macOS, Linux, Windows ]
steps:
- name: Retrieve artefacts
id: get-package
uses: actions/download-artifact@v4
with:
name: quaternion-${{ needs.Prepare.outputs.version}}-${{ matrix.type }}
path: package
- name: Upload artefacts to Cloudsmith (interim builds)
if: needs.Prepare.outputs.reftype != 'tags' # Tags will go to GitHub Releases
uses: cloudsmith-io/[email protected]
with:
api-key: '${{ secrets.CLOUDSMITH_API_KEY }}'
format: raw
owner: quotient
repo: quaternion
file: "`find package -name '*.*'`" # Globs don't seem to work: https://github.com/cloudsmith-io/action/issues/21
name: ${{ matrix.type }}
summary: CI builds of Quaternion, ${{ matrix.type }}
description: |
The builds produced by the continuous integration; only intended for testing,
not for production usage. No workability guarantees whatsoever.
version: ${{ needs.Prepare.outputs.version }}
republish: true
- name: Upload artefact to GitHub Releases (tag builds)
if: needs.Prepare.outputs.reftype == 'tags' && matrix.type != 'Linux'
uses: ncipollo/release-action@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit: dev
artifacts: ${{ steps.get-package.outputs.download-path }}/*
# It tends to false-prerelease things but that's better than false-release them
prerelease: ${{ contains(needs.Prepare.outputs.version, '-') }}
allowUpdates: true
# Create as a draft, update without touching the draft flag
draft: true
omitDraftDuringUpdate: true
# Never write name and body - this action is to upload files only
name: ""
omitNameDuringUpdate: true
body: ""
omitBodyDuringUpdate: true