Я вчусь користуватися 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 є сумно прискіпливим щодо тих, хто є вкладкою, а не пробілами.