| Български | English |
| Parent: Architecture Overview | Documentation Index |
Daqster’s build system is based on CMake template functions that automatically manage dependencies and conditional compilation of components (applications, plugins, libraries) based on available Qt modules, external libraries, and packages.
create_plugin() callINCLUDE_DIRECTORIES, COMPILE_DEFINITIONS, LINK_LIBRARIES, INSTALL_RPATHEach component type (app, plugin, library) is created through a specialized template function that:
Each component declares its dependencies in its own CMakeLists.txt file, with no need for centralized registration.
Qt modules are discovered dynamically only when needed by a component, rather than searching for all possible modules upfront.
create_application()create_application(Daqster
SOURCES
main.cpp
ApplicationsManager.cpp
AppToolbar.cpp
# ... other files
REQUIRES_LIBRARIES
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Widgets
Qt${QT_VERSION_MAJOR}::Gui
frame_work
)
Features:
bin/create_plugin()create_plugin(QtCoinTraderPlugin
SOURCES
QtCoinTraderInterface.cpp
QtCoinTraderPluginObject.cpp
utils/RandData.cpp
# ... other files
REQUIRES_LIBRARIES
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Gui
Qt${QT_VERSION_MAJOR}::Qml
Qt${QT_VERSION_MAJOR}::Network
Qt${QT_VERSION_MAJOR}::WebSockets
qtrest_lib
OpenSSL::SSL
OpenSSL::Crypto
frame_work
INCLUDE_DIRECTORIES # Optional
../../external_libs/nodeeditor/include
./Audio
./Library
COMPILE_DEFINITIONS # Optional
NODE_EDITOR_SHARED
CUSTOM_FEATURE_ENABLED
LINK_LIBRARIES # Optional
additional_lib
INSTALL_RPATH # Optional
"$ORIGIN/../../lib"
)
Features:
BUILD_AVAILABLE_PLUGIN definition./, ../../../frame_work/base/src/include)INCLUDE_DIRECTORIES parameterCOMPILE_DEFINITIONS parameterLINK_LIBRARIES parameterbin/ for runtime plugin discoveryINSTALL_RPATH parameter (default: $ORIGIN/../../lib)create_internal_library()create_internal_library(frame_work
SOURCES
base/src/QPluginManager.cpp
base/src/QPluginInterface.cpp
base/src/QPluginLoaderExt.cpp
# ... other files
REQUIRES_LIBRARIES
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Widgets
)
Features:
lib/FRAME_WORKSHARED_EXPORTcreate_external_library()External libraries are added via create_external_library(), which automatically:
DAQSTER_AUTO_INIT_SUBMODULES=ON)add_subdirectory()build/lib/# In root CMakeLists.txt
# NodeEditor remains Qt5-only
if(QT_VERSION_MAJOR EQUAL 5)
create_external_library(nodeeditor) # target: nodes
endif()
# QtRest is Qt5/Qt6 compatible
create_external_library(qtrest_lib) # target: qtrest_lib
Note: The parameter to create_external_library() is the directory name under src/external_libs/, but the actual CMake target may differ (e.g., nodeeditor -> target nodes).
Meta-target:
cmake --build . --target daqster_build_externals # builds all external libs
CMake options:
# Automatically initialize submodule if directory is missing (default: ON)
-DDAQSTER_AUTO_INIT_SUBMODULES=ON
# Show detailed dependency checks (default: OFF)
-DDAQSTER_VERBOSE_DEPENDENCIES=ON
The check_component_dependencies() function automatically:
Qt5::Core, Qt6::Widgets, etc.):
Core from Qt5::Core)find_package(Qt${QT_VERSION_MAJOR}${MODULE_NAME} QUIET)# Example: Qt5::Charts
string(REGEX REPLACE "^Qt[0-9]+::" "" MODULE_NAME ${LIBRARY})
# MODULE_NAME = "Charts"
find_package(Qt${QT_VERSION_MAJOR}Charts QUIET)
if(TARGET Qt5::Charts)
# Module is available
endif()
nodes, qtrest_lib):
EXTERNAL_LIB_${LIBRARY}_AVAILABLEif(TARGET nodes)
# Library is available
elseif(EXTERNAL_LIB_nodes_AVAILABLE)
# Library is registered as available
endif()
OpenSSL::SSL, OpenSSL::Crypto):
if(TARGET OpenSSL::SSL)
# Package is available
endif()
The link_component_dependencies() function:
REQUIRES_LIBRARIES listtarget_link_libraries() calls# Called automatically inside create_plugin(), create_application(), etc.
link_component_dependencies(${COMPONENT_NAME})
# Under the hood it does:
foreach(LIBRARY ${COMPONENT_LIBRARIES})
if(TARGET ${LIBRARY})
target_link_libraries(${COMPONENT_NAME} ${LIBRARY})
endif()
endforeach()
Important: The dependency check runs BEFORE add_library()/add_executable(). If dependencies are missing, the template function exits early with return() and the component is never created.
# Inside create_plugin():
# 1. First, dependencies are checked
register_component(${COMPONENT_NAME}
REQUIRES_LIBRARIES ${PLUGIN_REQUIRES_LIBRARIES}
)
# 2. Check whether the component is enabled
get_property(COMPONENT_ENABLED GLOBAL PROPERTY COMPONENT_${COMPONENT_NAME}_ENABLED)
if(NOT COMPONENT_ENABLED)
# Show reasons and exit
message(STATUS "Skipping plugin ${COMPONENT_NAME} - dependencies not met:")
foreach(REASON ${REASONS})
message(STATUS " - ${REASON}")
endforeach()
return() # add_library() is NOT called!
endif()
# 3. ONLY if dependencies are OK, create the target
add_library(${COMPONENT_NAME} SHARED ${PLUGIN_SOURCES})
Example output:
# If WebSockets is missing:
-- Checking Qt5::WebSockets - target exists: FALSE
-- QtCoinTraderPlugin plugin: DISABLED
-- - Qt5::WebSockets not available
-- Skipping plugin QtCoinTraderPlugin - dependencies not met:
-- - Qt5::WebSockets not available
# add_library(QtCoinTraderPlugin ...) is NOT called
# target_include_directories(QtCoinTraderPlugin ...) is NOT called
# No CMake errors for missing targets
Advantages:
tools/create_appimage.shDaqster-x86_64.AppImageThe module automatically:
CMAKE_PREFIX_PATH or the USE_QT6 optionQT_VERSION_MAJOR and QT_PREFIX variablesCore, Gui, Widgets)Qt${QT_VERSION_MAJOR}::Module in dependenciesDetection Logic:
# 1. Check USE_QT6 flag
if(DEFINED USE_QT6)
if(USE_QT6)
set(QT_PREFER_QT6 TRUE)
else()
set(QT_PREFER_QT5 TRUE)
endif()
# 2. Check CMAKE_PREFIX_PATH
elseif(CMAKE_PREFIX_PATH MATCHES "qt/5\\.")
set(QT_PREFER_QT5 TRUE)
elseif(CMAKE_PREFIX_PATH MATCHES "qt/6\\.")
set(QT_PREFER_QT6 TRUE)
endif()
# 3. Find Qt version
if(QT_PREFER_QT5)
find_package(Qt5 REQUIRED COMPONENTS Core Widgets Gui)
set(QT_VERSION_MAJOR 5)
else()
find_package(Qt6 REQUIRED COMPONENTS Core Widgets Gui)
set(QT_VERSION_MAJOR 6)
endif()
Usage Example:
# Works automatically for both Qt5 and Qt6
REQUIRES_LIBRARIES
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Widgets
Qt${QT_VERSION_MAJOR}::Qml
Daqster/
├── CMakeLists.txt # Root build file
├── cmake/
│ ├── FindQtVersion.cmake # Qt version detection
│ ├── ComponentTemplates.cmake # Template functions (create_plugin, create_app, etc.)
│ └── PluginDependencyManager.cmake # Dependency checking functions
├── src/
│ ├── frame_work/
│ │ └── CMakeLists.txt # Internal library (uses create_internal_library)
│ ├── external_libs/
│ │ ├── nodeeditor/
│ │ │ └── CMakeLists.txt # External library (own build system)
│ │ └── qtrest_lib/
│ │ └── CMakeLists.txt # External library (own build system)
│ ├── plugins/
│ │ ├── QtCoinTrader/
│ │ │ └── CMakeLists.txt # Plugin (uses create_plugin)
│ │ ├── node_editor/
│ │ │ └── CMakeLists.txt # Plugin (uses create_plugin)
│ │ └── tests/
│ │ ├── plugin_main_test/
│ │ │ └── CMakeLists.txt # Test plugin (uses create_plugin)
│ │ ├── plugin_fancy_test/
│ │ ├── plugin_uggly_test/
│ │ └── template_plugin_daqster/
│ └── apps/
│ └── Daqster/
│ └── CMakeLists.txt # Application (uses create_application)
# Root CMakeLists.txt
# 1. Include build system modules
include(FindQtVersion)
include(PluginDependencyManager)
include(ComponentTemplates)
# 2. Core framework (no external dependencies)
add_subdirectory(src/frame_work)
# 3. External libraries
# NodeEditor is Qt5-only
if(QT_VERSION_MAJOR EQUAL 5)
create_external_library(nodeeditor) # -> target: nodes
endif()
# QtRest works on Qt5/Qt6
create_external_library(qtrest_lib) # -> target: qtrest_lib
# 4. Plugins — all are added; the dependency system excludes them automatically
add_subdirectory(src/plugins/node_editor) # Qt5-only (requires nodes)
add_subdirectory(src/plugins/QtCoinTrader) # Qt5-only (requires qtrest_lib)
add_subdirectory(src/plugins/tests/plugin_main_test)
add_subdirectory(src/plugins/tests/plugin_fancy_test)
add_subdirectory(src/plugins/tests/plugin_uggly_test)
add_subdirectory(src/plugins/tests/template_plugin_daqster)
# 5. Applications
add_subdirectory(src/apps/Daqster)
# 6. Build summary
print_build_configuration_summary()
All plugin add_subdirectory() calls are always made. The dependency system automatically excludes them if the required external libs are missing:
Qt5 build: NodeEditorPlugin enabled, QtCoinTraderPlugin enabled, test plugins enabled
Qt6 build: NodeEditorPlugin disabled, QtCoinTraderPlugin enabled, test plugins enabled
Qt6 limitation:
NodeEditorPlugindoes not compile with Qt6 (nodeeditoris still Qt5-only).QtCoinTraderPlugincompiles on Qt6 becauseqtrest_libis now ported to Qt6.
A component is excluded automatically if its dependencies are missing:
# Plugin with OpenSSL dependency
create_plugin(QtCoinTraderPlugin
SOURCES ...
REQUIRES_LIBRARIES
OpenSSL::SSL # Automatically checked
OpenSSL::Crypto # Automatically checked
qtrest_lib # Automatically checked
frame_work
)
# If OpenSSL is missing:
# -- Checking OpenSSL::SSL - target exists: FALSE
# -- QtCoinTraderPlugin plugin: DISABLED
# -- - OpenSSL::SSL not available
QPluginManager searches for plugins in the following directories (by priority):
{applicationDirPath}{applicationDirPath}/plugins{applicationDirPath}/../lib/daqster/pluginsDAQSTER_PLUGIN_DIRDAQSTER_PLUGIN_PATH (multiple paths separated by :)~/.local/share/daqster/plugins/usr/lib/daqster/plugins/usr/local/lib/daqster/pluginsPlugin search paths are configured in QPluginManager.cpp:
// Build directory (highest priority for debug)
m_DirList.append(qApp->applicationDirPath()); // Searches in the bin/ directory
m_DirList.append(qApp->applicationDirPath()+QString("/plugins"));
m_DirList.append(QDir(qApp->applicationDirPath()+"/../lib/daqster/plugins").absolutePath());
// Environment variable override
const QString envDir = qgetenv("DAQSTER_PLUGIN_DIR");
if (!envDir.isEmpty()) {
m_DirList.append(envDir);
}
// User plugins directory
QString userPluginDir = QDir::homePath() + "/.local/share/daqster/plugins";
m_DirList.append(userPluginDir);
Create directory: src/plugins/MyNewPlugin/
CMakeLists.txt:
create_plugin(MyNewPlugin
SOURCES
MyPluginInterface.cpp
MyPluginObject.cpp
MyPluginInterface.h
MyPluginObject.h
resources.qrc
REQUIRES_LIBRARIES
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Gui
frame_work
)
CMakeLists.txt:
# Plugins section
add_subdirectory(src/plugins/MyNewPlugin)
cmake --build build --target MyNewPlugin
create_plugin(AdvancedPlugin
SOURCES
AdvancedInterface.cpp
AdvancedObject.cpp
utils/Helper.cpp
REQUIRES_LIBRARIES
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Gui
Qt${QT_VERSION_MAJOR}::Network
Qt${QT_VERSION_MAJOR}::Charts
nodes # External library
OpenSSL::SSL # System package
frame_work
INCLUDE_DIRECTORIES
../../external_libs/nodes/include
./utils
./models
COMPILE_DEFINITIONS
ADVANCED_PLUGIN_VERSION="1.0.0"
ENABLE_ADVANCED_FEATURES
LINK_LIBRARIES
custom_helper_lib
INSTALL_RPATH
"$ORIGIN/../../lib:$ORIGIN/../custom"
)
# All additional settings (INCLUDE_DIRECTORIES, COMPILE_DEFINITIONS, etc.)
# are applied automatically ONLY if dependencies are available.
# If nodes or OpenSSL are missing, the plugin is excluded and no target
# commands are called (no CMake errors).
Place the library in src/external_libs/mylibrary/
CMakeLists.txt:
# External libraries section
add_subdirectory(src/external_libs/mylibrary)
register_external_library_dependency(mylibrary)
create_plugin(MyPlugin
SOURCES ...
REQUIRES_LIBRARIES
mylibrary # Automatically checked
frame_work
)
Create directory: src/apps/MyApp/
Create CMakeLists.txt:
```cmake
create_application(MyApp
SOURCES
main.cpp
MainWindow.cpp
MainWindow.h
mainwindow.ui
resources.qrc
REQUIRES_LIBRARIES
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Widgets
frame_work
)
target_include_directories(MyApp PRIVATE ./)
3. Add to root `CMakeLists.txt`:
```cmake
# Apps section
add_subdirectory(src/apps/MyApp)
create_application(COMPONENT_NAME SOURCES ... REQUIRES_LIBRARIES ...)Creates an executable application.
Parameters:
COMPONENT_NAME - Application nameSOURCES - List of source filesREQUIRES_LIBRARIES - List of dependenciesExample:
create_application(Daqster
SOURCES main.cpp MainWindow.cpp
REQUIRES_LIBRARIES Qt5::Core Qt5::Widgets frame_work
)
create_plugin(COMPONENT_NAME SOURCES ... REQUIRES_LIBRARIES ...)Creates a plugin shared library.
Parameters:
COMPONENT_NAME - Plugin nameSOURCES - List of source filesREQUIRES_LIBRARIES - List of dependenciesAutomatic Features:
BUILD_AVAILABLE_PLUGIN definitionExample:
create_plugin(NodeEditorPlugin
SOURCES NodeEditorInterface.cpp NodeEditorObject.cpp
REQUIRES_LIBRARIES Qt5::Core Qt5::Gui nodes frame_work
)
create_internal_library(COMPONENT_NAME SOURCES ... REQUIRES_LIBRARIES ...)Creates an internal shared library.
Parameters:
COMPONENT_NAME - Library nameSOURCES - List of source filesREQUIRES_LIBRARIES - List of dependenciesExample:
create_internal_library(frame_work
SOURCES QPluginManager.cpp QPluginInterface.cpp
REQUIRES_LIBRARIES Qt5::Core Qt5::Widgets
)
register_component(COMPONENT_NAME REQUIRES_LIBRARIES ...)Registers a component and checks its dependencies.
Internal Function — called automatically by template functions.
check_plugin_dependencies(COMPONENT_NAME REQUIRES_LIBRARIES ...)Checks whether all dependencies are available.
Returns:
${COMPONENT_NAME}_ENABLED - TRUE/FALSE${COMPONENT_NAME}_REASONS - List of reasons if DISABLEDlink_component_dependencies(COMPONENT_NAME)Automatically links all dependencies of a component.
Internal Function — called automatically by template functions.
create_external_library(COMPONENT_NAME)Adds an external library (submodule), registers it, and sets up a copy target.
Example:
create_external_library(nodeeditor) # adds src/external_libs/nodeeditor
create_external_library(qtrest_lib) # adds src/external_libs/qtrest_lib
register_external_library_dependency(LIBRARY_NAME)Low-level function — registers a target as an available external dependency. Called automatically by create_external_library().
verbose_status(...)Outputs a STATUS message only if DAQSTER_VERBOSE_DEPENDENCIES=ON.
print_component_status_summary()Shows the status of all registered components.
print_build_configuration_summary()Shows general information about the build configuration.
| Option | Default | Description |
|---|---|---|
USE_QT6 |
— | ON for Qt6, OFF for Qt5; if not set — auto-detect from CMAKE_PREFIX_PATH |
DAQSTER_VERBOSE_DEPENDENCIES |
OFF |
Show detailed dependency checks during configure |
DAQSTER_AUTO_INIT_SUBMODULES |
ON |
Automatically run git submodule update --init when external directory is missing |
Example:
cmake -S . -B build \
-DUSE_QT6=OFF \
-DDAQSTER_VERBOSE_DEPENDENCIES=ON \
-DCMAKE_PREFIX_PATH=/path/to/Qt/5.15.2/gcc_64
QT_VERSION_MAJOR - Major Qt version (5 or 6)QT_PREFIX - Prefix for Qt targets (Qt5 or Qt6)QT_VERSION - Full Qt version string (e.g., 5.15.2)For each component, the following global properties are created:
COMPONENT_${NAME}_ENABLED - Whether the component is enabledCOMPONENT_${NAME}_REASONS - Reasons for disable (if any)COMPONENT_${NAME}_LIBRARIES - List of dependenciesEXTERNAL_LIB_${NAME}_AVAILABLE - Whether the external library is availableSymptom:
PluginsList count: 0
Cause: Plugin search paths do not include the build directory
Solution: Check QPluginManager.cpp:
m_DirList.append(qApp->applicationDirPath()); // Must be first
Symptom:
-- Checking Qt5::Charts - target exists: FALSE
-- QtCoinTraderPlugin plugin: DISABLED
-- - Qt5::Charts not available
Cause: Qt module is not installed or not found
Solution:
REQUIRES_LIBRARIESif(Qt${QT_VERSION_MAJOR}Charts_FOUND)
target_link_libraries(MyPlugin Qt${QT_VERSION_MAJOR}::Charts)
target_compile_definitions(MyPlugin PRIVATE CHARTS_AVAILABLE)
endif()
Symptom:
-- Checking nodes - target exists: FALSE
-- NodeEditorPlugin plugin: DISABLED
-- - nodes not available
Cause: External library is not registered
Solution: Add after add_subdirectory():
add_subdirectory(src/external_libs/nodeeditor)
register_external_library_dependency(nodes) # Required!
Symptom:
CMake Error: Could not find Qt5 or Qt6
Cause: CMAKE_PREFIX_PATH does not point to Qt
Solution:
# Set CMAKE_PREFIX_PATH
cmake -DCMAKE_PREFIX_PATH=/path/to/Qt/5.15.2/gcc_64 ..
# Or use the USE_QT6 flag
cmake -DUSE_QT6=OFF .. # For Qt5
cmake -DUSE_QT6=ON .. # For Qt6
Symptom:
fatal error: QObject: No such file or directory
Cause: Missing include directories
Solution: Template functions automatically add include directories, but if you have custom includes:
create_plugin(MyPlugin
SOURCES ...
REQUIRES_LIBRARIES Qt${QT_VERSION_MAJOR}::Core
)
# Additional includes
target_include_directories(MyPlugin PRIVATE
./my_include_dir
../../some_other_dir
)
Symptom:
error while loading shared libraries: libframe_work.so: cannot open shared object file
Cause: RPATH is not configured correctly
Solution: Template functions configure RPATH automatically, but verify:
# For plugins
set_target_properties(${COMPONENT_NAME} PROPERTIES
INSTALL_RPATH "$ORIGIN/../../lib"
)
# For applications
set_target_properties(${COMPONENT_NAME} PROPERTIES
INSTALL_RPATH "$ORIGIN/../lib"
)
Qt${QT_VERSION_MAJOR}:: for all Qt dependencies
# Good
REQUIRES_LIBRARIES Qt${QT_VERSION_MAJOR}::Core
# Bad
REQUIRES_LIBRARIES Qt5::Core # Hardcoded version
# Good — all dependencies are visible
REQUIRES_LIBRARIES
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Gui
Qt${QT_VERSION_MAJOR}::Network
frame_work
# Bad — hidden dependencies
REQUIRES_LIBRARIES frame_work
# And then manually:
target_link_libraries(MyPlugin Qt5::Network)
# Good
add_subdirectory(src/external_libs/mylibrary)
register_external_library_dependency(mylibrary)
# Bad
register_external_library_dependency(mylibrary)
add_subdirectory(src/external_libs/mylibrary)
# Good
create_plugin(MyPlugin
SOURCES ...
REQUIRES_LIBRARIES ...
)
# Bad
add_library(MyPlugin SHARED ...)
target_link_libraries(MyPlugin ...)
install(TARGETS MyPlugin ...)
# ... lots of manual code
# Root CMakeLists.txt — clear structure
# Framework
add_subdirectory(src/frame_work)
# External libraries
if(QT_VERSION_MAJOR EQUAL 5)
add_subdirectory(src/external_libs/nodeeditor)
add_subdirectory(src/external_libs/qtrest_lib)
endif()
# Plugins
add_subdirectory(src/plugins/node_editor)
add_subdirectory(src/plugins/QtCoinTrader)
# Applications
add_subdirectory(src/apps/Daqster)
# src/plugins/CMakeLists.txt
register_plugin(MyPlugin
REQUIRES_QT_MODULES Core Gui Network
REQUIRES_EXTERNAL_LIBS mylibrary
)
add_plugin_subdirectory(MyPlugin my_plugin)
# src/plugins/my_plugin/CMakeLists.txt
add_library(MyPlugin SHARED ...)
link_plugin_dependencies(MyPlugin)
target_link_libraries(MyPlugin Qt5::Network)
install(TARGETS MyPlugin ...)
# src/plugins/my_plugin/CMakeLists.txt
create_plugin(MyPlugin
SOURCES
MyInterface.cpp
MyObject.cpp
REQUIRES_LIBRARIES
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Gui
Qt${QT_VERSION_MAJOR}::Network
mylibrary
frame_work
)
# Root CMakeLists.txt
add_subdirectory(src/plugins/my_plugin)
Key changes:
src/plugins/CMakeLists.txtcreate_plugin() instead of manual CMake codeREQUIRES_LIBRARIES listlink_plugin_dependencies()Good: Everything is declared in the create_plugin() call
create_plugin(NodeEditorPlugin
SOURCES ...
REQUIRES_LIBRARIES ...
INCLUDE_DIRECTORIES
../../external_libs/nodeeditor/include
./Audio
COMPILE_DEFINITIONS
NODE_EDITOR_SHARED
)
Bad: Manual checks and target commands outside the template function
create_plugin(NodeEditorPlugin
SOURCES ...
REQUIRES_LIBRARIES ...
)
# Bad — manual check and target commands
get_property(COMPONENT_ENABLED GLOBAL PROPERTY COMPONENT_NodeEditorPlugin_ENABLED)
if(COMPONENT_ENABLED)
target_include_directories(NodeEditorPlugin ...)
target_compile_definitions(NodeEditorPlugin ...)
endif()
create_plugin(MyPlugin ...)
↓
register_component(MyPlugin) - checks dependencies
↓
get_property(COMPONENT_ENABLED)
↓
if (NOT ENABLED) -> return() <- add_library() is NOT called!
↓
if (ENABLED) -> add_library(MyPlugin ...)
-> target_include_directories() (if INCLUDE_DIRECTORIES is set)
-> target_compile_definitions() (if COMPILE_DEFINITIONS is set)
-> target_link_libraries() (automatic + LINK_LIBRARIES)
-> install()
-> set_target_properties()
INCLUDE_DIRECTORIES, COMPILE_DEFINITIONS, LINK_LIBRARIES, INSTALL_RPATHget_property(COMPONENT_ENABLED) in plugin CMakeLists.txtlink_plugin_dependencies()cmake/ComponentTemplates.cmake - Template function implementationscmake/PluginDependencyManager.cmake - Dependency checking logiccmake/FindQtVersion.cmake - Qt version detectionsrc/frame_work/base/src/include/plugin_global.h - Plugin export macros