CMake: Set different name for #cmakedefine variabl

2019-03-04 14:38发布

I know you can use CMake's configure_file to make CMake variables available to your program. For example, I can use

#define ${CMAKE_BUILD_TYPE}

resulting in

#define Release

However, to keep my code more readible, I would prefer to define

#define BUILD_TYPE_RELEASE

Is there a simple way to achieve this?

2条回答
手持菜刀,她持情操
2楼-- · 2019-03-04 15:23

Here is a fairly simple way to solve it:

In CMakesLists.txt:

if (NOT CMAKE_BUILD_TYPE)
    set (CMAKE_BUILD_TYPE Release)
endif (NOT CMAKE_BUILD_TYPE)

string (TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE_NAME)

configure_file (config.h.in config.h)

And in config.h.in:

#define BUILD_TYPE_${BUILD_TYPE_NAME}

I am, however, still curious if there is a more elegant solution.

查看更多
贼婆χ
3楼-- · 2019-03-04 15:24

This is more a question of your preferred programming style (configuration files vs. compiler definitions).

In your case I would use add_definitions() or directly modify/append COMPILE_DEFINITIONS directory property (using generator expressions also supports multi-configuration environments):

set_property(
    DIRECTORY 
    APPEND 
    PROPERTY 
        COMPILE_DEFINITIONS "BUILD_TYPE_$<UPPER_CASE:$<CONFIG>>"
)

Most simplified Debug/Release Check

You can also check what compiler definitions CMake does pre-define. Without having to modify/add something to your CMakeLists.txt files you could simply check for NDEBUG definition (set for Release builds across platforms) in you C/C++ code:

#ifdef NDEBUG
... 
#endif

References

查看更多
登录 后发表回答