2011-08-06 9 views
16

¿Hay alguna manera de repetir el tiempo (del sistema, del usuario, real) gastado en cada objetivo de Makefile recursivamente cuando lo hago make all?Medir el tiempo pasado en cada objetivo de un Makefile

Me gustaría comparar la compilación de un proyecto de forma más detallada que solo time make all. Idealmente, se haría eco de un árbol del objetivo ejecutado, cada uno con el tiempo empleado en todas sus dependencias. Sería genial también si pudiera funcionar con -j (fabricación paralela). Y, por cierto, mi Makefile no es recursivo (no genera otra instancia make para cada objetivo principal).

Gracias!

Respuesta

14

Gnu Make utiliza la variable $ (SHELL) para ejecutar comandos en los destinos.

Por defecto está configurado en/bin/sh.

Puede establecer esta variable a un script que ejecutará el comando dado con el comando "time". Algo como esto:

En el makefile especifica la variable SHELL, en algún lugar en la parte superior:

SHELL = ./report_time.sh 

y en el archivo ./report_time.sh:

#!/bin/sh 
shift # get rid of the '-c' supplied by make. 
time sh -c "$*" 

La sustituir la 'sh 'comando con el SHELL original especificado en el Makefile, si lo hay.

Esto informará los tiempos.

Sin embargo, esto no le indicará en qué destino se está ejecutando el script report_time.sh. Una solución para esto es anteponer el nombre del objetivo ($ @) en cada entrada de destino en el archivo MAKE para que también se pase al script report_time.sh.

+1

Gracias por la respuesta rápida y útil! Está bien, pero solo informará los tiempos de las 'hojas' del árbol de dependencia de compilación (los comandos reales), no los tiempos del objetivo intermedio (por ejemplo, el .PHONY). Supongo que tendrá que ser una función incorporada en 'make' para que esto sea posible ... – mqtthiqs

+0

time es un comando incrustado de bash (y tal vez otras shells), pero * not * dash que es el predeterminado en muchas distribuciones. Recomiendo usar '#!/Bin/bash' para este script para evitar problemas –

Cuestiones relacionadas