blob: 4b0403c4a84224d4ed04a17329949d588252ad03 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
cmake_minimum_required(VERSION 3.16)
project(BobinkQtOpcUaAppTemplate LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# ── Qt setup (must come before BobinkQtOpcUa so AUTOMOC is enabled) ───────
find_package(Qt6 6.10.2 REQUIRED COMPONENTS Quick)
qt_standard_project_setup(REQUIRES 6.10.2)
# ── QML tooling ────────────────────────────────────────────────────────────
# Generate .qmlls.ini for QML Language Server
set(QT_QML_GENERATE_QMLLS_INI
ON
CACHE BOOL "")
# ── BobinkQtOpcUa ──────────────────────────────────────────────────────────
# Builds open62541 and QtOpcUa from submodules automatically on first configure.
# Subsequent configures skip the dep builds (delete build/deps/*-install/ to
# force a rebuild).
#
# Prerequisites: Qt 6.10.2+ with qt-cmake in PATH, OpenSSL dev headers, Ninja,
# and initialized submodules: git submodule update --init --recursive
add_subdirectory(deps/BobinkQtOpcUa)
# Ensure the qml/ import directory exists before qmlimportscanner runs
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/qml")
qt_add_executable(BobinkQtOpcUaAppTemplate main.cpp)
qt_add_qml_module(
BobinkQtOpcUaAppTemplate
URI
BobinkQtOpcUaAppTemplate
VERSION
1.0
QML_FILES
Main.qml
IMPORT_PATH
"${CMAKE_BINARY_DIR}/deps/BobinkQtOpcUa/qml")
# Executable goes to bin/ to avoid clashing with the QML module directory
set_target_properties(
BobinkQtOpcUaAppTemplate PROPERTIES RUNTIME_OUTPUT_DIRECTORY
"${CMAKE_BINARY_DIR}/bin")
# Link against BobinkQtOpcUaplugin (not BobinkQtOpcUa). The "plugin" target
# includes the QML type registration needed for `import Bobink`.
target_link_libraries(BobinkQtOpcUaAppTemplate PRIVATE Qt6::Quick
BobinkQtOpcUaplugin)
# ── Runtime quirks ──────────────────────────────────────────────────────────
# BobinkQtOpcUa builds open62541 as a shared library. The QtOpcUa backend plugin
# (loaded at runtime via dlopen) needs to find it. These two lines make that
# work during development:
# RPATH: embed the dep lib dirs so the dynamic linker finds libopen62541 and
# libQt6OpcUa at runtime without installing them system-wide.
set(CMAKE_BUILD_RPATH "${QTOPCUA_INSTALL_DIR}/lib"
"${OPEN62541_INSTALL_DIR}/lib")
# Plugin path: Qt's plugin loader doesn't know about our locally-built QtOpcUa
# backend. Pass the path as a compile definition and call
# QCoreApplication::addLibraryPath(QTOPCUA_PLUGIN_PATH) in main.cpp *before*
# creating the QGuiApplication.
target_compile_definitions(
BobinkQtOpcUaAppTemplate
PRIVATE QTOPCUA_PLUGIN_PATH="${QTOPCUA_INSTALL_DIR}/plugins")
|