提供与 makefile 目标同名的第二个文件

Supplying a second file with same name as makefile target

我在搜索答案时遇到问题,因为我不知道要使用的术语,但到目前为止,我的所有搜索都没有成功。我有以下设置:

这是我目前使用的 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.metabar.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) > $@ ,两者都会给出相同的结果,但会避免依赖项和配方

之间的差异