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

时间:2013-04-04 14:05:48

标签: makefile gnu-make autoconf automake

Makefile正在使用

.SUFFIXES: .ext1

.ext1:
      echo bla bla

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

我希望 make path / to / abc.ext1 也能正常工作。如果我可以重用现有的.ext1目标,那将会很棒。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

如果您有此规则:

%.ext1:
    echo bla bla

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

答案 2 :(得分:0)

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

  1. 文件path/to/abc.ext1已存在。
  2. 您已经make path/to/abc回显bla bla而未创建文件path/to/abc
  3. 你像make path/to/abc.ext1一样表现得像make path/to/abc。在您当前的设置中,它不起作用,因为path/to/abc.ext1已经存在,因此make没有理由触发规则来“重建”它。
  4. 在您的情况下,您没有构建任何文件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他们的存在)。

    不幸的是,$(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}}的语义要容易得多。