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



当我到处寻找一件简单的事情却找不到它时,我会怀疑自己是否在做完全错误的事情。我使用过键入make targetname的框架,其中targetname不为makefile所知,因此它必须选择targetname作为makefile变量,并从中找出其依赖关系。我正在努力做到这一点,但我不知道如何做到,显然没有人这样做,因为我找不到任何人在谈论如何做到这一步。他们谈论的是阳光下的其他一切,但不是如何使用hooplah.html作为顶级目标来执行make hooplah

经过大量的搜索和猜测,我已经找到了下面失败的makefile,我很沮丧,在这里我冒着生命危险问了一个关于so的问题。如果这能让我免受伤害,我会提到我已经阅读了这个so的答案,这个,这个,还有这个,以及GNU makefile文档中的一些页面,但都无济于事。

我想在命令行上键入make page-72,并让make在整个makefile中将page-72.html视为其顶级依赖项,而不仅仅是在顶级规则中。其他规则需要了解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,可以获得额外积分。干杯

是的,你完全错了:(。

在您查看的任何一个地方,都没有像您上面所做的那样,有人试图在先决条件列表中使用$@这样的自动变量,但事实上,这是行不通的。自动变量仅在规则的配方中设置,而不在先决条件列表中设置。

因此,在make扩展您的目标和先决条件后,$@变量将取消设置,并扩展为空字符串。所以你的规则是这样的:

%: .html
@echo "Top: dollar-at = $@"
.html:
@echo "html: $@, $%, $<, $?, $^, $+, $|, $*"

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

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

你想这样写你的规则:

%: %.html
@echo "Top: dollar-at = $@"
%.html:
@echo "html: $@, $%, $<, $?, $^, $+, $|, $*"

然而,我真的不明白你想做什么。我不知道你所说的"整个makefile的顶级依赖"是什么意思。从您给出的示例中,我看不出make是如何构建x.html文件的。

要编写makefile,您需要为自己创建一组步骤,上面写着:我想构建这个目标。要构建它,它将使用这些先决条件。考虑到这些先决条件,它将使用这组命令。然后,对于需要构建的任何先决条件,您都可以递归地重复这一过程。您不必为源文件(不必构建的东西(编写规则。它们已经存在。

一旦你有了这些步骤,就可以很容易地将它们转化为makefile规则。

最新更新