我正在使用可变源和编译器的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
当它编译得很好时它只显示“编译:错误”,但我认为如果$?
等于0意味着它已经解决了,所以我找不到任何解释。
你知道如何让它做我正在寻找的东西吗?
非常感谢。
编辑:很多人的精彩帮助,我仍在调查食谱,但我找到了一种方法,可以在成功时和失败时简单显示。$(NAME): $(OBJS)
@$(COMP) $(OBJS) -o $(NAME) && echo -e "\033[32mCompilation: OK\033[0m" || echo -e "\033[31mCompilation: ERROR\033[0m"
我会继续挖掘,谢谢。
答案 0 :(得分:2)
$?
是一个shell变量而不是make变量,您正在使用该if
语句测试一个make变量,并且目标的配方只有一个echo
行
(请参阅make -qp
的输出,看看我的意思。)
要做你想做的事,你需要在$?
上进行 shell 测试但是要意识到make会在第一个失败的命令上退出,所以你永远不会看到故障echo以这种方式输出(除非你在编译命令中使用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
或其他。
答案 1 :(得分: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
请注意,我使用了' \'使用if语句将bash命令连接起来,因此它们都显示为单个配方。我还在最后添加了一个真实的语句,这样无论if语句返回什么,连接的配方都将返回true,make不会失败。你也可以这样做:
$(NAME):
@$(COMP) -o $(NAME) $(OBJS) || echo ....
只有在前一个命令失败时才会打印回显。