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создавать файлы с нуля или он только обновляет существующие файлы? Потому что, когда я удаляю сгенерированные файлы, он перестает работать. Глупый вопрос, который я знаю, но для меня это Ньюфаундленд ^^ "
Ахмед
1
Вы имеете в виду, что если нет файлов .markdown, то они будут созданы? да, это должно сделать это, насколько я знаю
Polym
1
Ладно. Я сделаю еще кое-что. Спасибо за ваши ответы, спасибо вам, что я на правильном пути
:)
1
Просто хотел поблагодарить вас за отличный ответ. То, как вы объяснили, очень легко понять, почему команда не работает, и очень подробные инструкции о том, как действовать. Еще раз спасибо.
У вас нет целей, определенных в вашем Makefile. Вы можете указать цель в командной строке: make something.markdownиспользовать рецепт для создания something.markdownиз something.html.
Или вы можете добавить в свой Makefile правило, определяющее цели по умолчанию.
Итак, выше, у цели allесть все файлы, которые вы хотите сделать в качестве предварительных условий, поэтому, когда вы make allсоздадите все перечисленные файлы.
pandoc
командой. Make, как известно, требователен к тем, что является табуляцией, а не пробелами.Ответы:
Проблема:
make
Ваша проблема в том, что не знает о ваших целях.Вы можете запустить ваш вышеупомянутый Makefile,
make stackoverflow.markdown
например, и он будет работать.make
однако, только потерпит неудачу, поскольку вы только указали, как создавать свои цели, а не какие.Как указывает Лейаз, указанное выше шаблонное правило называется неявным правилом .
Makefile:
Объяснение:
SRC
get получает все исходные файлы (те, которые заканчиваются на.html
) через Makefilewildcard
.TAR заменяет каждый указанный в списке исходный файл
SRC
на целевое, заканчивающееся.markdown
вместо.html
..PHONY перечисляет нефизические цели, которые всегда устарели и, следовательно, всегда выполняются - это часто
all
иclean
.Цель
all
имеет в качестве зависимостей (файлы перечислены на правой стороне:
) все*.markdown
файлы. Это означает, что все эти цели выполнены.В этом фрагменте говорится: Каждая цель, заканчивающаяся на
.markdown
, зависит от файла с тем же именем, за исключением того, что зависимость заканчивается на.html
. Подстановочные%
следует рассматривать как*
как в оболочке. Однако%
на правой стороне сравнивается с матчем на левой стороне. Источник .Обратите внимание, что последовательность пустого пространства
pandoc
перед a является TAB, посколькуmake
определяет это как стандарт.Наконец, фальшивая
clean
цель показывает, как очистить вашу систему от файлов, которые вы создали с помощью этого Makefile. В этом случае он удаляет все цели (те файлы, которые были названы*.markdown
.источник
makefile
создавать файлы с нуля или он только обновляет существующие файлы? Потому что, когда я удаляю сгенерированные файлы, он перестает работать. Глупый вопрос, который я знаю, но для меня это Ньюфаундленд ^^ "Шаблонные правила являются неявными правилами.
У вас нет целей, определенных в вашем Makefile. Вы можете указать цель в командной строке:
make something.markdown
использовать рецепт для созданияsomething.markdown
изsomething.html
.Или вы можете добавить в свой Makefile правило, определяющее цели по умолчанию.
Или с подстановочным знаком:
Когда вы просто запускаете
make
, первая цель первого правила является целью по умолчанию . Это не нужно называтьall
.Итак, выше, у цели
all
есть все файлы, которые вы хотите сделать в качестве предварительных условий, поэтому, когда выmake all
создадите все перечисленные файлы.источник