在Makefile中使用sed

use*_*804 2 unix makefile sed

我正在尝试使其删除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  
Run Code Online (Sandbox Code Playgroud)

这个命令没有任何结果.

谢谢!

Pet*_*ake 5

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

这有两种方法.一种是使用Phony Target 强制命令每次运行:

.PHONY: $(SUBDIRS)
$(SUBDIRS):
    sed .....
Run Code Online (Sandbox Code Playgroud)

另一种是为文件的编辑和未编辑版本提供不同的名称,例如 conf.pyconf.py.in,并使用模式规则使第一个依赖于第二个:

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

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


Bet*_*eta 5

sed在将命令合并到makefile之前,您应该在命令行上测试该命令.如上所述,它会删除您想要删除的行 - 然后将结果定向到stdout.要修改文件,您应该使用-i:

sed -i -e '/#--Begin/,/#--End/d' Docs/$@/conf.py
Run Code Online (Sandbox Code Playgroud)

可能还有其他问题.你没有向我们展示真正的makefile(.PHONY $(SUBDIRS)不合法,所以你不会粘贴一个正在运行的makefile),但规则可能甚至没有按你认为的那样执行.试试这个:

$(SUBDIRS):
    @echo attempting to act on $@
    @ls Docs/$@/conf.py
Run Code Online (Sandbox Code Playgroud)

在尝试引入命令之前,要使其完美地工作sed.