Мне нужен Makefile, который создает для каждой <file.rst>
папку <file>
, а затем выполняет
судно на воздушной подушке на <file.rst>
, которому нужна папка в качестве второго аргумента
$ tree
.
├── a.rst
├── b.rst
└── Makefile
С этим Makefile
$ cat Makefile
.PHONY: html
HTML_TARGETS:= $(patsubst %.rst,%.html,$(wildcard *.rst))
html: $(HTML_TARGETS)
%.html: %.rst
@rm -fr $(basename $@ .html)
@mkdir -p $(basename $@ .html)
@hovercraft -Ns $< $(basename $@ .html)
$
я типа работаю
.
├── a
│ └── index.html
├── a.rst
├── b
│ └── index.html
├── b.rst
└── Makefile
Я понял, насколько вычурным является этот Makefile, что может быть лучше, чтобы написать его?
Кстати, я не могу добавить в Makefile это эхо:
@echo output done in $(basename $@ .html)/index.html
Я получил:
output done in a /index.html
output done in b /index.html
^
└─ with an unwanted space
Я хотел бы напечатать:
output done in a/index.html
output done in b/index.html
Если я правильно понимаю, что вы хотите создать каталог «x», а затем выполнить hovercraft x.rst x/index.html
для каждого файла «x.rst», то это должен быть краткий способ сделать это.
SOURCES := $(wildcard *.rst)
TARGETS := $(SOURCES:.rst=/index.html)
%/index.html: %.rst
mkdir -p $*
hovercraft $< $@
.PHONY: all
all: $(TARGETS)
Пожалуйста, не рекомендуйте добавлять @
перед строками рецепта, чтобы скрыть вывод. Этот вывод имеет решающее значение для понимания того, как работает make.
Это на самом деле отличный совет. Причина, по которой он был там, заключалась в том, что я использую его с echo
перед командами только для того, чтобы убедиться, что цель работает должным образом, не выполняя никакой реальной работы и не печатая команду дважды. Затем я просто удаляю эхо, но по какой-то причине не удаляю это. В любом случае, помимо @echo
, они действительно контрпродуктивны.
Как я уже сказал в другом вашем вопросе,
$(basename $@ .html)
делает ли нет то, что вы думаете. Пожалуйста, обратитесь к руководству GNU make, чтобы узнать, как это работает на самом деле, тогда вы увидите, откуда берется дополнительное пространство.