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?
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'.
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
.
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
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
Ce que je fais habituellement, c’est de ne pas utiliser -d comme le disaient les répondants précédents.
Je non plus:
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
Quelques fois, j'ai aussi utilisé this (débogueur de création interactif (ancien mais toujours fonctionnel) de John Graham-Cumming
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
Plus d'informations sur mes fichiers make ici: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html