只运行一次CMake superbuild

时间:2018-01-19 10:39:42

标签: cmake

在CMake超级构建中,最好先运行依赖项构建和项目构建,然后再从不运行(除非需要)。我对optionsset的问题是我找不到设置初始值然后覆盖它的方法。

顶级CMakeLists.txt

if( NOT DEFINED USE_SUPERBUILD )
    set( USE_SUPERBUILD on CACHE BOOL "Set the superbuild to run once" )
else()
    set( USE_SUPERBUILD ${USE_SUPERBUILD} CACHE BOOL "Set the superbuild to run once" FORCE )
    message( "Forcing USE_SUPERBUILD AFTER: ${USE_SUPERBUILD}" )
endif()

superbuild.cmake

ExternalProject_Add( my_proj
        DEPENDS ${MYPROJ_DEPENDENCIES}
        SOURCE_DIR ${PROJECT_SOURCE_DIR}
        CMAKE_ARGS -DUSE_SUPERBUILD:BOOL=off ${EXTRA_CMAKE_ARGS}
        INSTALL_COMMAND ""
        BINARY_DIR ${INSTALL_DIR} ) 

运行它

Forcing USE_SUPERBUILD AFTER: off

CMakeCache.txt

//Set the superbuild to run once
USE_SUPERBUILD:BOOL=on

当superbuild到达终点时,它会使用USE_SUPERBUILD=off调用此脚本,并且应该存储此值。出于某种原因,即使它进入else()块并设置off,但CMakeCache.txt仍然包含on。所以这里的问题显然是ExternalProject_add没有调用构建,因此它在你启动时使用了CMAKE_BINARY_DIR的根。有没有办法让ExternalProject_add与调用cmake -DUSE_SUPERBUILD=off ../project_source_folder一样工作?

2 个答案:

答案 0 :(得分:1)

将我的评论转化为答案

我只是否定你的变量含义。只运行一次superbuild:

<强> superbuild.cmake

if (SKIP_SUPERBUILD) 
    return()
endif()

[...]

# superbuild run finished, don't run again
set(SKIP_SUPERBUILD ON CACHE BOOL "Set to skip superbuild")

<强>参考

答案 1 :(得分:0)

从ExternalProject_add切换

工作目录错误,ExternalProject_add可以替换为add_custom_target

add_custom_target( my_proj ALL
        DEPENDS ${MYPROJ_DEPENDENCIES}
        COMMAND cmake -DUSE_SUPERBUILD:BOOL=off ${EXTRA_CMAKE_ARGS} --build ${CMAKE_BINARY_DIR}
        WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
        COMMENT "Starting build ${CMAKE_BINARY_DIR}" )