0

Makefile 正在使用

.SUFFIXES: .ext1

.ext1:
      echo bla bla

我有一个配置文件 path/to/abc.ext1 所以让 path/to/abc工作正常。

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

4

3 回答 3

0

您可以只添加一个规则abc.ext1,然后运行make abc.ext1就可以了。仅在没有可用的显式规则时才搜索后缀规则。

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

于 2013-04-04T14:13:46.507 回答
0

MadScientist 的回答似乎是正确的,但我认为这里存在误解。

如果你有这个规则:

%.ext1:
    echo bla bla

而你make abc.ext1,会发生什么?

于 2013-04-04T15:14:17.620 回答
0

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

  1. 该文件path/to/abc.ext1已经存在。
  2. 您已经在没有创建文件的情况下进行了make path/to/abc回显。bla blapath/to/abc
  3. 你会喜欢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.ext1ormake path/to/abc将始终运行echo bla bla,而不管path/to/abc.ext1or的存在path/to/abcmake永远不会检查它们的存在)。

不幸的是,.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$(EXT1_FILES). _

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

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

于 2013-04-08T14:08:32.833 回答