Estoy trabajando en proyectos de gran escala, donde el tiempo de compilación es muy de 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, usamos compilación distribuidaCómo encontrar dependencias de encabezado para proyectos a gran escala en Linux
Respuesta
IIRC gcc podría crear archivos de dependencia.
Es posible que desee ver en la compilación distribuida, véase por ejemplo distcc
herramientas como doxygen (utilizado con las opciones graphviz) puede generar gráficos de dependencia para incluir archivos ... Pongo No sé si proporcionarían una visión general suficiente de lo que intenta hacer, pero podría valer la pena intentarlo.
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 ingresa un nombre de archivo, le dará dónde está incluido. Pero esto todavía está adivinando, y no rastrea dependencias encadenadas.
Tal
strace -e trace=open -o outfile make
grep 'some handy regex to match header'
Si desea saber qué archivos están incluidos sobre todo, utilizar este comando bash:
hallazgo. -name '.cpp' -exec egrep '^ [: espacio:] #include [[: espacio:]] + ["<] [[: alpha:] [: digit:] _.] + ["> ] '{} \;
| ordenar | uniq -c | ordenar -k 1rn, 1
| la cabeza -20
Se mostrará top 20 archivos clasificados según su 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.
Usando la filosofía de Unix de "pegar muchas herramientas pequeñas", sugiero escribir un script corto que llame a gcc con las opciones -M (o -MM) y -MF (OUTFILE) (como se detalla en here). 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 here le proporcionarán herramientas que rastrean #include dependencias. Pero no hay mención de optimización y tal.
Aparte: El libro "Diseño de software en gran escala C++" debería ayudar.
Desde el nivel de la raíz del árbol de código fuente 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
Línea 1 obtener todas las líneas de incluir. 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.
Necesita [^ ">] * en lugar de [^">] en grep. –
Esto también no rastrea incluye que se generan aguas abajo. Analizar el resultado de "gcc -E-dI" será mucho mejor para un proyecto más complejo. –
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 quería detectar el múltiple incluye, por lo que podría eliminarlos, se puede utilizar como sugiere makedepend Iulian Serbanoiu:
makedepend -m *.c -f - > /dev/null
dará una advertencia para cada múltiplo incluyen.
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 de 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.
- 1. ¿Ruby on Rails es bueno para proyectos a gran escala?
- 2. Java - Hacer proyectos de GUI a gran escala
- 3. Aprendizaje a gran escala
- 4. Pseudoinverso a gran escala
- 5. Estrategia para la refacturación a gran escala
- 6. Revisión ortográfica a "gran escala" en Python
- 7. Diseño a gran escala en Haskell?
- 8. Almacenamiento de imágenes a gran escala
- 9. ¿Qué tecnología para raspado/análisis a gran escala?
- 10. ¿Es preferible CakePHP para una aplicación web a gran escala?
- 11. ¿De qué maneras puede administrar proyectos de lenguaje ensamblador a gran escala?
- 12. ASP.NET + MySQL a gran escala. ¿Recomendado?
- 13. Cómo aplicar imágenes de paisaje a gran escala
- 14. Gestión de dependencias para grandes proyectos
- 15. Mejores prácticas CSS para el sitio web a gran escala
- 16. Dependencias relativas a proyectos en Gradle?
- 17. Aplicación de Internet a gran escala, ¿por dónde empezar?
- 18. Manejo del conjunto de datos a gran escala
- 19. Procesamiento de datos a gran escala Hbase vs Cassandra
- 20. Ver dependencias de proyectos de MSBuild
- 21. Aprendizaje automático a gran escala: ¿Python o Java?
- 22. minería a gran escala con los datos clojure
- 23. Agregando proyectos de eclipse referenciados a dependencias de maven
- 24. Gran gestión de dependencias del sistema Java
- 25. IronPython vs. C# para proyectos de pequeña escala
- 26. ¿Hay algún proyecto comercial a gran escala que utilice Squeak Smalltalk?
- 27. Soluciones de estudio visual con un gran número de proyectos
- 28. Biblioteca estándar de C++ para procesamiento de datos a gran escala
- 29. ¿Cómo encontrar colaboradores para proyectos de código abierto?
- 30. ¿Alternativa a valgrind (memcheck) para encontrar fugas en Linux?
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 – user12371
¿Tal vez debería editar su pregunta para incluir esta información en lugar de tenerla como comentario? – Daemin