2

我正在尝试删除conf.py每个子目录(存储在变量中)中的文件()文本块。SUBDIRS此文本块位于标签#--Begin#--End. 请参阅下面的代码示例。为了整洁并且不必从makefile中运行额外的shell脚本,我想在makefile中使用sed命令,但是这样做有困难。我在任何其他论坛帖子上都找不到解决方案,因此我们将不胜感激。

.PHONY $(SUBDIRS)
SUBDIRS = (list of all subdirectories that contain a relevant conf.py)
$(SUBDIRS):  
    sed '/#--Begin/,/#--End/d' Docs/$@/conf.py  

这个命令没有任何反应。

谢谢!

4

2 回答 2

5

您的规则使用 SUBDIRS 列表作为其目标。Make 看看这些是否存在,它们当然存在。它们不依赖于其他任何东西,因此它们是最新的,因此 Make 不需要做任何事情。

有两种方法可以解决这个问题。一种是使用Phony Target 来强制命令每次运行:

.PHONY: $(SUBDIRS)
$(SUBDIRS):
    sed .....

另一种是为文件的编辑和未编辑版本赋予不同的名称,例如 conf.pyand ,并使用Pattern Ruleconf.py.in使第一个依赖于第二个:

$(SUBDIRS): Docs/%/conf.py: Docs/%/conf.py.in
   sed '/#--Begin/,/#--End/d' $< >$@

这样更好,因为只要输入文件发生变化,它就会自动运行。

于 2012-07-24T16:33:17.070 回答
5

在将其合并到 makefile 之前,您应该已经sed在命令行上测试了该命令。正如所写的那样,它删除了您希望它删除的行 - 然后将结果定向到标准输出。要修改文件,您应该使用-i

sed -i -e '/#--Begin/,/#--End/d' Docs/$@/conf.py

很可能还有其他问题。您还没有向我们展示真正的 makefile(.PHONY $(SUBDIRS)不合法,因此您没有粘贴工作的 makefile 的一部分),但是该规则甚至可能没有按照您认为的方式执行。尝试这个:

$(SUBDIRS):
    @echo attempting to act on $@
    @ls Docs/$@/conf.py

在尝试引入命令之前,让它完美地工作。sed

于 2012-07-24T23:54:00.807 回答