2012-06-02 2 views
5
  1. Можно ли рассматривать предупреждения как ошибки в Makfile (и, следовательно, прежде чем Makefile выхода поступлений)Как обрабатывать предупреждение как ошибку в Makefile?

  2. Кроме того, можно отфильтровать, который дает предупреждение об ошибке?

Мой случай использования: Я хочу использовать --warn-undefined-variables в сочетании с этим так, что Makefile будет выходить, когда переменная не определена, что является очень распространенным источником ошибок. Очевидно, что я не хочу вручную проверять каждую переменную, поскольку она подвержена ошибкам/утомительна. Я ничего не мог найти на этом, но это довольно важная/основная функция.

Примечание: Я не ищу -Werror, который является специальной командой gcc, не применимой к моему прецеденту.

+1

Добро пожаловать в StackOverflow. Дизайн здесь «один вопрос за сообщение», поэтому может быть ясный ответ. Несколько вопросов означают, что более одного ответа может быть правильным (я отвечаю на вопрос 1, кто-то отвечает на вопрос 2), и невозможно выбрать один ответ в качестве принятого. Ознакомьтесь с [FAQ] (http://stackoverflow.com/faq), чтобы вы были более знакомы с тем, как работает SO. Благодарю. –

+2

Это кажется мне разумным вопросом. К сожалению, я подозреваю, что ответ 1) нет, 2) спорный и 3) жесткий. – Beta

+0

Это зависит от того, что вы подразумеваете под «неопределенной переменной», но переменные без значения ('VAR =') могут быть весьма важными (ничего, кроме ошибки). Я чаще встречаю неиспользуемые переменные; это определение, которое когда-то (предположительно) использовалось в make-файле, но больше не существует. –

ответ

2

Стандартная версия make не поддерживает то, что вы ищете. Тем не менее, нетрудно создать собственную версию make для выполнения вашего варианта использования.

Глядя на исходный код сделать 3.82, проверьте макро warn_undefined в 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) 

Я не пробовал это, но я думаю, что это должно быть достаточно, чтобы заменить error с fatal.

3

Если вы готовы добавить зависимость к каждой цели, вы можете вносить предупреждения в ошибки.

Вот сделайте файл с ошибкой в ​​нем ("SRCS" вместо "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) 

Когда я бегу, я вижу это:

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

Вы просто необходимо, чтобы каждая цель, которую вы хотите проверить, зависит от цели no-make-warnings.

Если кто-то знает, как это сделать автоматически, пожалуйста, звоните.

Смежные вопросы