La depuración de GNU make
Pregunta
¿Hay alguna forma de línea de comandos en make
para averiguar cuál de los requisitos previos de un objetivo y no se actualiza?
Solución
make -d
debería darle más que suficiente información para depurar el archivo MAKE.
Tenga cuidado:. Tomará un poco de tiempo y esfuerzo para analizar la salida, pero la carga de la salida en su editor favorito y hacer búsquedas ayudará mucho
. Usted puede reducir enormemente la cantidad de salida de depuración si se especifica el objetivo específico que le interesa lo tanto, si usted está interesado sólo en el objetivo dodgy
, en lugar de sólo make -d
que puede hacer cien cosas diferentes, intenta:
make clean
make -d dodgy
(suponiendo que tiene un objetivo clean
por supuesto).
El make --debug
es idéntica a make -d
pero también se puede especificar:
make --debug=FLAGS
donde las banderas pueden ser:
-
a
para todos depuración (igual quemake -d
ymake --debug
). -
b
para la depuración básica. -
v
para la depuración básica un poco más detallado. -
i
de reglas implícitas. -
j
para obtener información invocación. -
m
de información durante remakes 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'.
Otros consejos
¿Está buscando una "ensayo" a hacer? Se imprimirá lo que hacen está haciendo sin llegar a hacerlo, lo que le permite ver lo que sucede.
La bandera es -n
, lo utilizan como make -n
.
También hay GNU hacen con una salida de un depurador y mejor traza / error: Remake
screencast: http://showmedo.com/videotutorials/video? name = linuxBernsteinMakeDebug1 y fromSeriesID = 40
Su pregunta es un poco confuso. Si desea ver qué requisito previo archivos no se han modificado recientemente, utilice ls -l para ver su fecha de modificación. Si quieres ver lo que hacen está haciendo, intente lo siguiente:
# 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
Lo que suelo hacer es no ir utilizando -d como dijeron que responden anteriores.
o bien:
- Use -p para imprimir la base de datos, para ver lo que se han creado reglas. Esto es útil si tiene reglas segunda expansión y está creando reglas sobre la marcha, hacen especialmente recursiva. El uso intensivo de $ (información) de función
- .
- Utilice los consejos y trucos que se describen en este artículo DrDobbs Depuración Makefile
A continuación se muestra un código que estoy usando para la impresión de 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 utilizado este (viejo, pero todavía de trabajo) marca interactiva depurador por John Graham-Cumming
estoy usando GNU hacen hacer plantillas para definir las reglas tienen por objetivo;
Las plantillas son como macros que escriben reglas, que se explican aquí https://www.gnu.org/software/make/manual/html_node/Eval-Function.html
Esta función es útil cuando se tiene un sistema de construcción que incluye un makefile núcleo para generar todas las reglas por tipo de proyecto; si dice que hacer una biblioteca compartida entonces escribe las reglas para compilar una biblioteca compartida; etc. para otros tipos de objetivos.
en este ejemplo: si se agrega SHOW_RULES = 1 a la línea de comando make sino que también muestra el texto de las reglas que se generan por el PROGRAM_target_setup_template; junto con la generación de las reglas de sí mismos (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
- $ (llamar ...) invoca la plantilla
- $ (info ...) imprime el resultado de la sustitución de la plantilla; (Eval hubiera invocado el análisis de la producción y, además de la marca archivo actual)
Más sobre mi hacer que los archivos aquí: http : //mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html