在 Makefile 的 if 语句中设置变量?

Setting a variable in an if statement in Makefile?

我读过这篇文章 (makefile setting a variable in if statement in a target),但我仍然完全无法使用它。

如何让下面的内容打印“fooz”?

我的目标是有一个 ifeq 语句,该语句导致对“MISMATCH”变量的赋值,该变量(稍后在目标中)用于不同的 if 语句。

a =
MISMATCH=

all:
ifeq ($(a),)
    MISMATCH=yes
endif

ifdef MISMATCH
$(info fooz)
else
$(info bark)
endif

编辑

我希望文件看起来像这样:

VALUE_TO_TEST=bad_value
MISMATCH=

all:
    ifeq ($(VALUE_TO_TEST), expected_value)
        MISMATCH=yes
    endif

    ifdef MISMATCH
        # Do thing because there is a mismatch
    else
        # Do thing where there is no mismatch
    endif

叹息 - 许多排列后的答案是制表符错误:

a =
MISMATCH=

all:
ifeq ($(a),)
MISMATCH=yes
endif

ifdef MISMATCH
$(info fooz)
else
$(info bark)
endif

(make 文件太令人沮丧了)

您不能将 make 构造(如 ifeq)与 shell 构造(如设置 shell 变量)结合使用。 Makefile 不是脚本,例如 shell 脚本或 python 脚本或其他脚本。

Make 在两个不同的阶段工作:首先解析所有 makefile,分配所有 make 变量,解析所有 ifeq 语句,解析所有目标和先决条件并构造所有的内部图他们之间的关系。基本上,所有未使用 TAB 缩进的内容都会在此阶段进行解析。

其次,在解析完所有 makefile 后,make 将遍历第一步创建的图(的一部分),对于过时的目标,它将扩展配方(这是一个 shell script) 然后 运行 a shell 并给它配方。在此阶段处理所有使用 TAB 缩进的内容。

所以,显然你不能有 ifeq 条件(在第一阶段扩展)依赖于配方中的动作(运行 在第二阶段)。

您可以这样编写 makefile:

VALUE_TO_TEST = bad_value
MISMATCH =
ifeq ($(VALUE_TO_TEST), expected_value)
   MISMATCH = yes
endif

all:
ifdef MISMATCH
        # Do thing because there is a mismatch
else
        # Do thing where there is no mismatch
endif

我想你不想这样做,但尽管第二个例子比第一个好,但它仍然没有充分解释你想做什么,以及为什么这样做是不可接受的方式。