cmake - 如何在 CMake Release模式下启用断言?

标签 cmake assert ndebug

CMake 用于编译一些 C++ 文件。有assert在代码中调用。这些调用在 CMake 的 Release模式下被禁用。它定义了 NDEBUG在 Release模式下,我猜。

如果我有兴趣在 CMake 的 Release模式下断言,我该如何启用它?

最佳答案

以下是 LLVM 是如何做到的。他们添加了 LLVM_ENABLE_ASSERTIONS项目的选项(将 LLVM 更改为项目的前缀),然后检查它并过滤编译标志。 MSVC 有一个特殊情况。
总的来说,这对我来说似乎比定义构建配置更明智。启用断言是 IMO 对整体构建配置的正交关注。

# This is commonly needed so define it before we include anything else.
string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)

[...]

if(uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" )
    option(QD_ENABLE_ASSERTIONS "Enable assertions" ON)
else()
    option(QD_ENABLE_ASSERTIONS "Enable assertions" OFF)
endif()

[...]

if(QD_ENABLE_ASSERTIONS)
    if(NOT MSVC)
        add_definitions(-D_DEBUG)
    endif()
    # On non-Debug builds cmake automatically defines NDEBUG, so we explicitly undefine it:
    if(NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
        # NOTE: use `add_compile_options` rather than `add_definitions` since
        # `add_definitions` does not support generator expressions.
        add_compile_options($<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:-UNDEBUG>)

        # Also remove /D NDEBUG to avoid MSVC warnings about conflicting defines.
        foreach (flags_var_to_scrub
                CMAKE_CXX_FLAGS_RELEASE
                CMAKE_CXX_FLAGS_RELWITHDEBINFO
                CMAKE_CXX_FLAGS_MINSIZEREL
                CMAKE_C_FLAGS_RELEASE
                CMAKE_C_FLAGS_RELWITHDEBINFO
                CMAKE_C_FLAGS_MINSIZEREL)
            string (REGEX REPLACE "(^| )[/-]D *NDEBUG($| )" " "
                    "${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
        endforeach()
    endif()
endif()
来源:https://opensource.apple.com/source/llvmCore/llvmCore-2358.3/CMakeLists.txt.auto.html

关于cmake - 如何在 CMake Release模式下启用断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22140520/

相关文章:

c++ - CMake:CMAKE_REQUIRED_LIBRARIES 中的库顺序,用于在配置时测试最小程序

qt - CMake 在 Docker/Ubuntu 18.04 中找不到 Qt5LinguistTools

c++ - 通过 CMake 工具链包含正确版本的 STL header

c++ - 如何将应用程序链接到依赖于另一个库的库?

python - 断言浮点值等于有效数字公差

node.js - node.js 的断言库?

c - 如何覆盖C中的断言宏?

c++ - 混合 NDEBUG - 安全吗?