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,所以 make path/to/abc 可以正常工作。
我希望 make 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
没有理由触发规则来“重建”它。
在您的情况下,您没有构建任何文件 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
或 make path/to/abc
将始终运行 echo bla bla
,而不管 path/to/abc.ext1
或 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_FILES)
中的文件名中删除所有 .ext1
扩展名。
如果您有一棵非常大的树,您将受到$(shell find...)
调用的影响:每次Makefile
由make
加载时都会运行它。如果太慢,你可以用显式的文件名列表替换它(可能会自动生成)。
您的问题给出的上下文为零,因此很难提出更有用的替代方案。仍然感觉你在试图滥用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 中的目标的主要内容,如果未能解决你的问题,请参考以下文章