| Български | English |
| Родител: Architecture Overview | Documentation Index |
Build системата на Daqster е базирана на CMake шаблонни функции, които автоматично управляват зависимостите и условното компилиране на компоненти (приложения, plugins, библиотеки) според наличните Qt модули, външни библиотеки и пакети.
create_plugin()INCLUDE_DIRECTORIES, COMPILE_DEFINITIONS, LINK_LIBRARIES, INSTALL_RPATHВсеки тип компонент (app, plugin, library) се създава чрез специализирана template функция, която:
Всеки компонент декларира своите dependencies в собствения си CMakeLists.txt файл, без нужда от централизирана регистрация.
Qt модулите се откриват динамично само когато са необходими на компонент, вместо предварително да се търсят всички възможни модули.
create_application()create_application(Daqster
SOURCES
main.cpp
ApplicationsManager.cpp
AppToolbar.cpp
# ... други файлове
REQUIRES_LIBRARIES
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Widgets
Qt${QT_VERSION_MAJOR}::Gui
frame_work
)
Характеристики:
bin/create_plugin()create_plugin(QtCoinTraderPlugin
SOURCES
QtCoinTraderInterface.cpp
QtCoinTraderPluginObject.cpp
utils/RandData.cpp
# ... други файлове
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 # Опционално
../../external_libs/nodeeditor/include
./Audio
./Library
COMPILE_DEFINITIONS # Опционално
NODE_EDITOR_SHARED
CUSTOM_FEATURE_ENABLED
LINK_LIBRARIES # Опционално
additional_lib
INSTALL_RPATH # Опционално
"$ORIGIN/../../lib"
)
Характеристики:
BUILD_AVAILABLE_PLUGIN definition./, ../../../frame_work/base/src/include)INCLUDE_DIRECTORIES параметърCOMPILE_DEFINITIONS параметърLINK_LIBRARIES параметърbin/ за runtime plugin discoveryINSTALL_RPATH параметър (default: $ORIGIN/../../lib)create_internal_library()create_internal_library(frame_work
SOURCES
base/src/QPluginManager.cpp
base/src/QPluginInterface.cpp
base/src/QPluginLoaderExt.cpp
# ... други файлове
REQUIRES_LIBRARIES
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Widgets
)
Характеристики:
lib/FRAME_WORKSHARED_EXPORTcreate_external_library()Външните библиотеки се добавят чрез create_external_library(), което автоматично:
DAQSTER_AUTO_INIT_SUBMODULES=ON)add_subdirectory()build/lib/# В root CMakeLists.txt
# NodeEditor остава Qt5-only
if(QT_VERSION_MAJOR EQUAL 5)
create_external_library(nodeeditor) # target: nodes
endif()
# QtRest e Qt5/Qt6 compatible
create_external_library(qtrest_lib) # target: qtrest_lib
Важно: Параметърът на create_external_library() е името на директорията под src/external_libs/, но реалният CMake target може да е различен (например nodeeditor -> target nodes).
Meta-target:
cmake --build . --target daqster_build_externals # билдва всички external libs
CMake опции:
# Автоматично инициализиране на submodule ако директорията липсва (default: ON)
-DDAQSTER_AUTO_INIT_SUBMODULES=ON
# Показване на детайлни dependency проверки (default: OFF)
-DDAQSTER_VERBOSE_DEPENDENCIES=ON
Функцията check_component_dependencies() автоматично:
Qt5::Core, Qt6::Widgets, etc.):
Core от Qt5::Core)find_package(Qt${QT_VERSION_MAJOR}${MODULE_NAME} QUIET)# Пример: 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)
# Модулът е наличен
endif()
nodes, qtrest_lib):
EXTERNAL_LIB_${LIBRARY}_AVAILABLEif(TARGET nodes)
# Библиотеката е налична
elseif(EXTERNAL_LIB_nodes_AVAILABLE)
# Библиотеката е регистрирана като налична
endif()
OpenSSL::SSL, OpenSSL::Crypto):
if(TARGET OpenSSL::SSL)
# Package-ът е наличен
endif()
Функцията link_component_dependencies():
REQUIRES_LIBRARIES списъкаtarget_link_libraries()# Автоматично се извиква в create_plugin(), create_application(), etc.
link_component_dependencies(${COMPONENT_NAME})
# Под капака прави:
foreach(LIBRARY ${COMPONENT_LIBRARIES})
if(TARGET ${LIBRARY})
target_link_libraries(${COMPONENT_NAME} ${LIBRARY})
endif()
endforeach()
Важно: Dependency проверката се извършва ПРЕДИ add_library()/add_executable() командите. Ако dependencies липсват, template функцията излиза рано с return() и компонентът изобщо не се създава.
# В create_plugin():
# 1. Първо се проверяват dependencies
register_component(${COMPONENT_NAME}
REQUIRES_LIBRARIES ${PLUGIN_REQUIRES_LIBRARIES}
)
# 2. Проверка дали е enabled
get_property(COMPONENT_ENABLED GLOBAL PROPERTY COMPONENT_${COMPONENT_NAME}_ENABLED)
if(NOT COMPONENT_ENABLED)
# Показва причините и излиза
message(STATUS "Skipping plugin ${COMPONENT_NAME} - dependencies not met:")
foreach(REASON ${REASONS})
message(STATUS " - ${REASON}")
endforeach()
return() # НЕ се вика add_library()!
endif()
# 3. САМО ако dependencies са OK, се създава target
add_library(${COMPONENT_NAME} SHARED ${PLUGIN_SOURCES})
Пример изход:
# Ако WebSockets липсва:
-- 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 ...) НЕ се извиква
# target_include_directories(QtCoinTraderPlugin ...) НЕ се извиква
# Няма CMake грешки за missing targets
Предимства:
tools/create_appimage.shDaqster-x86_64.AppImageМодулът автоматично:
CMAKE_PREFIX_PATH или USE_QT6 опцияQT_VERSION_MAJOR, QT_PREFIX променливиCore, Gui, Widgets)Qt${QT_VERSION_MAJOR}::Module в dependenciesDetection Logic:
# 1. Проверка на USE_QT6 flag
if(DEFINED USE_QT6)
if(USE_QT6)
set(QT_PREFER_QT6 TRUE)
else()
set(QT_PREFER_QT5 TRUE)
endif()
# 2. Проверка на 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:
# Автоматично работи и за Qt5 и за 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 е Qt5-only
if(QT_VERSION_MAJOR EQUAL 5)
create_external_library(nodeeditor) # -> target: nodes
endif()
# QtRest работи на Qt5/Qt6
create_external_library(qtrest_lib) # -> target: qtrest_lib
# 4. Plugins — всички се добавят; dependency системата ги изключва автоматично
add_subdirectory(src/plugins/node_editor) # Qt5-only (изисква nodes)
add_subdirectory(src/plugins/QtCoinTrader) # Qt5-only (изисква 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()
Всички plugin add_subdirectory() се извикват винаги. Dependency системата автоматично ги изключва ако нужните external libs липсват:
Qt5 build: NodeEditorPlugin включен, QtCoinTraderPlugin включен, test plugins включени
Qt6 build: NodeEditorPlugin изключен, QtCoinTraderPlugin включен, test plugins включени
Qt6 ограничение:
NodeEditorPluginне се компилира при Qt6 (външната библиотекаnodeeditorвсе още е Qt5-only).QtCoinTraderPluginсе компилира при Qt6, защотоqtrest_libвече е портната за Qt6.
Компонентът се изключва автоматично ако dependencies липсват:
# Plugin с OpenSSL dependency
create_plugin(QtCoinTraderPlugin
SOURCES ...
REQUIRES_LIBRARIES
OpenSSL::SSL # Автоматично проверява
OpenSSL::Crypto # Автоматично проверява
qtrest_lib # Автоматично проверява
frame_work
)
# Ако OpenSSL липсва:
# -- Checking OpenSSL::SSL - target exists: FALSE
# -- QtCoinTraderPlugin plugin: DISABLED
# -- - OpenSSL::SSL not available
QPluginManager търси plugins в следните директории (по приоритет):
{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 се конфигурират в QPluginManager.cpp:
// Build директория (най-висок приоритет за дебъг)
m_DirList.append(qApp->applicationDirPath()); // Търси в bin/ директорията
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);
Създайте директория: 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"
)
# Всички допълнителни настройки (INCLUDE_DIRECTORIES, COMPILE_DEFINITIONS, etc.)
# се прилагат автоматично САМО ако dependencies са налични.
# Ако nodes или OpenSSL липсват, plugin-ът се изключва и никакви target
# команди не се извикват (няма CMake грешки).
Поставете библиотеката в 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 # Автоматично се проверява
frame_work
)
Създайте директория: src/apps/MyApp/
Създайте 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. Добавете в root `CMakeLists.txt`:
```cmake
# Apps section
add_subdirectory(src/apps/MyApp)
create_application(COMPONENT_NAME SOURCES ... REQUIRES_LIBRARIES ...)Създава executable application.
Parameters:
COMPONENT_NAME - Име на application-аSOURCES - Списък с source файловеREQUIRES_LIBRARIES - Списък с dependenciesExample:
create_application(Daqster
SOURCES main.cpp MainWindow.cpp
REQUIRES_LIBRARIES Qt5::Core Qt5::Widgets frame_work
)
create_plugin(COMPONENT_NAME SOURCES ... REQUIRES_LIBRARIES ...)Създава plugin shared library.
Parameters:
COMPONENT_NAME - Име на plugin-аSOURCES - Списък с source файловеREQUIRES_LIBRARIES - Списък с 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 ...)Създава internal shared library.
Parameters:
COMPONENT_NAME - Име на библиотекатаSOURCES - Списък с source файловеREQUIRES_LIBRARIES - Списък с dependenciesExample:
create_internal_library(frame_work
SOURCES QPluginManager.cpp QPluginInterface.cpp
REQUIRES_LIBRARIES Qt5::Core Qt5::Widgets
)
register_component(COMPONENT_NAME REQUIRES_LIBRARIES ...)Регистрира компонент и проверява dependencies.
Internal Function - извиква се автоматично от template functions.
check_plugin_dependencies(COMPONENT_NAME REQUIRES_LIBRARIES ...)Проверява дали всички dependencies са налични.
Returns:
${COMPONENT_NAME}_ENABLED - TRUE/FALSE${COMPONENT_NAME}_REASONS - Списък с причини ако е DISABLEDlink_component_dependencies(COMPONENT_NAME)Автоматично линква всички dependencies на компонент.
Internal Function - извиква се автоматично от template functions.
create_external_library(COMPONENT_NAME)Добавя external библиотека (submodule), регистрира я и настройва copy target.
Example:
create_external_library(nodeeditor) # добавя src/external_libs/nodeeditor
create_external_library(qtrest_lib) # добавя src/external_libs/qtrest_lib
register_external_library_dependency(LIBRARY_NAME)Ниско-ниво функция — регистрира target като налична external dependency. Извиква се автоматично от create_external_library().
verbose_status(...)Извежда STATUS съобщение само ако DAQSTER_VERBOSE_DEPENDENCIES=ON.
print_component_status_summary()Показва статус на всички регистрирани компоненти.
print_build_configuration_summary()Показва обща информация за build конфигурацията.
| Опция | Default | Описание |
|---|---|---|
USE_QT6 |
— | ON за Qt6, OFF за Qt5; ако не е зададен — auto-detect от CMAKE_PREFIX_PATH |
DAQSTER_VERBOSE_DEPENDENCIES |
OFF |
Показва детайлни dependency проверки при configure |
DAQSTER_AUTO_INIT_SUBMODULES |
ON |
Автоматично git submodule update --init при липсваща external директория |
Пример:
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 - Основна версия на Qt (5 или 6)QT_PREFIX - Prefix за Qt targets (Qt5 или Qt6)QT_VERSION - Пълна версия на Qt (напр. 5.15.2)За всеки компонент се създават следните global properties:
COMPONENT_${NAME}_ENABLED - Дали компонентът е enabledCOMPONENT_${NAME}_REASONS - Причини за disable (ако има)COMPONENT_${NAME}_LIBRARIES - Списък с dependenciesEXTERNAL_LIB_${NAME}_AVAILABLE - Дали external библиотеката е наличнаСимптом:
PluginsList count: 0
Причина: Plugin search paths не включват build директорията
Решение: Проверете QPluginManager.cpp:
m_DirList.append(qApp->applicationDirPath()); // Трябва да е първи
Симптом:
-- Checking Qt5::Charts - target exists: FALSE
-- QtCoinTraderPlugin plugin: DISABLED
-- - Qt5::Charts not available
Причина: Qt модулът не е инсталиран или не се намира
Решение:
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()
Симптом:
-- Checking nodes - target exists: FALSE
-- NodeEditorPlugin plugin: DISABLED
-- - nodes not available
Причина: External библиотеката не е регистрирана
Решение: Добавете след add_subdirectory():
add_subdirectory(src/external_libs/nodeeditor)
register_external_library_dependency(nodes) # Задължително!
Симптом:
CMake Error: Could not find Qt5 or Qt6
Причина: CMAKE_PREFIX_PATH не сочи към Qt
Решение:
# Задайте CMAKE_PREFIX_PATH
cmake -DCMAKE_PREFIX_PATH=/path/to/Qt/5.15.2/gcc_64 ..
# Или използвайте USE_QT6 flag
cmake -DUSE_QT6=OFF .. # За Qt5
cmake -DUSE_QT6=ON .. # За Qt6
Симптом:
fatal error: QObject: No such file or directory
Причина: Липсващи include directories
Решение: Template functions автоматично добавят include directories, но ако имате custom includes:
create_plugin(MyPlugin
SOURCES ...
REQUIRES_LIBRARIES Qt${QT_VERSION_MAJOR}::Core
)
# Допълнителни includes
target_include_directories(MyPlugin PRIVATE
./my_include_dir
../../some_other_dir
)
Симптом:
error while loading shared libraries: libframe_work.so: cannot open shared object file
Причина: RPATH не е настроен правилно
Решение: Template functions автоматично настройват RPATH, но проверете:
# За plugins
set_target_properties(${COMPONENT_NAME} PROPERTIES
INSTALL_RPATH "$ORIGIN/../../lib"
)
# За applications
set_target_properties(${COMPONENT_NAME} PROPERTIES
INSTALL_RPATH "$ORIGIN/../lib"
)
Qt${QT_VERSION_MAJOR}:: за всички Qt dependencies
# Добре
REQUIRES_LIBRARIES Qt${QT_VERSION_MAJOR}::Core
# Лошо
REQUIRES_LIBRARIES Qt5::Core # Hardcoded версия
# Добре - всички dependencies са видими
REQUIRES_LIBRARIES
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Gui
Qt${QT_VERSION_MAJOR}::Network
frame_work
# Лошо - скрити dependencies
REQUIRES_LIBRARIES frame_work
# И после ръчно:
target_link_libraries(MyPlugin Qt5::Network)
# Добре
add_subdirectory(src/external_libs/mylibrary)
register_external_library_dependency(mylibrary)
# Лошо
register_external_library_dependency(mylibrary)
add_subdirectory(src/external_libs/mylibrary)
# Добре
create_plugin(MyPlugin
SOURCES ...
REQUIRES_LIBRARIES ...
)
# Лошо
add_library(MyPlugin SHARED ...)
target_link_libraries(MyPlugin ...)
install(TARGETS MyPlugin ...)
# ... много ръчен код
# Root CMakeLists.txt - ясна структура
# 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)
Ключови промени:
src/plugins/CMakeLists.txtcreate_plugin() вместо ръчен CMake кодREQUIRES_LIBRARIES списъкlink_plugin_dependencies()Добре: Всичко е декларирано в create_plugin() извикването
create_plugin(NodeEditorPlugin
SOURCES ...
REQUIRES_LIBRARIES ...
INCLUDE_DIRECTORIES
../../external_libs/nodeeditor/include
./Audio
COMPILE_DEFINITIONS
NODE_EDITOR_SHARED
)
Лошо: Ръчни проверки и target команди извън template функцията
create_plugin(NodeEditorPlugin
SOURCES ...
REQUIRES_LIBRARIES ...
)
# Лошо - ръчна проверка и target команди
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) - проверява dependencies
↓
get_property(COMPONENT_ENABLED)
↓
if (NOT ENABLED) -> return() <- НЕ се вика add_library()!
↓
if (ENABLED) -> add_library(MyPlugin ...)
-> target_include_directories() (ако INCLUDE_DIRECTORIES е зададен)
-> target_compile_definitions() (ако COMPILE_DEFINITIONS е зададен)
-> target_link_libraries() (автоматично + LINK_LIBRARIES)
-> install()
-> set_target_properties()
INCLUDE_DIRECTORIES, COMPILE_DEFINITIONS, LINK_LIBRARIES, INSTALL_RPATHget_property(COMPONENT_ENABLED) в 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