Estoy en el proceso de reescribir una configuración CMake heredada para usar características modernas como la propagación automática de dependencias. (es decir, usando cosas como en target_include_directories(<target> PUBLIC <dir>)
lugar de include_directories(<dir>)
). Actualmente, manejamos manualmente toda la información de dependencia del proyecto estableciendo un conjunto de propiedades de directorio global.
En mis pruebas, encontré algunos ejemplos en los que un destino en la nueva compilación se vinculará a una biblioteca que la compilación anterior no. No me estoy vinculando a él explícitamente, así que sé que esto proviene de las dependencias del objetivo, pero para encontrar cuál (es) tengo que mirar recursivamente a través de todos los proyectos CMakeLists.txt
, siguiendo la jerarquía de dependencia hasta que encuentre uno que atrae a la biblioteca en cuestión. Tenemos docenas de bibliotecas, por lo que este no es un proceso trivial.
¿CMake proporciona alguna forma de ver, para cada objetivo, cuáles de sus dependencias se agregaron explícitamente y cuáles se propagaron a través de dependencias transitivas?
Parece que la --graphviz
salida hace mostrar esta distinción, tan claramente CMake conoce el contexto interno. Sin embargo, me gustaría escribir un tree
script similar para mostrar información de dependencia en la línea de comando, y analizar archivos Graphviz suena como una pesadilla y un hack.
Por lo que yo puedo decir, cmake-file-api
no no incluir esta información. Pensé que el codemodel/target/dependencies
campo podría funcionar, pero enumera las dependencias locales y transitivas mezcladas. Y el backtrace
campo de cada dependencia solo se vincula con add_executable
/ add_library
call para el objetivo actual.
--graphiz
opción no responde a tu pregunta? ¿Por qué analizar archivos dot se siente como una pesadilla? Los archivos de puntos son la forma más simple, común y flexible de representar puntos conectados legibles por humanos. Con lagvpr
utilidad, puede hacer cualquier cosa con ellos al estilo awk-ish, y puede importarlos en otros idiomas. ¿Por qué es un archivo de puntos, que literalmente representa una estructura de dependencias en forma de árbol entre objetivos, no una "forma de ver" lo que pides?Respuestas:
Puede analizar el
dot
archivo generado porgraphviz
y extraer los detalles que desee. A continuación se muestra un script de Python de muestra para hacer eso.También puede agregar este script para ejecutarlo desde cmake como destino personalizado, para que pueda llamarlo desde su sistema de compilación. Puede encontrar un ejemplo de proyecto cmake aquí
fuente
pydot
.