Compgen y make: ¿Existe alguna forma de compilar las recetas de make?
Estoy ejecutando compgen -c make
en BASH en Mac y estoy obteniendo los siguientes valores de retorno:
makepqg
makepqg
makepqg
make
makeinfo
makepqg
makepqg
Pero lo que quiero y debería obtener (y obtengo al completar con
foo
bar
biz
baz
Estos representan mis diferentes reglas ficticias de make que hacen cosas automáticas.
¿Cómo se genera esta lista desde la terminal en general, con la herramienta ejecutable compgen
?
(Esta es la pregunta ideal porque, desde python3, subprocess
no puede simular la interacción de
Esto es diferente a la candidatura duplicada “Cómo obtener los objetivos en make (parafraseado)”, en el sentido de que no creo que el comando (que no funciona) sea una buena respuesta, y esta pregunta se trata de compgen
y make
, en lugar de make
y el funcionamiento interno de make
:
make -p no_targets__
| awk -F'[:]' '/^[a-zA-Z0-9][^$$#/\t=]*:([^=]|$$)/ {split($$1,A,/ /);for(i in A)print A[i]}' "
| grep -v '__$$' "
| sort
¿Pero puedo llegar a alguna solución para mi propósito de alto nivel utilizando expresiones regulares?
En mi opinión, no, porque compgen
es fácil y fácil de recordar, mientras que este truco es complicado e introduce dificultades en cualquier código que le agregue.
Además, el duplicado permite realizar cambios en el archivo make.
En mi caso, el archivo make debe considerarse dado, o lo que estoy haciendo será menos útil.
Entonces, más específicamente, dado cualquier archivo make, ¿hay una solución que involucre herramientas fuera de make que puedan examinar make y hacer que make produzca una lista de sus recetas como lo haría para la finalización de bash?
En otras palabras, ¿se puede hacer esto para cualquier archivo make (sin pérdida de generalidad) sin requerir permisos de escritura en el archivo make y sin simular el tab-tab usando un simulador de terminal?
davy.ai
Para generar una lista de reglas PHONY para make desde la SHELL, se puede utilizar el comando
compgen
con la opción-W
, seguido de una lista de reglas PHONY separadas por espacios.Por ejemplo, si las reglas PHONY son
foo
,bar
,biz
ybaz
, el comando sería:Esto imprimirá la lista de reglas PHONY de la siguiente manera:
Alternativamente, se puede utilizar
make
en sí mismo para generar la lista de reglas PHONY utilizando la opción-p
y filtrando la salida congrep
ysed
.Por ejemplo:
Esto imprimirá la lista de reglas PHONY en el mismo orden en que aparecen en el
Makefile
.Tenga en cuenta que este comando puede no funcionar para todos los
Makefiles
, especialmente aquellos con dependencias complejas y generación de reglas dinámicas.