c++ - makeopts - Cómo encontrar dependencias de encabezado para proyectos a gran escala en Linux
makefile 112 makeopts no existe el fichero o el directorio (11)
Consulte makdepend
Estoy trabajando en proyectos a gran escala, donde el tiempo de compilación es muy largo. ¿Qué herramientas puedo usar (preferentemente de código abierto) en Linux para encontrar los archivos más incluidos y optimizar sus usos? Para ser más claros, necesito una herramienta que, dadas las dependencias, me muestre qué encabezados son los más incluidos. Por cierto, sí usamos compilación distribuida
Desde el nivel de raíz del árbol de origen y haga lo siguiente (/ t es el carácter de tabulación):
find . -exec grep ''[ /t]*#include[ /t][ /t]*["<][^">][">]'' {} '';''
| sed ''s/^[ /t]*#include[ /t][ /t]*["<]//''
| sed ''s/[">].*$//''
| sort
| uniq -c
| sort -r -k1 -n
La línea 1 obtiene todas las líneas de inclusión. La línea 2 quita todo antes del nombre de archivo real. La línea 3 se quita del final de la línea, dejando solo el nombre del archivo. La línea 4 y 5 cuentan cada línea única. La línea 6 ordena por recuento de líneas en orden inverso.
Es posible que desee ver compilación distribuida, consulte por ejemplo distcc
Esto no es exactamente lo que estás buscando, y puede que no sea fácil de configurar, pero podrías echarle un vistazo a lxr: lxr.linux.no es un árbol kernel navegable.
En el cuadro de búsqueda, si ingresas un nombre de archivo, te dará dónde está incluido. Pero esto todavía está adivinando, y no rastrea dependencias encadenadas.
Tal vez
strace -e trace=open -o outfile make
grep ''some handy regex to match header''
Herramientas como doxygen (que se usa con las opciones de graphviz) pueden generar gráficos de dependencia para incluir archivos ... No sé si proporcionarían una visión general suficiente de lo que intenta hacer, pero podría valer la pena intentarlo.
IIRC gcc podría crear archivos de dependencia.
Los scripts Bash encontrados en la página no son una buena solución. Funciona solo en proyecto simple. De hecho, en un proyecto grande, como por ejemplo en la página del encabezado, a menudo se usan preprocesadores C (#if, #else, ...). Solo un buen software más complejo, como makedepend o scons puede dar buenas informaciones. gcc -E puede ayudar, pero, en proyectos grandes, su análisis de resultados es un tiempo de pérdida.
Si desea saber qué archivos están incluidos más que todo, use este comando bash:
encontrar . -name '' .cpp'' -exec egrep ''^ [: espacio:] #include [[: espacio:]] + ["<] [[: alfa:] [: dígito:] _.] + [">]'' {} /;
| ordenar | uniq -c | ordenar -k 1rn, 1
| cabeza -20
Mostrará los mejores 20 archivos ordenados por la cantidad de veces que fueron incluidos.
Explicación: La 1.ª línea encuentra todos los archivos * .cpp y extrae las líneas con la directiva "#include". La segunda línea calcula cuántas veces se incluyó cada archivo y la tercera línea tiene 20 archivos en su mayoría incluidos.
Use ccache . Agrupará las entradas de una compilación y almacenará en caché los resultados, lo que aumentará drásticamente la velocidad de este tipo de compilaciones.
Si desea detectar las inclusiones múltiples, para poder eliminarlas, puede usar makedepend como sugiere Iulian Şerbănoiu:
makedepend -m *.c -f - > /dev/null
dará una advertencia por cada múltiple incluido.
Utilizando la filosofía de Unix de "pegar muchas herramientas pequeñas", sugiero escribir un pequeño script que llame a gcc con las opciones -M (o -MM) y -MF (PERFIL) (como se detalla aquí ). Eso generará las listas de dependencia para la herramienta make, que luego puede analizar fácilmente (en relación con el análisis directo de los archivos fuente) y extraer la información requerida.
Las respuestas aquí le darán herramientas que rastrean #include dependencias. Pero no hay mención de optimización y tal.
Aparte: el libro "Diseño de software C ++ a gran escala" debería ayudar.