我正在学习如何使用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 次 |
最近记录: |