编译时如何更改 makefile 诊断消息 [GNU ARM GCC, Eclipse make.exe]

Posted

技术标签:

【中文标题】编译时如何更改 makefile 诊断消息 [GNU ARM GCC, Eclipse make.exe]【英文标题】:How to change makefile diagnostic message when compiling [ GNU ARM GCC, Eclipse make.exe] 【发布时间】:2021-01-26 15:03:52 【问题描述】:

我正在通过使用GNU-ARM-Gcc 和 Eclipse_make.exe 构建项目来构建 STM32F4 程序。一切正常,但编译时终端上显示的诊断消息太长而且很难看到。当每个 *.c 文件被编译时,终端会给我一个诊断消息(见下面的段落)任何人都可以给我建议,只显示一个文件名 [删除 gcc 目录路径、依赖项、头文件路径]。 makefile 由 CubeMX 生成。这是makefile:https://github.com/loiefy/STM32-makefile/blob/main/Makefile

示例诊断消息:

C:/Program Files (x86)/GNU Arm Embedded Toolchain/9 2020-q2-update/bin/arm-none-eabi-gcc -c -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -DUSE_HAL_DRIVER -DSTM32F407xx -IEngine/Src/website_c -IEngine/Inc -ILWIP/Target -IMiddlewares/Third_Party/LwIP/src/include -IMiddlewares/Third_Party/LwIP/system -IDrivers/STM32F4xx_HAL_Driver/Inc -IDrivers/STM32F4xx_HAL_Driver/Inc/Legacy -IMiddlewares/Third_Party/LwIP/src/include/netif/ppp -IMiddlewares/Third_Party/LwIP/src/apps/httpd -IDrivers/CMSIS/Device/ST/STM32F4xx/Include -IMiddlewares/Third_Party/LwIP/src/include/lwip -IMiddlewares/Third_Party/LwIP/src/include/lwip/apps -IMiddlewares/Third_Party/LwIP/src/include/lwip/priv -IMiddlewares/Third_Party/LwIP/src/include/lwip/prot -IMiddlewares/Third_Party/LwIP/src/include/netif -IMiddlewares/Third_Party/LwIP/src/include/posix -IMiddlewares/Third_Party/LwIP/src/include/posix/sys -IMiddlewares/Third_Party/LwIP/system/arch -IDrivers/CMSIS/Include -IDrivers/CMSIS/Include -IEngine/Inc -ILWIP/Target  -Og -Wall -fdata-sections -ffunction-sections -fdiagnostics-show-location=every-line -g -gdwarf-2 -MMD -MP -MF"build/mqtt.d"  -Wa,-a,-ad,-alms=build/mqtt.lst Middlewares/Third_Party/LwIP/src/apps/mqtt/mqtt.c -o build/mqtt.o

我要显示的消息:Middlewares/Third_Party/LwIP/src/apps/mqtt/mqtt.c 已编译 我花了一天时间寻找 echo 命令或另一个具有相同目的的命令来显示 makefile 中的消息。但我什么也没找到。 谢谢你的帮助

【问题讨论】:

【参考方案1】:

因此,默认情况下会回显它运行的每一行 - makefile 中的编译器行:

$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) 
    $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@

将输出执行行你可以做的是:

$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) 
    @echo "compiling $<"
    @$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@

注意:make 中的@ 前缀表示不打印正在执行的命令。因此,即使 echo 行也需要 @ 否则你会得到 echo comping...compiling ... 被打印出来

您可能希望也可能不希望对所有输出执行类似操作。我有时会根据可以传入的详细程度标志有条件地做一个或另一个,这样当你真的想查看实际的编译行时,你可以....

【讨论】:

硬编码@ 可能会出现问题,因为它可以隐藏非常重要的信息,然后您必须编辑您的makefile 才能查看输出。您可能会从这里获得一些想法:make.mad-scientist.net/managing-recipe-echoing @MadScientist 这就是为什么我还建议他们可能希望有条件地使其冗长。有多种方法可以实现这一点 - 但我喜欢你链接中详细目标的风格,它很整洁:) .. 虽然我个人更喜欢利用 make 的制表符完成的方式,但你可以看到所有可用的选项(它不过有点不合时宜)。 我切换到 cmake & ninja

以上是关于编译时如何更改 makefile 诊断消息 [GNU ARM GCC, Eclipse make.exe]的主要内容,如果未能解决你的问题,请参考以下文章

项目构建工具CMake、GYP、GN

鸿蒙源码构建工具Gn 与 Ninja 的介绍及使用入门

如何修改makefile以将更改的源编译到对象目录中,文件列表除外

用于在头文件更改时构建简单 c 项目重新编译的示例 makefile

Makefile不会在头文件更改时重新编译

[openharmony]liteos-a编译过程分析