В Makefile используйте patsubst и подстановочный знак с подпапками и заменами подпапок - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь использовать make-файл для преобразования некоторых файлов разметки в HTML-файлы.Я пытаюсь выполнить в нескольких строках то, что раньше делал длинный скрипт на python.

В простом примере, приведенном ниже, я хотел бы увидеть этот код:

build: $(patsubst src/pages/%.md, output/%.html, $(wildcard src/pages/*.md))

%.html: %.md
    @echo $< to $@

и этот вывод

src/pages/index.md to output/index.html
src/pages/about.md to output/about.html
src/pages/contact.md to output/contact.html
src/page/foo/bar.md to output/foo/bar.html

Вместо этого он говорит:

$ make build
make: *** No rule to make target 'output/index.html', needed by 'build'.  Stop.

Мне здесь не хватает чего-то очень простого.

1 Ответ

0 голосов
/ 20 октября 2018

Рассмотрим цель output/index.html.Зависимость ...

%.html: %.md

будет эффективно расширена до ...

output/index.html: output/index.md

с $*, равным output/index.Так что make ищет output/index.md, но не может его найти - отсюда и сообщение об ошибке.

Чтобы получить правильный стебель образца ($* == index), вам нужно добавить базукаталоги к правилу шаблона ...

output/%.html: src/pages/%.md
    @echo $< to $@

РЕДАКТИРОВАТЬ 1:

Если вас беспокоит повторяющиеся жестко закодированные строки, такие как output и src/pages тогда вы всегда можете назначить их параметрам ...

OUTPUT_DIR := output
SOURCE_DIR := src/pages

build: $(patsubst $(SOURCE_DIR)/%.md, $(OUTPUT_DIR)/%.html, $(wildcard $(SOURCE_DIR)/*.md))


$(OUTPUT_DIR)/%.html: $(SOURCE_DIR)/%.md
    @echo $< to $@

(Предполагая, что вы имели в виду "оптимизация" в вашем комментарии.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...