Я вчусь користуватися makeта makefiles, тому я написав цей маленький файл:
%.markdown: %.html
pandoc -o $< $@
Але коли я біжу make, все, що я отримую, це make: *** No targets. Stop.те, що відбувається?
Я вчусь користуватися makeта makefiles, тому я написав цей маленький файл:
%.markdown: %.html
pandoc -o $< $@
Але коли я біжу make, все, що я отримую, це make: *** No targets. Stop.те, що відбувається?
Відповіді:
Ваша проблема полягає в тому, makeщо не знаєте про свої цілі.
Ви можете запустити свій вище Makefile, make stackoverflow.markdownнаприклад, і він буде працювати.
make тільки, проте, не вдасться, оскільки ви вказали лише, як створити цілі, але не які.
Як зазначає leiaz, вищезазначене правило називається неявним правилом .
SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)
.PHONY: all clean
all: $(TAR)
%.markdown: %.html
pandoc -o $< $@
clean:
rm -f $(TAR)
SRCотримати всі вихідні файли (ті, що закінчуються .html) через Makefile wildcard.
TAR замінює кожен вихідний файл, вказаний у, SRCцільовим, який закінчується .markdownзамість .html.
.PHONY перераховує нефізичні цілі, які завжди застаріли і тому завжди виконуються - це часто allі clean.
Метаall має в якості залежностей (файли перераховані на правій стороні :) все *.markdownфайли. Це означає, що всі ці цілі виконуються.
%.markdown: %.html
pandoc -o $< $@
Цей фрагмент говорить: Кожна цільова група, що закінчується .markdown, залежить від файлу з тим самим іменем, за винятком того, що залежність закінчується .html. Символи% слід розглядати як *як в оболонці. Однак %праворуч порівняно з матчем з лівого боку. Джерело .
Зауважимо, що послідовність пробілів, що pandocзнаходиться перед TAB, є a , оскільки 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 є сумно прискіпливим щодо тих, хто є вкладкою, а не пробілами.