Using cmake, how do you determine the default compiler flags per build type?

后端 未结 1 753
鱼传尺愫
鱼传尺愫 2020-12-14 03:09

I\'m trying to configure my build system so that my release builds don\'t have extra debugging included. But I can\'t find anywhere in the CMake documentation that lists whi

相关标签:
1条回答
  • 2020-12-14 03:42

    This blog post has some helpful information, and this post describes some common anti-patterns.

    The four build types that CMake includes out of the box are Release, Debug, RelWithDebInfo, and MinSizeRel. Correspondingly, CMake ships with default values for each defined build type in CMAKE_C_FLAGS_<buildType> and CMAKE_CXX_FLAGS_<buildType>.

    If you want to find out the what the default values are for each build type, you can add the following statements to your CMakeLists.txt:

    message("CMAKE_C_FLAGS_DEBUG is ${CMAKE_C_FLAGS_DEBUG}")
    message("CMAKE_C_FLAGS_RELEASE is ${CMAKE_C_FLAGS_RELEASE}")
    message("CMAKE_C_FLAGS_RELWITHDEBINFO is ${CMAKE_C_FLAGS_RELWITHDEBINFO}")
    message("CMAKE_C_FLAGS_MINSIZEREL is ${CMAKE_C_FLAGS_MINSIZEREL}")
    
    message("CMAKE_CXX_FLAGS_DEBUG is ${CMAKE_CXX_FLAGS_DEBUG}")
    message("CMAKE_CXX_FLAGS_RELEASE is ${CMAKE_CXX_FLAGS_RELEASE}")
    message("CMAKE_CXX_FLAGS_RELWITHDEBINFO is ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
    message("CMAKE_CXX_FLAGS_MINSIZEREL is ${CMAKE_CXX_FLAGS_MINSIZEREL}")
    

    On my version of cmake (cmake version 2.8.12.1 on OS X), this prints the following values:

    CMAKE_C_FLAGS_DEBUG is -g
    CMAKE_C_FLAGS_RELEASE is -O3 -DNDEBUG
    CMAKE_C_FLAGS_RELWITHDEBINFO is -O2 -g -DNDEBUG
    CMAKE_C_FLAGS_MINSIZEREL is -Os -DNDEBUG
    
    CMAKE_CXX_FLAGS_DEBUG is -g
    CMAKE_CXX_FLAGS_RELEASE is -O3 -DNDEBUG
    CMAKE_CXX_FLAGS_RELWITHDEBINFO is -O2 -g -DNDEBUG
    CMAKE_CXX_FLAGS_MINSIZEREL is -Os -DNDEBUG
    

    (as you can see, the sets of flags are the same for C and C++ by default.)

    Be cautious, because the default build type is an empty string. So unless you specify a build type, none of the above applies. On the cmake mailing list, the following code was suggested (should be placed near the top of a top-level CMakeLists.txt, I imagine) for those who do not desire this behavior:

    if (NOT CMAKE_BUILD_TYPE)
        message(STATUS "No build type selected, default to Release")
        set(CMAKE_BUILD_TYPE "Release")
    endif()
    

    However, this is not recommended, because it will break some mutli-configuration generators. (Better to set it inside a build script.)

    (One of the blog posts above advocated using a shell alias to set -DCMAKE_BUILD_TYPE=Debug when cmake is first invoked instead.)

    0 讨论(0)
提交回复
热议问题