Makefile:带空格的先决条件
更新:GNU Make 3.81,Ubuntu 12.04 我有一组标记文件,我想编译成(比如)html文件,所以这是我的规则:Makefile:带空格的先决条件,makefile,gnu-make,Makefile,Gnu Make,更新:GNU Make 3.81,Ubuntu 12.04 我有一组标记文件,我想编译成(比如)html文件,所以这是我的规则: %.html: %.md pandoc $< -o $@ 如何在必备文件名有空格的地方编写通用规则%.html:%.md 我可以使用以下方法来解决此问题: foo\ bar.html: foo\ bar.md pandoc $< -o $@ foo\bar.html:foo\bar.md 潘多克$
%.html: %.md
pandoc $< -o $@
如何在必备文件名有空格的地方编写通用规则%.html:%.md
我可以使用以下方法来解决此问题:
foo\ bar.html: foo\ bar.md
pandoc $< -o $@
foo\bar.html:foo\bar.md
潘多克$<-o$@
但是,当我更愿意使用%
结构时,我必须为我拥有的每个这样的源文件手动写出这个规则。我唯一的希望是做一些$(foreach f,$(获取*.md文件列表),$(eval$(调用函数生成规则))
?编辑
显然make在推理规则中对空格的支持取决于您使用的GNU make的变体。它只是神奇地与Gentoo的补丁sys-devel/make-3.82-r4配合使用(与Gentoo的make 3.81-r2配合使用失败)。在快速检查make-3.82的变更日志、新闻或Gentoo补丁时,我没有注意到任何解释。因此,使用空格的隐式规则可能只是make-3.82本身的一个侥幸,甚至是Gentoo的补丁集。GNU对目标中空白的官方支持在“仍然开放”中进行跟踪
原始错误答案
您可以使用shell支持的任何引用字符<代码>生成在执行宏替换时忽略它们,并将它们直接传递给shell。比如说,
.SUFFIXES: .md .html
.md.html:
pandoc "$(<)" > "$(@)"
这是用一个名为a“b”c.md
的文件测试的,该文件成功地创建了a“b”c.html
(免责声明:我使用了折扣的降价
命令而不是pandoc)。
显然make在推理规则中对空格的支持取决于您使用的GNU make的变体。它只是神奇地与Gentoo的补丁sys-devel/make-3.82-r4配合使用(与Gentoo的make 3.81-r2配合使用失败)。在快速检查make-3.82的变更日志、新闻或Gentoo补丁时,我没有注意到任何解释。因此,使用空格的隐式规则可能只是make-3.82本身的一个侥幸,甚至是Gentoo的补丁集。GNU对目标中空白的官方支持在“仍然开放”中进行跟踪
原始错误答案
您可以使用shell支持的任何引用字符<代码>生成在执行宏替换时忽略它们,并将它们直接传递给shell。比如说,
.SUFFIXES: .md .html
.md.html:
pandoc "$(<)" > "$(@)"
这是用一个名为a“b”c.md
的文件测试的,该文件成功地创建了a“b”c.html
(免责声明:我使用了折扣的降价
命令而不是pandoc)。
显然make在推理规则中对空格的支持取决于您使用的GNU make的变体。它只是神奇地与Gentoo的补丁sys-devel/make-3.82-r4配合使用(与Gentoo的make 3.81-r2配合使用失败)。在快速检查make-3.82的变更日志、新闻或Gentoo补丁时,我没有注意到任何解释。因此,使用空格的隐式规则可能只是make-3.82本身的一个侥幸,甚至是Gentoo的补丁集。GNU对目标中空白的官方支持在“仍然开放”中进行跟踪
原始错误答案
您可以使用shell支持的任何引用字符<代码>生成在执行宏替换时忽略它们,并将它们直接传递给shell。比如说,
.SUFFIXES: .md .html
.md.html:
pandoc "$(<)" > "$(@)"
这是用一个名为a“b”c.md
的文件测试的,该文件成功地创建了a“b”c.html
(免责声明:我使用了折扣的降价
命令而不是pandoc)。
显然make在推理规则中对空格的支持取决于您使用的GNU make的变体。它只是神奇地与Gentoo的补丁sys-devel/make-3.82-r4配合使用(与Gentoo的make 3.81-r2配合使用失败)。在快速检查make-3.82的变更日志、新闻或Gentoo补丁时,我没有注意到任何解释。因此,使用空格的隐式规则可能只是make-3.82本身的一个侥幸,甚至是Gentoo的补丁集。GNU对目标中空白的官方支持在“仍然开放”中进行跟踪
原始错误答案
您可以使用shell支持的任何引用字符<代码>生成在执行宏替换时忽略它们,并将它们直接传递给shell。比如说,
.SUFFIXES: .md .html
.md.html:
pandoc "$(<)" > "$(@)"
这是用一个名为
a“b”c.md
的文件测试的,该文件成功地创建了a“b”c.html
(免责声明:我使用了折扣的markdown
命令而不是pandoc)。从@binki的说法来看,GNU make 3.82可能没有这个问题,但不幸的是,我没有从我的Ubuntu12.04机器上的v3.81更新的选项
我通过使用SECONDEXPANSION在前提条件中用反斜杠替换空格来“解决”它(因此foo bar.md
的前提条件变成foo\bar.md
)
#使用单个空格定义变量
空间:=
空间+=
.第二次扩展:
%.html:$$(subst$$(空格),\$$(空格),%).md
pandoc“$从@binki的说法来看,GNU make 3.82可能没有这个问题,但不幸的是,我没有从我的Ubuntu 12.04机器上的v3.81更新的选项
我通过使用SECONDEXPANSION在前提条件中用反斜杠替换空格来“解决”它(因此foo bar.md
的前提条件变成foo\bar.md
)
#使用单个空格定义变量
空间:=
空间+=
.第二次扩展:
%.html:$$(subst$$(空格),\$$(空格),%).md
pandoc“$从@binki的说法来看,GNU make 3.82可能没有这个问题,但不幸的是,我没有从我的Ubuntu 12.04机器上的v3.81更新的选项
我通过使用SECONDEXPANSION在前提条件中用反斜杠替换空格来“解决”它(因此foo bar.md
的前提条件变成foo\bar.md
)
#定义