在使用CMake时在Visual Studio中检测构建类型(调试/发布)

10

我有一个小游戏引擎,需要在Debug或Release模式下定义一些自定义宏。

这是我的CMake脚本的几行代码,可以实现这个功能:

if (CMAKE_BUILD_TYPE STREQUAL "Debug")
    set(OE_BUILD_TYPE_DEFINE "OE_DEBUG")
endif()
    
if (CMAKE_BUILD_TYPE STREQUAL "Release")
    set(OE_BUILD_TYPE_DEFINE "OE_RELEASE")
endif()

if (CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
    set(OE_BUILD_TYPE_DEFINE "OE_DEBUG")
endif()

if (CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")
    set(OE_BUILD_TYPE_DEFINE "OE_RELEASE")
endif()

target_compile_definitions(OverEngine PRIVATE
    "_CRT_SECURE_NO_WARNINGS"
    "GLFW_INCLUDE_NONE"

    PUBLIC
    OE_BUILD_TYPE_DEFINE
)

在Linux系统中,使用makeninja都可以很好地运行,但是在Windows系统中使用Visual Studio时,CMAKE_BUILD_TYPE变量始终为空。我知道原因,这是因为VS可以在不重新运行CMake的情况下切换构建类型,而makeninja生成器无法做到这一点。

Premake有一个叫做filter的东西,它完全可以使用,但出于某些原因,我现在没有使用它。

我该如何设置这个呢?

如果需要的话,我正在使用VisualStudio 2019版本16.7.2和CMake 3.18.2。

编辑: 通过使用下面的代码替换那些行来解决此问题:

target_compile_definitions(OverEngine PRIVATE
    "_CRT_SECURE_NO_WARNINGS"
    "GLFW_INCLUDE_NONE"

    PUBLIC
    $<$<CONFIG:Debug>:OE_DEBUG>
    $<$<CONFIG:Release>:OE_RELEASE>

    $<$<CONFIG:RelWithDebInfo>:OE_DEBUG>
    $<$<CONFIG:MinSizeRel>:OE_RELEASE>
)
2个回答

10
你可能希望在这里使用生成器表达式。它们在构建时进行评估,因此即使是多配置生成器(如Visual Studio或Xcode),构建类型也会被设置。
target_compile_definitions(OverEngine
    PRIVATE
      _CRT_SECURE_NO_WARNINGS
      GLFW_INCLUDE_NONE
    PUBLIC
      $<$<CONFIG:Debug>:OE_DEBUG>
      $<$<CONFIG:RelWithDebInfo>:OE_DEBUG>
      $<$<CONFIG:Release>:OE_RELEASE>
      $<$<CONFIG:MinSizeRel>:OE_RELEASE>
)

这段代码给了我这个错误:$<CONFIG>表达式需要一个或零个参数。然而,对于每个CONFIG使用4个生成器表达式对我有用。 - OverShifted
我的错,我发布了支持在$<CONFIG:cfgs>生成器表达式中使用多个变量的CMake 3.19的代码。我会编辑答案。 - vre

-1
我有一个小游戏引擎,在构建调试或发布模式时需要定义一些自定义宏。
请不要使用CMake功能来实现这个。
我个人不常使用CMake生成器表达式。除了CMake生成器表达式之外,可能的替代方法是直接从MSVC编译器中执行:
首先,您可能想要检测是否正在使用MSVC工具链。可以通过检查_MSC_VER宏(https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=msvc-170)来完成。
接下来,您可能希望使用以下启发式方法。当源代码使用DEBUG版本的C和C++运行时编译时,通过为编译器指定标志/MTd /MDd,编译器会自动定义_DEBUG宏。您可以使用此启发式方法来区分调试构建和发布构建。
参考资料
  1. 编译器选项列表
  2. 关于 _DEBUG 宏的说明
  3. MSVC使用的特定工具链宏(与标准C和C++宏混合使用)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接