2014-10-21 3 views
0

Я использую Gnu Make 3.81 и получаю сообщение об ошибке, которое пытается совместить шаблонное правило, в котором также есть переменная.Правило шаблона Makefile с переменной в целевом

Вот маленький пример, который я мог придумать:

YYMMDD:=$(shell date +%y%m%d) 
TMP_DIR:=/tmp/$(YYMMDD) 

# create a temporary directory, and put a "source" file in it 
$(TMP_DIR): 
    mkdir $(TMP_DIR) 
    echo something > $(TMP_DIR)/somefile.orig 

# to build an "object" file in the temp dir, process the "source" file 
$(TMP_DIR)/%.new: $(TMP_DIR)/%.orig 
    wc -l $< > [email protected] 

atarget: $(TMP_DIR) $(TMP_DIR)/somefile.new 

Затем, когда я бегу make atarget, я получаю:

mkdir /tmp/141021 
echo something > /tmp/141021/somefile.orig 
make: *** No rule to make target `/tmp/141021/somefile.new', needed by `atarget'. Stop. 

Не должны ли эта работа? похоже, что правило шаблона должно соответствовать этому просто отлично.

ответ

1

Это потому, что make не знает, что существует файл .orig: у вас есть правило, которое строит $(TMP_DIR), но make не знает, что это правило также создает $(TMP_DIR)/somefile.orig. Поэтому, когда make пытается сопоставить правило шаблона, он увидит, что файл .orig не существует, и у него нет способа узнать, как сделать этот файл, поэтому шаблон не соответствует, и после этого есть нет способа построить файл .new.

Вы должны написать:

$(TMP_DIR)/%.orig: 
     mkdir -p $(TMP_DIR) 
     echo $* > [email protected] 

, то он будет работать.

+1

Я думаю, что кое-что я тогда не понимаю. Почему бы не сделать просто проверку, чтобы увидеть, что файл «.orig» существует на самом деле? – brooks94

+0

У файла есть кеш, файлы которого существуют по соображениям производительности. Кэш обновляется, когда make знает, что какой-то файл был создан. В этом случае не было выполнено правило, в котором говорится, что он создаст этот файл. Также обратите внимание, что ваш make-файл недействителен, если вы включили параллелизм ('-j'), так как make затем начнет создавать' $ (TMP_DIR) ', а затем сразу начнет пытаться найти следующую цель, которую он не смог найти, поскольку команда для сборки '$ (TMP_DIR)' не было завершено. В общем, это просто плохая идея полагаться на «побочные эффекты» правил, а не на явные предпосылки. – MadScientist

+0

Если это правда, почему работает правило по умолчанию «% .o:% .c»? – brooks94

Смежные вопросы