我正在尝试检查变量是否包含特定字符串。我尝试了此处发布的解决方案:Makefile:包含字符串,但对我来说,它似乎不起作用。
@echo $(findstring 2025, $(basename $(<F)))`
返回2025
,但是:
ifeq ($(findstring 2025, $(basename $(<F))),2025)
@echo $(findstring 2025, $(basename $(<F)))
endif
不返回2025
。为什么?
我正在尝试检查变量是否包含特定字符串。我尝试了此处发布的解决方案:Makefile:包含字符串,但对我来说,它似乎不起作用。
@echo $(findstring 2025, $(basename $(<F)))`
返回2025
,但是:
ifeq ($(findstring 2025, $(basename $(<F))),2025)
@echo $(findstring 2025, $(basename $(<F)))
endif
不返回2025
。为什么?
如果您需要帮助,尤其是有关 makefile 的帮助,您必须提供一个最小但功能齐全的示例。Makefile极其依赖于上下文,因此某些内容的行为通常完全取决于它在 makefile 中出现的位置:是在配方中吗?在变量赋值中吗?等等。
在您的情况下,您正在使用
ifeq
,并且由于您没有说您遇到语法错误,所以这一定不在配方中。makeifeq
关键字不是有效的 shell 命令,因此它不能在配方中。如果您查看自动变量的文档,
$(<F)
您会发现它们仅在配方上下文中设置。因此,您永远不能在ifeq
条件中使用自动变量:它们始终是空字符串。如果您不知道您想做什么,我们只能说这些。
您的问题与 makefile 运行的阶段有关。我假设您正在运行类似以下内容:
输出如下:
解释:
注意:
$(info)
是 makefile 构造——它们扩展为无,但它们的副作用是在扩展时将文本吐出到控制台。(这意味着我可以将 粘贴$(info...)
到 的末尾ifeq
而不会影响它的作用……它将在评估 ifeq 时输出一些内容)。Make 将首先解析全局上下文中的所有内容(不以制表符开头的行...)。完成此操作后,它将决定要运行哪些配方等,它将在运行配方之前解析配方行,然后执行它们。
在这种情况下,请注意,
ifeq
语句在配方被考虑运行之前就被解析了,因为它不是以制表符开头的。此时$(<F)
是空白的,并且其中的任何内容都ifeq
不会展开。您还应该注意到,的输出在的
info
输出之前运行echo
,因为$(info)
在配方实际运行之前就进行了扩展。简而言之,除非您真的知道自己在做什么,否则您应该避免在配方中使用 makefile 条件。更好的方法是在配方中的 bash 条件中使用 makefile 变量,如下所示: