如何展平CMake Superbuild?

时间:2018-01-28 14:29:31

标签: cmake dependency-management external-project

虽然艰苦学习如何让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之类的东西。问题是我最终得到了一个用于“superbuild”的Makefile / Solution,另一个用于我的实际项目。它运作良好,但它很混乱。我一直在考虑尝试使用git模块来引入依赖项,但我不确定它是否能正常工作。我怎样才能降低复杂性,因此只有一个构建系统?

基础CMakeLists.txt位于https://github.com/coder0xff/Plange/blob/master/CMakeLists.txt

2 个答案:

答案 0 :(得分:2)

事实上,您只能将ExternalProject用于“克隆”(就像执行便携式git子模块的cmake方式一样)。

所有内容都解释here

注意:这是一个测试它的宠物项目:mizux/cmake-external.git

答案 1 :(得分:0)

我已经更新了项目,完全不使用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()