Depurando el Makefile / parte 2 /

Métodos de depuración



En esta parte, hablaremos sobre técnicas y problemas de depuración comunes. En última instancia, la depuración es una mezcolanza de todo lo que funciona en una situación determinada. Estos métodos funcionan para mí y tengo que confiar en ellos incluso en caso de problemas con los archivos MAKE más simples . Quizás ellos también te ayuden.







Depurando el Makefile / parte 1 /







Un error muy molesto en make



3.80 fue el mensaje de error en el archivo MAKE , donde make



el número de línea y generalmente el número de línea era incorrecto. No me molesté en investigar por qué ocurre este problema: debido a archivos importados, asignaciones a variables de varias líneas o debido a macros personalizadas. Por lo general, make



da un número de línea mayor de lo que debería. En archivos MAKE complejos , sucede que el número no coincide en 20 líneas.







A menudo, la forma más fácil de ver el valor de una variable es imprimirla durante la ejecución del objetivo. Si bien es fácil de imprimir con ayuda warning



, a largo plazo puede ahorrar mucho tiempo y un poco de esfuerzo al agregar un objetivo común debug



para generar variables. Aquí hay un código de destino de ejemplo debug



:







debug:
       $(for v,$(V), \
         $(warning $v = $($v)))
      
      





, debug



:







$ make V="USERNAME SHELL" debug
makefile:2: USERNAME = Owner
makefile:2: SHELL = /bin/sh.exe
make: debug is up to date.
      
      





, MAKECMDGOALS



, V



:







debug:
       $(for v,$(V) $(MAKECMDGOALS), \
         $(if $(filter debug,$v),,$(warning $v = $($v))))
      
      





. , , make



( ) :







$ make debug PATH SHELL
makefile:2: USERNAME = Owner
makefile:2: SHELL = /bin/sh.exe
make: debug is up to date.
make: *** No rule to make target USERNAME. Stop.
      
      





make



, shell



. , , , . — :







DATE := $(shell date +%F)
OUTPUT_DIR = out-$(DATE)
make-directories := $(shell [ -d $(OUTPUT_DIR) ] || mkdir -p $(OUTPUT_DIR))
all: ;
      
      





sh



, :







$ make SHELL="sh -x"
+ date +%F
+ '[' -d out-2004-05-11 ']'
+ mkdir -p out-2004-05-11
      
      





, .







, , :







FIND_TOOL = $(firstword $(wildcard $(addsuffix /$(1).exe,$(TOOLPATH))))
      
      





. :







$(warning $(TOOLPATH))
$(warning $(addsuffix /$(1).exe,$(TOOLPATH)))
$(warning $(wildcard $(addsuffix /$(1).exe,$(TOOLPATH))))
      
      





, ( ) .









make



make



. . , , make



, , . .







make



:







    makefile:n: *** message. Stop
      
      





:







    make:n: *** message. Stop.
      
      





makefile — . — , , , , , .







, make



, , makefile . , - , - . , — . , make



.









: , , .







make



:







foo:
     for f in $SOURCES; \
     do                 \
        …               \
     done
      
      





, make



$S



, OURCES



f



. , f



, :







    OURCES: No such file or directory
      
      





. — .







missing separator



:







    makefile:2:missing separator. Stop.
      
      





( GNU make — .):







    makefile:2:missing separator (did you mean TAB instead of 8 spaces?). Stop.
      
      





make



, :, =, . , - .







commands commence before first target



makefile, ( ). make



, , , , make



.







unterminated variable reference



, . , . make



Lisp! , , Emacs.









: , , , .







" ", .







:







    bash: foo: command not found
      
      





, foo



. , PATH



. , PATH



, .profile (Bourne shell), .bashrc (bash) .cshrc (C shell). , PATH



makefile, PATH



make



.







, . , make



:







$ make
touch /foo/bar
touch: creating /foo/bar: No such file or directory
make: *** [all] Error 1
      
      





touch



, . — make



. makefile , . , , make



.







, @



. .







make



, make



.







No Rule to Make Target



:







    make: *** No rule to make target XXX. Stop.
      
      





:







    make: *** No rule to make target XXX, needed by YYY. Stop.
      
      





, make



XXX, make



. make



.







:







  • makefile . .
  • makefile — . make



    . makefile , . make



    .
  • , make



    - , , make



    . , make



    . — VCS. , make



    - , - . , .







    Overriding Commands for Target



    make



    ( «::» , ). , make



    :







    makefile:5: warning: overriding commands for target foo
          
          





    :







    makefile:2: warning: ignoring old commands for target foo
          
          





    , ; .









makefile , . , , .







, :







# Create a jar file.
$(jar_file):
        $(JAR) $(JARFLAGS) -f $@ $^
      
      





makefile . makefile:







# Set the target for creating the jar and add prerequisites
jar_file = parser.jar
$(jar_file): $(class_files)
      
      





Si agrega inadvertidamente un script de comando a dicho archivo MAKE , make



se emitirá una advertencia de anulación.








All Articles