在CMake中迭代依赖图以生成用于CGO的链接库文件列表

问题描述 投票:0回答:1

我想迭代目标

target
的所有链接库,以构建
target
链接到的所有库二进制文件(静态库)的列表,例如

add_executable(exe main.cpp)
target_link_libraries(exe fmt::fmt otherExe)

我们需要依赖目标 $<TARGET_LINKER_FILE:tgt>

fmt::fmt 的所有库二进制文件的列表(通过使用
otherExe
)来生成带有 
interface.go
CFLAGS
的适当的 CGO
LDFLAGS
文件。

问题是,很难在 CMake 中编写循环来迭代

target
的链接依赖项,因为 像
LINK_LIBRBARIES
INTERFACE_LINK_LIBRARIES
这样的属性在一般列表中,但可能包含生成器表达式,就像来自 Conan 的接口库目标
fmt::fmt
的情况一样,其中
INTERFACE_LINK_LIBRARIES
解析为
$<$<CONFIG:Release>:CONAN_LIB::fmt_fmt_RELEASE;>
。其中包含一个分号“;”然后将其自身视为带有
$<$<CONFIG:Release>:CONAN_LIB::fmt_fmt_RELEASE;
>
的列表。

这是因为柯南添加了以下内容

set_property(TARGET fmt::fmt
             PROPERTY INTERFACE_LINK_LIBRARIES
             $<$<CONFIG:Release>:${fmt_LIBRARIES_TARGETS_RELEASE}
                                           ${fmt_OBJECTS_RELEASE}> APPEND)

我该如何解决这个问题?

c++ go cmake cgo
1个回答
0
投票

我们通过使用 Cmake 的 file-api 找到了一个解决方案,我们在 CMake 中设置了一个“配置”

add_custom_target
,这是一个 pyhton 脚本,它正在读取“codemodel-v2”(file-api)的回复:解析 JSON 输出文件以找到感兴趣的目标。然后 从此 JSON 收集所有链接器和编译器标志,然后使用这些标志配置 Go 文件。

包含文件已通过将

$<TARGET_PROPERTY:targetName,INCLUDE_DIRECTORIES>
传递到
add_custom_command
来提取。

© www.soinside.com 2019 - 2024. All rights reserved.