作为构建过程的一部分,我需要使用 m4 处理一些文件。这些文件具有“.in”扩展名,不仅位于顶级目录中,而且位于子目录中。 我使用 find 找到它们并在 shell 循环中处理它们。
是否有一些 makefile 语法魔法可以编写更简单的规则来处理它们,将输出保存到与输入文件位于同一目录中的文件中(去掉“.in”扩展名)?
这是我现在的 makefile 中的内容:
PROCESS_FILES=$(shell find . -name \*.in)
WORK_FILES=$(subst .in,,$(PROCESS_FILES))
$(WORK_FILES): $(PROCESS_FILES)
for file in $(PROCESS_FILES); \
do \
m4 $$file > $${file%.*};\
done
最佳答案
您可以编写一组规则来转换后缀为 .in
的文件。没有该后缀的文件。
在经典的表示法中,这将是这样的:
# Not functional — see discussion
.SUFFIXES: .in # Add .in as a suffix
M4 = m4
M4FLAGS =
M4SCRIPT = xyz.m4
.in:
${M4} ${M4FLAGS} ${M4SCRIPT} $< > $*
这增加了 .in
作为可识别的后缀,并表示您使用 .in
转换文件使用三个宏指定的命令将后缀添加到不带后缀的文件。 $<
是带有 .in
的文件名扩大; $*
是不带扩展名的文件名。
不幸的是,该表示法仅在要转换的文件具有诸如 xyz.in
之类的名称时才有效。并需要转换为xyz
。它不适用于 xyz.h.in
的情况需要转换为xyz.h
.
可以指定后缀为 .h.in
和.h
,但是两者之间的转换规则以 .h.in.h:
开头和make
感到困惑。
但是,GNU make 有一个替代的表示法来定义后缀规则,可以适应这种情况:
.SUFFIXES: .h.in .h # Add .h.in and .h as suffixes
M4 = m4
M4FLAGS =
M4SCRIPT = xyz.m4
%.h: %.h.in
${M4} ${M4FLAGS} ${M4SCRIPT} $< > $*.h
%.h: %.h.in
line 能够处理带有两个点的后缀。唯一的麻烦是对于每个扩展名,例如 .c.in
或.y.in
或.mk.in
,您必须提供类似的映射。
(在 Mac OS X 10.7.4 上测试。如果该 makefile 为 xyz.mk
,您可以创建一个空文件 xyz.h.in
,然后运行 make -n -f xyz.mk xyz.h
,您将看到构建将运行命令 m4 xyz.m4 xyz.h.in > xyz.h
。 .)
关于makefile - makefile 中使用 m4 处理文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11881925/