【问题标题】:Using make to translate reST files使用 make 翻译 reST 文件
【发布时间】:2011-01-09 08:05:40
【问题描述】:

我在help_pages/ 目录中有一堆文本文件,全部以reST 格式。我正在尝试向我的 GNU make 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 命令,如果目标目录中不存在这些文件,则不会重新安装它们。

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

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

干杯,

【问题讨论】:

    标签: makefile restructuredtext gnu-make


    【解决方案1】:

    “我花了一整天的时间试图学习 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。您会发现依赖项正常工作。

    【讨论】:

      【解决方案2】:

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

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

      echo $@ | cpio -pdl public/html
      

      顺便说一句,.PHONY 大写。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-10
        • 2021-05-13
        • 2011-02-05
        • 1970-01-01
        • 2020-04-03
        • 2021-11-23
        • 2014-12-19
        相关资源
        最近更新 更多