如何在VC ++生成器上编写完全单一的配置而不是多个配置

时间:2019-04-25 01:32:08

标签: visual-c++ makefile cmake

摘要

我正在为多个平台(Win32 VC ++ / mingw / linux /嵌入式系统,将生成* .lib和* .a文件)的库编写cmake脚本。

如何在VC ++生成器中编写cmake脚本以强制覆盖单个配置并为单个配置生成器获得相同的结果?

背景

我将在CI流程中使用它,并且需要使用与单一配置生成器(可能是“ Unix Makefile”等)相同的简单目录结构来获取输出。

我了解多重配置的好处,我将在Visual Studio上使用它进行设计和开发。但是它对CI流程造成了阻碍。

例如,VC ++生成器构建了MSBuild脚本,我们必须使用配置参数'--config':

cmake --build . -j --config Debug

它将编译的库放在名为subdir的配置中

[outdir]/Debug/libil2c.lib

但是Unix Makefile生成器只是简单地调用:

# "--config" argument not required because it was already configured with CMAKE_BUILD_TYPE=Debug
cmake --build . -j

它直接放置编译的库:

[outdir]/libil2c.a

对于VC ++生成器,我需要相同的用法和相同的结果。

相关主题

我们必须使用多种配置知识仔细编写cmake脚本。例如,变量可以(必须)对“配置命名:”

隐式应用后缀。
# For multiple configuration "Debug" usage.
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /Od /Ob0 /Oi /RTC1 /GR /sdl /MTd -D_DEBUG")
# For multiple configuration "Release" usage.
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Ox /GL /GS /sdl- /MT -DNDEBUG")

我们仅使用此策略进行多次配置。如果我们针对单个配置生成器(伪代码),我们可以简单地编写:

if(DEFINED DEBUG)
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Od /Ob0 /Oi /RTC1 /GR /sdl /MTd -D_DEBUG")
else()
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Ox /GL /GS /sdl- /MT -DNDEBUG")
endif()

此示例的策略可以应用所有其他目标平台。

0 个答案:

没有答案