Tengo un archivo MAKE bastante grande que crea varios objetivos sobre la marcha calculando nombres a partir de variables. (por ejemplo, foo $ (VAR): $ (PREREQS)). ¿Hay alguna forma de convencer a gnu make de que arroje una lista de objetivos después de haber expandido estas variables?
Me gustaría poder obtener los objetivos para un archivo MAKE arbitrario. Estoy tratando de escribir una función de finalización para mi shell.
make -pn | sed -rn '/^[^# \t\.%].*:[^=]?/p'
make -pnr
. La-r
quita reglas implícitas.Tomado de la finalización de make arg, que funciona a la perfección.
fuente
~/bin
lugar de usar un alias. Funciona genial; ¡Gracias!alias mkl="make -qp | awk -F':' '/^[a-zA-Z0-9][^\$#\/\t=]*:([^=]|\$)/ {split(\$1,A,/ /);for(i in A)print A[i]}' | sort"
que te ahorrará 2 minutos de citas de juegos :-)| sort -u
parece más útil :)No estoy seguro de si esto es solo una cosa de gnu make, pero esto funciona bien:
make help
fuente
Varios respondedores han sugerido usar
make -pn
, que imprimirá la base de datos de reglas pero no ejecutará nada, más o menos. El problema con este enfoque es que-n
aún invoca todas las marcas recursivas, y aún hace mucho más trabajo del necesario, porque imprime todos los comandos que habría invocado en una compilación normal. Una solución más eficiente sería crear un archivo MAKE trivial, dummy.mk, con estos contenidos:Ahora invoque make as
make -p -f Makefile -f dummy.mk __all_targets__
. En cualquier construcción sustancial, la diferencia en la cantidad de salida generada por la marca es significativa. Por ejemplo:El tiempo de ejecución también fue dramáticamente mejor: 2.063 segundos para la primera versión, 0.059 segundos para la segunda.
fuente
time make -pn | wc -l
":1338738 real 0m47.754s.
"time make -f Makefile -f dummy.mk -pn __all_targets__ | wc -l
":938621 real 0m40.219s
.make
parece sugerir algo similar pero amigable, a sabermake -p -f/dev/null
-f /dev/null
impedirámake
a partir de análisis de los archivos make regulares, de manera que obtendrá una impresión única de los incorporados en las reglas. Por eso mi solución lo especifica-f Makefile -f dummy.mk
. Pero eso tampoco es suficiente, porque con-n
,make
continuará y realmente comenzará a ejecutar las reglas en el archivo MAKE también. Desafortunadamente, no conozco ninguna modificación que pueda simplificar la solución tal como se presentó originalmente.-n
..."Consulte la finalización de bash para make en GitHub.
fuente
Editar: Para su información, el repositorio de git de finalización de bash de Debian en otra respuesta ahora incorpora una versión mejorada de este script adaptada a los casos de uso de finalización de bash.
Este es un script mucho más completo que el script de finalización de debian bash porque proporciona resultados para las reglas generadas que es lo que pide la pregunta y la respuesta más votada (script de finalización de debian bash en el servidor git de debian) no va lo suficientemente lejos.
Este no es el guión original al que me vinculé, pero es mucho más simple y un poco más rápido.
fuente
Este es el código para alias basado en la solución de Todd Hodes
fuente
Esto dará un buen resultado:
fuente
Hay una solución muy agradable con algo de magia sed y egrep aquí: https://gist.github.com/pvdb/777954
fuente
Supongo que llego un poco tarde a esta fiesta, pero si estás buscando un comando específico, puedes probar
Esto funciona principalmente, aunque aún puede incluir algunas cosas que no son de destino, como una
vpath
directiva. Si no depende demake
las reglas integradas de ', puede utilizarlomake -qpR
como primer comando de la canalización.fuente
Solución de rubí:
fuente
Estoy trabajando en solaris 10 y turbo C shell. La solución dada no funciona para mi proyecto makefile. incluso después de alterar la línea de comando anterior a la sintaxis tcsh. Sin embargo, descubrí que puede obtener una solución fácil usando
versión de remake:
es
y algunos otros datos de versión sin importancia
fuente
Fui a buscar la misma pregunta y se me ocurrió este giro:
Esto elimina todas las líneas de comentarios, reglas de patrones (líneas que comienzan con tabulaciones), todos los elementos intrínsecos (ejemplo
.c.o
y%.o: %.c
patrones).fuente
Encontré esta solución en otro hilo:
También puede agregarlo a su
Makefile
:Y ejecutar
make list
.fuente
Claro, pero ¿cuándo quieres que los escupe?
Para informar el nombre del objetivo cuando ejecuta la regla, coloque una línea en la regla:
Para escupirlos todos a la vez, puede hacer un objetivo PHONY separado:
Y esto puede convertirse en un requisito previo de su objetivo predeterminado:
EDITAR:
desea una forma de mostrar todos los objetivos posibles de un archivo MAKE arbitrario, lo que supongo que significa de forma no intrusiva. Bien...
Para hacerlo exactamente, y ser capaz de manejar archivos MAKE sofisticados, por ejemplo, que involucren reglas construidas por
eval
declaraciones, tendría que escribir algo parecido a un emulador Make. Poco práctico.Para ver los objetivos de las reglas simples, puede escribir un archivo MAKE que actuaría como un escáner de archivos MAKE, operando en un archivo MAKE arbitrario:
Este sería un trabajo impresionante. ¿Estás seguro de que el objetivo merece la pena?
fuente
fuente
:=
).