Esiste un modo riga di comando in make
per scoprire quale dei prerequisiti di una destinazione non viene aggiornato?Debugging GNU make
risposta
make -d
dovrebbe darvi ulteriori di informazioni sufficienti per eseguire il debug del makefile.
Attenzione: ci vorrà un po 'di tempo e fatica per analizzare l'output ma caricare l'output nel tuo editor preferito e fare ricerche sarà di grande aiuto.
È possibile ridurre notevolmente la quantità di output di debug se si specifica l'obiettivo specifico che ti interessa. Quindi, se siete interessati solo alla dodgy
bersaglio, invece di make -d
che può rendere un centinaio di cose diverse, provare :
make clean
make -d dodgy
(ammesso che abbiate un clean
bersaglio ovviamente).
Il make --debug
è identico a make -d
, ma è anche possibile specificare:
make --debug=FLAGS
dove le bandiere possono essere:
a
per tutti debug (lo stessomake -d
emake --debug
).b
per il debug di base.v
per un debug di base leggermente più dettagliato.i
per le regole implicite.j
per informazioni di chiamata.m
per informazioni durante i remake del makefile.
Sembra make --debug=b
è l'opzione migliore per quello che ti serve, come mostrato nella seguente trascrizione:
[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'.
Un altro suggerimento che se vuoi eliminare regole implicite incorporate, puoi usare il flag '-r' a fianco di' -d'. –
Sei alla ricerca di "prova generale" del Marchio? Stamperà ciò che fa il fare senza farlo, permettendoti di vedere cosa succede.
La bandiera è -n
, utilizzare come make -n
.
Questo è il mio preferito, '-d' è troppo prolisso (anche' --debug = b'). Soprattutto se sei bloccato con fare ricorsivo (ugh!). –
La tua domanda non è chiara. Se vuoi vedere quali file prerequisiti non sono stati modificati di recente, usa ls -l per vedere il loro tempo di modifica.Se volete vedere che cosa rendere sta facendo, provate questo:
# 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
Stavo per suggerire $? pure –
Non proprio una soluzione da riga di comando ma utile comunque. Si potrebbe creare una riga di comando basandosi solo sugli echos solo se è impostato un env-var. – paxdiablo
C'è anche GNU fare con un debugger e una migliore traccia/errore di uscita: Remake
screencast:
http://showmedo.com/videotutorials/video?name=linuxBernsteinMakeDebug1&fromSeriesID=40
Poche volte Ho anche usato this (vecchio ma funzionante) debugger di make interattivo di John Graham-Cumming
Quello che faccio di solito non va usando -d come hanno detto i precedenti rispondenti.
mi sia:
- Usa -p per stampare il database, per vedere quali sono state create regole. Questo è utile se si hanno le seconde regole di espansione e si stanno creando regole al volo, specialmente per la marca ricorsiva.
- Uso pesante della funzione $ (info).
- Utilizzare i suggerimenti e trucco descritti in questo articolo DrDobbs Debugging Makefiles
Di seguito è riportato un codice che sto utilizzando per la stampa di valori:
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
sto usando rendere GNU make modelli per definire la fare regole per target;
I modelli sono come le macro che scrivono le regole, che sono spiegati qui https://www.gnu.org/software/make/manual/html_node/Eval-Function.html
questa funzione è utile quando si dispone di un sistema di marca che include un makefile nucleo di generare tutte le regole per tipo di progetto; se dice di fare una libreria condivisa, scrive le regole per compilare una libreria condivisa; ecc. per altri tipi di obiettivi.
in questo esempio: se si aggiunge SHOW_RULES = 1 alla riga di comando make, viene visualizzato anche il testo delle regole generate da PROGRAM_target_setup_template; insieme a generare le regole stesse (con 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
- $ (chiamare ...) richiama il modello
- $ (info ...) stampa il risultato della sostituzione del modello; (Eval avrebbe invocato l'analisi della produzione e oltre al file make corrente)
di più sulla mia rendere i file qui: http://mosermichael.github.io/cstuff/all/projects/2011/06/17/make-system.html
- 1. GNU make cheat-sheet
- 2. grep dall'interno di GNU make
- 3. Completo gnu make/gcc tutorial
- 4. Rilevamento (non-) GNU Make quando qualcuno esegue `make`
- 5. Vale la pena imparare GNU Make?
- 6. Esiste una versione Cygwin di GNU make?
- 7. Perché GNU Make eliminare un file
- 8. equivalente a pipefail in GNU make?
- 9. GNU Make ciclo for con due variabili
- 10. Come posso intercettare errori e interruzioni in GNU make?
- 11. Le variabili automatiche nelle prove di condizionali: GNU Make
- 12. GNU make: Obiettivi multipli in una singola regola
- 13. regole del modello multi-jolly di GNU Make
- 14. Posso ottenere solo il secondo prerequisito in GNU make?
- 15. Forza GNU make per ricostruire oggetti interessati per definizione compilatore
- 16. Trova Unix con GNU Make per aggiornare automaticamente i file
- 17. Come posso presentare un git SHA1 a gnu make?
- 18. GNU Make convertire gli ambienti, a due punti
- 19. GNU make 3,81 - come fare '--output-sync = target'
- 20. GNU Make: come unire l'elenco e separarlo con il separatore?
- 21. . SECONDARIO per una regola di pattern con GNU Make
- 22. Come verificare la versione di GNU make nel terminale mac?
- 23. Esiste un framework di test unitario per GNU make?
- 24. Qual è il flag -lrt in gnu-make?
- 25. Quanto sono simili/diversi i make di gnu, microsoft nmake e posix standard make?
- 26. make: $ LD_RUN_PATH viene ignorato
- 27. Debugging route in codeigniter?
- 28. GNU make's -j opzione
- 29. Come determinare un buon valore per --load-average usando gnu Make?
- 30. gnu make: elenca i valori di tutte le variabili (o "macro") in una particolare esecuzione
non è lì come una modalità dettagliata? E non puoi semplicemente inserire un po 'di echo' di debug su ciascun target per capirlo? – Earlz