debugging makefile gnu-make

debugging - Depuración de GNU make



makefile gnu-make (7)

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

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

¿Hay alguna forma de línea de comandos para averiguar cuál de los requisitos previos de un objetivo no está actualizado?


Estoy usando 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 archivo MAKE 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 reglas en sí (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 la plantilla; (eval habría invocado el análisis del resultado y la adición al archivo make actual)

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


Lo que suelo hacer es no usar -d como dicen los contestadores anteriores.

Yo tampoco:

  1. Use -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 las recursivas.
  2. Uso intensivo de la función $ (información).
  3. Use los consejos y el truco descritos en este artículo de DrDobbs Depuración de Makefiles

A continuación se muestra 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


Pocas veces también he usado this (viejo pero todavía funciona) depurador de make interactivo de John Graham-Cumming



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 tiempo de modificación. Si quieres ver qué está haciendo make, prueba esto:

# Make will announce when it is making this target, and why. sometarget: preq1 preq2 preq3 @echo making $@ @echo The following preqs are newer than the target: $? do_things


make -d

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

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

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

make clean make -d dodgy

(suponiendo que tiene un objetivo clean , por supuesto).

El make --debug es idéntico para make -d pero también puedes especificar:

make --debug=FLAGS

donde las banderas pueden ser:

  • a para todas las depuraciones (igual que make -d y make --debug ).
  • b para la depuración básica.
  • v para una depuración básica un poco más detallada.
  • i para las reglas implícitas.
  • j para la 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''.