2012-06-02 14 views
5
  1. Czy można traktować ostrzeżenia jako błędy w Makfile (a więc wyjścia przed wpływami Makefile)Jak traktować ostrzeżenie jako błąd w pliku Makefile?

  2. Ponadto możliwe jest odfiltrowanie który daje ostrzeżenie błąd?

Mój przypadek użycia: Chcę używać --warn-undefined-variables w połączeniu z tym tak, że Makefile wyjdzie gdy zmienna nie jest zdefiniowana, co jest bardzo częstym źródłem błędu. Oczywiście nie chcę ręcznie sprawdzać każdej zmiennej, ponieważ jest to podatne na błędy/żmudne. Nie mogłem nic na ten temat znaleźć, ale jest to dość ważna/podstawowa funkcja.

Uwaga: Nie szukam -Werror, która jest specyficzna dla gcc, nie dotyczy mojego przypadku użycia.

+1

Witamy w StackOverflow. Projekt jest tutaj "jedno pytanie na post", więc może być jasna odpowiedź. Wiele pytań oznacza, że ​​więcej niż jedna odpowiedź może być poprawna (odpowiadam na pytanie 1, ktoś inny odpowiada na pytanie 2) i nie można wybrać jednej odpowiedzi jako zaakceptowanej. Zapoznaj się z [FAQ] (http://stackoverflow.com/faq), aby lepiej poznać sposób działania SO. Dzięki. –

+2

To wydaje mi się rozsądnym pytaniem. Niestety, podejrzewam, że odpowiedź brzmi: 1) nie, 2) dyskusja i 3) trudne. – Beta

+0

To zależy, co masz na myśli przez "niezdefiniowaną zmienną", ale zmienne bez wartości ('VAR =') mogą być dość ważne (wszystko oprócz błędu). Częściej spotykam nieużywane zmienne; jest to definicja, która była kiedyś (prawdopodobnie) użyta w pliku makefile, ale już jej nie ma. –

Odpowiedz

2

Wersja standardowa make nie obsługuje tego, czego szukasz. Jednak nie powinno być trudno zbudować własną wersję make, aby wypełnić swój przypadek użycia.

Patrząc na kodzie źródłowym uczynić 3,82, sprawdź makro warn_undefined w 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) 

nie próbowałem tego, ale myślę, że powinno być wystarczające, aby zastąpić error z fatal.

3

Jeśli chcesz dodać zależność do każdego celu, możesz ustawić ostrzeżenia w błędach.

Oto plik make z błędem w nim ("SRCS" zamiast "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) 

Gdy go widzę, to:

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

po prostu musisz sprawić, aby każdy cel, który chcesz sprawdzić, zależał od celu: no-make-warnings.

Jeśli ktoś wie, jak to zrobić automatycznie, należy zadzwonić.

Powiązane problemy