如何从 CMake 生成的构建系统中检索目标属性?

lis*_*rus 5 cmake target

假设我有一个现有项目,并且它是 cmake 配置的构建目录。如果我知道目标名称,如何使用此构建检索某些目标的属性?我尝试创建一个像这样的单独脚本

get_target_property(VAR target property)
Run Code Online (Sandbox Code Playgroud)

但它因错误而失败

Command get_target_property() is not scriptable
Run Code Online (Sandbox Code Playgroud)

还有其他方法吗?

小智 3

显然,只有在使用 cmake 配置构建目录时才能调用 get_target_property() 。我不知道有任何方法可以在已配置的构建目录上获取目标属性。但如果可以选择修改现有的 CMakeFiles.txt,则有一个解决方法。

您可以尝试查找目标定义,在那里获取目标的属性并将它们转储到文本文件中。然后,该文件可以在构建目录配置完成后调用的任何其他脚本中使用。

此示例说明了此解决方法:

add_executable(app ${app_sources}) 
set_target_properties(app PROPERTIES COMPILE_DEFINITIONS SOME_DEF=1)

get_target_property(compile_defs app COMPILE_DEFINITIONS)
file(WRITE app_compile_defs.txt ${compile_defs})
Run Code Online (Sandbox Code Playgroud)

请务必get_target_property在 CMakeFiles.txt 中给定目标的每个属性更改完成后使用。否则你可能会错过一些东西,如下例所示。

add_executable(app ${app_sources}) 
set_target_properties(app PROPERTIES COMPILE_DEFINITIONS SOME_DEF=1)

get_target_property(compile_defs app COMPILE_DEFINITIONS)
file(WRITE app_compile_defs.txt ${compile_defs})

set_target_properties(app PROPERTIES COMPILE_DEFINITIONS ANOTHER_DEF=0)
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,ANOTHER_DEF=0定义不会在 中列出app_compile_defs.txt