es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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 ) es:

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 , y tendré que hacer algo más complejo)

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?

Tags:  , , , ,

Answer

  1. Avatar for 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 y baz, el comando sería:

    compgen -W "foo bar biz baz" -- ""
    

    Esto imprimirá la lista de reglas PHONY de la siguiente manera:

    baz
    bar
    biz
    foo
    

    Alternativamente, se puede utilizar make en sí mismo para generar la lista de reglas PHONY utilizando la opción -p y filtrando la salida con grep y sed.

    Por ejemplo:

    make -qp | grep -w PHONY | sed 's/.*PHONY: //; s/ /\
    /g'
    

    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.

Comments are closed.