2015-12-16 3 views
1

У меня есть простой Makefile, как это:сделать неявные правила не работают без команды

%.t1: %.t2 

%.t2: 
    echo "t2" 

Когда я типа make x.t2 он прекрасно работает. Но когда я печатаю make x.t1 Я получаю

make: *** No rule to make target 'x.t1'. Stop. 

Если я изменяю в% .t1 цель сказать

%.t1: %.t2 
    echo 

Затем он работает. Почему он не работает без команды? Я использую GNU make 4.0 для Fedora 23.

+0

Потому что не существует правила для построения 'x.t1'. Что вы ожидаете от достижения цели «x.t1» в этот момент? Почему у вас есть makefile, настроенный так? Какова ваша конечная цель? –

+0

Я понимаю, что% .t1 соответствует любой цели, которая заканчивается на .t1. Итак, это правило, которое я бы хотел использовать, так же, как он знает, использовать цель% .t2, когда я прошу сделать x.t2. Моя цель - использовать спецификации зависимостей как форму декларативного программирования. Пример, который я дал, изобретателен, но с несколькими зависимостями и побочными эффектами этот подход может быть весьма полезным. – theTrickster

+0

Вы не указали правило для '% .t1', которое вы указали в качестве необходимого условия. Это правило без рецепта. make не нравится. Вы можете дать ему пустой рецепт, если хотите, хотя '% .t1:% .t2;'. Вы также хотели бы отметить его как «.PHONY», чтобы это хорошо работало. Можете ли вы представить небольшой пример того, что вы пытаетесь сделать здесь? –

ответ

1

Правило шаблона без рецепта не добавляет правила, оно отменяет неявные правила. См http://www.gnu.org/software/make/manual/make.html#Canceling-Rules:

Вы можете отменить встроенное неявное правило, определив шаблонное правило с одной и той же целью и предпосылками, но не рецептом. Например, следующий отменит правило, которое запускает ассемблер:

%.o : %.s 

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

%.t1: %.t2 ; 
%.t2: 
    echo t2 

что дает:

$ make x.t1 
t2 
Смежные вопросы