【问题标题】:Makefile logging which stops at first error and display the errorMakefile 日志记录在第一个错误时停止并显示错误
【发布时间】:2017-07-30 17:16:55
【问题描述】:

我正在寻找一种在 makefile 中记录编译错误的方法,但这是我的问题:

不带日志功能的行如下:

$(OBJ_PATH)/%.obj: $(SRC_PATH_ASW)/%.c
    @echo -Compiling $<:
    $(CC) $(INCLUDE_ASW) $(INCLUDE_ASW_AUTO) $(INCLUDE_BSW) -c $< $(CFLAGS)

我尝试使用以下命令在日志文件中重定向标准错误和/或标准输出

$(OBJ_PATH)/%.obj: $(SRC_PATH_ASW)/%.c
    @echo -Compiling $<:
    $(CC) $(INCLUDE_ASW) $(INCLUDE_ASW_AUTO) $(INCLUDE_BSW) -c $< $(CFLAGS)  > $@.log

此解决方案不会将消息显示到终端,而只会显示在日志文件中。 (我尝试了所有可能的重定向但没有成功)

我也尝试过 tee 但问题不同,事实上 makefile 不会在第一次出错时停止,因为 tee 命令返回码总是成功的。

$(OBJ_PATH)/%.obj: $(SRC_PATH_ASW)/%.c
    @echo -Compiling $<:
    $(CC) $(INCLUDE_ASW) $(INCLUDE_ASW_AUTO) $(INCLUDE_BSW) -c $< $(CFLAGS) | tee $@.log

如果可能的话,我希望能够将编译结果记录到文件中并显示它,但是 makefile 在第一次编译错误时停止并且不会继续其他文件编译。

感谢您的支持。

【问题讨论】:

标签: c logging makefile


【解决方案1】:

您可以使用set -o pipefailPIPESTATUS[0]

set -o pipefail; $(CC) ... | tee file.log

如果$(CC) ...tee... 命令失败,将返回错误。或者,如果你只是这样做

$(CC) ... | tee file.log

那么${PIPESTATUS[0]}将是第一个命令的错误代码($(CC)...)(例如,您可以在行尾添加exit ${PIPESTATUS[0]}

【讨论】:

    【解决方案2】:

    我也经常想这样做,我想出的解决方案是创建这个简短的 shell 脚本和别名 make 来运行它。

    #!/bin/sh
    
    make $* | tee make.log
    

    【讨论】:

      猜你喜欢
      • 2012-09-26
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      相关资源
      最近更新 更多