不使用Match Anything规则作为先决条件

问题描述 投票:0回答:1

所以,我有一个带有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.part存在,make做:

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

我期待make会:

  1. 找到about.md的先决条件
  2. 使用match-anything规则制作先决条件$(HEADER)
  3. 在满足所有先决条件的情况下,最终执行第一条规则

从阅读调试跟踪,似乎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

有任何想法吗?

makefile gnu-make
1个回答
1
投票

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

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

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

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

  • 尝试执行规则时不存在任何文件
  • 没有具有该显式目标的规则

它失败;然而,如果我们尝试make专门$(HEADER),然后尝试make about.html它成功,它成功,因为那时$(HEADER)是一个现有的文件。

© www.soinside.com 2019 - 2024. All rights reserved.