这是我想要makefile做的一些伪代码:
if (A doesn't exist) or (B is newer than A):
rm -rf A
create an empty A
parallel_for X in (a large set of files):
if (X is newer than A):
update A using the contents of X
在上面的伪代码中,A
是一个SQLite数据库,B
是一个C头文件,“大型文件集”中的每个文件都是一个C源文件。
基本上,如果我只修改其中一个C源文件,我只想快速更新数据库,而不是从头开始重建整个数据库。
这种问题是否可以直接在GNU make中解决,还是我不得不求助于使用脚本?
提前致谢!
答案 0 :(得分:7)
这样的事情应该有效:
A:: B
-rm -f $@
create_A $@
A:: $(all_X)
update_A_from_Xes $@ $?
$?
扩展为比{A}更新的$(all_X)
子集(有关更多详细信息,请参阅Automatic Variables的“GNU Make manual部分。”因此,{{1}必须根据后续参数的 all 更新其第一个参数;它只会被调用一次。
double colons告诉要使更新A运行的命令与B相比过时不同,而不是相对于Xes过时。我不确定这两组命令是否会在两者都过时的情况下运行;如果它们都运行,update_A_from_Xes
规则将首先运行。