我正在为多个平台(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()
此示例的策略可以应用所有其他目标平台。