gpt4 book ai didi

makefile - 在 makefile 中使用 m4 处理文件

转载 作者:行者123 更新时间:2023-12-04 18:15:12 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com