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?

¿Fue útil?

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 que make -d y make --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:

  1. 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.
  2. El uso intensivo de $ (información) de función
  3. .
  4. 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top