【问题标题】:Process files with m4 in makefile在 makefile 中使用 m4 处理文件
【发布时间】:2012-08-09 11:00:09
【问题描述】:

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

【问题讨论】:

  • 答案可能是肯定的,但是我们有些人对m4并不熟悉。你能展示一下你现在使用的(最小的)makefile吗?
  • 嗨,我添加了当前makefile的相关部分

标签: makefile gnu-make


【解决方案1】:

您可以编写一组规则来将带有后缀.in 的文件转换为没有该后缀的文件。

在经典符号中,这将是这样的:

# Not functional — see discussion
.SUFFIXES: .in       # Add .in as a suffix

M4       = m4
M4FLAGS  =
M4SCRIPT = xyz.m4

.in:
    ${M4} ${M4FLAGS} ${M4SCRIPT} $< > $*

这会将.in 添加为可识别的后缀,并表示您使用三个宏指定的命令将带有.in 后缀的文件转换为没有后缀的文件。 $&lt; 是带有.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 行能够处理带有两个点的后缀。唯一麻烦的是,对于每个扩展,例如 .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 &gt; xyz.h .)

【讨论】:

    【解决方案2】:

    如果你有一个源文件path/to/file.in、一个从%.in 生成% 的规则,以及对输出文件path/to/file 的依赖,那么你应该只需要这些。

    也许您想根据find 的输出来表达您的依赖关系。在 GNU Make 中,这很容易;在其他方言中,也许您想生成并包含类似find -name '*.in' | sed 's/\.in$//' &gt;make.dep

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-15
      • 2022-06-30
      • 2012-02-27
      相关资源
      最近更新 更多