Как мне сгладить CMake Superbuild?

Трудно изучая, как заставить CMake делать то, что мне нужно в Visual Studio для кроссплатформенного проекта, я узнал о ExternalProject_Add, и он прекрасно решил все мои потребности. Выдержка:

ExternalProject_Add(googletest
    PREFIX "${CMAKE_BINARY_DIR}/Downloads/googletest"
    GIT_REPOSITORY "https://github.com/google/googletest.git"
    GIT_TAG 718fd88d8f145c63b8cc134cf8fed92743cc112f 
    BINARY_DIR "${CMAKE_BINARY_DIR}/Downloads/googletest/${CMAKE_CFG_INTDIR}/build"
    CMAKE_ARGS
        "-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/Dependencies/googletest"
        "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
        "-DCMAKE_DEBUG_POSTFIX=''"
        "-Dgtest_force_shared_crt=ON"
)

Он использует несколько таких зависимостей, и он хорошо работает в Linux и в Windows, где нельзя ожидать установки таких вещей, как LLVM. Проблема в том, что я получаю Makefile / Solution для "superbuild" и еще один для моего реального проекта. Это работает хорошо, но это грязно. Я подумывал попробовать git-модули для получения зависимостей, но я не уверен, что это сработает хорошо. Как я могу уменьшить сложность, чтобы была только одна система сборки?

База CMakeLists.txt находится по адресу https://github.com/coder0xff/Plange/blob/master/CMakeLists.txt

2 ответа

Решение

Я обновил свой проект, чтобы не использовать ExternalProject_Add на всех, а вместо использования add_subdirectory, Уловка для меня заключалась в том, чтобы set любые соответствующие переменные до add_subdirectory,

function(add_googletest)
    set(BUILD_GMOCK OFF CACHE BOOL "")
    set(BUILD_GTEST ON CACHE BOOL "")
    set(INSTALL_GMOCK OFF CACHE BOOL "")
    set(INSTALL_GTEST ON CACHE BOOL "")
    set(gtest_force_shared_crt ON CACHE BOOL "Force gtest to used shared VC++ CRT")
    add_subdirectory(source/googletest)
    include_directories("${gtest_SOURCE_DIR}/include")
endfunction(add_googletest)
add_googletest()

На самом деле вы можете использовать ExternalProject просто для "клонирования" (как способ создания переносимого подмодуля git cmake).

Здесь все объясняют.

примечание: вот домашний проект для тестирования: https://github.com/Mizux/cmake-external

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