Skip to content

Commit bf0ff9e

Browse files
feihonghjmjohnson
authored andcommitted
ENH: add CMake build system support and update CI
add static link support add CMake build support to PythonQtGenerator prefer to use ${CMAKE_CURRENT_LIST_DIR}/generated_cpp add custom targets to automatically run generated commands Initial support for using auto-generated wrappers enable testing add cmake ci CMake CI Process Validation Update cmake.yml adapting more Qt header file include paths fix _qt_include_prefix Captured partial cmake rewrite from ``` REMOTE: git@github.com:feihong-gz/pythonqt.git commit d02ca888ffca2012307bfe9d5e1a176eb95f0cfc Author: feihong <wangfeihong@pzeda.com> Date: 2025-02-13 02:08:42 -0500 ```
1 parent a268782 commit bf0ff9e

13 files changed

Lines changed: 420 additions & 171 deletions

File tree

.github/workflows/cmake.yml

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
name: CMake CI
2+
3+
on:
4+
push:
5+
branches:
6+
- master
7+
8+
jobs:
9+
build-and-test:
10+
runs-on: ${{ matrix.os }}
11+
strategy:
12+
matrix:
13+
os: [ubuntu-latest, windows-latest]
14+
qt_version: [5, 6]
15+
python_version: ["3.8", "3.9", "3.10"]
16+
fail-fast: false
17+
18+
steps:
19+
- name: Checkout code
20+
uses: actions/checkout@v3
21+
22+
- name: Set up Python
23+
uses: actions/setup-python@v4
24+
with:
25+
python-version: ${{ matrix.python_version }}
26+
27+
- name: Install dependencies (Linux)
28+
if: runner.os == 'Linux'
29+
run: |
30+
sudo apt-get update
31+
if [ "${{ matrix.qt_version }}" = "5" ]; then
32+
sudo apt-get install -y qtbase5-dev qtbase5-private-dev qtchooser qt5-qmake qtbase5-dev-tools \
33+
libqt5svg5-dev qttools5-dev libqt5xmlpatterns5-dev qtmultimedia5-dev qtdeclarative5-dev \
34+
qtwebengine5-dev libqt5webkit5-dev
35+
echo "QTDIR=/usr/lib/x86_64-linux-gnu/qt5" | tee -a $GITHUB_ENV
36+
else
37+
sudo apt-get install -y qt6-base-dev qt6-base-private-dev qt6-5compat-dev qt6-base-dev-tools \
38+
libqt6svg6-dev qt6-multimedia-dev qt6-declarative-dev qt6-webengine-dev
39+
echo "QTDIR=/usr/lib/x86_64-linux-gnu/qt6" | tee -a $GITHUB_ENV
40+
fi
41+
42+
- name: Install dependencies (Windows)
43+
if: runner.os == 'Windows'
44+
run: |
45+
if ("${{ matrix.qt_version }}" -eq "5") {
46+
pip install aqtinstall
47+
aqt install-qt windows desktop 5.15.2 win64_msvc2019 -m all
48+
$Qt5Dir = "$env:USERPROFILE\Qt\5.15.2\msvc2019_64"
49+
echo "Qt5Dir=$Qt5Dir" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
50+
echo "$Qt5Dir\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
51+
echo "QTDIR=$Qt5Dir" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
52+
} else {
53+
choco install -y qt6-base-dev qt6-base-private-dev qt6-5compat-dev qt6-base-dev-tools `
54+
libqt6svg6-dev qt6-multimedia-dev qt6-declarative-dev qt6-webengine-dev `
55+
--params "/InstallationFolder C:/Qt/${{ matrix.qt_version }}"
56+
echo "C:/Qt/${{ matrix.qt_version }}/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
57+
echo "QTDIR=C:/Qt/${{ matrix.qt_version }}" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
58+
}
59+
60+
- name: Configure CMake
61+
run: |
62+
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=./install
63+
64+
- name: Build project
65+
run: |
66+
cmake --build build --parallel --target all install
67+
68+
- name: Run tests
69+
run: |
70+
cd build
71+
ctest --output-on-failure

CMakeLists.txt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
cmake_minimum_required(VERSION 3.27)
2+
3+
project(PythonQt LANGUAGES CXX VERSION 3.5.6)
4+
5+
enable_testing()
6+
7+
set(CMAKE_CXX_STANDARD 11)
8+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
9+
10+
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
11+
find_package(Python3 COMPONENTS Development)
12+
13+
set(PYTHONQT_SUFFIX Qt${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}-Python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR})
14+
15+
add_subdirectory(generator)
16+
add_subdirectory(src)
17+
add_subdirectory(extensions)
18+
add_subdirectory(tests)
19+
# add_subdirectory(examples)

