add CMake build system support #427
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 | |
on: | |
push: | |
branches: | |
- master | |
pull_request: | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | |
cancel-in-progress: true | |
env: | |
ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true | |
defaults: | |
run: | |
shell: bash | |
jobs: | |
ubuntu: | |
strategy: | |
fail-fast: false | |
matrix: | |
container_version: | |
- '20.04' | |
- '22.04' | |
runs-on: ubuntu-latest | |
container: ubuntu:${{ matrix.container_version }} | |
steps: | |
- name: Install Qt | |
run: | | |
apt-get update | |
DEBIAN_FRONTEND=noninteractive apt-get install -y --force-yes \ | |
build-essential \ | |
python3 \ | |
python3-dev \ | |
libpython3-dev \ | |
qtbase5-dev \ | |
qtbase5-private-dev \ | |
qt5-qmake \ | |
qtbase5-dev-tools \ | |
qttools5-dev \ | |
qtdeclarative5-dev \ | |
libqt5svg5* \ | |
libqt5xmlpatterns5* \ | |
libqt5multimedia5* \ | |
libqt5multimediawidgets5* \ | |
libqt5qml5* \ | |
libqt5quickwidgets5* \ | |
qtmultimedia5-dev | |
apt-get clean | |
- name: Checkout PythonQt | |
uses: actions/checkout@v4 | |
- name: Ccache | |
uses: hendrikmuhs/ccache-action@v1.2.14 | |
with: | |
key: ${{ runner.os }}-ubuntu-${{ matrix.container_version }} | |
- name: Build PythonQt | |
run: | | |
export QT_SELECT=qt5 | |
echo ======= SYSTEM INFO ======== | |
uname -a; gcc --version | grep "gcc"; python3 --version; qmake --version | |
echo ============================ | |
qmake -r PythonQt.pro CONFIG+=ccache CONFIG+=release CONFIG+=force_debug_info \ | |
CONFIG+=sanitizer CONFIG+=sanitize_undefined CONFIG+=sanitize_address \ | |
PYTHON_VERSION=$(python3 --version | cut -d " " -f 2 | cut -d "." -f1,2) \ | |
PYTHON_DIR=$(which python3 | xargs dirname | xargs dirname) | |
make -j $(nproc) | |
PYTHONDEVMODE=1 PYTHONASYNCIODEBUG=1 PYTHONWARNINGS=error PYTHONMALLOC=malloc_debug \ | |
UBSAN_OPTIONS="halt_on_error=1" ASAN_OPTIONS="detect_leaks=0:detect_stack_use_after_return=1:fast_unwind_on_malloc=0" \ | |
make check TESTARGS="-platform offscreen" | |
- name: Run memory tests with sanitizers | |
run: | | |
QT_VERSION_FULL=$(qmake -query QT_VERSION) | |
if [[ "$QT_VERSION_FULL" == 5.12* ]]; then | |
echo "leak:QPlatformIntegrationFactory::create" >> $PWD/lsan.supp | |
export LSAN_OPTIONS="suppressions=$PWD/lsan.supp" | |
fi | |
PYTHONDEVMODE=1 PYTHONASYNCIODEBUG=1 PYTHONWARNINGS=error PYTHONMALLOC=malloc_debug \ | |
UBSAN_OPTIONS="halt_on_error=1" ASAN_OPTIONS="detect_leaks=1:detect_stack_use_after_return=1:fast_unwind_on_malloc=0" \ | |
PYTHONQT_RUN_ONLY_MEMORY_TESTS=1 \ | |
make check TESTARGS="-platform minimal" | |
- name: Generate Wrappers | |
run: | | |
# workaround to allow to find the Qt include dirs for installed standard qt packages | |
mkdir /usr/include/qt5; ln -s /usr/include/x86_64-linux-gnu/qt5 /usr/include/qt5/include | |
export QTDIR=/usr/include/qt5 | |
cd generator | |
UBSAN_OPTIONS="halt_on_error=1" ASAN_OPTIONS="detect_leaks=0:detect_stack_use_after_return=1:fast_unwind_on_malloc=0" \ | |
./pythonqt_generator | |
- name: Upload Wrappers | |
uses: actions/upload-artifact@v4 | |
with: | |
name: wrappers_ubuntu_${{ matrix.container_version }} | |
path: generated_cpp | |
oldschool: | |
strategy: | |
fail-fast: false | |
matrix: | |
container_os: ['centos'] | |
container_os_version: ['7'] | |
container_os_python_package: ['python-debug'] | |
configuration: ['debug', 'release'] | |
include: | |
- container_os: 'rockylinux' | |
container_os_version: '9' | |
container_os_python_package: 'python3-devel' | |
configuration: 'release' | |
runs-on: ubuntu-latest | |
container: '${{ matrix.container_os }}:${{ matrix.container_os_version }}' | |
steps: | |
- name: Change centos archive repository | |
run: | | |
sed -i s/mirror.centos.org/vault.centos.org/g /etc/yum.repos.d/*.repo | |
sed -i s/^#.*baseurl=http/baseurl=http/g /etc/yum.repos.d/*.repo | |
sed -i s/^mirrorlist=http/#mirrorlist=http/g /etc/yum.repos.d/*.repo | |
if: matrix.container_os == 'centos' | |
- name: Install Qt | |
run: | | |
yum update -y | |
yum groupinstall "Development Tools" -y | |
yum install -y \ | |
which \ | |
${{ matrix.container_os_python_package }} \ | |
qt5-qtbase-* \ | |
qt5-qttools* \ | |
qt5-qtsvg \ | |
qt5-qtxmlpatterns \ | |
qt5-qtmultimedia \ | |
qt5-qt3d \ | |
qt5-*-devel | |
- name: Checkout PythonQt | |
uses: actions/checkout@v3 | |
- name: Build PythonQt | |
run: | | |
export QT_SELECT=qt5 | |
echo ======= SYSTEM INFO ======== | |
which python 2>/dev/null && export PYTHON_VERSION_SUFFIX= || export PYTHON_VERSION_SUFFIX=3 | |
uname -a; gcc --version | grep "gcc"; python${PYTHON_VERSION_SUFFIX} --version; qmake-qt5 --version | |
echo ============================ | |
export PYTHON_VERSION_SHORT=`python${PYTHON_VERSION_SUFFIX} --version | cut -d " " -f 2 | cut -d "." -f1,2` | |
if [[ `echo ${PYTHON_VERSION_SHORT} | wc -w` = 0 ]]; then export PYTHON_VERSION_SHORT=2.7; fi | |
export PYTHON_DIR=`which python${PYTHON_VERSION_SUFFIX} | xargs dirname | xargs dirname` | |
echo PYTHON_VERSION_SHORT=${PYTHON_VERSION_SHORT} | |
echo PYTHON_DIR=${PYTHON_DIR} | |
qmake-qt5 -r PythonQt.pro CONFIG+=${{ matrix.configuration }} \ | |
"PYTHON_VERSION=${PYTHON_VERSION_SHORT}" "PYTHON_DIR=${PYTHON_DIR}" | |
make -j $(nproc) && \ | |
PYTHONDEVMODE=1 PYTHONASYNCIODEBUG=1 PYTHONWARNINGS=error PYTHONMALLOC=malloc_debug \ | |
make check TESTARGS="-platform offscreen" | |
- name: Generate Wrappers | |
run: | | |
# workaround to allow to find the Qt include dirs for installed standard qt packages | |
mkdir /usr/include/qt5ln; ln -s /usr/include/qt5 /usr/include/qt5ln/include | |
export QTDIR=/usr/include/qt5ln | |
cd generator | |
./pythonqt_generator | |
- name: Upload Wrappers | |
uses: actions/upload-artifact@v3 | |
with: | |
name: wrappers_${{ matrix.container_os }}-${{ matrix.container_os_version }}_${{ matrix.configuration }} | |
path: generated_cpp | |
macOS: | |
strategy: | |
fail-fast: false | |
matrix: | |
macos-version: ['latest'] | |
python-version: ['3.9'] | |
qt-version: ['5.9.*'] | |
configuration: ['release','debug'] | |
include: | |
- macos-version: 'latest' | |
python-version: '3.11' | |
qt-version: '5.12.*' | |
configuration: 'debug' | |
runs-on: macos-${{ matrix.macos-version }} | |
steps: | |
- name: Install Qt | |
uses: jurplel/install-qt-action@v4 | |
with: | |
version: ${{ matrix.qt-version }} | |
host: 'mac' | |
target: 'desktop' | |
arch: 'clang_64' | |
modules: 'qtscript' | |
archives: 'qtmultimedia qtmacextras qtbase qttools' | |
- name: Setup Python ${{ matrix.python-version }} | |
uses: actions/setup-python@v5 | |
with: | |
python-version: '${{ matrix.python-version }}' | |
- name: Checkout PythonQt | |
uses: actions/checkout@v4 | |
- name: Ccache | |
uses: hendrikmuhs/ccache-action@v1.2.14 | |
with: | |
key: ${{ runner.os }}-${{ matrix.qt-version }} | |
- name: Detect exact versions | |
id : versions | |
run : | | |
set -eu | |
PYTHON_VERSION_FULL=$(python --version 2>&1 | cut -f 2 -d ' ') | |
PYTHON_VERSION_SHORT=$(cut -f 1,2 -d . <<< $PYTHON_VERSION_FULL) | |
QT_VERSION_FULL=$($QT_ROOT_DIR/bin/qmake -query QT_VERSION) | |
QT_VERSION_SHORT=$(cut -f 1,2 -d . <<< $QT_VERSION_FULL) | |
MACOS_VERSION_FULL=$(sw_vers -productVersion) | |
MACOS_VERSION_SHORT=$(cut -f 1,2 -d . <<< $MACOS_VERSION_FULL) | |
echo "PYTHON_VERSION_FULL=$PYTHON_VERSION_FULL" | tee -a $GITHUB_OUTPUT | |
echo "PYTHON_VERSION_SHORT=$PYTHON_VERSION_SHORT" | tee -a $GITHUB_OUTPUT | |
echo "QT_VERSION_FULL=$QT_VERSION_FULL" | tee -a $GITHUB_OUTPUT | |
echo "QT_VERSION_SHORT=$QT_VERSION_SHORT" | tee -a $GITHUB_OUTPUT | |
echo "MACOS_VERSION_FULL=$MACOS_VERSION_FULL" | tee -a $GITHUB_OUTPUT | |
echo "MACOS_VERSION_SHORT=$MACOS_VERSION_SHORT" | tee -a $GITHUB_OUTPUT | |
- name: Build PythonQt | |
run: | | |
set -ue | |
echo ======= SYSTEM INFO ======== | |
uname -a; gcc --version | head -n 1; python --version; qmake --version | |
echo ============================ | |
PYTHON_VERSION_MAJOR=$(cut -d . -f1 <<< ${{ steps.versions.outputs.PYTHON_VERSION_SHORT }}) | |
for i in "python${{ steps.versions.outputs.PYTHON_VERSION_SHORT }}-embed" "python${{ steps.versions.outputs.PYTHON_VERSION_SHORT }}" \ | |
"python${PYTHON_VERSION_MAJOR}-embed" "python${PYTHON_VERSION_MAJOR}" | |
do if pkg-config --exists "$i"; then PYTHON_PKGCONFIG_NAME="$i"; break; fi; done | |
qmake CONFIG+=ccache CONFIG+=${{ matrix.configuration }} CONFIG+=sanitizer CONFIG+=sanitize_undefined CONFIG+=sanitize_address \ | |
PYTHON_VERSION=${{ steps.versions.outputs.PYTHON_VERSION_SHORT }} \ | |
PYTHON_DIR="$pythonLocation" \ | |
PKGCONFIG+=$PYTHON_PKGCONFIG_NAME \ | |
-r PythonQt.pro | |
make -j $(nproc) | |
PYTHONDEVMODE=1 PYTHONASYNCIODEBUG=1 PYTHONWARNINGS=error PYTHONMALLOC=malloc_debug \ | |
UBSAN_OPTIONS="halt_on_error=1" ASAN_OPTIONS="detect_leaks=0:detect_stack_use_after_return=1:fast_unwind_on_malloc=0" \ | |
make check TESTARGS="-platform offscreen" | |
- name: Generate Wrappers | |
if: ${{ contains(matrix.configuration, 'release') }} | |
run: | | |
cd generator | |
# workaround to allow to find the Qt include dirs for installed standard qt packages | |
UBSAN_OPTIONS="halt_on_error=1" ASAN_OPTIONS="detect_leaks=0:detect_stack_use_after_return=1:fast_unwind_on_malloc=0" \ | |
QTDIR=-UNDEFINED- ./pythonqt_generator --qt-version=${{ steps.versions.outputs.QT_VERSION_FULL }} --include-paths=$QT_ROOT_DIR/lib | |
- name: Upload Wrappers | |
uses: actions/upload-artifact@v4 | |
with: | |
name: wrappers_macos${{ steps.versions.outputs.MACOS_VERSION_SHORT }}_qt${{ steps.versions.outputs.QT_VERSION_SHORT }} | |
path: generated_cpp | |
windows: | |
strategy: | |
fail-fast: false | |
matrix: | |
qt-arch: ['win64_mingw73'] | |
python-version: ['3.10'] | |
qt-version: ['5.12.*'] | |
python-arch: ['x64'] | |
pythonqtall-config: [''] | |
# msvc-toolset: ['14.0'] | |
include: | |
- qt-arch: 'win64_msvc2017_64' | |
python-version: '3.6' | |
python-arch: 'x64' | |
qt-version: '5.11.*' | |
# msvc-toolset: '14.16' | |
- qt-arch: 'win64_msvc2019_64' | |
python-version: '3.12' | |
python-arch: 'x64' | |
qt-version: '5.15.*' | |
pythonqtall-config: 'PythonQtCore PythonQtGui PythonQtMultimedia' | |
- qt-arch: 'win32_mingw53' | |
python-version: '3.6' | |
python-arch: 'x86' | |
qt-version: '5.11.*' | |
#Either MSVC2015 is sick or Qt5.9 is buggy :( | |
#Main problem is QBasicMutex with default ctor, that (by no means) is missing in dll-export of QtCore, but linker tries to find it | |
# - qt-arch: 'win32_msvc2015' | |
# python-version: '2.7' | |
# python-arch: 'x86' | |
# qt-version: '5.9.*' | |
# pythonqtall-config: 'PythonQtCore PythonQtGui PythonQtMultimedia' | |
runs-on: windows-latest | |
steps: | |
- name: Checkout PythonQt | |
uses: actions/checkout@v4 | |
- name: Reset PATH | |
uses: egor-tensin/cleanup-path@v4 | |
- name: Install MSVC++ | |
uses: ilammy/msvc-dev-cmd@v1 | |
if: ${{ contains(matrix.qt-arch, 'msvc') }} | |
with: | |
arch: amd64${{ contains(matrix.python-arch, 'x86') && '_x86' || '' }} | |
- name: Install Qt | |
uses: jurplel/install-qt-action@v4 | |
with: | |
version: ${{ matrix.qt-version }} | |
host: 'windows' | |
target: 'desktop' | |
arch: ${{ matrix.qt-arch }} | |
modules: 'qtscript' | |
archives: 'qtwinextras qtmultimedia qtbase' | |
tools: ${{ contains(matrix.qt-arch, 'mingw') && format('tools_mingw,qt.tools.{0}0', matrix.qt-arch) || '' }} | |
- name: Setup Python ${{ matrix.python-version }} | |
uses: actions/setup-python@v4 | |
with: | |
python-version: '${{ matrix.python-version }}' | |
architecture: ${{ matrix.python-arch }} | |
- name: Detect exact versions | |
shell: bash | |
id: versions | |
run: | | |
set -eu | |
QT_VERSION_FULL=$("$QT_ROOT_DIR/bin/qmake" -query QT_VERSION) | |
QT_VERSION_SHORT=$(cut -f 1,2 -d . <<< $QT_VERSION_FULL) | |
PYTHON_VERSION_FULL=$(python --version 2>&1 | cut -f 2 -d ' ') | |
PYTHON_VERSION_SHORT=$(cut -f 1,2 -d . <<< $PYTHON_VERSION_FULL) | |
echo "QT_VERSION_FULL=$QT_VERSION_FULL" | tee -a $GITHUB_OUTPUT | |
echo "QT_VERSION_SHORT=$QT_VERSION_SHORT" | tee -a $GITHUB_OUTPUT | |
echo "PYTHON_VERSION_SHORT=$PYTHON_VERSION_SHORT" | tee -a $GITHUB_OUTPUT | |
- name: Build PythonQt | |
shell: cmd | |
run: | | |
qmake -query | |
python --version | |
set PYTHONQTALL_CONFIG=${{ matrix.pythonqtall-config }} | |
qmake CONFIG+=release CONFIG-=debug_and_release CONFIG-=debug_and_release_target ^ | |
"PYTHON_PATH=%pythonLocation%" ^ | |
"PYTHON_VERSION=${{ steps.versions.outputs.PYTHON_VERSION_SHORT }}" ^ | |
PythonQt.pro | |
set PYTHONDEVMODE=1 | |
set PYTHONASYNCIODEBUG=1 | |
set PYTHONWARNINGS=error | |
mingw32-make -j 2 && mingw32-make check "TESTARGS=-platform offscreen" ^ | |
|| set CL=/MP && nmake && nmake check "TESTARGS=-platform offscreen" | |
- name: Generate Wrappers | |
shell: cmd | |
run: | | |
cd generator | |
set QTDIR=%QT_ROOT_DIR% | |
pythonqt_generator | |
- name: Upload Wrappers | |
if: (matrix.pythonqtall-config || '') == '' | |
uses: actions/upload-artifact@v4 | |
with: | |
name: wrappers_${{ matrix.qt-arch }}_${{ steps.versions.outputs.QT_VERSION_SHORT }} | |
path: generated_cpp |