У меня есть следующий make-файл:
all: DIR/0/a.txt DIR/1/b.txt DIR/2/c.txt DIR/3/abc.txt
DIR/%/abc.txt: DIR/%/def.xtx # rule #1
mkdir -p $(@D)
touch $@
DIR/%.txt: # rule #2
mkdir -p $(@D)
touch $@
DIR/%.xtx:
touch $@
Я хочу генерировать DIR/%/def.xtx
всякий раз, когда генерируется DIR/%/abc.txt
; в противном случае генерировать только DIR/%.txt
.
Однако при использовании make-файла с GNU Make 3.81 создается только DIR/3/abc.txt
, а DIR/%/def.xtx
не создается.
Следуя алгоритму поиска неявных правил в руководстве пользователя GNU make, мы получаем:
(1) Разделите t на часть каталога, названную d, и остальную часть, названную n. Например, если t равно «src / foo.o», то d равно «src /», а n - «foo.o».
Для DIR/3/abc.txt
, d = DIR/3
и n = abc.txt
.
(2) Составьте список всех шаблонных правил, одна из целей которых соответствует t или n. Если целевой шаблон содержит косую черту, он сопоставляется с t; в противном случае против п.
Правила №1 и №2 совпадают.
(3) Если какое-либо правило в этом списке не является правилом поиска совпадений, удалите из списка все нетерминальные правила поиска совпадений.
НЕ УВЕРЕН: ни одно правило не удалено из списка.
(4) Удалить из списка все правила без рецепта.
Ни одно правило не удалено.
(5) Для каждого шаблонного правила в списке:
(5.a) Найдите основу s, которая является непустой частью t или n, которой соответствует "%" в целевом шаблоне.
Для правила № 1 s = 3
. Для правила № 2 s = 3/abc
(5.b) Вычислить предварительные имена, заменив s на «%»; если целевой шаблон не содержит косой черты, добавьте d перед каждым именем предварительного требования.
Для правила №1 это становится: DIR/3/abc.txt: DIR/3/def.xtx
Правило №2 не имеет предварительных условий.
(5.c) Проверьте, все ли предпосылки существуют или должны существовать. (Если имя файла упоминается в make-файле как цель или явное предварительное условие, мы говорим, что оно должно существовать.)
НЕ УВЕРЕН: DIR/3/def.xtx
упоминается правилом DIR/%.xtx:
.
После этого долгого долгого объяснения я считаю, что, вероятно, ошибаюсь в (5.c).
%
когда-либо совпадет с чем-то с/
в нем. Таким образом, предполагая, что приведенное выше - это весь вашMakefile
, у вас нет правила, которое соответствовало быDIR/3/def.txt
, иmake
должен жаловаться на то, что вы не знаете, как создать DIR / 3 / def.txt или что-то в этом роде. - person twalberg   schedule 23.10.2012/
; иначеDIR/0/a.txt
,DIR/1/b.txt
иDIR/2/c
не пострадали бы; но они это делают. - person Adriano Carvalho   schedule 23.10.2012DIR/3/def.xtx
не создается, потому что третьему правилу не хватаетmkdir
части? Поскольку это предварительное условие дляDIR/3/abc.txt
, его нужно сначала создать, прежде чем каталог будет существовать, поэтомуmkdir
в правиле 1 не произойдет, пока он не попытается запустить правило 3. - person twalberg   schedule 23.10.2012