使用Makefile复制修改文件时提示“Nothing to be done”问题排查
问题原因与解决方法
依赖路径错误(最可能原因)
你的Makefile中,目标www/bar.html的依赖被定义为src/$@,展开后是src/www/bar.html。如果你的源文件实际放在src/根目录下(即src/bar.html),而非src/www/子目录,这个路径就完全错误了——Make找不到正确的依赖文件,自然不会触发更新。
修正方法是使用静态模式规则,提取目标的文件名部分匹配源文件:
FILES = www/foo.html www/bar.html www/zap.php all: $(FILES) # 静态模式规则:匹配www/xxx,依赖对应src/xxx $(FILES): www/%: src/% cp $< $@ clean: rm $(FILES)
这里www/%匹配所有目标路径,src/%对应源文件路径,$<代表第一个依赖文件(即正确的源文件路径)。
源文件时间戳未更新
如果你修改了src/www/bar.html但文件的时间戳没有同步更新(比如某些编辑器保存逻辑、文件系统时间异常),Make会对比目标文件www/bar.html和依赖文件的时间戳,发现依赖并未比目标“更新”,因此判定无需操作。
可以手动更新源文件时间戳验证:
touch src/www/bar.html make
如果此时Make执行了复制,说明问题出在时间戳上。
命令行缩进不符合要求
Make强制要求规则中的命令行必须用**制表符(Tab)**缩进,不能用空格。如果你的cp src/$@ $@行用的是空格缩进,Make会忽略这条命令,导致即使依赖更新也不会执行复制操作。检查复制命令的缩进是否为制表符即可。
内容的提问来源于stack exchange,提问作者squarewav
相关产品推荐
相关产品推荐

