我正在学习如何使用make和生成文件,所以我写了这个小文件:
%.markdown: %.html
pandoc -o $< $@
Run Code Online (Sandbox Code Playgroud)
但是当我运行时make,我得到的只是make: *** No targets. Stop.发生了什么?
pol*_*lym 19
你的问题是make不知道你的目标。
make stackoverflow.markdown例如,您可以使用上面的 Makefile 运行它,它会起作用。
make 但是, only 会失败,因为您只指定了如何创建目标,而不是指定哪个。
正如leiaz 指出的那样,上述模式规则称为隐式规则。
SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)
.PHONY: all clean
all: $(TAR)
%.markdown: %.html
pandoc -o $< $@
clean:
rm -f $(TAR)
Run Code Online (Sandbox Code Playgroud)
SRC.html通过 Makefile 的 .get获取所有源文件(以 结尾的文件)wildcard。
TAR将 中列出的每个源文件替换为SRC以.markdown而不是结尾的目标.html。
.PHONY列出了总是过时并因此总是被执行的非物理目标 - 这些通常是all和clean。
该目标all具有作为依赖(文件上的右侧列出:全部)*.markdown的文件。这意味着所有这些目标都被执行。
%.markdown: %.html
pandoc -o $< $@
Run Code Online (Sandbox Code Playgroud)
这段代码说:每个以 结尾的目标.markdown都依赖于一个同名的文件,除了依赖以.html. 的通配符%被看作是一个*在壳等。在%右侧,然而,相比于比赛左侧。来源。
请注意,前面的空格序列pandoc是 a TAB,因为make将其定义为标准。
最后,虚假clean目标描述了如何从您使用此 Makefile 创建的文件中清除您的系统。在这种情况下,它会删除所有目标(那些名为*.markdown.
您的 Makefile 中没有定义目标。您可以在命令行上指定目标:make something.markdown将使用配方创建something.markdown自something.html。
或者您可以将指定默认目标的规则添加到您的 Makefile。
all: file1.markdown file2.markdown
Run Code Online (Sandbox Code Playgroud)
或者使用通配符:
all: *.markdown
Run Code Online (Sandbox Code Playgroud)
当您运行 just 时make,第一条规则的第一个目标是默认目标。它不需要被调用all。
所以上面,目标all有你想制作的所有文件作为先决条件,所以当你make all,它会制作所有列出的文件。
| 归档时间: |
|
| 查看次数: |
36230 次 |
| 最近记录: |