Iterar el grafo de dependencias en CMake para generar una lista de archivos de bibliotecas de enlaces utilizadas para CGO.
Quiero iterar sobre todas las bibliotecas de enlace de un objetivo objetivo
para construir una lista de todos los binarios de bibliotecas (bibliotecas estáticas) a las que enlaza el objetivo
, por ejemplo:
cmake
add_executable(exe main.cpp)
target_link_libraries(exe fmt::fmt otherExe)
Deseamos una lista de todos los archivos binarios de bibliotecas (usando $<TARGET_LINKER_FILE:tgt>
) para los objetivos dependientes fmt::fmt
y otherExe
para generar el archivo CGO interface.go
apropiado con CFLAGS
y LDFLAGS
.
El problema es que es difícil escribir un bucle en CMake para iterar sobre las dependencias de enlace del objetivo
ya que las propiedades como LINK_LIBRARIES
e INTERFACE_LINK_LIBRARIES
son en general listas pero pueden contener expresiones generadoras, como en el caso del objetivo de biblioteca de interfaz fmt::fmt
que proviene de Conan donde INTERFACE_LINK_LIBRARIES
se resuelve como $<$<CONFIG:Release>:CONAN_LIB::fmt_fmt_RELEASE;>
, que contiene un punto y coma “";"” que luego se trata como una lista con $<$<CONFIG:Release>:CONAN_LIB::fmt_fmt_RELEASE;
y >
.
Esto se debe a que Conan agrega lo siguiente:
cmake
set_property(TARGET fmt::fmt
PROPERTY INTERFACE_LINK_LIBRARIES
$<$<CONFIG:Release>:${fmt_LIBRARIES_TARGETS_RELEASE}
${fmt_OBJECTS_RELEASE}> APPEND)
¿Alguien tiene una solución para esto?
davy.ai
Una posible solución es utilizar las propiedades
LINK_LIBRARIES
eINTERFACE_LINK_LIBRARIES
de cada objetivo dependiente de forma recursiva hasta que se hayan recopilado todas las bibliotecas de enlace. Aquí está la función de CMakeget_target_link_libraries
que hace esto:Puedes usar esta función en tu proyecto de CMake de la siguiente manera:
Esto mostrará una lista de todos los archivos binarios de bibliotecas enlazadas a
exe
. Puedes usar esta lista para generar el archivointerface.go
de CGO correspondiente conCFLAGS
yLDFLAGS
apropiados.