In a CMake superbuild it is desirable to run the dependency build and project build the first time and then never again (unless desired). The problem I'm having with options and set is that I haven't found a way to set an initial value and then override it.
Top-Level 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} )
Running it
Forcing USE_SUPERBUILD AFTER: off
CMakeCache.txt
//Set the superbuild to run once
USE_SUPERBUILD:BOOL=on
When the superbuild gets to the end, it calls this script with USE_SUPERBUILD=off and it should store this value. For some reason even though it is getting to the else() block and setting off but the CMakeCache.txt still contains on. So the problem here is clearly the ExternalProject_add not calling the build such that it uses the root of the CMAKE_BINARY_DIR when you started. Is there a way to make ExternalProject_add work the same as calling cmake -DUSE_SUPERBUILD=off ../project_source_folder?