extensions/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
add_subdirectory(PythonQt_QtAll)
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
project(QtAll LANGUAGES CXX)
2+
3+
set(CMAKE_AUTOMOC ON)
4+
5+
file(GLOB SOURCES *.h *.cpp)
6+
7+
if(BUILD_SHARED_LIBS)
8+
add_library(${PROJECT_NAME} SHARED)
9+
target_compile_definitions(${PROJECT_NAME} PRIVATE PYTHONQT_QTALL_EXPORTS)
10+
else()
11+
add_library(${PROJECT_NAME} STATIC)
12+
target_compile_definitions(${PROJECT_NAME} PUBLIC PYTHONQT_QTALL_STATIC)
13+
endif()
14+
15+
target_sources(${PROJECT_NAME} PRIVATE ${SOURCES})
16+
17+
target_link_libraries(${PROJECT_NAME} PUBLIC Core)
18+
19+
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR})
20+
21+
list(APPEND QTMODULES Core Gui Svg Sql Network OpenGL Xml XmlPatterns Multimedia Qml Quick UiTools WebEngineWidgets WebKit)
22+
23+
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS ${QTMODULES})
24+
25+
foreach(QtModule IN LISTS QTMODULES)
26+
if(NOT TARGET "Qt${QT_VERSION_MAJOR}::${QtModule}")
27+
continue()
28+
endif()
29+
30+
string(TOUPPER ${QtModule} QTMODULE)
31+
target_sources(${PROJECT_NAME} PRIVATE ${PYTHONQT_WRAPPER_${QTMODULE}_SOURCES})
32+
target_link_libraries(${PROJECT_NAME} PUBLIC Qt${QT_VERSION_MAJOR}::${QtModule})
33+
target_compile_definitions(${PROJECT_NAME} PRIVATE PYTHONQT_WITH_${QTMODULE})
34+
endforeach()
35+
36+
if(TARGET "Qt${QT_VERSION_MAJOR}::Gui")
37+
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets PrintSupport REQUIRED)
38+
target_link_libraries(${PROJECT_NAME} PUBLIC
39+
Qt${QT_VERSION_MAJOR}::Widgets
40+
Qt${QT_VERSION_MAJOR}::PrintSupport
41+
)
42+
endif()
43+
44+
if(TARGET "Qt${QT_VERSION_MAJOR}::Svg" AND QT_VERSION_MAJOR VERSION_GREATER_EQUAL 6)
45+
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS SvgWidgets REQUIRED)
46+
target_link_libraries(${PROJECT_NAME} PUBLIC
47+
Qt${QT_VERSION_MAJOR}::SvgWidgets
48+
)
49+
endif()
50+
51+
if(TARGET "Qt${QT_VERSION_MAJOR}::Multimedia")
52+
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS MultimediaWidgets REQUIRED)
53+
target_link_libraries(${PROJECT_NAME} PUBLIC
54+
Qt${QT_VERSION_MAJOR}::MultimediaWidgets
55+
)
56+
endif()
57+
58+
if(TARGET "Qt${QT_VERSION_MAJOR}::Quick")
59+
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS QuickWidgets REQUIRED)
60+
target_link_libraries(${PROJECT_NAME} PUBLIC
61+
Qt${QT_VERSION_MAJOR}::QuickWidgets
62+
)
63+
endif()
64+
65+
if(TARGET "Qt${QT_VERSION_MAJOR}::WebKit")
66+
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS WebKitWidgets REQUIRED)
67+
target_link_libraries(${PROJECT_NAME} PUBLIC
68+
Qt${QT_VERSION_MAJOR}::WebKitWidgets
69+
)
70+
endif()
71+
72+
file(GLOB PUBLIC_HEADER *.h)
73+
74+
set_target_properties(${PROJECT_NAME} PROPERTIES
75+
OUTPUT_NAME PythonQt-QtAll-${PYTHONQT_SUFFIX}
76+
PUBLIC_HEADER "${PUBLIC_HEADER}"
77+
)
78+
79+
if(MSVC)
80+
target_compile_options(${PROJECT_NAME} PRIVATE "/bigobj")
81+
elseif(MINGW)
82+
target_compile_options(${PROJECT_NAME} PRIVATE "-Wa,-mbig-obj")
83+
endif()
84+
85+
include(GNUInstallDirs)
86+
install(TARGETS ${PROJECT_NAME}
87+
BUNDLE DESTINATION .
88+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
89+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
90+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
91+
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
92+
)

extensions/PythonQt_QtAll/PythonQt_QtAll.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,16 @@
3333
*
3434
*/
3535

36-
#ifdef WIN32
37-
#ifdef PYTHONQT_QTALL_EXPORTS
38-
#define PYTHONQT_QTALL_EXPORT __declspec(dllexport)
39-
#else
40-
#define PYTHONQT_QTALL_EXPORT __declspec(dllimport)
41-
#endif
36+
#include <QtCore/qglobal.h>
37+
38+
#ifndef PYTHONQT_QTALL_STATIC
39+
# if defined(PYTHONQT_QTALL_EXPORTS)
40+
# define PYTHONQT_QTALL_EXPORT Q_DECL_EXPORT
41+
# else
42+
# define PYTHONQT_QTALL_EXPORT Q_DECL_IMPORT
43+
# endif
4244
#else
43-
#define PYTHONQT_QTALL_EXPORT
45+
# define PYTHONQT_QTALL_EXPORT
4446
#endif
4547

4648
namespace PythonQt_QtAll

0 commit comments

Comments
 (0)