Make编译时如何强制Shell打印每条命令的当前工作目录?
解决Make静默模式下跟踪编译目录与命令的问题
问题背景
我需要收集项目编译所用的全部优化标志,计划通过完整编译项目并解析编译日志实现。项目采用Make编译,但900个Makefile没有统一规范,各种静默用法导致日志收集困难:
- 直接使用
make -s或子Make调用$(MAKE) -s - Makefile中设置
MAKEFLAGS += -s - 命令行首加
@抑制输出 - 单行多命令用
;分隔的复杂结构
当前方案的局限
目前使用命令:
make SHELL="/bin/bash -x" | grep -E "Entering|Leaving" 2> log.txt
该命令能获取展开变量后的完整命令列表,且每条命令单独成行,便于解析。但存在关键问题:子Make以静默模式执行时,Make自带的Entering/Leaving目录切换消息不会输出,导致无法跟踪当前子目录,无法按模块归类编译命令。
解决方案:通过Bash的PS4提示符添加当前目录
无需修改任何Makefile,只需在调用Make时设置Bash的PS4环境变量,让bash -x输出的每条命令前自动带上当前工作目录:
具体命令
PS4='+ $(pwd): ' make SHELL="/bin/bash -x" 2>&1 | grep -E "Entering|Leaving|^\+ " > log.txt
原理说明
PS4是Bash开启-x模式时的命令前缀提示符,默认值为+。将其修改为+ $(pwd):后,每条被bash -x追踪的命令前都会自动追加当前工作目录。- 该输出不受Make的
-s参数或@前缀影响,因为这是Bash层面的输出控制,完全绕过了Make的静默机制。 2>&1将Bash的stderr输出(即-x的命令日志)与Make的stdout输出(Entering/Leaving消息)合并,再通过grep过滤出有用内容,最终写入日志文件。
效果
日志中会同时包含:
- Make输出的
Entering directory/Leaving directory消息(用于确认目录切换) - 带当前目录前缀的编译命令(如
+ /home/user/project/src: gcc -O2 -c main.c),方便按目录模块归类解析优化标志。
内容的提问来源于stack exchange,提问作者ABu
相关产品推荐
相关产品推荐

