Existe-t-il un moyen de ligne de commande dans make
pour déterminer les prérequis d'une cible qui ne sont pas mis à jour?Débogage de GNU make
Répondre
make -d
devrait vous donner plus que suffisamment d'informations pour déboguer votre makefile.
Soyez averti: cela prendra un peu de temps et d'effort pour analyser la sortie, mais charger la sortie dans votre éditeur favori et faire des recherches vous sera très utile.
Vous pouvez réduire considérablement la quantité de sortie de débogage si vous spécifiez la cible spécifique qui vous intéresse. Donc, si vous êtes seulement intéressé par la cible dodgy
, au lieu de seulement make -d
qui peut faire une centaine de choses différentes, essayez :
make clean
make -d dodgy
(en supposant que vous avez une cible clean
bien sûr).
Le make --debug
est identique à make -d
mais vous pouvez également spécifier:
make --debug=FLAGS
où les drapeaux peuvent être:
a
pour tous le débogage (commemake -d
etmake --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 des informations d'invocation.m
pour l'information pendant les remakes de makefile.
Il ressemble à make --debug=b
est la meilleure option pour ce dont vous avez besoin, comme le montre la transcription suivante:
[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'.
Une autre suggestion que si vous voulez vous débarrasser des règles implicites intégrées, vous pouvez utiliser le drapeau '-r' à côté du simple' -d'. –
Vous cherchez « essai » de Marque? Il imprimera ce que fait faire sans vraiment le faire, vous permettant de voir ce qui se passe. Le drapeau est -n
, utilisez-le comme make -n
.
Ceci est mon préféré, '-d' est beaucoup trop verbeux (même' --debug = b'). Surtout si vous êtes coincé avec make récursive (pouah!). –
Votre question est un peu floue. 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 make est en train de faire, essayez ceci:
# Make will announce when it is making this target, and why. sometarget: preq1 preq2 preq3 @echo making [email protected] @echo The following preqs are newer than the target: $? do_things
J'allais suggérer $? aussi bien –
Pas vraiment une solution en ligne de commande mais utile néanmoins. Vous pouvez éventuellement faire en ligne de commande en ne faisant les echos que si un env-var est défini. – paxdiablo
Il y a aussi GNU make avec un débogueur et une meilleure trace/sortie erreur: Remake
screencast:
http://showmedo.com/videotutorials/video?name=linuxBernsteinMakeDebug1&fromSeriesID=40
Quelques fois J'ai également utilisé this (ancien mais fonctionne toujours) débogueur interactif par John Graham-Cumming
Ce que je fais habituellement ne va pas en utilisant -d comme dit les précédents répondeurs.
I soit:
- Utilisez -p pour imprimer la base de données, pour voir quelles règles ont été créées. C'est pratique si vous avez des règles d'expansion secondes et que vous créez des règles à la volée, en particulier des marques récursives.
- Utilisation intensive de la fonction $ (info).
- Utilisez les conseils et astuces décrites dans cet article DrDobbs Debugging Makefiles
Voici un code que je utilise pour l'impression 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
J'utilise gnu make faire des modèles pour définir la établir des règles par cible;
Les modèles sont comme des macros qui écrivent les règles, ils sont expliqués ici https://www.gnu.org/software/make/manual/html_node/Eval-Function.html
cette fonction est utile lorsque vous avez un système de marque qui comprend un makefile de base pour générer toutes les règles par type de projet; s'il dit de faire une bibliothèque partagée alors 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, il affiche également le texte des règles générées par le PROGRAM_target_setup_template; avec la génération des règles eux-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
- $ (appel ...) appelle le modèle
- $ (info ...) affiche le résultat de substitution de modèle; (Eval aurait invoqué l'analyse syntaxique de la sortie et l'ajout du fichier en cours make)
En savoir plus sur mon make fichiers ici: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html
- 1. Didacticiel gnu make/gcc complet
- 2. Périphérie GNU Make pour Win32
- 3. construire une version Cygwin de GNU make
- 4. Speedup GNU make processus de construction - Parallélisme?
- 5. exécuter grep à partir de GNU make
- 6. GNU make avec de nombreux répertoires cibles
- 7. « Level » compilateur GNU débogage
- 8. Solution pour GNU Make 3.80 eval bug
- 9. GNU make rule pour plusieurs cibles
- 10. Variables automatiques dans les tests de conditionnels: GNU Make
- 11. comment configurer les dépendances entre répertoires dans gnu make
- 12. GNU Make: Comment exporter la variable SHELL en sous-marques?
- 13. Forcer GNU make à exécuter une cible spécifique
- 14. Dans GNU Make, comment convertir une variable en minuscule?
- 15. comment faire $ (eval $ (shell ...)) travail dans GNU make
- 16. Comment invoquer une macro GNU make créée en utilisant define?
- 17. Ajout à des variables GNU make via la ligne de commande
- 18. Imagemagick Liaison à QT et mingw32-make: *** [débogage] Erreur 2
- 19. Comment vérifier les bibliothèques installées, par ex. libpcap lors de l'installation de logiciels utilisant gnu make?
- 20. make: fichier hiérarchique make
- 21. Comment éviter GNU Make d'exécuter lorsqu'une définition variable a des espaces de fin
- 22. "Erreur: impossible de trouver un GNU Make exécutable" avec Cygwin et NDK
- 23. Définition et utilisation d'un horodatage de construction pour GNU Make sur Windows
- 24. "GNU Make not found. Essayez de définir la variable d'environnement GNUMAKE."
- 25. Une règle cible vide est-elle un substitut viable pour .DEFAULT_GOAL dans GNU Make?
- 26. Comment déterminer une bonne valeur pour --load-average en utilisant gnu Make?
- 27. VERBOSE = oui option makefile sur gnu make sous cygwin ne fonctionne pas pour moi
- 28. Répertoire pour les fichiers générés par Make pendant l'installation à partir de configure, make et make install
- 29. Make: $ (joker) maintenant un répertoire ouvert
- 30. Environnement de développement de bureau Ubuntu (outils GNU)
est pas là comme un mode bavard? Et est-ce que tu ne peux pas juste entrer un débogage 'echo' sur chaque cible pour comprendre ça? – Earlz