it-swarm.dev

Depuración GNU hacer

¿Hay una forma de línea de comandos en make para averiguar cuál de los requisitos previos de un objetivo no se actualiza?

68
mithuna
make -d

debería darle más que suficiente información para depurar su makefile.

Tenga cuidado: tomará un tiempo y esfuerzo analizar la salida, pero cargar la salida en su editor favorito y realizar búsquedas ayudará mucho.

Puede reducir en gran medida la cantidad de resultados de depuración si especifica el objetivo específico en el que está interesado. Por lo tanto, si solo está interesado en el objetivo dodgy, en lugar de solo en make -d que puede hacer cien cosas diferentes, intente:

make clean
make -d dodgy

(asumiendo que tienes un objetivo clean por supuesto).

El make --debug es idéntico a make -d pero también puede especificar:

make --debug=FLAGS

donde las banderas pueden ser:

  • a para toda la depuración (igual que make -d y make --debug).
  • b para depuración básica.
  • v para una depuración básica un poco más detallada.
  • i para reglas implícitas.
  • j para información de invocación.
  • m para obtener información durante los remakes de makefile.

Parece que make --debug=b es la mejor opción para lo que necesita, como se muestra en la siguiente transcripción:

pax@paxbox> cat makefile
c:a b
    touch c

pax@paxbox> touch a b ; make
touch c

pax@paxbox> make
make: 'c' is up to date.

pax@paxbox> touch a ; make --debug=b
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc. Blah, blah, blah.
Reading makefiles...
Updating goal targets....
 Prerequisite 'a' is newer than target 'c'.
Must remake target 'c'.
touch c
Successfully remade target file 'c'.
95
paxdiablo

¿Estás buscando la "carrera en seco" de Make? Imprimirá lo que hace la marca sin hacerlo realmente, permitiéndole ver lo que sucede.

La bandera es -n, úsala como make -n.

22
LiraNuna

También está GNU make con un depurador y una mejor salida de seguimiento/error: Remake

screencast: http://showmedo.com/videotutorials/video?name=linuxBernsteinMakeDebug1&fromSeriesID=40

8
rocky

Tu pregunta es un poco confusa. Si desea ver qué archivos de requisitos previos no se han modificado recientemente, use ls -l para ver su hora de modificación. Si quieres ver lo que hace make, prueba esto:

 # Make anunciará cuándo está haciendo este objetivo, y por qué. 
 Sometarget: preq1 preq2 preq3 
 @Echo making $ @ 
 @Echo Los siguientes requisitos son: más nuevo que el objetivo: $? 
 do_things 
7
Beta

Lo que normalmente hago es no usar -d como dijeron los respondedores anteriores.

Yo tampoco:

  1. Utilice -p para imprimir la base de datos, para ver qué reglas se han creado. Esto es útil si tiene segundas reglas de expansión y está creando reglas sobre la marcha, especialmente la creación recursiva.
  2. Uso intensivo de la función $ (info).
  3. Use los consejos y trucos descritos en este artículo de DrDobbs Depuración de archivos Makefiles

A continuación hay un código que estoy usando para imprimir valores:

define pv
$(info $(1) [$(Origin $(1))] : >|$($(1))|<)
endef

define pva
$(foreach t,$(1),$(call pv,$(t)))
endef

define itemizer
$(foreach t,$($(1)),$(info $(t)))
endef
6
George André

Pocas veces también he usado este (antiguo pero aún funcionando) hace el debugger interactivo por John Graham-Cumming

1
Alex

estoy utilizando make gnu make templates para definir las reglas make por objetivo;

Las plantillas son como macros que escriben reglas, se explican aquí https://www.gnu.org/software/make/manual/html_node/Eval-Function.html

esta característica es útil cuando tiene un sistema make que incluye un makefile central para generar todas las reglas por tipo de proyecto; si dice hacer una biblioteca compartida, escribe las reglas para compilar una biblioteca compartida; etc. para otros tipos de objetivos.

en este ejemplo: si agrega SHOW_RULES = 1 a la línea de comando make, también muestra el texto de las reglas generadas por PROGRAM_target_setup_template; junto con la generación de las propias reglas (con eval).

 # this one defines the target for real
 $(foreach prog, $(TARGETS), $(eval $(call PROGRAM_target_setup_template,$(prog))))

 ifneq "$(SHOW_RULES)" ""
 $(foreach prog, $(TARGETS), $(info $(call PROGRAM_target_setup_template,$(prog))))
 endif
  • $ (llamada ...) invoca la plantilla
  • $ (info ...) imprime el resultado de la sustitución de plantillas; (eval habría invocado el análisis de la salida y la adición al archivo make actual)

Más sobre mis archivos de creación aquí: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html

0
MichaelMoser