【问题标题】:Make: Target name in RuleMake:规则中的目标名称
【发布时间】:2018-06-30 10:20:17
【问题描述】:

我创建了一个Makefile 来生成pdfhtml 用于在调用make 时提到的make a.md 之类的文件应该生成a.pdfa.html,并且不应转换其他@987654329 @目录中存在的文件。

My make file

但我遇到了错误Nothing to be done for a.md

您能建议更改吗?

【问题讨论】:

    标签: makefile build gnu-make


    【解决方案1】:

    因为a.md 已经到位,make 确实无事可做。例如,您可以使用 a 作为指定的目标(它可以依赖 pdf 和 html 文件作为先决条件)。或者通过变量传递所需的源并从中确定所需的目标。


    一个(后者)选项是这样的:

    EXPORTED= $(SOURCE:%.md=%.html) $(SOURCE:%.md=%.pdf)
    
    %.html : %.md
            pandoc -o $@ $<
    
    %.pdf : %.md
            pandoc -o $@ $<
    
    all: $(EXPORTED)
    

    您可以使用make SOURCE=a.md 拨打电话。


    另一个选项(前):

    %.html : %.md
            pandoc -o $@ $<
    
    %.pdf : %.md
            pandoc -o $@ $<
    
    .PHONY: $(MAKECMDGOALS)
    $(MAKECMDGOALS): $(MAKECMDGOALS:%=%.html) $(MAKECMDGOALS:%=%.pdf)
    

    允许您拨打make a


    但要重申。您不能使用(现有)源作为目标,因为 make 会(就像它所做的那样)得出结论,它已经完成了该目标。


    除了(但我个人不太喜欢这样,因为它让 IMO 感到困惑),如果你坚持,你可以对之前的镜头做一些变化......但使用 *.md 目标......你们都声明了作为.PHONY。 IE。不是真正的文件,总是要考虑/重新制作:

    %.html : %.md
        echo pandoc -o $@ $<
    
    %.pdf : %.md
        echo pandoc -o $@ $<
    
    .PHONY: $(MAKECMDGOALS)
    $(MAKECMDGOALS): $(MAKECMDGOALS:%.md=%.html) $(MAKECMDGOALS:%.md=%.pdf)
    

    现在您确实可以致电make a.md。我还是更喜欢以上两种中的一种。

    【讨论】:

    • 感谢回复,其实我想创建一个通用的makefile。所以,我想将目标名称作为输入(在调用 make 时)。如何在调用 make 时通过变量传递所需的源?
    • 感谢您帮助我!! :)
    • 该解决方案有效,但如果我们不需要在调用 make 时传递带有值的变量名,它可能会更优雅。不能只取make a.md 之类的值并将其存储在 SOURCE 变量中吗?
    • 非常感谢!
    • 希望这会有所帮助...现在有多种可供选择。我个人可能会选择中间的例子,即开头段落中的第一个选项。
    猜你喜欢
    • 2019-10-27
    • 2017-10-13
    • 1970-01-01
    • 2013-06-13
    • 2015-07-31
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    相关资源
    最近更新 更多