Подтвердить что ты не робот

Правило шаблона Makefile без расширения?

У меня есть множество приложений, которые построены с одним типом правила make:

apps = foo bar baz

all: $(apps)

foo: foo.o $(objects)
    $(link)

bar: bar.o $(objects)
    $(link)

baz: baz.o $(objects)
    $(link)

Если у них было расширение (например, .x), я мог бы создать правило шаблона, например:

%.x: %.o $(objects)
    $(link)

и мне не пришлось бы выписывать новое правило для каждого приложения.

Но у них нет расширения, и я уверен, что:

%: %.o $(objects)
    $(link)

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

Можно ли указать одно правило, которое будет охватывать все правила сборки $(apps)?

4b9b3361

Ответ 2

%: %.o $(objects)
    $(link)

Вышеуказанное должно работать.

Вы можете ограничить область действия правила, превратив его в правило статического шаблона , чтобы он учитывался только для вашего списка целей:

$(apps) : % : %.o $(objects) # only consider this for $(apps) targets
    $(link)

Ответ 3

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

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

Я вижу, что вы пытались достичь, создавая общее правило, которое будет удовлетворять всем целевым проверкам объекта и ссылки в вашем коде.

что-то вроде этого::

 % : % : $(rule1)
         echo / generic code ;

чтобы он вызывался для всех приложений в разных сценариях

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

следовательно, если вы попытаетесь, я думаю, вы попадете сюда...

 $ make -nf mk.t
   mk.t:18: *** mixed implicit and static pattern rules.  Stop.

:), я дам этому повторить попытку завтра, чтобы посмотреть, могу ли я заставить эту работу работать в общем роде. Хороший вопрос, хотя.