当我到处寻找一件简单的事情而找不到时,这使我想知道我是否在做完全错误的事情。我使用的框架在您键入make targetname
的情况下,其中makefile不知道targetname
,因此它必须选择targetname
作为makefile变量并从那里找出其依赖性。我正在尝试这样做,但是我不知道怎么做,而且显然没有人这样做,因为我找不到任何人在谈论如何做。他们谈论的是阳光下的其他一切,而不是谈论如何使用make hooplah
作为顶层目标来执行hooplah.html
。
许多搜索和猜测已经使我了解到下面失败的makefile,而我感到非常沮丧,以至于我在SO上提问会冒着生命危险。万一它使我免受伤害,我会提到我已经阅读了this答案,this,this和this,并进行了深入研究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
,您将获得加分。干杯
答案 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规则。