CMake:如何获取安装规则的目标位置

时间:2019-06-06 01:50:52

标签: cmake

我有一个执行此操作的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()之前,如何弥合这一差距,并像以前一样发现目标输出路径?

2 个答案:

答案 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)

请参见cmake-policies