2015-06-22 3 views
2

Я работаю над Makefile со сменными источниками и компилятором.Условный Makefile

В принципе, я хочу, чтобы это отображалось сообщение зеленым, если компиляция хорошо выработана и в противном случае в противном случае. Кроме того, я хочу избежать отображения обычных сообщений об ошибках (и сообщений компиляции), которые создает Makefile. (Как я пытался делать со всеми «@»)

Вот что у меня есть сейчас:

COMP = gcc 

NAME = test 

RM  = rm -f 

SRC  = main.c 

OBJS = $(SRC:.c=.o) 

CFLAGS = -Werror 

all: $(NAME) 

$(NAME): 
     @$(COMP) -c $(SRC) 
     @$(COMP) -o $(NAME) $(OBJS) 

ifeq ($?, 0) 
     @echo -e '\033[1;32;40mCompilation : OK\033[0m' 
else 
     @echo -e '\033[1;31;40mCompilation : ERROR\033[0m' 
endif 

clean: 
     @$(RM) $(OBJS) 

fclean: clean 
    @$(RM) $(NAME) 

re: fclean all 

.PHONY: all clean fclean re 

Все это делает дисплей «Компиляция: ERROR», когда он компилирует хорошо, но я подумал, что если $? равно 0, это означало, что это сработало, поэтому я не могу найти никаких объяснений.

Вы знаете, как сделать так, чтобы я сделал то, что искал?

Большое спасибо.

EDIT: Замечательная помощь от многих из вас, я все еще ищу рецепт, но я нашел способ просто отображать, когда это удалось, и когда это не удалось.

$(NAME): $(OBJS) 
     @$(COMP) $(OBJS) -o $(NAME) && echo -e "\033[32mCompilation: OK\033[0m" || echo -e "\033[31mCompilation: ERROR\033[0m" 

Я буду продолжать копать, спасибо.

+0

Вы пытаетесь смешать bash и сделать. В вашем примере оператор ifeq разрешен во время чтения make-файла (не после того, как был запущен предыдущий рецепт), так что $? не имеет смысла. Вы, вероятно, должны сделать это из конкатенированного рецепта. – John

+1

Как правило, очень плохая идея удалить ошибку из вывода make. Существует множество редакторов, которые анализируют вывод компилятора для отслеживания их для последующего руководства пользователя. vim фиксирует этот вывод, и вы можете перейти от ошибки к ошибке в редакторе. Удаление этой функции делает процесс сборки черной дырой! – Klaus

+0

Насколько интересен ха-ха, спасибо за ввод, я считаю, что нашел способ отобразить сообщение об ошибке, не касаясь этих ошибок. – Christopher

ответ

2

$? - это переменная оболочки, не являющаяся переменной make, вы проверяете переменную make с этим оператором if, а рецепт для вашей цели имеет только одну линию echo.

(См вывода make -qp чтобы увидеть, что я имею в виду.)

Чтобы сделать то, что вы хотите, вам нужен будет тест оболочки на $? однако понимают, что делает выйдут на первую неисправную команде, так что вы будете never этот выход эхо-сигнала отката (если вы не улавливаете/скрываете отказ от make с помощью if или аналогичной конструкции в команде компиляции).

Что-то вроде этого будет работать для захвата/скрытия статуса выхода из компиляции из make, но позволит вам использовать его.

@if $(COMP) -c $(SRC); then \ 
    echo -e '\033[1;32;40mCompilation : OK\033[0m'; \ 
else \ 
    _ret=$$?; \ 
    echo -e '\033[1;31;40mCompilation : ERROR\033[0m'; \ 
    exit $$_ret;\ 
fi 

Бит с _ret должен иметь грим выход с кодом выхода компиляции, а не статический exit 1 или любой другой.

+0

Я вижу, как вы сказали, нет прямого способа отобразить ошибку с личным сообщением. Но я заинтригован, не могу ли я просто отобразить красную «Компиляцию: ОШИБКА» перед выходом? Вы говорили о захвате/скрытии неудачи, не могли бы вы дать мне некоторую точность по этому поводу? Большое спасибо за вашу помощь. – Christopher

+0

Вы можете сделать это с помощью или командой ... Я напишу resopnse ... – John

+0

Вы абсолютно можете отобразить любое сообщение об ошибке, которое вы хотите, просто убедитесь, что make не видит сбоя, прежде чем вы это сделаете. –

1

То, что вы хотите что-то вроде этого:

$(NAME): 
    @$(COMP) -c $(SRC) 
    @$(COMP) -o $(NAME) $(OBJS); \ 
    if [ $$? == 0 ]; then \ 
     echo -e '\033[1;32;40mCompilation : OK\033[0m'; \ 
    else \ 
     echo -e '\033[1;31;40mCompilation : ERROR\033[0m'; \ 
    fi; \ 
    true 

Обратите внимание, что я использовал «\», чтобы concatinate команду оргии с, если заявление, так что все они выглядят как единый рецепт. Я также добавил к концу истинного утверждения, что независимо от того, что возвращает оператор if, конкатенированный рецепт вернет true, и make не будет терпеть неудачу. Вы также можете сделать:

$(NAME): 
     @$(COMP) -o $(NAME) $(OBJS) || echo .... 

, где эхо будет печататься только в том случае, если предыдущая команда не удалась.

+0

Интересно, новизна ко всему этому помогает много, и спасибо за точное объяснение. Я попробовал это, заменив мой текущий $ (NAME) первым, который вы предложили, но он, похоже, не подходит. «@» И «если», похоже, не распознаются. Большое спасибо за вашу помощь. – Christopher

+0

oops, да '@' является файлом makefile и не может быть добавлен в рецепт. Я отредактирую ответ ... – John

+0

Итак, где же должен идти этот кусок скрипта? Не прямо в Makefile? Я не уверен, что понял. – Christopher

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