makefile - makefile 中使用 m4 处理文件

标签 makefile gnu-make

作为构建过程的一部分,我需要使用 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/

相关文章:

c++ - 文件格式无法识别;视为链接描述文件

makefile - ifeq( $(foo), ) 和 ifndef foo 有什么区别

c - GNU gcc 编译器无法处理部分包含语句

使用外部 makefile 进行正确的语法检查

build-process - openwrt项目的部分编译

c++ - 在 g++ 中生成 "-L"和 -rpath 标志的等效函数是什么

linux - 使用 makefile 进行编译的多个 SRCDIR 文件夹

makefile - 如果版本太旧则退出 makefile

c++ - g++/c++ makefile 依赖项生成忽略 boost header ?

c - Makefile 不起作用 - 添加新文件