Makefile如何实现需手动编辑文件的依赖校验与构建中断逻辑
你可以按照以下方式修改Makefile实现需求:
修改后的完整Makefile
SOURCE = source AUTO = auto MANUAL = manual RESULT = result # 最终产物依赖auto,保证执行构建逻辑前auto已经更新到最新版本 $(RESULT): $(AUTO) # 检查manual文件是否存在 @if [ ! -f $(MANUAL) ]; then \ echo "错误:未找到$(MANUAL)文件,请基于最新生成的$(AUTO)修改后保存为$(MANUAL),再重新执行make"; \ exit 1; \ fi # 检查manual是否比source或auto旧 @if [ $(MANUAL) -ot $(SOURCE) ] || [ $(MANUAL) -ot $(AUTO) ]; then \ echo "错误:$(MANUAL)已过时,请基于最新的$(AUTO)更新后再重新执行make"; \ exit 1; \ fi # 所有检查通过后生成最终产物 cp $(MANUAL) $(RESULT) # auto的原有构建规则保留 $(AUTO): $(SOURCE) cp $(SOURCE) $(AUTO) # 可选的清理规则 .PHONY: clean clean: rm -f $(AUTO) $(RESULT)
实现逻辑说明
- 调整
result的依赖为仅auto,保证运行构建逻辑前,auto已经基于最新的source构建完成,符合要求的自动构建auto的前置逻辑 - 删除原有的
manual构建规则,避免make自动生成/修改manual文件,保证该文件只能由用户手动编辑 - 在
result的构建配方中加入两层校验:- 第一层校验
manual是否存在,不存在直接打印提示终止构建 - 第二层用shell的
-ot判断参数,检查manual的修改时间是否早于source或者auto,过时就打印提示终止构建
- 第一层校验
- 所有校验通过后才会执行最终的
result生成操作
场景验证
- 首次执行
make:会自动构建auto,然后提示找不到manual终止,用户基于auto修改保存为manual后重新执行即可正常构建 - 修改
source后执行make:会自动重新构建auto,然后检测到manual过时提示更新,用户修改manual后重新执行即可正常构建 manual为最新版本时执行make:跳过所有提示,直接生成result
内容的提问来源于stack exchange,提问作者Konstantin Morenko
相关产品推荐
相关产品推荐

