Ограничение правила шаблона Makefile - PullRequest
0 голосов
/ 29 апреля 2020

Рассмотрим следующее упрощенное Makefile:

target :
    (recipe)

target-mt : (add some flags)
target-mt : target

Этот пример работает как задумано: make target-mt добавляет несколько флагов и приступает к компиляции target.

Теперь, так как шаблон *-mt встречается довольно часто, с всегда одинаковыми флагами, я хочу, чтобы это усилие было распространено. Итак, давайте упростим с помощью правила шаблона Makefile :

target :
    (recipe)

%-mt : (add some flags)

target-mt : target

Это работает как задумано, и теперь все более поздние цели *-mt получают такой же дополнительный набор флагов. Теперь обратите внимание, что зависимость something-mt всегда равна something. Так что у меня возникает соблазн обобщить это отношение еще больше:

target :
    (recipe)

%-mt : (add some flags)
%-mt : %

Это не работает .

make: *** No rule to make target `target-mt'.  Stop.

Это кажется странным с общей формулировкой шаблонных правил, таких как канонический пример:

%.o : %.c
    $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

Я предполагаю, что должна быть причина этого сбоя, и я предполагаю, что это может быть связано с тем фактом, что зависимость является чистой %, не что-то более определенное, как %.c. Но я не смог найти ничего связанного с таким ограничением в документации (ссылка выше).

Вопросы:

1) Есть ли объяснение этому поведению?

2) Есть ли другой способ достичь той же цели?

1 Ответ

1 голос
/ 29 апреля 2020

Вы не можете объявить шаблонное правило без рецепта. Или, скорее, вы можете, но он не делает то, что вы хотите здесь: вместо этого отменяет правило шаблона .

Вы можете добавить фиктивный рецепт, например:

%-mt: % ; @:

(: является оператором командной оболочки).

Или вы можете просто не использовать это и go вернуться к тому, что было. Из этого ограниченного примера немного сложно понять весь контекст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...