aboutsummaryrefslogtreecommitdiffstats
path: root/CMakeLists.txt
blob: 262cf71d4885908893bf7155742982f20e54d43d (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
68
69
70
71
72
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)

# ── QtXpl2 ──────────────────────────────────────────────────────────────── TCP
# client for the Alchemie XPL2 printhead remote protocol.
add_subdirectory(deps/QtXpl2)

# 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"
  "${CMAKE_BINARY_DIR}/deps/QtXpl2/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 QtXpl2plugin)

# ── 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")