0

我在目录中有一堆文本文件help_pages/,全部以 reST 格式。我正在尝试向我的 GNU 添加Makefile一些规则:

  1. help_pages通过一个应用程序运行扩展名为“.rst”的目录(和子目录)中的每个文件,该应用程序会输出一个有效的 html 文件(现在我只是在使用rst2html)。
  2. 将这些输出 html 文件复制到目标目录,再现目录中存在的目录结构help_pages

因此,例如,help_pages/some/dir/foo.rst首先会被翻译成help_pages/some/dir/foo.html,然后复制到public/help/some/dir/foo.html

我花了一整天的时间试图学习 Makefile 的内部结构,但最后我放弃了。这是我已经拥有的:

# Directory that the .rst files reside in:
HELP_DIR=help_pages
# use 'find' to locate all such files:
HELP_SRCS=$(shell find $(HELP_DIR) -name "*.rst")
# work out what path the intermediate files would be
HELP_TARGETS=$(HELP_SRCS:.rst=.html)

# do the translation.   
$(HELP_TARGETS): %.html: %.rst
        rst2html $< $@

help: $(HELP_TARGETS) 

.phony:
        help

这种工作 - .rst 文件被翻译成 .html 文件,但我不知道如何将它们安装到最终的目标目录中。如果我cp向主构建配方添加命令,如果目标目录中不存在这些文件,则不会重新安装它们。

理想情况下,我想要一个目标来制作帮助文件,一个来安装它们,第三个(称为“帮助”)取决于这两个。我认为这会给我最大的灵活性。

谁能给我一些关于如何实现这一目标的提示?

干杯,

4

2 回答 2

2

“我花了一整天的时间试图学习 Makefile 的内部结构,但最后我放弃了。” 你不知道这有多好笑。

这应该这样做:

HELP_DIR=help_pages
# use 'find' to locate all such files:
HELP_SRCS=$(shell find $(HELP_DIR) -name "*.rst")
# work out what path the intermediate files would be
HELP_TARGETS=$(HELP_SRCS:.rst=.html)
# and the destinations
HELP_INSTALL = $(patsubst help_pages%,public%,$(HELP_TARGETS))

# do the translation.
$(HELP_TARGETS): %.html: %.rst
    rst2html $< $@          

# do the installation
$(HELP_INSTALL):public/%:help_pages/%
    cp $< $@

.PHONY: help install

help: $(HELP_TARGETS)

install:$(HELP_INSTALL)

现在,如果您想做所有事情,只需make install. 或者,如果您想创建 html 文件而不将它们复制到public/. make help您会发现依赖项可以正常工作。

于 2011-01-10T19:41:11.270 回答
1

make使用目录分隔符对路径名进行“智能”处理,这使得编写跨不同目录执行操作的规则变得非常痛苦。

一种解决方法是将复制作为转换的副作用进行,例如,将其添加为第二个命令可能会起作用:

echo $@ | cpio -pdl public/html

顺便说一句,.PHONY大写。

于 2011-01-10T11:19:07.703 回答