我有一个执行此操作的CMakeLists.txt:
get_target_property(myloc mytarget LOCATION)
它曾经可以正常工作,但是不建议使用LOCATION
弃用CMake 3.0(请参阅https://cmake.org/cmake/help/v3.0/policy/CMP0026.html)。所以我尝试使用生成器表达式:
set(myloc $<TARGET_FILE:mytarget>)
这似乎是可行的,除了生成器表达式不是在任何地方都被求值,它们似乎仅在设置其他目标的属性时才起作用,并且在“生成”步骤而不是之前的“配置”步骤中得到解析。问题是,我需要知道install()
规则中的目标位置,像这样(实际用途不是strip
,但没关系):
install(CODE "execute_process(COMMAND strip ${myloc})")
使用LOCATION
时,此方法工作正常,但现在已弃用,我不知道该怎么做。问题的根源似乎是在目标路径未知的情况下,在“配置”步骤中调用了install()
。
在调用install()
之前,如何弥合这一差距,并像以前一样发现目标输出路径?
答案 0 :(得分:5)
理想情况下,可以通过generator expressions完成:
install(CODE "execute_process(COMMAND strip $<TARGET_FILE:mytarget>)")
不幸的是,仅在CMake 3.14中添加了install
命令的 CODE 和 SCRIPT 模式下的生成器表达式支持(请参阅的documentation该版本的安装命令。
在CMake 3.14之前,您只能使用单一配置生成器(例如,使用Makefile,但不能使用Visual Studio)。
在这种情况下,您可以按照Th.Thielemann's answer中的建议禁用CMP0026警告并读取LOCATION属性。
或者您可以使用命令的install(SCRIPT)
流程,其中脚本是通过file(GENERATE)命令准备的,类似于configure_file
,但可以使用生成器表达式:
file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/mytarget_strip.cmake
CONTENT "execute_process(COMMAND strip $<TARGET_FILE:mytarget>)")
install(SCRIPT ${CMAKE_CURRENT_BINARY_DIR}/mytarget_strip.cmake)
请注意,使用file(GENERATE)
的方法仍不适用于多重配置生成器:CMake要求OUTPUT
子句的文件名在配置之间是唯一的。一个人可以用
file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/mytarget_strip.cmake_$<CONFIG>
CONTENT "execute_process(COMMAND strip $<TARGET_FILE:mytarget>)")
install(SCRIPT ${CMAKE_CURRENT_BINARY_DIR}/mytarget_strip.cmake_${CMAKE_BUILD_TYPE})
但这仍然行不通:在多配置生成器中,CMAKE_BUILD_TYPE
被评估为空字符串。
(在${CMAKE_BUILD_TYPE}
命令中用$<CONFIG>
替换install(SCRIPT)
仅在CMake 3.14及更高版本中有效,但是在这些版本中,不需要整个file(GENERATE)
,也许只需要使用第一个代码段。)
答案 1 :(得分:0)
您可以尝试使用/重新启用cmake_policy(SET CMP0026 OLD)