我想迭代目标
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)
我该如何解决这个问题?
我们通过使用 Cmake 的 file-api 找到了一个解决方案,我们在 CMake 中设置了一个“配置”
add_custom_target
,这是一个 pyhton 脚本,它正在读取“codemodel-v2”(file-api)的回复:解析 JSON 输出文件以找到感兴趣的目标。然后
从此 JSON 收集所有链接器和编译器标志,然后使用这些标志配置 Go 文件。
$<TARGET_PROPERTY:targetName,INCLUDE_DIRECTORIES>
传递到 add_custom_command
来提取。