Makefile依赖文件未变更仍执行make编译命令问题排查
问题原因
你的Makefile存在两处错误逻辑,导致每次执行make都会重新编译:
- 生成
Unix.zwc的命令被绑定到了all目标下,而非Unix.zwc目标本身。 all作为默认执行的目标,没有对应生成名为all的实际文件,make每次都会判定all需要重新构建,连带执行你写在all下的编译命令,完全不会判断Unix.zwc是否已经是最新版本。
修正后的写法
# 声明all为伪目标,避免和目录下的同名文件冲突 .PHONY: all all: Unix.zwc # Unix.zwc的依赖为Unix目录下所有文件,编译命令直接归属该目标 Unix.zwc: Unix/* zsh -c 'zcompile -Uz Unix.zwc Unix/*'
逻辑说明
修正后make的执行逻辑会变成:
- 默认执行
all目标,all仅依赖Unix.zwc,本身没有执行命令 - make会检查
Unix.zwc的最后修改时间是否晚于所有Unix/*文件的修改时间 - 只要有一个
Unix/下的文件比Unix.zwc新,才会执行Unix.zwc目标下的编译命令,否则直接跳过
内容的提问来源于stack exchange,提问作者Martin Vegter
相关产品推荐
相关产品推荐

