Makefile 正在使用
.SUFFIXES: .ext1
.ext1:
echo bla bla
我有一个配置文件 path/to/abc.ext1 所以让 path/to/abc工作正常。
我想让path/to/abc.ext1也能正常工作。如果我可以重用现有的 .ext1 目标,那就太好了。
您可以只添加一个规则abc.ext1
,然后运行make abc.ext1
就可以了。仅在没有可用的显式规则时才搜索后缀规则。
如果这对您的情况不起作用,请更清楚地解释您的问题。
MadScientist 的回答似乎是正确的,但我认为这里存在误解。
如果你有这个规则:
%.ext1:
echo bla bla
而你make abc.ext1
,会发生什么?
让我试着总结一下我所理解的:
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
没有理由触发规则来“重建”它。在您的情况下,您没有构建任何文件abc
或abc.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.ext1
ormake path/to/abc
将始终运行echo bla bla
,而不管path/to/abc.ext1
or的存在path/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
从$(EXT1_FILES)
. _
如果你有一棵非常大的树,你会受到$(shell find...)
调用的影响:每次你Makefile
被加载时它都会运行make
。如果它太慢,您可以用显式文件名列表替换它(可能会自动生成)。
您的问题给出了零上下文,因此很难提出更有用的替代方案。仍然感觉你在试图滥用make
。当您声明“make foo.ext1
即使foo.ext1
存在也应该运行一些命令”之类的内容时,这很可疑。你不能写一个简单的shell脚本,它接受一个参数,并且echo bla bla
无论何时$1
或$1.ext1
存在都可以吗?这可能比尝试解决make
's 语义要容易得多。