How to define preprocessor definition for each configuration in CLion?
Asked Answered
C

2

6

I have several build profiles in CLion -> Settings -> Build, Execution, Deployment -> CMake. How can I set the preprocessor definitions for each profile, regardless of which compiler I use?

Carabao answered 13/7, 2019 at 19:20 Comment(0)
C
13
  1. Go to Settings -> Build, Execution, Deployment -> CMake.
  2. Select the profile for which you want to set preprocessor definition.
  3. Write in the CMake options field: -DYOUR_DEFINE_VARIABLE=1
  4. In your CMakeLists.txt write the following:
if (YOUR_DEFINE_VARIABLE)
    add_definitions(-DYOUR_DEFINE_VARIABLE=1)
endif (YOUR_DEFINE_VARIABLE)
Carabao answered 14/7, 2019 at 11:1 Comment(2)
Newbie here, why does it neet to be set both in clion buid config and cmakelists ?Falter
@Falter As I understand, -D in CMake options just adds a local variable to cmake script, whereas add_definitions adds definitions (-D) to the compiler command line. More information: add_definitions, cmake optionsCarabao
C
0

I didn't try this but this should work

if (CMAKE_CONFIGURATION_TYPES)
        string(TOLOWER "${CMAKE_CONFIGURATION_TYPES}" CMAKE_CONFIGURATION_TYPES_LOWER)
else()
        string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_CONFIGURATION_TYPES_LOWER)
endif()

foreach(config ${CMAKE_CONFIGURATION_TYPES_LOWER})
        if (${config} MATCHES "debug")
                #add preprocessor definition something like this bellow
                add_definitions(-DFOO -DBAR ...)
        elseif(${config} MATCHES "release")
                #and so on...
        endif()
endforeach()

So, to correctly check strings, we convert build configuration types to lower case, and then we check if config from the type matches this custom configuration types. if it does, then we can add some preprocessor definitions, etc (

Canso answered 13/7, 2019 at 22:6 Comment(4)
What does it say?Canso
${CMAKE_CONFIGURATION_TYPES} outputs nothing. I just realized that the CMake tab contains not cmake configurations, but build profiles.Carabao
Global add_definitions is a bad style in modern CMake. It's adviseable to use target_compile_definitions etc instead.Thracophrygian
Didn't know. Thank you!Canso

© 2022 - 2024 — McMap. All rights reserved.