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

yb3bgrhw  于 5个月前  发布在  Go
关注(0)|答案(1)|浏览(50)

我想遍历目标target的所有链接库,以构建target链接到的所有库二进制文件(静态库)的列表,例如:

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

字符串
我们想要一个所有库二进制文件的列表(通过使用$<TARGET_LINKER_FILE:tgt>)为依赖目标fmt::fmtotherExe生成适当的CGO interface.go文件与CFLAGSLDFLAGS
问题是,很难在CMake中编写一个循环来消除target的链接依赖关系,因为像LINK_LIBRBARIESINTERFACE_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)


我该怎么解决这个问题?

xytpbqjk

xytpbqjk1#

我们通过使用Cmake的file-api找到了一个解决方案,我们在Cmake中设置了一个“configure”add_custom_target,这是一个pyhton脚本,它阅读“codemodel-v2”(file-api)的回复:解析JSON输出文件以找到感兴趣的目标。然后从这个JSON中收集所有链接器和编译器标志,然后用这些标志配置一个Go文件。
通过将$<TARGET_PROPERTY:targetName,INCLUDE_DIRECTORIES>传递到add_custom_command,已提取包含文件。

相关问题