Я настраиваю систему сборки на основе CMake для старого фреймворка, написанного на C. Он состоит из одного двоичного файла, некоторых базовых библиотек и множества динамически связанных библиотек, которые построены на основе базовых библиотек. Моя цель состоит в том, чтобы структурировать эти библиотеки в нескольких проектах CMake («базовая структура», «библиотеки расширений»,…), поддерживая два сценария:
Независимая сборка библиотек расширений в сравнении со сборкой базовой инфраструктурыtree:
- base_framework/
- cmake/
- functions.cmake
- core_libraries/
- CMakeLists.txt
- extension_libs/
- lib1/
- lib2/
- CMakeLists.txt
Для этого сценария я использую
export(EXPORT foo
FILE FooFrameworkConfig.cmake)
и
find_package(FooFramework)
и добавляю дерево сборки в CMAKE_PREFIX_PATH
при настройке extension_libs
project.
Использование базовой платформы и библиотек расширений в качестве подпроектов (например, в виде подмодулей git) конкретного проекта приложения:
- my_project/
- base_framework/
- cmake/
- functions.cmake
- core_libraries/
- CMakeLists.txt
- extension_libs/
- lib1/
- lib2/
- CMakeLists.txt
- my_lib1/
- CMakeLists.txt
Для этого сценария,Я использую add_subdirectory()
для базовой инфраструктуры и библиотек расширений.
(Третий сценарий - создание библиотек расширений на основе дерева установки базовой платформы. К сожалению, этоСценарий в настоящее время предотвращается другими проблемами CMake.)
Теперь я хочу включить файл base_framework/cmake/functions.cmake
, содержащий некоторые пользовательские функции CMake для всех библиотек, в верхний уровень всех проектов CMakeLists.txt
s в обоих сценариях.
Для второго сценария я просто устанавливаю кэшированную переменную CMake в base_framework/CMakeLists.txt
:
set(BASE_FRAMEWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR}
CACHE PATH "" FORCE)
и использую эту переменную для включения файла функций в extension_libraries/CMakeLists.txt
, а также my_project/CMakeLists.txt
:
include(${BASE_FRAMEWORK_DIR}/cmake/functions.cmake)
Но как мне найти файл function.cmake
в исходном дереве базовой платформы из extenstion_libs/cmake
в первом сценарии? Все каталоги (base_framework
, extension_libs
, дерево сборки базового фреймворка) могут находиться где угодно на моем компьютере.