我有一个生成器程序,可以创建两个版本文件,例如ver.h
和ver.cpp
。我最终的构建目标取决于这两个文件,而构建这两个文件的规则是一个程序。如果我这样做:
build : ver.h ver.cpp
ver.h ver.cpp :
./gen/version/program
则并行构建可能会运行program
两次,这虽然不错,但也不过分。我想我可以让它们都依赖于假目标:
ver.h ver.cpp : do-version-impl
do-version-impl:
./gen/version/program
.PHONY : do-version-impl
这是最好的方法吗?必须引入一个假音规则来做到这一点,这听起来有点可笑。
使用假目标作为前提是一个坏主意。program
即使ver.*
文件存在也将运行,这是一个误报错误。
更巧妙的是,仅当GNU Make文件是配方规则的目标时,才保证更新它的文件时间戳。因此,即使program
始终运行,依赖于ver.*
文件的所有内容也可能根本无法更新!
我认为最好不要为每个目标组成不自然的模式,而要明确:
您正在生成一个“主”文件,即ver.cpp
。;
对另一种使用“无操作”配方,可以将其放在同一行上,如下所示:
ver.h: ver.cpp ;
ver.cpp: Makefile
./gen/version/program
该方法从您编写的内容开始,但增加了非常重要的;
。
如果您没有“主”文件的自然候选人,那么我认为最好使用“前哨”:
ver.h ver.cpp: sentinel ;
sentinel: Makefile
./gen/version/program
touch $@
同样,此方法与您的方法之一相似,但非常重要的是,它不使用假音,而是使用真实文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句