Как использовать «Цепочки неявных правил» для Makefiles - PullRequest
1 голос
/ 13 июля 2011

GNU Make поддерживает `` цепочки неявных правил ". Чего я хочу достичь, так это написать в одном разделе Makefile:

  1. сгенерировать A в B командой: cmd1 A B
  2. сгенерировать B в C командой: cmd2 B C
  3. сгенерировать C в D командой: cmd3 C D

С A, B, C и D - четыре файла с разными расширениями (обозначим, например, .p, .q, .r и .t). B и C - промежуточные файлы, которые мне не нужны, в то время как A - исходный файл, а D - вывод. Проблема в том, что A - это очень большой набор файлов. Поэтому я хочу использовать цепочку неявных правил Makefile для достижения этой цели. Но я не знаю, как узнать имена файлов для промежуточных файлов B и C, например:

%.t : %.r : %.q : %.r
        cmd1 $< ?
        cmd2 ? ??
        cmd3 ?? $@

где? а также ?? это имена для промежуточных файлов. Я не нашел очень конкретного объяснения того, как назвать эти файлы. Страница руководства по GNU make предоставляет только переменные представления, такие как $ <и $ @, которые мне не нужны. Большое спасибо. </p>

1 Ответ

4 голосов
/ 13 июля 2011

Вы должны разбить правила на отдельные части:

%.t: %.r.tmp
    cmd1 $< $@

%.r.tmp: %.q
    cmd2 $< $@

%.q: %.r
    cmd3 $< $@

Когда вы создадите target.t, для вас будет создан промежуточный target.r.tmp, target.q, и они будут удалены вend.

EDIT

Если промежуточные файлы * .r.tmp, * .q не используются нигде, кроме cmd2, cmd3, лично я не чувствуюЯ люблю создавать неявные правила.

Хотя «Цепочки неявных правил» - хороший шаблон, в случае Makefile, IMO, в этом нет необходимости.Опять же, это просто личное чувство.

%.t: %.r
    cmd1 $<       $*.r.tmp
    cmd2 $*.r.tmp $*.q
    cmd3 $*.q     $@
    rm -f $*.r.tmp $*.q
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...