【问题标题】:Makefile error message customMakefile 错误信息自定义
【发布时间】:2015-06-22 12:37:19
【问题描述】:

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

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

到“Makefile 代码”

事实上,我想做这样的事情: 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

谢谢 祝你有美好的一天

【问题讨论】:

  • "if" 是测试 echo 的状态,这个永远是真的。
  • 我删除了 if 以免混淆,因为它不是主要问题。我需要在顶部转换 bash
  • 对不起,我更新了...

标签: bash error-handling makefile


【解决方案1】:

在目标失败时停止,您不会比失败的编译更进一步,因此您将看不到任何其他内容。

如果您希望稍微“静音”编译(因此您看不到编译命令本身),您可以考虑使用我的 silent make rules makefile 之类的东西(基于最近的自动工具中的静音支持)。

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

如果您确实想要在原始链接中执行类似操作,那么您需要确保将来自 gcc 的错误代码返回隐藏在 if 或类似名称中(并捕获它) 然后在配方结束时再次退出,以便 make 仍然正确停止。

【讨论】:

  • @user3409642 我还没有为此写任何介绍/帮助,如果您无法弄清楚,请随时询问或提出问题或其他内容。
【解决方案2】:

只要发生错误,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

【讨论】:

  • 是的,谢谢你的回答。所以你认为在makefile中做上面链接中的事情是不可能的?
  • 您可以从 makefile 中获取整个编译过程,然后它会调用该脚本。
  • @EtanReisner 这是我之前实验的残余,现在已经被移除了。
  • @user3409642 我想我现在明白了。
  • 是的,我不喜欢 tmp 文件。但我也是这样结束的
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 2017-01-28
    • 2021-02-10
    • 2017-08-22
    • 2016-03-31
    • 2018-03-03
    相关资源
    最近更新 更多