Makefile正在使用
.SUFFIXES: .ext1
.ext1:
echo bla bla
我有一个配置文件路径/到/ abc.ext1所以 make path / to / abc 工作正常。
我希望 make path / to / abc.ext1 也能正常工作。如果我可以重用现有的.ext1目标,那将会很棒。
答案 0 :(得分:0)
您只需为abc.ext1
添加规则,然后运行make abc.ext1
即可。只有在没有明确的规则可用时才会搜索后缀规则。
如果这对您的情况不起作用,请更清楚地解释您的问题。
答案 1 :(得分:0)
MadScientist的回答似乎是正确的,但我认为这里存在误传。
如果您有此规则:
%.ext1:
echo bla bla
和你make abc.ext1
,会发生什么?
答案 2 :(得分:0)
让我试着总结一下我的理解:
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
他们的存在)。
不幸的是,$(wildcard...)
需要明确的目标列表。使用GNU make,您可以使用$(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
即使echo bla bla
存在也应该运行某些命令”,那就太可疑了。难道你不能编写一个带有一个参数的简单shell脚本,并且只要$1
或$1.ext1
存在make
吗?它可能比尝试解决{{1}}的语义要容易得多。