cmake:DEBUG_POSTFIX 根据debug/release类型指定target的输出文件名

在用cmake生成工程文件(such as Makefile)编译项目的时候,有时我们希望debug/release生成的二进制文件在文件名上有区别:
比如对于target project1,在debug模式编译的dll,希望在Debug模式下生成的文件名为project1_d.dll,以与release模式下编译的project1.dll区别开。该怎么实现呢?

(本文末尾有更新内容)

这就要用到CMAKE的一个target属性:OUTPUT_NAME
OUTPUT_NAME预定义target的生成目标文件名,如果没有指定,则默认为target的名字。
对于Debug/Release等不同的配置,还有对应的属性OUTPUT_NAME_DEBUGOUTPUT_NAME_RELEASE,默认也是target的名字。
可以通过set_target_properties设置OUTPUT_NAME_<CONFIG>的值。
所以我们只要修改OUTPUT_NAME_DEBUG的值就可以达到上述的要求。

下面的cmake脚本以一个functin实现了对指定的target,在debug模式下自动对输出的文件名加_d后缀:

# debug模式下对输出文件名加_d后缀
# targets 输入参数,一组target
function(set_target_output_name targets)
foreach(target ${targets})
  # 获取 OUTPUT_NAME_DEBUG 的值
  get_target_property(_output_name ${target} OUTPUT_NAME_DEBUG)  
  if(_output_name)
    # 如果 OUTPUT_NAME_DEBUG已经定义则直接在后面加_d
    set_target_properties(${target} PROPERTIES OUTPUT_NAME_DEBUG "${_output_name}_d" )
  else()
    # 否则直接修改OUTPUT_NAME_DEBUG 
    set_target_properties(${target} PROPERTIES OUTPUT_NAME_DEBUG "${target}_d" )
  endif()  
  get_target_property(_output_name ${target} OUTPUT_NAME_DEBUG)
  # 显示修改后的结果
  message(STATUS "TARGET:${target} OUTPUT_NAME_DEBUG=${_output_name}")
  # 清除临时变量
  unset(_output_name)
endforeach()
endfunction()

实际调用的效果如下:

– TARGET:fse_cas_static OUTPUT_NAME_DEBUG=fse_cas_static_d
– TARGET:fse_cas OUTPUT_NAME_DEBUG=fse_cas_d
– TARGET:fse_cas_static_mt OUTPUT_NAME_DEBUG=fse_cas_static_mt_d

也可以利用cmake-generator-expressions让写法更简化:

  set_target_properties(${target} PROPERTIES OUTPUT_NAME "${target}$<$<CONFIG:Debug>:_d>" )

实际应用的例子参见:
https://gitee.com/l0km/feature_se/blob/master/feature_se/CMakeLists.txt

DEBUG_POSTFIX

cmake的内容实在是太多了,了解也是一步步深入的,今天找到了DEBUG_POSTFIX这个target property,才知道上面的过程都太low了。
cmake已经提供了DEBUG_POSTFIX这个target属性,用于指定deuug版本的文件结尾符,这才是最正确的打开方式。
所以要指定Target的debug版结尾符

只需要调用set_target_propertiesset_property

set_target_properties (myTarget PROPERTIES DEBUG_POSTFIX _d)

set_property(TARGET myTarget PROPERTY DEBUG_POSTFIX _d) 

也可以通过set(CMAKE_DEBUG_POSTFIX _d)预定义所有target的DEBUG_POSTFIX

NOTE
实际测试证明:使用DEBUG_POSTFIX指定输出文件结尾对executable target(可执行文件)无效。

参考资料

https://cmake.org/cmake/help/v3.1/prop_tgt/CONFIG_POSTFIX.html
https://cmake.org/cmake/help/v3.1/prop_tgt/DEBUG_POSTFIX.html
https://cmake.org/cmake/help/v3.1/variable/CMAKE_DEBUG_POSTFIX.html

猜你喜欢

转载自blog.csdn.net/10km/article/details/79982957