web-dev-qa-db-fra.com

Débogage GNU faire

Existe-t-il un moyen de ligne de commande dans make pour déterminer lequel des prérequis d'une cible n'est pas mis à jour?

67
mithuna
make -d

devrait vous donner plus que suffisamment d’informations pour déboguer votre makefile.

Soyez averti: il faudra du temps et des efforts pour analyser le résultat, mais le chargement du résultat dans votre éditeur favori et les recherches faciliteront grandement les choses.

Vous pouvez réduire considérablement le nombre de sorties de débogage si vous spécifiez la cible spécifique qui vous intéresse. Donc, si vous êtes uniquement intéressé par la cible dodgy, au lieu de simplement make -d qui peut générer une centaine de choses différentes, essayez:

make clean
make -d dodgy

(en supposant que vous ayez une cible clean bien sûr).

Le make --debug est identique au make -d mais vous pouvez également spécifier:

make --debug=FLAGS

où les drapeaux peuvent être:

  • a pour tout le débogage (identique à make -d et make --debug).
  • b pour le débogage de base.
  • v pour un débogage de base légèrement plus détaillé.
  • i pour les règles implicites.
  • j pour les informations d'invocation.
  • m pour plus d'informations lors des remakes de makefile.

Il semble que make --debug=b soit la meilleure option pour ce dont vous avez besoin, comme indiqué dans la transcription suivante:

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'.
94
paxdiablo

Recherchez-vous Make "dry run"? Il imprimera ce que fait make sans le faire réellement, vous permettant de voir ce qui se passe.

Le drapeau est -n, utilisez-le comme make -n.

20
LiraNuna

Il y a aussi GNU make avec un débogueur et une meilleure sortie trace/error: Remake

screencast: http://showmedo.com/videotutorials/video?name=linuxBernsteinMakeDebug1&fromSeriesID=40

8
rocky

Votre question n'est pas claire. Si vous voulez voir quels fichiers prérequis n'ont pas été modifiés récemment, utilisez ls -l pour voir leur heure de modification. Si vous voulez voir ce que fait make, essayez ceci:

 # Make annoncera quand il aura atteint cet objectif, et pourquoi… __. Quelque chose: cible @echo faisant $ @ 
 @echo Les préq suivants sont plus récents que la cible: $? 
 faire des choses
7
Beta

Ce que je fais habituellement, c’est de ne pas utiliser -d comme le disaient les répondants précédents.

Je non plus:

  1. Utilisez -p pour imprimer la base de données, pour voir quelles règles ont été créées. Ceci est pratique si vous avez des règles de deuxième expansion et si vous créez des règles à la volée, en particulier une marque récursive.
  2. Utilisation intensive de la fonction $ (info).
  3. Utilisez les astuces et astuces décrites dans cet article sur DrDobbs Debugging Makefiles

Ci-dessous, quelques codes que j'utilise pour imprimer des valeurs:

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
6
George André

Quelques fois, j'ai aussi utilisé this (débogueur de création interactif (ancien mais toujours fonctionnel) de John Graham-Cumming

1
Alex

j'utilise make gnu make templates pour définir les règles de création par cible; 

Les modèles sont comme des macros qui écrivent des règles, ils sont expliqués ici https://www.gnu.org/software/make/manual/html_node/Eval-Function.html

cette fonctionnalité est utile lorsque vous avez un système de création qui inclut un fichier Make central pour générer toutes les règles par type de projet. s'il dit de faire une bibliothèque partagée, il écrit les règles pour compiler une bibliothèque partagée; etc. pour d'autres types de cibles.

dans cet exemple: si vous ajoutez SHOW_RULES = 1 à la ligne de commande make, le texte des règles générées par PROGRAM_target_setup_template s'affiche également. avec générer les règles elles-mêmes (avec 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
  • $ (call ...) appelle le modèle
  • $ (info ...) affiche le résultat de la substitution de modèle; (eval aurait invoqué l'analyse syntaxique de la sortie et son ajout au fichier make actuel)

Plus d'informations sur mes fichiers make ici: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html

0
MichaelMoser