在错误的目录中搜索源代码

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

我进行了相当多的搜索来找到这个问题的解决方案,但没有运气。 我有一些生成 HTML 的源代码,并为此使用

Makefile
。目录结构为:

main/
main/Makefile
main/src
main/src/dox
main/src/dox/generate.rb
...

Makefile 的相关部分是:

sources := $(shell find src -name "*rb" )
pages := $(sources:src/%.rb=%.html)

all: $(pages)

%.html: src/%.rb
        ruby $< > $@

make -dr
产生:

(snip)
Considering target file 'dox/generate.html'.
   File 'dox/generate.html' does not exist.
   Looking for an implicit rule for 'dox/generate.html'.
   Trying pattern rule with stem 'generate'.
   Trying implicit prerequisite 'dox/src/generate.rb'.
   Trying pattern rule with stem 'generate'.
   Trying implicit prerequisite 'dox/src/generate.rb'.
   Looking for a rule with intermediate file 'dox/src/generate.rb'.
    Avoiding implicit rule recursion.
   No implicit rule found for 'dox/generate.html'.
   Finished prerequisites of target file 'dox/generate.html'.
  Must remake target 'dox/generate.html'.
make: *** No rule to make target 'dox/generate.html', needed by 'build'.  Stop.`

我该如何纠正这个问题?

显然,

make
正在错误的目录中寻找源文件,但规则看起来非常简单明了。

makefile gnu-make
1个回答
0
投票

显然,make 正在错误的目录中寻找源文件,但规则看起来非常简单明了。

当然,“错误”是指“不是您希望它查找的目录”。这里没有实际的不当行为,因为

make
的行为与 记录的完全相同。

make
考虑构建目标
dox/generate.html
问题中的模式规则时,模式与stem
dox/generate
匹配。该干中的主要目录很重要。 当目标模式没有任何文字目录组件时

当先决条件转为文件名时,将主干中的目录添加到前面,而主干的其余部分将替换“%”。

(GNU制作手册)

这就是 GNU

make
支持模式规则的方式,用于在与其相应源相同的目录中构建目标,无论目录是什么。这是
make
的传统做法。

这就是为什么当主干为

make
并且先决条件模式为
dox/src/generate.rb
时,您会看到
dox/generate.html
正在寻找文件
src/%.html

尚不清楚您想要使用此规则构建哪些其他文件,但这可能就是您正在寻找的:

dox/%.html: src/%.rb
        ruby $< > $@

当目标模式确实具有显式前导目录组件时,则将词干视为平面字符串,而不对目录组件进行特殊处理。

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