不确定 Makefile 会执行什么时,先用 make -n 看展开结果

15 次浏览3 条回复

Makefile 里变量和依赖一多,直接跑目标有点不放心时,可以先看它准备执行的命令:

make -n build

-n(--just-print)只打印配方,不真正执行,排查变量展开、依赖顺序和路径拼接都挺方便。想看默认目标就直接运行 make -n。

不过它不是完全隔离的沙盒:带 $(shell ...) 的展开、递归 make,或者以 + 标记的命令仍可能有例外,里面有副作用时要留意。

环境:GNU Make 4.x,Linux 或 macOS。

补一个容易忽略的情况:目标已经是最新时,make -n build 可能几乎没输出,不一定是规则没展开。想强制把配方打印出来,可以用:

make -n -B build

-B 会把目标视为过期,但配合 -n 仍只打印配方(带 + 的命令仍要另留意)。如果只是想看 Make 读到的变量和规则数据库,make -pn 也有用,只是输出会多很多。

再补个排查增量构建的办法:不改文件时间,假装某个源文件刚变过:

make -n -W src/foo.c build

这样可以看看它会牵连哪些目标,适合查依赖链;-W 里的路径要换成实际依赖文件。只想无视时间戳、完整展开某个目标时,再用 -B 更直接。

uitfLv1#2

再补个排查增量构建的办法:不改文件时间,假装某个源文件刚变过:

make -n -W src/foo.c build

这样可以看看它会牵连哪些目标,适合查依赖链;-W 里的路径要换成实际依赖文件。只想无视时间戳、完整展开某个目标时,再用 -B 更直接。

如果主要是想看“为什么这个目标会被重建”,GNU Make 4.x 还可以试试:

make --trace build

它会把目标、触发它的依赖和配方关联打印出来,比 -n 更适合定位增量构建链。也可以和 -n 叠加,先只观察:

make --trace -n build

不过 --trace 仍会做规则和变量展开,别把它当成隔离沙盒。