Makefile中带目录的通用模式规则匹配失效的解决方法问询
GNU Make 特定目录模式规则的通用匹配方案
问题说明
通用模式规则%.txt:可以匹配任意层级路径下的.txt文件,比如执行make foo.txt、make foo/bar/baz.txt都能正常生成对应文件。但定义如下特定目录规则时:
doc/%.txt: echo "bla bla" >$@ data/%.txt: echo "bla bla bla" >$@
仅能匹配直接位于doc/或data/根目录下的文件(如doc/foo.txt),无法匹配嵌套路径中对应目录下的文件(如foo/bar/doc/baz.txt)。这是因为GNU Make的模式匹配机制中,单个%默认不会匹配包含斜杠的文本,doc/%.txt里的%只能匹配无斜杠的文件名,因此无法覆盖带前置子目录的场景。
解决方案
修改模式规则,使用两个%通配符分别匹配目标路径中特定目录(doc//data/)之前的任意路径部分,以及特定目录之后的文件名部分:
%doc/%.txt: echo "bla bla" >$@ %data/%.txt: echo "bla bla bla" >$@
该模式可以同时匹配两种场景:
- 直接位于根目录下的
doc//data/文件(如doc/foo.txt,第一个%匹配空字符串,第二个%匹配foo) - 嵌套路径中的
doc//data/文件(如foo/bar/doc/baz.txt,第一个%匹配foo/bar/,第二个%匹配baz)
此方案无需重复定义规则,也不需要修改目标文件名,完美适配需求。
内容的提问来源于stack exchange,提问作者ovmjm
相关产品推荐
相关产品推荐

