Débogage du Makefile / partie 2 /

Méthodes de débogage



Dans cette partie, nous parlerons des techniques et problèmes de débogage courants. En fin de compte, le débogage est un méli-mélo de tout ce qui fonctionne dans une situation donnée. Ces méthodes fonctionnent pour moi et doivent compter sur elles même en cas de problèmes avec les makefiles les plus simples . Peut-être qu'ils vous aideront aussi.







Débogage du Makefile / partie 1 /







Un bogue très ennuyeux dans make



3.80 était le message d'erreur dans le makefile , où make



le numéro de ligne et généralement le numéro de ligne étaient incorrects. Je n'ai pas pris la peine d'enquêter sur les raisons de ce problème: à cause de fichiers importés, d'affectations à des variables multilignes ou à cause de macros personnalisées. Habituellement, make



donne un numéro de ligne supérieur à ce qu'il devrait. Dans les makefiles complexes , il arrive que le nombre ne coïncide pas avec 20 lignes.







Souvent, le moyen le plus simple de voir la valeur d'une variable est de l'imprimer lors de l'exécution de la cible. Bien qu'il soit facile d'imprimer avec de l'aide warning



, à long terme, cela peut gagner beaucoup de temps, un peu d'effort en ajoutant une cible commune debug



pour la sortie des variables. Voici un exemple de code cible 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 vous ajoutez par inadvertance un script de commande à un tel makefile , un make



avertissement de remplacement sera émis.








All Articles