在 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)
Run Code Online (Sandbox Code Playgroud)
这是我调用 make 传递 Target_A 和调用它传递 Target_B 时的输出:
$ make Target_A
Path_b
Target_A
$ make Target_B
Path_b
Target_B
Run Code Online (Sandbox Code Playgroud)
事实上,我总是得到“Path_b”,这表明 ifeq 的计算结果始终为 false,但您可以看到 $@ 包含正确的字符串。
为什么这不起作用?
您可能需要特定于目标的变量:
Target_A: THE_PATH="Path_a"
Target_A:
@echo $(THE_PATH)
Run Code Online (Sandbox Code Playgroud)
由于(常规)变量的内容在每次使用时都会扩展,因此THE_TARGET=$@可以使其成为全局变量。
特定于目标的变量只能在它们所属的目标及其依赖项中访问。
通常这已经足够了,但是如果您需要全局变量,您可以使用问题中的相同代码,并将条件更改为:
ifneq ($(filter Target_A,$(MAKECMDGOALS)),)
Run Code Online (Sandbox Code Playgroud)
$@(您尝试使用的)仅在配方内部起作用,并扩展为配方构建的目标名称。
$(MAKECMDGOALS)是一个全局变量,包含调用时指定的所有目标(作为命令行参数)make。
仅当您要查找的目标被指定为命令行参数时,此选项才有效。
| 归档时间: |
|
| 查看次数: |
1560 次 |
| 最近记录: |