在 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
我想你不想这样做,但尽管第二个例子比第一个好,但它仍然没有充分解释你想做什么,以及为什么这样做是不可接受的方式。
我读过这篇文章 (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
我想你不想这样做,但尽管第二个例子比第一个好,但它仍然没有充分解释你想做什么,以及为什么这样做是不可接受的方式。