条件Makefile

时间:2015-06-22 17:26:42

标签: 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

当它编译得很好时它只显示“编译:错误”,但我认为如果$?等于0意味着它已经解决了,所以我找不到任何解释。

你知道如何让它做我正在寻找的东西吗?

非常感谢。

编辑:很多人的精彩帮助,我仍在调查食谱,但我找到了一种方法,可以在成功时和失败时简单显示。

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

我会继续挖掘,谢谢。

2 个答案:

答案 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 ....

只有在前一个命令失败时才会打印回显。