一个棘手的GNU问题

spl*_*cer 2 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
Run Code Online (Sandbox Code Playgroud)

在上面的伪代码中,A是一个SQLite数据库,B是一个C头文件,"大文件集"中的每个文件都是一个C源文件.

基本上,如果我只修改其中一个C源文件,我只希望快速更新数据库,而不是从头开始重建整个数据库.

这种类型的问题是否可以直接在GNU make中解决,还是我不得不求助于使用脚本?

提前致谢!

zwo*_*wol 7

这样的事情应该有效:

A:: B
        -rm -f $@
        create_A $@

A:: $(all_X)
        update_A_from_Xes $@ $?
Run Code Online (Sandbox Code Playgroud)

$?扩展到$(all_X)比A更新的子集(有关更多详细信息,参阅GNU Make手册的" 自动变量"部分.)因此,必须更新其关于所有后续参数的第一个参数;它只会被调用一次.update_A_from_Xes

双冒号告诉作出这样的命令来运行更新是不同的,当它是过时的,相对于B时相比,这是过时的关于XES.我不确定这两组命令是否会在两者都过时的情况下运行; 如果它们都运行,A:: B规则将首先运行.