¿Hay una forma de línea de comandos en make
para averiguar cuál de los requisitos previos de un objetivo no se actualiza?
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:
[email protected]> cat makefile
c:a b
touch c
[email protected]> touch a b ; make
touch c
[email protected]> make
make: 'c' is up to date.
[email protected]> 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'.
¿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
.
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
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
Lo que normalmente hago es no usar -d como dijeron los respondedores anteriores.
Yo tampoco:
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
Pocas veces también he usado este (antiguo pero aún funcionando) hace el debugger interactivo por John Graham-Cumming
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
Más sobre mis archivos de creación aquí: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html