From 3e8111aaee070dc9b5d51cab3fd44ff88841f63e Mon Sep 17 00:00:00 2001 From: Thomas Vanbesien Date: Tue, 24 Feb 2026 17:41:35 +0100 Subject: Make build system usable as a git submodule Replace CMAKE_SOURCE_DIR/CMAKE_BINARY_DIR with PROJECT_SOURCE_DIR/ PROJECT_BINARY_DIR so paths resolve correctly from add_subdirectory(). Guard global settings (CMAKE_CXX_STANDARD, CMAKE_BUILD_RPATH, qt_standard_project_setup, demo) behind PROJECT_IS_TOP_LEVEL. Export OPEN62541_INSTALL_DIR and QTOPCUA_INSTALL_DIR as CACHE INTERNAL so parent projects can set up RPATH and plugin paths. --- CMakeLists.txt | 46 +++++++++++++++++++++++++++------------------- cmake/BuildDeps.cmake | 16 +++++++++------- demo/CMakeLists.txt | 2 +- src/CMakeLists.txt | 3 ++- 4 files changed, 39 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f35b498..51b90e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,9 +1,11 @@ cmake_minimum_required(VERSION 3.16) project(BobinkQtOpcUa LANGUAGES CXX) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +if(PROJECT_IS_TOP_LEVEL) + set(CMAKE_CXX_STANDARD 17) + set(CMAKE_CXX_STANDARD_REQUIRED ON) + set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +endif() # Build external dependencies (open62541, qtopcua) if not already built include(cmake/BuildDeps.cmake) @@ -19,21 +21,27 @@ set(Qt6DeclarativeOpcua_DIR "${QTOPCUA_INSTALL_DIR}/lib/cmake/Qt6DeclarativeOpcu list(PREPEND CMAKE_PREFIX_PATH "${OPEN62541_INSTALL_DIR}") find_package(Qt6 6.10.2 REQUIRED COMPONENTS Core Qml Quick OpcUa) -qt_standard_project_setup(REQUIRES 6.10.2) - -# Set path for qmllint -set(QML_IMPORT_PATH - "${CMAKE_CURRENT_BINARY_DIR}/qml" - CACHE STRING "Path to locally built qml") -# Generate .qmlls.ini for QML Language Server. Useful once QtOpcUa is installed -# globally (qt-cmake --install build/deps/qtopcua-build) so qmlls can resolve -# all Qt QML imports without extra importPaths. set(QT_QML_GENERATE_QMLLS_INI ON -# CACHE BOOL "") - -# Ensure the local QtOpcUa and open62541 libs are findable at runtime (needed -# because the Qt plugin loader dlopen's the open62541 backend). -set(CMAKE_BUILD_RPATH "${QTOPCUA_INSTALL_DIR}/lib" - "${OPEN62541_INSTALL_DIR}/lib") + +if(PROJECT_IS_TOP_LEVEL) + qt_standard_project_setup(REQUIRES 6.10.2) + + # Set path for qmllint + set(QML_IMPORT_PATH + "${CMAKE_CURRENT_BINARY_DIR}/qml" + CACHE STRING "Path to locally built qml") + # Generate .qmlls.ini for QML Language Server. Useful once QtOpcUa is installed + # globally (qt-cmake --install build/deps/qtopcua-build) so qmlls can resolve + # all Qt QML imports without extra importPaths. set(QT_QML_GENERATE_QMLLS_INI ON + # CACHE BOOL "") + + # Ensure the local QtOpcUa and open62541 libs are findable at runtime (needed + # because the Qt plugin loader dlopen's the open62541 backend). + set(CMAKE_BUILD_RPATH "${QTOPCUA_INSTALL_DIR}/lib" + "${OPEN62541_INSTALL_DIR}/lib") +endif() add_subdirectory(src) -add_subdirectory(demo) + +if(PROJECT_IS_TOP_LEVEL) + add_subdirectory(demo) +endif() diff --git a/cmake/BuildDeps.cmake b/cmake/BuildDeps.cmake index 8f819f3..83791a2 100644 --- a/cmake/BuildDeps.cmake +++ b/cmake/BuildDeps.cmake @@ -8,12 +8,14 @@ # skipped. Delete the file to rebuild. # ====================================== -set(OPEN62541_SOURCE_DIR "${CMAKE_SOURCE_DIR}/deps/open62541") -set(OPEN62541_BUILD_DIR "${CMAKE_BINARY_DIR}/deps/open62541-build") -set(OPEN62541_INSTALL_DIR "${CMAKE_BINARY_DIR}/deps/open62541-install") -set(QTOPCUA_SOURCE_DIR "${CMAKE_SOURCE_DIR}/deps/qtopcua") -set(QTOPCUA_BUILD_DIR "${CMAKE_BINARY_DIR}/deps/qtopcua-build") -set(QTOPCUA_INSTALL_DIR "${CMAKE_BINARY_DIR}/deps/qtopcua-install") +set(OPEN62541_SOURCE_DIR "${PROJECT_SOURCE_DIR}/deps/open62541") +set(OPEN62541_BUILD_DIR "${PROJECT_BINARY_DIR}/deps/open62541-build") +set(OPEN62541_INSTALL_DIR "${PROJECT_BINARY_DIR}/deps/open62541-install" + CACHE INTERNAL "open62541 install prefix") +set(QTOPCUA_SOURCE_DIR "${PROJECT_SOURCE_DIR}/deps/qtopcua") +set(QTOPCUA_BUILD_DIR "${PROJECT_BINARY_DIR}/deps/qtopcua-build") +set(QTOPCUA_INSTALL_DIR "${PROJECT_BINARY_DIR}/deps/qtopcua-install" + CACHE INTERNAL "QtOpcUa install prefix") # Verify submodules are initialized if(NOT EXISTS "${OPEN62541_SOURCE_DIR}/CMakeLists.txt") @@ -150,7 +152,7 @@ endif() if(WIN32) # On Windows DLLs must be next to the .exe (no RPATH). Copy them to bin/. - file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/bin") + file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/bin") file(GLOB _dep_dlls "${OPEN62541_INSTALL_DIR}/bin/*.dll" "${QTOPCUA_INSTALL_DIR}/bin/*.dll") foreach(_dll ${_dep_dlls}) diff --git a/demo/CMakeLists.txt b/demo/CMakeLists.txt index 03c19d3..d2158cb 100644 --- a/demo/CMakeLists.txt +++ b/demo/CMakeLists.txt @@ -12,7 +12,7 @@ qt_add_qml_module( # Executable goes to bin/ to avoid clashing with the QML module directory set_target_properties(BobinkDemo PROPERTIES RUNTIME_OUTPUT_DIRECTORY - "${CMAKE_BINARY_DIR}/bin") + "${PROJECT_BINARY_DIR}/bin") target_link_libraries(BobinkDemo PRIVATE Qt6::Quick BobinkQtOpcUaplugin) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b0781cd..0aff9d4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -14,6 +14,7 @@ qt_add_qml_module( OpcUaMonitoredNode.h OpcUaMonitoredNode.cpp OUTPUT_DIRECTORY - "${CMAKE_BINARY_DIR}/qml/Bobink") + "${PROJECT_BINARY_DIR}/qml/Bobink") +target_compile_features(BobinkQtOpcUa PUBLIC cxx_std_17) target_link_libraries(BobinkQtOpcUa PUBLIC Qt6::Core Qt6::Quick Qt6::OpcUa) -- cgit v1.2.3