I have a CMake project that I sometimes want to compile against the static boost libraries, but I want to also make it easy to just use the dynamic libraries from the cmake GUI. In my top level CMakeLists.txt I have this:
option(USE_STATIC_BOOST "Build with static BOOST libraries instead of dynamic" NO)
Then in a different file, I have the following logic set up:
if(USE_STATIC_BOOST)
unset(Boost_LIBRARIES)
message(WARNING "Linking against boost static libraries")
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
find_package(Boost REQUIRED COMPONENTS thread program_options system)
else(USE_STATIC_BOOST)
unset(Boost_LIBRARIES)
message(WARNING "Linking against boost dynamic libraries")
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
find_package(Boost REQUIRED COMPONENTS thread program_options system)
endif(USE_STATIC_BOOST)
This seems to work fine if I start from scratch and use:
cmake ../.. -DUSE_STATIC_BOOST=YES
However, when I use
ccmake ../..
I cannot get it to use the static libraries no matter what I do. CMake appears to load the dynamic option into cache on startup and changing USE_STATIC_BOOST doesn't switch it. I even tried to unset(Boost_LIBRARIES) to explicitly clear it out. Is there a way to do what I'm trying to do?
Using x86_64 Linux and g++ to compile. Thanks in advance!
To force the FindBoost CMake module to search for the desired libraries again, you have to clear the cache variables
Boost_INCLUDE_DIR
andBoost_LIBRARY_DIRS
, i.e.:Note that the argument
CACHE
is necessary to make the unset command clear the variables in the cache.Also note that once the option variable
USE_STATIC_BOOST
has been cached, you need to explicitly set the variable from the command line or edit the value in the cache file to make CMake notice the change: