如何获取Makefile中的所有规则以记住顶级(通配符)目标的名称

时间:2018-11-26 21:56:43

标签: makefile

当我到处寻找一件简单的事情而找不到时,这使我想知道我是否在做完全错误的事情。我使用的框架在您键入make targetname的情况下,其中makefile不知道targetname,因此它必须选择targetname作为makefile变量并从那里找出其依赖性。我正在尝试这样做,但是我不知道怎么做,而且显然没有人这样做,因为我找不到任何人在谈论如何做。他们谈论的是阳光下的其他一切,而不是谈论如何使用make hooplah作为顶层目标来执行hooplah.html

许多搜索和猜测已经使我了解到下面失败的makefile,而我感到非常沮丧,以至于我在SO上提问会冒着生命危险。万一它使我免受伤害,我会提到我已经阅读了this答案,thisthisthis,并进行了深入研究GNU makefile文档中的number of pages,但无济于事。

我想在命令行上输入make page-72,并让make将page-72.html视为其顶层依赖性整个 makefile,而不仅仅是在顶层规则。其他规则需要了解page-72.html,但是我不知道如何向他们提供信息。

我已经读过MAKECMDGOALS了,但是看来这仅对检查特定目标名称有用;我正在寻找可以允许任何目标名称并将其视为输出文件名的东西。以下是我所拥有的。由于page-72目标,它显示了%,并且$@.html依赖项起作用了,但是我没有找到任何变量允许$@.html规则知道目标名称在命令行上指定的。

%: $@.html
    @echo "Top: dollar-at = $@"

$@.html:
    @echo "html: $@, $%, $<, $?, $^, $+, $|, $*"

我得到以下输出:

html: .html, , , , , , , 
Top: dollar-at = makefile
Top: dollar-at = index

我在概念上错了吗?只是不是这样吗?如果有人可以帮助我摆脱Top: dollar-at = makefile,您将获得加分。干杯

1 个答案:

答案 0 :(得分:2)

是的,您完全错了:)。

在您所寻找的任何地方,没有人像上面所做的那样尝试在先决条件列表中使用诸如$@之类的自动变量,实际上是行不通的。 Automatic variables仅在规则的配方中设置,而不在先决条件列表中设置。

因此,在make扩展目标和前提条件之后,$@变量在那里未设置,并且扩展为空字符串。所以您的规则如下:

%: .html
        @echo "Top: dollar-at = $@"

.html:
        @echo "html: $@, $%, $<, $?, $^, $+, $|, $*"

也许这有助于解释为什么您获得看到的输出。

pattern rule中,词干(与%模式匹配的部分)在目标和先决条件中必须相同。

您要这样编写规则:

%: %.html
        @echo "Top: dollar-at = $@"

%.html:
        @echo "html: $@, $%, $<, $?, $^, $+, $|, $*"

但是,我真的不明白您要做什么。我不知道“整个makefile中的顶级依赖项”是什么意思。而且,从您提供的示例中,我看不出如何期望make生成x.html文件。

要编写一个makefile,您需要为自己创建一组步骤,说:我要构建此目标。要构建它,它将使用这些先决条件。考虑到这些先决条件,它将使用这组命令。然后,针对需要构建的任何先决条件递归地重复该操作。您不必为源文件编写规则(不需要构建的东西)。它们已经存在。

一旦有了这些步骤,就很容易将它们转换成makefile规则。