Make: Имя цели в правиле - PullRequest
0 голосов
/ 30 июня 2018

Я создал Makefile для генерации pdf и html для файла md, упомянутого при вызове make, как make a.md, должен генерировать a.pdf и a.html и не должен конвертировать другие md файлы в каталоге.

Мой make file

Но я получаю ошибку Nothing to be done for a.md

Не могли бы вы предложить изменения?

1 Ответ

0 голосов
/ 30 июня 2018

Поскольку a.md уже на месте, make действительно больше не имеет ничего общего. Вы можете либо просто использовать, например, a в качестве указанной цели (что может зависеть от файлов pdf и html в качестве предварительных условий). Или пропустите нужный источник через переменную и определите желаемую цель из этого.


Один (последний) вариант будет таким:

EXPORTED= $(SOURCE:%.md=%.html) $(SOURCE:%.md=%.pdf)

%.html : %.md
        pandoc -o $@ $<

%.pdf : %.md
        pandoc -o $@ $<

all: $(EXPORTED)

Который вы можете позвонить с make SOURCE=a.md.


Другой вариант (прежний):

%.html : %.md
        pandoc -o $@ $<

%.pdf : %.md
        pandoc -o $@ $<

.PHONY: $(MAKECMDGOALS)
$(MAKECMDGOALS): $(MAKECMDGOALS:%=%.html) $(MAKECMDGOALS:%=%.pdf)

Позволяет звонить make a.


Но повторить. Вы не можете использовать (существующий) источник в качестве цели, потому что make (как и раньше) пришла к выводу, что она достигла этой цели.


За исключением (но лично мне это не очень нравится, так как это вводит в заблуждение IMO), если бы вы настаивали, вы могли бы сделать вариацию на предыдущем дубле ... но работать с *.md целями ..., о которых вы все заявляете как .PHONY. То есть не настоящие файлы и всегда нужно учитывать / переделывать:

%.html : %.md
    echo pandoc -o $@ $<

%.pdf : %.md
    echo pandoc -o $@ $<

.PHONY: $(MAKECMDGOALS)
$(MAKECMDGOALS): $(MAKECMDGOALS:%.md=%.html) $(MAKECMDGOALS:%.md=%.pdf)

Теперь вы действительно можете позвонить make a.md. Я все еще предпочел бы один из двух выше.

...