使用Make出现“无目标”错误


12

我正在学习如何使用make和生成文件,所以我写了这个小文件:

%.markdown: %.html
    pandoc -o $< $@

但是当我跑步时make,我得到的只是发生了make: *** No targets. Stop.什么事?


这些空格或pandoc命令前的制表符吗?众所周知,Make对于制表符而不是空格非常挑剔。
slm

@slm:这是一个标签。我在某处读到Windows的EOL不兼容,因此我将整个文件转换为Unix兼容的EOL。
艾哈迈德2014年

Answers:


17

问题:

您的问题是您make不了解目标。

make stackoverflow.markdown例如,您可以运行上面的Makefile,它将起作用。

make 但是,仅会失败,因为您仅指定了创建目标的方式,但没有指定目标。

正如leiaz point所指出的那样,上述模式规则称为隐式规则

生成文件:

SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)

.PHONY: all clean

all: $(TAR)

%.markdown: %.html
    pandoc -o $< $@

clean:
    rm -f $(TAR)

说明:

SRC.html通过Makefile的获取所有源文件(以结尾的文件)wildcard

TAR 列出的每个源文件替换SRC以结尾的目标,.markdown而不是.html

.PHONY列出了总是过时并因此始终执行的非物理目标-通常是allclean

目标all具有作为依赖(文件上的右侧列出:全部)*.markdown的文件。这意味着所有这些目标均已执行。

%.markdown: %.html
    pandoc -o $< $@

该代码段说:每个以结尾的目标.markdown都依赖于一个具有相同名称的文件,除了该依赖关系以结尾.html。的通配符%被看作是一个*在壳等。在%右侧,然而,相比于比赛左侧。来源

请注意,位于前面的空格序列pandocTAB,因为make将其定义为标准。

最后,phony clean目标描述了如何清除使用此Makefile创建的文件中的系统。在这种情况下,它将删除所有目标(名为的文件*.markdown


1
很好的答案,这些是我在进一步了解它时发现的其他链接:通配符函数替换引用伪造目标
艾哈迈德2014年

请再问一个问题:可以makefile从头开始创建文件还是仅更新现有文件?因为当我删除生成的文件时,它停止工作。我知道这个愚蠢的问题,但这对我来说是纽芬兰^^“
艾哈迈德(Ahmed)2014年

1
您的意思是如果没有.markdown文件,那么将创建它们吗?是的,据我所知应该这样做
polym 2014年

1
那好吧 我会做更多的挖掘。谢谢您的回答,谢谢您,我现在走对了路
:)

1
只想感谢您的出色回答。您所解释的方式非常容易理解,该命令无法正常工作的原因以及如何执行的非常详细的说明。再次感谢。
zanona

5

模式规则是隐式规则。

您的Makefile中没有定义目标。你可以在命令行上的目标:make something.markdown将使用的配方创建something.markdownsomething.html

或者,您可以将一个指定默认目标的规则添加到Makefile中。

all: file1.markdown file2.markdown

使用通配符:

all: *.markdown

当您仅运行时make第一个规则的第一个目标是默认目标。不需要调用它all

因此,在上面,目标all将您要制作的所有文件作为先决条件,因此当您使用时make all,它将制作所有列出的文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.