Как вызвать pandoc из makefile на разные файлы? - PullRequest
0 голосов
/ 20 сентября 2019

Я работаю над написанием проекта и хотел бы использовать make для запуска pandoc для файлов.До сих пор я пытался передать аргументы make, как это делается с помощью скрипта bash.

Например:

$ make chapter 2

В файле make chapter - это цель, а2 будет аргументом.

Я не знаю, есть ли у make-файлов возможность принимать аргументы cli.Мне не удалось найти то, что я ищу в документации 1014 *.

До сих пор я пытался запустить make с этим рецептом.

chapter:
    @pandoc -s -o "$1.epub" "$1.md"

Я получаю эту ошибку обратно

pandoc: .md: openBinaryFile: does not exist (No such file or directory)
make: *** [Makefile:2: chapter] Error 1

Это для превращения разделов книги, над которой я работаю, в epubs.Я открыт для других способов сделать это с помощью make vision, так как токены не работают.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

В главе make-файла указана цель, а 2 будет аргументом

$ make chapter num=2

Назначение переменных в командной строке make переопределяет любойопределение внутри make-файла (да, такие переменные становятся доступными только для чтения).Это предполагает, что make-файл выглядит примерно так:

num = $(error You must set $$num to the chapter number you want (make chapter num=4))

.PHONY: chapter
chapter:
    pandoc -s -o "${num}.epub" "${num}.md"

Что здесь происходит?Хорошо, если вы забудете установить num , когда make расширит рецепт для chapter , $(error) приведет к остановке make .

$ make
Makefile:5: *** You must set $num to the chapter number you want (make chapter num=4).  Stop.

А ваш оригинальный пример?

$ make chapter num=2
pandoc -s -o "2.epub" "2.md"

Советы

  • Я редко рекомендую использовать префикс @ - пользователи могут использовать make -s, если они не хотят видеть команды оболочки
  • Не лгите make - В частности, ваше правило не создает файл с именем chapter, поэтому, пожалуйста, сообщите make , отметив цель .PHONY
0 голосов
/ 20 сентября 2019

Естественный способ сказать это в Make - это перечислить все главы как цели, как правило, как зависимости для make all.

Так что в основном

src := $(wildcard *.md)
epubs := $(patsubst %.md,%.epub,$(src))

.PHONY: all
all: $(epubs)

%.epub: %.md
    pandoc -s -o $@ $<

Вы можете сказать make ch4.epub если у вас есть глава с источником ch4.md.Вы не можете действительно передать аргумент, который не является именем файла или целевым именем, и они не могут содержать пробелы.

Я полагаю, вы могли бы добавить фальшивку типа

.PHONY: 2
2: ch2.epub

чтобы иметь возможность сказать make 2 и иметь это значение make ch2.epub.Если имена файлов систематически называются так, вы можете обобщить до

short := $(patsubst ch%.md,%,$(src))
.PHONY: $(short)
$(short): %: ch%.epub

Не используйте @ впереди, это только усложняет ситуацию.Вы можете использовать make -s, если вы не хотите видеть вывод и не разрушать ваш Makefile.

...