CMake如何为自定义目标设置TARGET_FILE生成表达式
CMake自定义目标设置TARGET_FILE生成器表达式的实现方法
首先说明直接设置LOCATION属性不生效的原因:LOCATION是CMake的只读目标属性,仅add_executable、add_library等内置方法生成的非导入目标会由CMake自动赋值,用户无法手动修改该属性让$<TARGET_FILE>生成器表达式生效。
你可以根据你的使用场景选择以下两种实现方案:
场景1:自定义目标对应实际生成的输出文件
这是最常见的使用场景,你需要先绑定自定义目标和输出文件,再设置对应属性即可:
# 1. 定义生成目标文件的自定义命令 add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/my_generated_file COMMAND # 这里填写你生成文件的对应命令,如打包、自定义编译指令等 DEPENDS # 这里填写生成文件依赖的前置文件/目标 ) # 2. 定义自定义目标,绑定上面的输出文件 add_custom_target(my_target ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/my_generated_file ) # 3. 设置目标属性让TARGET_FILE生成器表达式生效 set_target_properties(my_target PROPERTIES # 根据你生成的文件类型设置TYPE,可选值包括EXECUTABLE/STATIC_LIBRARY/SHARED_LIBRARY等 TYPE EXECUTABLE # 单配置场景直接填IMPORTED_LOCATION,多配置场景可以加_<CONFIG>后缀区分不同配置的路径 IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/my_generated_file )
设置完成后,$<TARGET_FILE:my_target>就会正常返回你指定的输出文件路径。
场景2:仅需要自定义TARGET_FILE返回值,无实际生成文件
如果你的自定义目标不需要生成实际文件,只是要让$<TARGET_FILE:my_target>返回你指定的任意路径,可以直接将目标声明为导入目标:
add_custom_target(my_target) set_target_properties(my_target PROPERTIES IMPORTED TRUE # 同样根据你的需要设置TYPE TYPE EXECUTABLE # 直接填你想要返回的任意路径 IMPORTED_LOCATION "/your/custom/path/any.file" )
该方案下即使你填写的路径不存在,生成器表达式也会正常返回你设置的路径值。
内容的提问来源于stack exchange,提问作者Sogartar
相关产品推荐
相关产品推荐

