Here’s some pseudocode for what I want my makefile to do:
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
In the above pseudocode, A is an SQLite database, B is a C header file, and each of the files in the “large set of files” is a C source file.
Basically, if I only modify one of the C source files, I just want the database to be quickly updated rather than rebuilding the entire database from scratch.
Is this type of problem solvable directly in GNU make, or am I going to have to resort to using a script?
Thanks in advance!
Something like this ought to work:
$?expands to the subset of$(all_X)that are newer than A (see the “Automatic Variables section of the GNU Make manual for more details). Therefore,update_A_from_Xesmust update its first argument with respect to all of the subsequent arguments; it will only be invoked once.The double colons tell Make that the commands to run to update A are different when it’s out of date with respect to B than when it’s out of date with respect to the Xes. I am not sure whether both sets of commands will get run in the case that it is out of date with respect to both; if they do both get run, the
A:: Brules will get run first.