Сложная проблема с GNU make - PullRequest
       24

Сложная проблема с GNU make

2 голосов
/ 12 августа 2011

Вот некоторый псевдокод для того, что я хочу, чтобы мой make-файл делал:

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 Ответ

7 голосов
/ 12 августа 2011

Примерно так должно работать:

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

A:: $(all_X)
        update_A_from_Xes $@ $?

$? расширяется до подмножества $(all_X), которое новее, чем A (см. Раздел « Автоматические переменные » в GNU Создать руководство для получения более подробной информации. Поэтому update_A_from_Xes должен обновить свой первый аргумент относительно всех последующих аргументов, он будет вызван только один раз.

двойное двоеточие говорит Make, что команды, запускаемые для обновления A, отличаются, когда он устарел по отношению к B, чем когда он устарел по отношению к X. Я не уверен, что обанаборы команд будут запущены в случае, если они устарели по отношению к обоим, если они оба запустятся, сначала запустятся правила A:: B.

...