CMake: How to pass preprocessor macros

C++Cmake

C++ Problem Overview


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?

C++ Solutions


Solution 1 - C++

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.

Solution 2 - C++

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++.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKillrazorView Question on Stackoverflow
Solution 1 - C++Cat Plus PlusView Answer on Stackoverflow
Solution 2 - C++LesqueView Answer on Stackoverflow