Make工具:如何仅在目标文件不存在或指定参数时重建目标
解决Makefile仅在目标不存在或-B参数时重建的问题
你的需求很明确——因为构建步骤耗时极长,希望target.file只有在自身不存在,或者手动传入-B参数时才触发完整构建流程,忽略依赖的时间戳变化。下面是两种可靠的实现方式:
方法一:利用Make的无依赖目标特性
这种方法最贴合Make的原生逻辑,不需要额外的条件判断就能实现需求:
# 保留原有intermediate.file的构建规则 intermediate.file: base.file # 这里放生成intermediate.file的耗时命令,示例: # gcc -c base.file -o intermediate.file # 定义target.file的规则:无直接依赖 target.file: @if [ ! -f "$@" ]; then \ echo "Building $@..."; \ $(MAKE) intermediate.file; \ # 这里放生成target.file的耗时命令,示例: # gcc intermediate.file -o target.file; \ else \ echo "$@ already exists, skipping build."; \ fi
原理说明:
- Make默认会认为存在且无依赖的目标是最新的,所以只要
target.file存在,就不会执行它的规则命令。 - 当
target.file不存在时,Make会执行规则内的命令,先递归构建intermediate.file,再生成目标文件。 - 传入
-B参数时,Make会强制执行所有规则,无论目标是否存在,满足你强制重建的需求。
方法二:使用FORCE目标配合条件判断
如果你需要更显式的控制,可以用FORCE目标触发规则执行,再通过shell判断是否跳过构建:
intermediate.file: base.file # 生成intermediate.file的耗时命令 target.file: FORCE @if [ -f "$@" ]; then \ echo "$@ exists, skipping rebuild."; \ else \ echo "Building $@ from scratch..."; \ $(MAKE) intermediate.file; \ # 生成target.file的耗时命令; \ fi # 定义FORCE伪目标,确保每次make都会进入target.file的规则 .PHONY: FORCE
原理说明:
.PHONY: FORCE标记FORCE为伪目标,Make每次都会认为它需要更新,从而触发target.file的规则执行。- 规则内的shell判断会检查
target.file是否存在,存在则跳过构建,不存在则执行完整流程。 - 传入
-B参数时,同样会强制执行所有步骤,包括重新构建intermediate.file和target.file。
注意事项
- 如果你需要确保
intermediate.file在强制重建时也被更新,两种方法都通过$(MAKE) intermediate.file触发了它的规则,-B参数会传递给递归调用的Make,所以会强制重建所有依赖。 - 避免直接把
intermediate.file作为target.file的依赖——否则只要intermediate.file更新,Make就会自动重建target.file,不符合你的需求。
内容的提问来源于stack exchange,提问作者LDericher
相关产品推荐
相关产品推荐

