2012-06-02 14 views
5
  1. E 'possibile trattare gli avvisi come errori in un il Makefile (e quindi di uscita prima di proventi Makefile)Come trattare un avviso come un errore in un Makefile?

  2. Inoltre, è possibile filtrare i cui avvertimento produce un errore?

mio caso d'uso: voglio usare --warn-undefined-variables in combinazione con questo in modo che Makefile uscirà quando una variabile non è definito, che è una fonte molto comune di errore. Ovviamente non voglio controllare manualmente ciascuna variabile in quanto questa è soggetta a errori/noioso. Non ho trovato nulla su questo, ma è una caratteristica piuttosto importante/di base.

Nota: non sto cercando -Werror che è un comando specifico di gcc non applicabile al mio caso d'uso.

+1

Benvenuti in StackOverflow. Il design qui è "una domanda per post", quindi può esserci una risposta chiara. Domande multiple significa che più di una risposta può essere corretta (rispondo alla domanda 1, qualcun altro risponde alla domanda 2) ed è impossibile selezionare una singola risposta come accettata. Consulta le [FAQ] (http://stackoverflow.com/faq) in modo da familiarizzare con il funzionamento di SO. Grazie. –

+2

Questa mi sembra una domanda ragionevole. Purtroppo, ho il sospetto che la risposta sia 1) no, 2) discutibile, e 3) dura. – Beta

+0

Dipende da cosa intendi per 'variabile indefinita', ma le variabili senza valore ('VAR =') possono essere abbastanza importanti (qualsiasi cosa tranne un errore). Più spesso mi imbatto in variabili inutilizzate; questa è una definizione che una volta era (presumibilmente) usata nel makefile ma non lo è più. –

risposta

2

La versione standard di marca non supporta ciò che si sta cercando. Tuttavia, non dovrebbe essere difficile creare la tua versione di make per soddisfare il tuo caso d'uso.

Guardando il codice sorgente di rendere 3.82, controlla la macro warn_undefined in variable.h:

214 /* Warn that NAME is an undefined variable. */ 
215 
216 #define warn_undefined(n,l) do{\ 
217        if (warn_undefined_variables_flag) \ 
218         error (reading_file, \ 
219          _("warning: undefined variable `%.*s'"), \ 
220         (int)(l), (n)); \ 
221        }while(0) 

Non ho provato questo, ma penso che dovrebbe essere sufficiente a sostituire error con fatal.

3

Se si è pronti ad aggiungere una dipendenza a ogni destinazione, è possibile rendere gli avvisi in errore.

Ecco un make file con un errore in esso ("SRCS" invece di "SRC"):

# Turn on the warning we want 
MAKEFLAGS += --warn-undefined-variables 

# Make sure MAKECMDGOALS is defined, so it doesn't cause an error itself 
ifndef MAKECMDGOALS 
MAKECMDGOALS = all 
endif 

SRC=hello.c 

all: compile 

# Fails if the Makefile contains any warnings. 
# Run this Makefile with the same goals, but with the -n flag. 
# Grep for warnings, and fail if any are found. 
no-make-warnings: 
    ! make -n $(MAKECMDGOALS) 2>&1 >/dev/null | grep warning 

# Targets you want to check must depend on no-make-warnings 
compile: no-make-warnings 
    gcc -o hello $(SRCS) 

quando l'eseguo, vedo questo:

$ make 
! make -n all 2>&1 >/dev/null | grep warning 
Makefile:17: warning: undefined variable `SRCS' 
make: *** [no-make-warnings] Error 1 

Basta è necessario rendere ogni target che si desidera controllare dipende dal target no-make-warnings.

Se qualcuno sa come farlo automaticamente, si prega di inserire.