Правило Make-файла GNU, генерирующее несколько целей от единственного исходного файла

Я пытаюсь сделать следующее. Существует программа, назовите ее foo-bin, это берет в единственном входном файле и генерирует два выходных файла. Немое правило Make-файла для этого было бы:

file-a.out file-b.out: input.in
    foo-bin input.in file-a.out file-b.out

Однако это не говорит make всегда то, что обе цели будут сгенерированы одновременно. Это прекрасно при выполнении make в сериале, но вероятно доставит неприятности, если Вы попробуете make -j16 или что-то одинаково сумасшедшее.

Вопрос состоит в том, существует ли там способ записать надлежащее правило Make-файла для такого случая? Очевидно, это генерировало бы DAG, но так или иначе GNU делает руководство, не указывает, как этот случай мог быть обработан.

Выполнение того же кода дважды и генерация только одного результата вне рассмотрения, потому что вычисление занимает время (думайте: часы). Вывод только одного файла также был бы довольно трудным, потому что часто он используется в качестве входа к GNUPLOT, который не знает, как обработать только часть файла данных.

96
задан makesaurus 4 June 2010 в 11:06
поделиться

2 ответа

Я бы решил это следующим образом:

file-a.out: input.in
    foo-bin input.in file-a.out file-b.out   

file-b.out: file-a.out
    #do nothing
    noop

В этом случае параллельная программа make будет «сериализовать», создавая a и b, но поскольку создание b ничего не делает, это не требует времени.

10
ответ дан 24 November 2019 в 05:37
поделиться

Хитрость заключается в использовании шаблонного правила с несколькими целями. В этом случае make будет считать, что обе цели созданы одним вызовом команды.

all: file-a.out file-b.out
file-a%out file-b%out: input.in
    foo-bin input.in file-a$*out file-b$*out

Эта разница в интерпретации между шаблонными и обычными правилами не совсем логична, но она полезна в подобных случаях и документирована в руководстве.

Этот трюк можно использовать для любого количества выходных файлов, если их имена имеют некоторую общую подстроку для соответствия %. (В данном случае общей подстрокой является ".")

124
ответ дан 24 November 2019 в 05:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: