GNU Make规则问题:目标未更新仍复制文件如何修复?
修复Makefile的执行逻辑问题
你的问题出在move规则的定义上:当前move是一个没有实际目标文件的规则,Make会默认将其视为需要每次都执行的伪目标,哪怕generated/effect.cpp没有更新。要实现仅当源文件更新时才复制的逻辑,需要把规则目标明确设为src/effect.cpp,让Make通过对比源文件和目标文件的时间戳来判断是否执行复制。
修改后的Makefile如下:
.PHONY: gen create gen: create src/effect.cpp create: cd generated && ./builder.sh build src/effect.cpp: generated/effect.cpp cp $< $@
关键修改点说明:
- 用
.PHONY: gen create标记gen和create为伪目标,确保每次执行make gen时都会运行create规则(不管是否存在同名文件)。 - 将原
move规则的目标替换为src/effect.cpp,让Make自动对比generated/effect.cpp(依赖)和src/effect.cpp(目标)的修改时间:只有当generated/effect.cpp的时间戳晚于src/effect.cpp时,才会执行cp命令。 $<是Make的自动变量,代表第一个依赖文件(即generated/effect.cpp);$@代表目标文件(即src/effect.cpp),用自动变量让规则更简洁通用。
这样修改后,每次执行make gen都会先运行builder.sh,然后只有当generated/effect.cpp确实更新时,才会复制到src目录。
内容的提问来源于stack exchange,提问作者assemberist
相关产品推荐
相关产品推荐

