How can I pass a macro to the preprocessor? For example, if I want to compile some part of my code because a user wants to compile unit test, I would do this:
#ifdef _COMPILE_UNIT_TESTS_ BLA BLA #endif //_COMPILE_UNIT_TESTS_
Now I need to pass this value from CMake to the preprocessor. Setting a variable doesn't work, so how can I accomplish this?
You can use the command line to set entries in the Cache with the syntax cmake -D var:type=value , just cmake -D var=value or with cmake -C CMakeInitialCache. cmake .
CMake supports both functions and macros to provide a named abstraction for some repetitive works. A function or macro always define a new command.
The #ifdef identifier statement is equivalent to #if 1 when identifier has been defined. It's equivalent to #if 0 when identifier hasn't been defined, or has been undefined by the #undef directive.
add_definitions(-DCOMPILE_UNIT_TESTS)
(cf. CMake's doc) or modify one of the flag variables (CMAKE_CXX_FLAGS
, or CMAKE_CXX_FLAGS_<configuration>
) or set COMPILE_FLAGS
variable on the target.
Also, identifiers that begin with an underscore followed by an uppercase letter are reserved for the implementation. Identifiers containing double underscore, too. So don't use them.
If you have a lot of preprocessor variables to configure, you can use configure_file:
Create a configure file, eg. config.h.in
with
#cmakedefine _COMPILE_UNIT_TESTS_ #cmakedefine OTHER_CONSTANT ...
then in your CMakeLists.txt:
set(_COMPILE_UNIT_TESTS_ ON CACHE BOOL "Compile unit tests") # Configurable by user set(OTHER_CONSTANT OFF) # Not configurable by user configure_file(config.h.in config.h)
in the build directory, config.h
is generated:
#define _COMPILE_UNIT_TESTS_ /* #undef OTHER_CONSTANT */
As suggested by robotik, you should add something like include_directories(${CMAKE_CURRENT_BINARY_DIR})
to your CMakeLists.txt
for #include "config.h"
to work in C++.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With