[CMake] CMake command line arguments
Michael Hertling
mhertling at online.de
Mon Mar 7 05:33:51 EST 2011
On 03/06/2011 12:12 PM, Gabriel Petrovay wrote:
> Hi,
>
> Is there a way to read the arguments that were passed to CMake from
> inside a CMakeLists.txt file?
>
> There is a problem that some generators (like "NMake Makefiles") set a
> default value for certain variables (like CMAKE_BUILD_TYPE=Debug,
> CMAKE_INSTALL_PREFIX=C:\Program Files\${CMAKE_PROJECT_NAME})
>
> From inside CMake one can not set up a different default value if the
> user does not specify it with a -D option. This is because
> IF(CMAKE_BUILD_TYPE) will always be true because of the default set by
> the generator ("NMake Makefiles").
>
> There was this guy having the same problem:
> http://www.mail-archive.com/cmake@cmake.org/msg09640.html
>
> Any solution how one can solve this? Reading the arguments passed to
> CMake would be one, but I find no documentation/example/google_result
> for this.
>
>
> Thanks!
Scanning the command line for user-supplied settings wouldn't be
reliable because your project might also be configured via a GUI.
Furthermore, even an empty CMAKE_BUILD_TYPE variable may denote a
valid build type, so there's no robust criterion to decide when to
set a default value by examining this variable alone. Instead, you
might use another variable, say ${PROJECT_NAME}_BUILD_TYPE, and do:
IF(NOT DEFINED ${PROJECT_NAME}_BUILD_TYPE)
SET(${PROJECT_NAME}_BUILD_TYPE "CUSTOM")
ENDIF()
SET(CMAKE_BUILD_TYPE "${${PROJECT_NAME}_BUILD_TYPE}")
In this way, an undefined ${PROJECT_NAME}_BUILD_TYPE results in a
default CMAKE_BUILD_TYPE on behalf of the CMakeLists.txt file. Of
course, you should document that variable and urge your project's
users to not directly use CMAKE_BUILD_TYPE anymore; perhaps, you
should even hide the latter in a GUI by marking it as advanced.
With regard to CMAKE_INSTALL_PREFIX, you could do the same - or use
CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT, as a robust criterion,
to see whether the user has supplied a value explicitly. Note that
there're additional aspects to consider if the CMakeLists.txt file
is to write that variable's value to the cache, cf. [1] et seq.
Regards,
Michael
[1] http://www.mail-archive.com/cmake@cmake.org/msg32848.html
More information about the CMake
mailing list