Debuggen des Makefiles / Teil 2 /

Debugging-Methoden



In diesem Teil werden wir über gängige Debugging-Techniken und -Probleme sprechen. Letztendlich ist das Debuggen ein Durcheinander von allem, was in einer bestimmten Situation funktioniert. Diese Methoden funktionieren für mich und ich muss mich auch bei Problemen mit den einfachsten Makefiles auf sie verlassen . Vielleicht helfen sie dir auch.







Debuggen des Makefiles / Teil 1 /







Ein sehr ärgerlicher Fehler in make



3.80 war die Fehlermeldung im Makefile , in der make



die Zeilennummer und normalerweise die Zeilennummer falsch waren. Ich habe nicht untersucht, warum dieses Problem auftritt: aufgrund importierter Dateien, Zuweisungen zu mehrzeiligen Variablen oder aufgrund benutzerdefinierter Makros. Gibt normalerweise make



eine Zeilennummer an, die größer ist als sie sollte. In komplexen Makefiles kommt es vor, dass die Zahl nicht mit 20 Zeilen übereinstimmt.







Der einfachste Weg, den Wert einer Variablen zu sehen, besteht häufig darin, ihn während der Ausführung des Ziels auszudrucken. Während es einfach ist, mit Hilfe zu drucken warning



, kann es auf lange Sicht viel Zeit und Mühe sparen, ein gemeinsames Ziel debug



für die Ausgabe von Variablen hinzuzufügen . Hier ist ein Beispiel für einen Zielcode 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)
      
      





Wenn Sie einem solchen Makefile versehentlich ein Befehlsskript hinzufügen , wird eine make



Überschreibungswarnung ausgegeben.








All Articles