2008-09-17 10 views
11

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

+0

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

+0

¿Tal vez debería editar su pregunta para incluir esta información en lugar de tenerla como comentario? – Daemin

Respuesta

0

IIRC gcc podría crear archivos de dependencia.

0

Es posible que desee ver en la compilación distribuida, véase por ejemplo distcc

4

Salida makdepend

+0

Esto me da la dependencia para cada archivo. Necesito algo que, dado esto, encuentre los archivos más incluidos. – user12371

2

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.

0

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' 
1

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.

+0

No lo he comprobado, pero su solución no funcionará si se incluye el mismo archivo utilizando dos rutas diferentes. Es decir. #include y #include <./ dev/blah.h> se considerarán diferentes archivos de inclusión. – Daemin

+0

Básicamente una buena idea. – Jonathan

2

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.

4

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.

2

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.

+0

Necesita [^ ">] * en lugar de [^">] en grep. –

+0

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. –

1

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.

1

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.

Cuestiones relacionadas