我进行了相当多的搜索来找到这个问题的解决方案,但没有运气。 我有一些生成 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
正在错误的目录中寻找源文件,但规则看起来非常简单明了。
显然,make 正在错误的目录中寻找源文件,但规则看起来非常简单明了。
当然,“错误”是指“不是您希望它查找的目录”。这里没有实际的不当行为,因为
make
的行为与 记录的完全相同。
当
make
考虑构建目标dox/generate.html
问题中的模式规则时,模式与stemdox/generate
匹配。该干中的主要目录很重要。 当目标模式没有任何文字目录组件时,
当先决条件转为文件名时,将主干中的目录添加到前面,而主干的其余部分将替换“%”。
(GNU制作手册)
这就是 GNU
make
支持模式规则的方式,用于在与其相应源相同的目录中构建目标,无论目录是什么。这是make
的传统做法。
这就是为什么当主干为
make
并且先决条件模式为 dox/src/generate.rb
时,您会看到 dox/generate.html
正在寻找文件 src/%.html
。
尚不清楚您想要使用此规则构建哪些其他文件,但这可能就是您正在寻找的:
dox/%.html: src/%.rb
ruby $< > $@
当目标模式确实具有显式前导目录组件时,则将词干视为平面字符串,而不对目录组件进行特殊处理。