Обзор
В шаблоне суперсборки зависимость foo извлекается из github с помощью External_project. Эта зависимость является модулем, и я должен добавить каталог foo/cmake
в CMAKE_MODULE_PATH:
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
Структура проекта
project
├── external
│ └── upstream
│ └── foo
│ └── CMakeLists.txt
└── project_core
└── CMakeLists.txt
└── CMakeLists.txt
То, что я пробовал:
Вариант 1
Я попытался добавить эти строки в project/external/upstream/foo/CMakeLists.txt
:
list(APPEND CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR}/subprojects/Source/foo_external/cmake)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH})
message("cmake module path:" ${CMAKE_MODULE_PATH})
Запуск cmake .. выводит: cmake module path:/home/becheler/dev/myproject/build/subprojects/Source/foo_external/cmake
Затем я пересылаю CMAKE_MODULE_PATH
в качестве аргументов кеша в root project/CMakeLists.txt
:
ExternalProject_Add(
${PROJECT_NAME}_core
DEPENDS
foo_external
SOURCE_DIR
${CMAKE_CURRENT_LIST_DIR}/${PROJECT_NAME}_core
CMAKE_CACHE_ARGS
-DCMAKE_MODULE_PATH:PATH=${CMAKE_MODULE_PATH}
BUILD_ALWAYS
1
INSTALL_COMMAND
""
)
И затем я пытаюсь повторно использовать его в project/project_core/CMakeLists.txt
:
message("cmake module path:" ${CMAKE_MODULE_PATH})
, но вывод - пустая строка, а модуль не найден:
cmake module path:
CMake Error at CMakeLists.txt:30 (include):
include could not find load file:
FindAnyProject
CMake Error at CMakeLists.txt:32 (find_anyproject):
Unknown CMake command "find_anyproject".
Вариант 2
Я пишу только следующие строки в myproject/myproject_core/CMakeLists.txt
:
list(APPEND CMAKE_MODULE_PATH "/home/path-to-my-project/build/subprojects/Source/foo_external/cmake")
message("cmake module path:" ${CMAKE_MODULE_PATH})
include(FindAnyProject)
И это работает.
Проблема
Даже если каким-то образом второе решение работает нормально, я не понимаю почему, и меня не устраивает жестко заданный путь.
Возможные подсказки
- Возможно, я неправильно перенаправляю переменную из времени настройки во время сборки
- Я не смог найти, как / где мы должны установить переменную
CMAKE_MODULE_PATH
чтобы получить желаемый эффект - мне, конечно, нужно получить каталоги макета внешнего проекта во время сборки, но определяется во время настройки, и мне не удалось найти альтернативу.