我正在学习如何使用make
makefile,所以我写了这个小文件:
%.markdown: %.html
pandoc -o $< $@
但当我跑步时make
,我得到的只是“make: *** No targets. Stop.
发生了什么事?”
答案1
问题:
你的问题是make
不知道你的目标。
例如,您可以运行上面的 Makefile make stackoverflow.markdown
,它将起作用。
make
但是,only 会失败,因为您只指定了如何创建目标,但没有指定创建目标。
生成文件:
SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)
.PHONY: all clean
all: $(TAR)
%.markdown: %.html
pandoc -o $< $@
clean:
rm -f $(TAR)
解释:
SRC
.html
通过 Makefile获取所有源文件(以 结尾的)wildcard
。
柏油替代品列出的每个源文件的SRC
目标都以..markdown
而不是. 结尾。.html
。假列出总是过时的非物理目标,因此总是被执行 - 这些通常是all
和clean
。
这目标all
具有依赖项(在右侧列出的文件:
)所有*.markdown
文件。这意味着所有这些目标都已执行。
%.markdown: %.html
pandoc -o $< $@
此代码片段表示:每个以 结尾的目标.markdown
都依赖于具有相同名称的文件,但依赖关系以.html
.这通配符%
被视为类似于*
shell。然而,右侧的比赛%
与左侧的比赛进行了比较。来源。
笔记前面的空白序列pandoc
是 a TAB,因为make
将其定义为标准。
最后,虚假clean
目标描述了如何清除系统中使用此 Makefile 创建的文件。在这种情况下,它将删除所有目标(那些名为*.markdown
.
答案2
您的 Makefile 中没有定义目标。您可以在命令行上指定目标:make something.markdown
将使用配方something.markdown
来创建something.html
。
或者您可以向 Makefile 添加指定默认目标的规则。
all: file1.markdown file2.markdown
或者使用通配符:
all: *.markdown
当你刚刚跑步时make
,第一条规则的第一个目标是默认目标。它不需要被调用all
。
因此,上面,目标all
具有您想要制作的所有文件作为先决条件,因此当您 时make all
,它将制作所有列出的文件。