Я учусь использовать make
и создавать файлы, поэтому я написал этот маленький файл:
%.markdown: %.html
pandoc -o $< $@
Но когда я бегу make
, все, что я получаю, это make: *** No targets. Stop.
то, что происходит?
Я учусь использовать make
и создавать файлы, поэтому я написал этот маленький файл:
%.markdown: %.html
pandoc -o $< $@
Но когда я бегу make
, все, что я получаю, это make: *** No targets. Stop.
то, что происходит?
Ответы:
make
Ваша проблема в том, что не знает о ваших целях.
Вы можете запустить ваш вышеупомянутый Makefile, make stackoverflow.markdown
например, и он будет работать.
make
однако, только потерпит неудачу, поскольку вы только указали, как создавать свои цели, а не какие.
Как указывает Лейаз, указанное выше шаблонное правило называется неявным правилом .
SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)
.PHONY: all clean
all: $(TAR)
%.markdown: %.html
pandoc -o $< $@
clean:
rm -f $(TAR)
SRC
get получает все исходные файлы (те, которые заканчиваются на .html
) через Makefile wildcard
.
TAR заменяет каждый указанный в списке исходный файл SRC
на целевое, заканчивающееся .markdown
вместо .html
.
.PHONY перечисляет нефизические цели, которые всегда устарели и, следовательно, всегда выполняются - это часто all
и clean
.
Цельall
имеет в качестве зависимостей (файлы перечислены на правой стороне :
) все *.markdown
файлы. Это означает, что все эти цели выполнены.
%.markdown: %.html
pandoc -o $< $@
В этом фрагменте говорится: Каждая цель, заканчивающаяся на .markdown
, зависит от файла с тем же именем, за исключением того, что зависимость заканчивается на .html
. Подстановочные%
следует рассматривать как *
как в оболочке. Однако %
на правой стороне сравнивается с матчем на левой стороне. Источник .
Обратите внимание, что последовательность пустого пространства pandoc
перед a является TAB, поскольку make
определяет это как стандарт.
Наконец, фальшивая clean
цель показывает, как очистить вашу систему от файлов, которые вы создали с помощью этого Makefile. В этом случае он удаляет все цели (те файлы, которые были названы *.markdown
.
makefile
создавать файлы с нуля или он только обновляет существующие файлы? Потому что, когда я удаляю сгенерированные файлы, он перестает работать. Глупый вопрос, который я знаю, но для меня это Ньюфаундленд ^^ "
Шаблонные правила являются неявными правилами.
У вас нет целей, определенных в вашем Makefile. Вы можете указать цель в командной строке: make something.markdown
использовать рецепт для создания something.markdown
из something.html
.
Или вы можете добавить в свой Makefile правило, определяющее цели по умолчанию.
all: file1.markdown file2.markdown
all: *.markdown
Когда вы просто запускаете make
, первая цель первого правила является целью по умолчанию . Это не нужно называть all
.
Итак, выше, у цели all
есть все файлы, которые вы хотите сделать в качестве предварительных условий, поэтому, когда вы make all
создадите все перечисленные файлы.
pandoc
командой. Make, как известно, требователен к тем, что является табуляцией, а не пробелами.