【问题标题】:Makefile- How to define variables in a target that creates other targets?Makefile-如何在创建其他目标的目标中定义变量?
【发布时间】:2015-02-20 15:11:27
【问题描述】:

我不完全了解如何使用特定于目标的变量来充当目标本身,拥有自己的依赖项和配方。

有效但不使用目标特定变量的示例 Makefile:

VAR=progName
ATARGET: $(VAR)
    @echo Do actions for $@ based on the completed target $(VAR)
$(VAR):
    @echo Do actions on $@

制作目标

对 progName 执行操作

根据完成的目标 progName 对 ATARGET 执行操作

在尝试使用特定于目标的变量时不起作用的 Makefile(请注意在执行 make 时缺少“对 progName 执行操作”):

ATARGET:VAR=progName
ATARGET: $(VAR)
    @echo Do actions for $@ based on the completed target $(VAR)
$(VAR):
    @echo Do actions on $@

制作目标

根据完成的目标 progName 对 ATARGET 执行操作

所需的 Makefile 行为:

ATARGET:VAR=progName
ATARGET: $(VAR)
    @echo Do actions for $@ based on the completed target $(VAR)

BTARGET:VAR=otherProgName
BTARGET: $(VAR)
    @echo Do actions for $@ based on the completed target $(VAR)

$(VAR):
    @echo Do actions on $@

制作目标

对 progName 执行操作

根据完成的目标 progName 对 ATARGET 执行操作

制作BTARGET

对 otherProgName 执行操作

根据完成的目标 otherProgName 对 BTARGET 执行操作

这些是用于说明问题的简单 Makefile - 实际的 makefile 有几个目标,具体取决于 VAR 的值。

PGM = $(VAR)_test.exe;
LIB = lib$(VAR).a;
LIBLINKNAME = $(VAR);

【问题讨论】:

  • 您不完全理解它的原因是您尝试做的事情是不可能的。请参阅目标特定变量的手册,其中明确指出 与自动变量一样,这些值仅在目标配方的上下文中可用。另一个规则定义不是“在目标配方的上下文中”。但是,根据您的其他示例,您无论如何都不需要这样做,正如 Wintermute 所示。

标签: makefile


【解决方案1】:

您不能根据正在构建的目标更改 make 变量的值;在所有这些之前处理它们。但是,您可以拥有具有多个目标的规则,并使用它们产生您想要的行为。例如:

VAR = progName otherProgName

ATARGET: progName
    echo Do actions for $@ based on the completed target $<

BTARGET: otherProgName
    echo Do actions for $@ based on the completed target $<

$(VAR):
    echo Do actions on $@

VAR 现在不再是一个非常好的名字(也许更好地称呼它为LIST 或其他名称)。这样,相同的配方适用于 progNameotherProgName 目标,生成哪一个取决于您正在构建的目标的先决条件。

结合字符串处理函数,这适用于更复杂的用例。例如,您可以使用

# pattern substitution: append _test.exe to all entries in VAR
PGM = $(VAR:%=%_test.exe)

$(PGM):
    recipe for individual *_test.exe programs here.

您可能也非常static pattern rules感兴趣。

【讨论】:

  • 谢谢!有时答案是“你不能那样做,但你可以通过另一种方式获得几乎相同的结果”。会试试的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多