GNU 使用文件作为 SUFFIXES 中的目标

Posted

技术标签:

【中文标题】GNU 使用文件作为 SUFFIXES 中的目标【英文标题】:GNU make use file as target in SUFFIXES 【发布时间】:2013-04-04 14:05:48 【问题描述】:

Makefile 正在使用

.SUFFIXES: .ext1

.ext1:
      echo bla bla

我有一个配置文件 path/to/abc.ext1,所以 ma​​ke path/to/abc 可以正常工作。

我希望 ma​​ke path/to/abc.ext1 也能正常工作。如果我可以重用现有的 .ext1 目标,那就太好了。

【问题讨论】:

当你做“make abc.ext1”时,你想让Make做什么?你想让它建立abc.ext1吗?还是path/to/abc.ext1 path/to/abc.ext1 已经存在,我不想构建它。我希望 echo bla bla 打印出来。正常运行 make abc 打印 echo bla bla。 如果您不努力清楚地提出问题,我们将无法为您提供有用的答案。 你用什么命令来调用 Make? 让我尝试改进它。我正在使用“make path/to/abc.ext1” 【参考方案1】:

让我试着总结一下我所理解的:

    文件path/to/abc.ext1已经存在。 您已经有 make path/to/abc 回显 bla bla 而不创建文件 path/to/abc。 你想让make path/to/abc.ext1 表现得像make path/to/abc。在您当前的设置中它不起作用,因为path/to/abc.ext1 已经存在,所以make 没有理由触发规则来“重建”它。

在您的情况下,您没有构建任何文件 abcabc.ext1,因此您应该真正告诉 make 这些是虚假目标。 (我假设您希望 make abc 工作,即使 abc 已经存在并且比 abc.ext1 更新,对吧?)

对于单个文件,您可以使用以下内容:

.PHONY: path/to/abc.ext1 path/to/abc
path/to/abc.ext1 path/to/abc:
        @echo bla bla

这样,make path/to/abc.ext1make path/to/abc 将始终运行 echo bla bla,而不管 path/to/abc.ext1path/to/abc 是否存在(make 永远不会检查它们的存在)。

不幸的是,.PHONY 需要明确的目标列表。使用 GNU make,您可以使用 $(wildcard...) 计算目标列表,或者如果您需要递归到子目录,使用 $(shell find...)。例如:

EXT1_FILES = $(shell find -type f -name '*.ext1' -print)
PHONY_TARGETS = $(EXT1_FILES) $(EXT1_FILES:.ext1=)

.PHONY: $(PHONY_TARGETS)
$(PHONY_TARGETS):
        @echo bla bla

$(EXT1_FILES:.ext1=) 只是从 $(EXT1_FILES) 中的文件名中删除所有 .ext1 扩展名。

如果您有一棵非常大的树,您将受到$(shell find...) 调用的影响:每次Makefilemake 加载时都会运行它。如果太慢,你可以用显式的文件名列表替换它(可能会自动生成)。

您的问题给出的上下文为零,因此很难提出更有用的替代方案。仍然感觉你在试图滥用make。当您声明“make foo.ext1 应该运行一些命令,即使foo.ext1 存在”之类的内容时,这很可疑。你不能写一个简单的shell脚本,它接受一个参数,并且只要$1$1.ext1存在,echo bla bla就可以吗?这可能比尝试解决make 的语义要容易得多。

【讨论】:

这确实解决了问题中提到的问题。我必须解决make语义,因为echo“bla bla”要复杂得多,并且递归调用回目标。因此,使用 make 语义来做这件事需要对构建系统进行大修。谢谢【参考方案2】:

您只需为abc.ext1 添加规则,然后运行make abc.ext1 即可。仅在没有可用的明确规则时才搜索后缀规则。

如果这对您的情况不起作用,请更清楚地解释您的问题。

【讨论】:

我之前试过这个,但它不起作用,因为 conf 文件在一个文件夹中。看起来 / 在目标中不起作用,建议? 如果我使用 %.ext1: 作为我的目标,它不起作用。它说:使'path/to/abc.ext1'更新到日期。 您需要编辑您的问题以添加这些详细信息。文件位于不同目录等事实对于提供答案绝对至关重要。因为您的问题所包含的信息远远不足以让我们回答。您应该显示您的 makefile,剪切/粘贴您现在键入的命令和输出,然后显示您想要键入的命令以及您在键入它时想要发生的确切内容。 我认为正如您指出的问题是完整路径。使 path/to/abc.ext1 与 %.ext1 不匹配【参考方案3】:

MadScientist 的回答似乎是正确的,但我认为这里有误会。

如果你有这个规则:

%.ext1:
    echo bla bla

make abc.ext1,会发生什么?

【讨论】:

以上是关于GNU 使用文件作为 SUFFIXES 中的目标的主要内容,如果未能解决你的问题,请参考以下文章

GNU make:规则专题

如何在 GNU make 中收集过期依赖项列表?

GNU make:删除生成的文件时如何重建哨兵目标?

插入文件内容作为文件的第一行;在 bash (GNU) 中

GNU项目

GNU Make 中的仅订购目标 - 用于 Microsoft NMAKE?