Как получить доступ к макету внешнего проекта во время сборки? - PullRequest
0 голосов
/ 01 августа 2020

Обзор

В шаблоне суперсборки зависимость 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 чтобы получить желаемый эффект
  • мне, конечно, нужно получить каталоги макета внешнего проекта во время сборки, но определяется во время настройки, и мне не удалось найти альтернативу.
...