Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CMake: How to pass preprocessor macros

Tags:

c++

cmake

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?

like image 509
Killrazor Avatar asked Mar 09 '12 18:03

Killrazor


People also ask

How do I specify in Cmake?

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 .

What is a Cmake macro?

CMake supports both functions and macros to provide a named abstraction for some repetitive works. A function or macro always define a new command.

What is Ifdef C++?

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.


2 Answers

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.

like image 67
Cat Plus Plus Avatar answered Sep 19 '22 18:09

Cat Plus Plus


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

like image 43
Lesque Avatar answered Sep 20 '22 18:09

Lesque