Add suport for third-party modules (c-extensions) #81
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 | |
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/[email protected] | |
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 \ | |
CONFIG+=tests CONFIG+=generator \ | |
PYTHON_VERSION=$(python3 --version | cut -d " " -f 2 | cut -d "." -f1,2) \ | |
PYTHON_DIR=$(which python3 | xargs dirname | xargs dirname) | |
make -j $(nproc) | |
- name: Run 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" | |
export ASAN_OPTIONS="detect_leaks=0:detect_stack_use_after_return=1:fast_unwind_on_malloc=0" | |
fi | |
if [[ "$QT_VERSION_FULL" == 5.15* ]]; then | |
export ASAN_OPTIONS="detect_leaks=1:detect_stack_use_after_return=1:fast_unwind_on_malloc=0" | |
fi | |
PYTHONDEVMODE=1 PYTHONASYNCIODEBUG=1 PYTHONWARNINGS=error PYTHONMALLOC=malloc_debug \ | |
UBSAN_OPTIONS="halt_on_error=1" \ | |
make check | |
- 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 | |
altlinux: | |
runs-on: ubuntu-latest | |
container: altlinux/base:latest | |
steps: | |
- name: Install Qt | |
run: | | |
apt-get update && apt-get install -y \ | |
gcc-c++ \ | |
python3-dev \ | |
libpython3 \ | |
qt5-base-devel \ | |
qt5-tools-devel \ | |
qt5-declarative-devel \ | |
qt5-svg-devel \ | |
qt5-multimedia-devel \ | |
qt5-xmlpatterns-devel \ | |
qt5-multimedia-devel \ | |
qt5-quick1-devel \ | |
qt5-script-devel \ | |
qt5-3d-devel \ | |
make | |
apt-get clean | |
- name: Checkout PythonQt | |
uses: actions/checkout@v3 | |
- name: Build PythonQt | |
run: | | |
export QT_SELECT=qt5 | |
echo ======= SYSTEM INFO ======== | |
uname -a; gcc --version | grep "gcc"; python3 --version; qmake-qt5 --version | |
echo ============================ | |
export PYTHON_VERSION_SHORT=`python3 --version | cut -d " " -f 2 | cut -d "." -f1,2` | |
qmake-qt5 -r PythonQt.pro CONFIG+=release \ | |
CONFIG+=tests CONFIG+=generator \ | |
"PYTHON_VERSION=${PYTHON_VERSION_SHORT}" PYTHON_DIR="/usr" | |
make -j $(nproc) && \ | |
PYTHONDEVMODE=1 PYTHONASYNCIODEBUG=1 PYTHONWARNINGS=error PYTHONMALLOC=malloc_debug \ | |
make check | |
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 }} \ | |
CONFIG+=tests CONFIG+=generator \ | |
"PYTHON_VERSION=${PYTHON_VERSION_SHORT}" "PYTHON_DIR=${PYTHON_DIR}" | |
make -j $(nproc) && \ | |
PYTHONDEVMODE=1 PYTHONASYNCIODEBUG=1 PYTHONWARNINGS=error PYTHONMALLOC=malloc_debug \ | |
make check | |
- 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: ['12'] | |
python-version: ['3.9'] | |
qt-version: ['5.9.*'] | |
configuration: ['release','debug'] | |
include: | |
- macos-version: '12' | |
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/[email protected] | |
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 \ | |
CONFIG+=tests CONFIG+=generator \ | |
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 | |
- 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@v5 | |
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 ^ | |
CONFIG+=tests CONFIG+=generator ^ | |
"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 ^ | |
|| set CL=/MP && nmake && nmake check | |
- 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 |