gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:17:20 28 4
gpt4 key购买 nike

我有一个 CMakeLists.txt 这样做:

get_target_property(myloc mytarget LOCATION)

它曾经工作正常,但 CMake 3.0 已弃用 LOCATION (见 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() 之前,我该如何弥合这一差距,并像以前一样发现目标输出路径? ?

最佳答案

理想情况下,这将通过 generator expressions 完成:

install(CODE "execute_process(COMMAND strip $<TARGET_FILE:mytarget>)")

不幸的是,在 install 的 CODE 和 SCRIPT 模式中支持生成器表达式命令仅在 CMake 3.14 中添加(请参阅该版本中安装命令的 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),可以只使用第一个片段。)

关于CMake:如何获取安装规则的目标位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56470020/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com