Как использовать add_subdirectory() после завершения загрузки ExternalProject_Add()?
Я в основном задаю тот же вопрос, который был задан здесь. Однако на этот вопрос не было ответа.
Я хочу использовать googletest в своем проекте. Для этого я использую ExternalProject_Add(), который клонирует набор тестов с помощью git. После этого я люблю использовать add_subdirectory()
,
Это также то, что описано в официальном репозитории. Хорошая особенность этого подхода в том, что скрипты сборки в googletest сами обрабатывают процесс сборки.
Проблема, однако, в том, что add_subdirectory()
не могу найти исходную папку, так как она не существует с самого начала. Следовательно, add_subdirectory()
должно зависеть от завершения ExternalProject_Add()
,
Можно ли сделать add_subdirectory()
зависит от ExternalProject_Add()
Как add_dependencies() делает для целей?
PS. Я могу сделать все это скомпилировать, если я прокомментирую add_subdirectory()
out, скомпилируйте его (что заканчивается ошибкой, потому что отсутствует библиотека googletest), раскомментируйте его и постройте снова (успех).
ExternalProject_Add(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG master
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
TEST_COMMAND ""
)
ExternalProject_Get_Property(googletest source_dir binary_dir)
set(GTEST_INCLUDE_DIR ${source_dir}/googletest/include)
set(GMOCK_INCLUDE_DIR ${source_dir}/googlemock/include)
add_subdirectory(${source_dir}
${binary_dir})
2 ответа
Я использовал этот учебник для достижения этой цели. Просто положи ExternalProject
код в отдельном файле, скажем "CMakeLists.txt.dependencies", а затем запустите еще один cmake с execute_process
, я использую configure_file
сначала ввести информацию о конфигурации во внешний проект и скопировать ее в дерево сборки.
configure_file(CMakeLists.txt.dependency.in dependency/CMakeLists.txt)
execute_process(COMMAND "${CMAKE_COMMAND}" -G "${CMAKE_GENERATOR}" .
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/dependency" )
execute_process(COMMAND "${CMAKE_COMMAND}" --build .
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/dependency" )
Вы не следуете методу правильно. Там должно быть только ExternalProject_Add()
как последняя команда в CMakeLists.txt.in
файл.
CMakeLists.txt.in
файл вызывается внешним CMakeLists.txt
файл, так что обработка подпроекта происходит во время настройки через execute_process()
, CMakeLists.txt.in
действует как прославленный загрузчик.
Итак, все остальные команды, такие как add_subdirectory()
добавляются к внешнему CMakeLists.txt
файл.