Я учусь использовать 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)
SRCget получает все исходные файлы (те, которые заканчиваются на .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, как известно, требователен к тем, что является табуляцией, а не пробелами.