Как использовать 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 файл.

Другие вопросы по тегам