一个棘手的GNU问题

时间:2011-08-12 04:27:38

标签: sqlite dependencies makefile gnu-make

这是我想要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中解决,还是我不得不求助于使用脚本?

提前致谢!

1 个答案:

答案 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规则将首先运行。