在CMake超级构建中,最好先运行依赖项构建和项目构建,然后再从不运行(除非需要)。我对options
和set
的问题是我找不到设置初始值然后覆盖它的方法。
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()
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
//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
一样工作?
答案 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
可以替换为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}" )