For some internal tests, I would like the install prefix to default to a subdirectory of the build directory, unless explicitly overridden by the user. I know the user can specify a install prefix by:
$ cmake -DCMAKE_INSTALL_PREFIX=/foo/bar ..
But if the user does not specify this, it should default to, e.g. ${PWD}/installed
.
The variable CMAKE_INSTALL_PREFIX
is already set to /usr/local
, so I cannot just check to see if it unset/empty before setting it.
My current solution is to add a custom switch that the user has to invoke to specify that the CMAKE_INSTALL_PREFIX
variable gets respected:
option(ENABLE_INSTALL_PREFIX "Install build targets to system (path given by '-DCMAKE_INSTALL_PREFIX' or '${CMAKE_INSTALL_PREFIX}' if not specified)." OFF)
if ( ENABLE_INSTALL_PREFIX )
set (CMAKE_INSTALL_PREFIX installed CACHE PATH "Installation root")
else()
set (CMAKE_INSTALL_PREFIX installed CACHE PATH "Installation root" FORCE)
endif()
My questions are:
(a) Are there any issues with the above, beyond the annoyance of the extra flag needing to be passed to CMake to get CMAKE_INSTALL_PREFIX
to have an effect?
(b) Is there a better, cleaner, more robust, more idiomatic and/or less annoying way to achieve the above?
Thanks.
CMake sets the boolean variable CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT
if CMAKE_INSTALL_PREFIX
has not been explicitly specified and is initialized to its default setting. You can override it in the following way:
if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set (CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/installed" CACHE PATH "default install path" FORCE )
endif()