2016-04-19 3 views
1

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

, например:

тогда у меня есть шаблонное правило:

DATA=$(get string from template.txt) 
%: %.tpl 
    sed 's/__TEMPLATE__/$(DATA)/g' $< > [email protected] 
templates: src/fileB.js src/fileD.css 

И все в порядке. До следующей сборки ... теперь src/fileB.js не будет обновляться, потому что там уже есть, и src/fileB.js.tpl не был изменен, хотя другой файл template.txt, который я использую в качестве источника данных для его обновления. Это подводит меня к чистому шагу.

прямо сейчас мой чистый шаг rm Ввод каждого файла. это уродливо.

.PHONY: clean 
clean: 
    rm src/fileB.js 
    rm src/fileD.css 
    ... 

Вы можете видеть, как это становится уродливым.

В обычном проекте мой чистый будет всего rm *.o, но здесь я не могу сделать rm *.js, так как половина файлов не сгенерирована автоматически.

есть ли способ сделать правило %: %.tpl be PHONY?

Если нет, есть ли способ подать список файлов с template в clean?

ответ

2

Что относительно этого?

TEMPLATES=$(wildcard src/*.tpl) 
GENERATED=$(TEMPLATES:%.tpl=%) 

clean: 
    rm -f $(GENERATED) 

Ну, я бы подпорку перед тестированием этого ...

+0

приятно! теперь мое правило 'templates' также более чистое с' templates: $ (GENERATED) '. большое спасибо! всегда забывайте о 'wildcard' – gcb

+0

Необходимые вручную« чистые »шаги - это« запах кода »для make. Вам не нужно их иметь. Решение проблемы здесь заключается в использовании промежуточных файлов, которые * всегда * генерируются, а затем обновляют фактический файл .js, когда он отличается от промежуточного файла. Да, это немного дороже, но означает, что вы не можете забыть очистить и в итоге сломаться. –

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