【问题标题】:Makefile target name compared to stringMakefile 目标名称与字符串比较
【发布时间】:2020-02-29 19:35:55
【问题描述】:

在 makefile 中,我尝试将目标名称与字符串进行比较,并根据此设置一个带有字符串或其他字符串的变量。 这个例子说明了我正在尝试做的事情:

ifeq ($@,"Target_A")
 THE_PATH="Path_a"
 THE_TARGET=$@
else
 THE_PATH="Path_b"
 THE_TARGET=$@
endif

Target_A:
    @echo $(THE_PATH)
    @echo $(THE_TARGET)

Target_B:
    @echo $(THE_PATH)
    @echo $(THE_TARGET)

这是我调用 make 传递 Target_A 和调用它传递 Target_B 时的输出:

$ make Target_A
Path_b
Target_A

$ make Target_B
Path_b
Target_B

我总是得到“Path_b”的事实表明 ifeq 总是评估为假,但你可以看到 $@ 包含正确的字符串。

为什么这不起作用?

【问题讨论】:

  • 你对make Target_A Target_B有什么要求?

标签: makefile


【解决方案1】:

您可能需要特定于目标的变量:

Target_A: THE_PATH="Path_a"
Target_A:
    @echo $(THE_PATH)

由于(常规)变量的内容在每次使用时都会扩展,因此可以将 THE_TARGET=$@ 设为全局变量。


特定于目标的变量只能在它们所属的目标及其依赖项中访问。

通常这已经足够了,但是如果您需要有 全局 变量,您可以使用问题中的相同代码,条件更改为:

ifneq ($(filter Target_A,$(MAKECMDGOALS)),)

$@(您尝试使用)仅在配方内部起作用,并扩展为配方构建的目标名称。

$(MAKECMDGOALS) 是一个全局变量,包含调用make 时指定的所有目标(作为命令行参数)。

仅当您要查找的目标被指定为命令行参数时,此选项才有效。

【讨论】:

  • 谢谢,$(MAKECMDGOALS) 正是我所需要的。如果 $@ 没有在食谱之外设置,我仍然很好奇为什么 THE_TARGET 包含正确的字符串......
  • @Dan 变量的内容通常在使用变量时展开,而不是在您为其赋值时展开。见gnu.org/software/make/manual/make.html#Flavors
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多