提供与 makefile 目标同名的第二个文件
Supplying a second file with same name as makefile target
我在搜索答案时遇到问题,因为我不知道要使用的术语,但到目前为止,我的所有搜索都没有成功。我有以下设置:
prependix.html
包含 <html>
标签、<head>...</head>
和指向 CSS 文件等的各种链接。
appendix.html
包含大多数内容的结束标记,即 </html>
等
- 然后我在
content/
目录中有一个文件列表,其中包含 foo.html
之类的东西,它基本上只是我通过 pandoc 从 emacs org 模式生成的 <body>...</body>
片段。
这是我目前使用的 makefile:
CXX=cat
CXXPRE=templates/prependix.html
CXXPOST=templates/appendix.html
TARGETS=staging/index.html staging/foo.html staging/bar.html staging/baz.html staging/quux.html
default: $(TARGETS)
stage1/%.html: content/%.org
mkdir -p stage1/
pandoc $< -o $@
staging/%.html: stage1/%.html
mkdir -p staging/
$(CXX) $(CXXPRE) $< $(CXXPOST) > $@
clean:
rm -rf staging/
rm -rf stage1/
deploy:
mkdir -p staging/css
cp content/css/styles.css staging/css/
mkdir -p staging/img
cp content/img/*.png staging/img/
cp content/img/*.jpg staging/img/
rsync -a --delete staging/ $(URI):/home/me/www/mysite.tld
该 makefile 有效,但我意识到我无法指定每个文件的 <meta>
标记,但我想这样做。所以我将把附录分成两部分,并提供例如foo.meta
、bar.meta
等将仅包含 <meta>
标签。如果我在命令行上进行单个连接,我会这样执行:
$ cat templates/prependix.html foo.meta templates/prependix2.html foo.html templates/appendix.html > final-product.html
作为制定规则,类似于:
$(CXX) $(CXXPRE) [somehow specify the .meta file here] $(CXXPRE2) $< $(CXXPOST) > $@
我该怎么做?有可能吗?
请在下面找到可以解决问题的代码。
您可以将所有 .meta 文件放在 stage1 文件夹中。示例:stage1/foo.meta 并使用 stage1/$(*).meta
。这将实现为 stage1/foo.meta
CXX=cat
CXXPRE=templates/prependix.html
CXXPOST=templates/appendix.html
TARGETS=staging/index.html staging/foo.html staging/bar.html staging/baz.html staging/quux.html
default: $(TARGETS)
stage1/%.html: content/%.org
mkdir -p stage1/
pandoc $< -o $@
# You can add dependency stage1/%.meta if needed or remove it as per your need
staging/%.html: stage1/%.meta stage1/%.html
mkdir -p staging/
$(CXX) $(CXXPRE) stage1/$(*).meta $< $(CXXPOST) > $@
clean:
rm -rf staging/
rm -rf stage1/
deploy:
mkdir -p staging/css
cp content/css/styles.css staging/css/
mkdir -p staging/img
cp content/img/*.png staging/img/
cp content/img/*.jpg staging/img/
rsync -a --delete staging/ $(URI):/home/me/www/mysite.tld
请注意,以上只是一个示例,旨在为您提供可修改且有效的解决方案。
同样基于 Raspy 注释,您可以替换 stage1/$(*).meta with $(word 2, $^)$(CXXPOST) > $@
,两者都会给出相同的结果,但会避免依赖项和配方
之间的差异
我在搜索答案时遇到问题,因为我不知道要使用的术语,但到目前为止,我的所有搜索都没有成功。我有以下设置:
prependix.html
包含<html>
标签、<head>...</head>
和指向 CSS 文件等的各种链接。appendix.html
包含大多数内容的结束标记,即</html>
等- 然后我在
content/
目录中有一个文件列表,其中包含foo.html
之类的东西,它基本上只是我通过 pandoc 从 emacs org 模式生成的<body>...</body>
片段。
这是我目前使用的 makefile:
CXX=cat
CXXPRE=templates/prependix.html
CXXPOST=templates/appendix.html
TARGETS=staging/index.html staging/foo.html staging/bar.html staging/baz.html staging/quux.html
default: $(TARGETS)
stage1/%.html: content/%.org
mkdir -p stage1/
pandoc $< -o $@
staging/%.html: stage1/%.html
mkdir -p staging/
$(CXX) $(CXXPRE) $< $(CXXPOST) > $@
clean:
rm -rf staging/
rm -rf stage1/
deploy:
mkdir -p staging/css
cp content/css/styles.css staging/css/
mkdir -p staging/img
cp content/img/*.png staging/img/
cp content/img/*.jpg staging/img/
rsync -a --delete staging/ $(URI):/home/me/www/mysite.tld
该 makefile 有效,但我意识到我无法指定每个文件的 <meta>
标记,但我想这样做。所以我将把附录分成两部分,并提供例如foo.meta
、bar.meta
等将仅包含 <meta>
标签。如果我在命令行上进行单个连接,我会这样执行:
$ cat templates/prependix.html foo.meta templates/prependix2.html foo.html templates/appendix.html > final-product.html
作为制定规则,类似于:
$(CXX) $(CXXPRE) [somehow specify the .meta file here] $(CXXPRE2) $< $(CXXPOST) > $@
我该怎么做?有可能吗?
请在下面找到可以解决问题的代码。
您可以将所有 .meta 文件放在 stage1 文件夹中。示例:stage1/foo.meta 并使用 stage1/$(*).meta
。这将实现为 stage1/foo.meta
CXX=cat
CXXPRE=templates/prependix.html
CXXPOST=templates/appendix.html
TARGETS=staging/index.html staging/foo.html staging/bar.html staging/baz.html staging/quux.html
default: $(TARGETS)
stage1/%.html: content/%.org
mkdir -p stage1/
pandoc $< -o $@
# You can add dependency stage1/%.meta if needed or remove it as per your need
staging/%.html: stage1/%.meta stage1/%.html
mkdir -p staging/
$(CXX) $(CXXPRE) stage1/$(*).meta $< $(CXXPOST) > $@
clean:
rm -rf staging/
rm -rf stage1/
deploy:
mkdir -p staging/css
cp content/css/styles.css staging/css/
mkdir -p staging/img
cp content/img/*.png staging/img/
cp content/img/*.jpg staging/img/
rsync -a --delete staging/ $(URI):/home/me/www/mysite.tld
请注意,以上只是一个示例,旨在为您提供可修改且有效的解决方案。
同样基于 Raspy 注释,您可以替换 stage1/$(*).meta with $(word 2, $^)$(CXXPOST) > $@
,两者都会给出相同的结果,但会避免依赖项和配方