不对先决条件

时间:2017-12-20 16:39:59

标签: makefile gnu-make

所以,我有一个带有2个模式规则的Makefile,其中一个是终端Match-Anything;目标是about.html(例如):

vpath %.md $(SOURCE_DIR)
HEADER := assets/navbar.part

%.html : %.md $(HEADER)
        pandoc [...] $< -o $@

%::
        cp $(SOURCE_DIR)/$@ $@

如果我执行make assets/navbar.part,然后make about.html(例如),一切正常(navbar.part使用匹配任何内容,而about.html使用第一个规则)。但是,如果我在没有make about.html的情况下尝试navbar.partmake会这样做:

  1. 找到先决条件about.md
  2. ?放弃履行$(HEADER)
  3. 尝试使用匹配任何规则来生成about.html
  4. 我期待make会:

    1. 找到先决条件about.md
    2. 使用match-anything规则
    3. 制作先决条件$(HEADER)
    4. 满足所有先决条件后,最后执行第一条规则
    5. 从阅读调试跟踪看起来似乎Make永远不会真正尝试满足$(HEADER)先决条件:

      Considering target file 'about.html'.
       File 'about.html' does not exist.
       Looking for an implicit rule for 'about.html'.
       Trying pattern rule with stem 'about'.
       Trying implicit prerequisite 'about.md'.
       Found prerequisite 'about.md' as VPATH '../website/about.md'
       Trying rule prerequisite 'assets/navbar.part'.
       Trying pattern rule with stem 'about.html'.
       Found an implicit rule for 'about.html'.
        Considering target file 'about.md'.
         Finished prerequisites of target file 'about.md'.
        No need to remake target 'about.md'; using VPATH name '../website/about.md'.
       Finished prerequisites of target file 'about.html'.
      Must remake target 'about.html'.
      cp -f ../website/about.html about.html
      

      有什么想法吗?

1 个答案:

答案 0 :(得分:1)

在挖掘手册后,我发现section 10.8表示:

对于列表中的每个模式规则:

  • 找到词干s,它是目标模式中'或'匹配的t或n的非空部分。
  • 通过将s替换为'%'来计算先决条件名称;如果目标模式不包含斜杠,请将d附加到每个先决条件名称的前面。
  • 测试是否存在所有先决条件或应该存在。 (如果在makefile中提到文件名作为目标或作为显式先决条件,那么我们说它应该存在。)

因为$(HEADER)不符合ought to exist的定义:

  • 尝试使用规则时不存在文件
  • 没有显式目标存在的规则
它失败了;但是,如果我们尝试make专门用$(HEADER),然后尝试make about.html它就会成功,因为当时$(HEADER)是一个现有文件。