Makefile错误消息自定义

时间:2015-06-22 12:37:20

标签: bash error-handling makefile

我对makefile有些问题。 我只想测试src / launcher.c上的编译是否失败。 但在此之前,我无法转换此bash代码:

out=$(gcc -c src/launcher.c -o /obj/launcher.o 2>&1)

到“Makefile code”

事实上,我想做出类似的东西: Handling gcc warnings and output in a Bash Script 但是在makefile中

如果你有一些想法,请。

CC      = clang
RM      = rm -f

NAME        = automakefile

CFLAGS      += -Wall -Wextra
CFLAGS      += -O2 -march=native -fomit-frame-pointer

LDFLAGS     +=

OBJS_DIR    = ./obj/
SRCS_DIR    = ./src/

INCLUDES    += -I ./src/include

OBJS_FILES  = launcher.o

OBJS        = $(foreach obj,$(OBJS_FILES),$(OBJS_DIR)$(obj))

all: script $(NAME)

script:
    @if [ ! -d "$(OBJS_DIR)" ]; then    \
        mkdir $(OBJS_DIR);      \
    fi

$(NAME): $(OBJS)
    $(CC) $(CFLAGS) $(OBJS) -o $(NAME) $(LDFLAGS)

$(OBJS_DIR)%.o: $(SRCS_DIR)%.c
    //This line isn't working!
    $(eval TMP=$$(gcc -c src/launcher.c -o obj/launcher.o 2>&1))
    echo $(TMP)

clean:
    $(RM) $(OBJS)

fclean: clean
    $(RM) $(NAME)

re: fclean all

.Phony: all script clean fclean re

由于 祝你有愉快的一天

3 个答案:

答案 0 :(得分:1)

Make会在发生错误时自动停止编译过程,但是如果出现警告或没有发生任何不良事件,您可以使用消息:

$(OBJS_DIR)%.o: $(SRCS_DIR)%.c
    @$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $< &>output
    @if grep "warning" output >/dev/null ; then echo "$(<F) Warning" ; else echo "$(<F) OK" ; fi
    @$(RM) output

你走了:

$(OBJS_DIR)%.o: $(SRCS_DIR)%.c
    @if $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $< &>output; then \
        if grep "warning" output >/dev/null; then              \
            echo "$(<F) Warning(s)";                           \
        else                                                   \
            echo "$(<F) OK";                                   \
        fi;                                                    \
    else                                                       \
        echo "$(<F) Error(s)";                                 \
    fi
    @$(RM) output

答案 1 :(得分:1)

停止目标失败,你不会比失败的编辑更进一步,所以你不会看到任何其他东西。

如果您希望&#34;沉默&#34;有点编译(所以你不会看到编译命令本身)你可以考虑使用我的silent make rules makefile之类的东西(基于最近的autotools中的静默支持)。

它不会隐藏编译命令本身的输出(警告等),但是对于成功/无警告的编译,无论如何都不应该输出太多的输出以及您可能希望看到的失败/警告它

如果您 想要在原始链接中执行某些操作,那么您需要确保隐藏gccif或类似内容中的错误代码返回(然后捕捉它)然后在配方的末尾再次退出,这样make仍然可以正确停止。

答案 2 :(得分:0)

最后,我用了一个小技巧:

@$(CC) $(CFLAGS) -c $^ -o $@ $(INCLUDES) \
                && echo -e "\033[33;1m=== Compilation $@ \tSUCCEED===\033[0m"\
                || echo -e "\033[1;31m=== Compilation $@ \tFAILED===\033[0m"