How to define a C++ preprocessor macro through the command line with CMake?
C++CmakeC++ Problem Overview
I try to set a preprocessor macro in the command line of CMake. I've tried:
set generator="Visual Studio 8 2005"
set params=-D MY_MACRO=1
cmake.exe -G %generator% %params% ..\some_project
but it's neither defined when I compile nor can I find the name MY_MACRO
in the files generated by CMake at all, except for CMakeCache.txt
where it's present in the form:
MY_MACRO:UNINITIALIZED=1
How can I do it?
C++ Solutions
Solution 1 - C++
A good alternative would be to define a cmake option:
OPTION(DEFINE_MACRO "Option description" ON) # Enabled by default
Followed by a condition:
IF(DEFINE_MACRO)
ADD_DEFINITIONS(-DMACRO)
ENDIF(DEFINE_MACRO)
Then you can turn that option ON/OFF via command line with cmake using the -D
flag. Example:
cmake -DDEFINE_MACRO=OFF ..
To make sure the compiler is receiving the definition right, you can call make in verbose mode and check for the macro being defined or not:
make VERBOSE=1
This is a good solution also because make
will recompile your code when any of cmake options changes.
Solution 2 - C++
Try this: -D CMAKE_CXX_FLAGS=/DMY_MACRO=1
Solution 3 - C++
The motivation behind the question was to batch build 3rd party libraries, which is why I wanted to avoid modifying CMakeLists. So years later, even though I don't need that anymore, I figured out that it's easily achievable by means external to CMake:
-
Invoke CMake as usual, no special flags.
-
Then:
-
With MSVC: The compiler reads the
CL
environment variable to get extra command line arguments. Soset CL=/DMY_MACRO=1 %CL%
then invoke MSBuild to do its job.
-
With Makefiles: The generated makefiles use the
CFLAGS
andCXX_FLAGS
variables as makefiles are expected to do. So the build can be started bymake CXX_FLAGS=-DMY_MACRO=1
or by setting the corresponding environment variables.
-
Solution 4 - C++
Unless you have a good reason not to, you should use ADD_DEFINITIONS(<name>=<value>[, ...])
.
Just add the following line to your CMakeLists.txt:
ADD_DEFINITIONS("MY_MACRO=1")
CMake will take care of the syntax of the switches (be it -D<name>=<value>
, or /D<name>=<value>
).