makefile ifeq与ifdef
makefilevar := A
var1 := $(var)
var2 :=
var_m :=$(var2)
var3 =
var4=$(var3)
var_t:
ifeq ($(var),$(var1))
@echo "var == var1"
else
@echo "var != var1"
endif
ifneq ($(var),$(var1))
@echo "var != var1"
else
@echo "var == var1"
endif
ifeq ($(var2),)
@echo "var2 is empty"
else
@echo "var2 is define"
endif
ifdef var2
@echo "var2 is define"
else
@echo "var2 is not define"
# $(eval bm += q)
# @echo "bm: $(bm)"
endif
ifdef var_m
@echo "var_m is define"
else
@echo "var_m is not define"
endif
ifdef var3
@echo "var3 is define"
else
@echo "var3 is not define"
endif
ifeq ($(var4),)
@echo "ifeq var4 is empty"
else
@echo "ifeq var4 is not define"
endif
ifdef var4
@echo "var4 is define"
else
@echo "var4 is not define"
endif
执行上述代码时输出打印:
var == var1
var == var1
var2 is empty
var2 is not define
var_m is not define
var3 is not define
ifeq var4 is empty
var4 is define
请解释下详细输出打印的原因 以下是对Makefile输出结果的详细解释,重点分析`ifeq`、`ifneq`和`ifdef`的行为:
变量定义分析:
var := A # 立即赋值,值为 'A'
var1 := $(var) # 立即展开为 'A'
var2 := # 定义为空字符串
var_m := $(var2) # 立即展开为空字符串
var3 = # 递归赋值为空字符串
var4 = $(var3) # 递归赋值,值为表达式 "$(var3)"(非空字符串)
输出结果解析:
1. var == var1
ifeq ($(var),$(var1)) → 比较 'A' == 'A' → 成立
2. var == var1
ifneq ($(var),$(var1)) → 比较 'A' != 'A' → 不成立 → 执行else分支
3. var2 is empty
ifeq ($(var2),) → 判断 $(var2) 是否为空 → 成立(因var2是空字符串)
4. var2 is not define
ifdef var2 → 检查变量是否被定义为非空值 → 失败(因var2是空字符串)
5. var_m is not define
ifdef var_m → 同上,var_m也是空字符串 → 失败
6. var3 is not define
ifdef var3 → var3是空字符串 → 失败
7. ifeq var4 is empty
ifeq ($(var4),) → $(var4) 展开为 $(var3) → 最终为空 → 成立
8. var4 is define
ifdef var4 → 检查 var4 是否被赋值(不检查值内容)→ 成立(因var4被赋值为表达式 "$(var3)")
核心规则总结:
1. ifeq/ifneq:比较变量展开后的值(空字符串视为空)
2. ifdef:检查变量是否被定义为非空字符串(空字符串或未赋值均返回false)
3. 赋值方式的影响:
o var4 = $(var3) 使 var4 获得表达式字符串 "$(var3)"(非空)
o 但 $(var4) 展开时继承 var3 的空值
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 @小甲鱼 @不二如是 建议可选是否启用 Latex… player-none 发表于 2025-6-11 19:57
@小甲鱼 @不二如是 建议可选是否启用 Latex…
收到,自动触发了 不二如是 发表于 2025-6-11 20:34
收到,自动触发了
对啊,这就对很多药用到$符号的地方出现问题,影响鱼油交流+%/
test$1$ player-none 发表于 2025-6-11 20:37
对啊,这就对很多药用到$符号的地方出现问题,影响鱼油交流+%/
test$1$
{:9_232:}{:9_232:}{:9_232:} player-none 发表于 2025-6-11 19:57
@小甲鱼 @不二如是 建议可选是否启用 Latex…
这个比较麻烦的点在于默认 Latex 就是在 $ 符号间触发,但如果改成其他符号的话,原来那些也得一并修改……看似无解…… # 定义变量 var,赋值为 A(使用 := 表示简单赋值,立即展开右侧值)
var := A
# 定义变量 var1,其值为 var 的值,即 A
var1 := $(var)
# 定义变量 var2,赋空值
var2 :=
# 定义变量 var_m,其值为 var2 的值,即空
var_m :=$(var2)
# 定义变量 var3,赋空值(注意这里用了 =,是递归赋值,但此处无区别)
var3 =
# 定义变量 var4,其值为 var3 的值,即空
var4=$(var3)
# 定义伪目标 var_t
var_t:
# 下面是条件判断语句。ifeq 判断 $(var) 是否等于 $(var1)
ifeq ($(var),$(var1))
@echo "var == var1" # 如果相等,打印“var == var1”
else
@echo "var != var1" # 否则,打印“var != var1”
endif
# ifneq 判断 $(var) 是否不等于 $(var1)
ifneq ($(var),$(var1))
@echo "var != var1" # 如果不相等,打印“var != var1”
else
@echo "var == var1" # 否则,打印“var == var1”
endif
# ifeq 判断 $(var2) 是否为空字符串
ifeq ($(var2),)
@echo "var2 is empty" # 若为空,打印“var2 is empty”
else
@echo "var2 is define" # 否则,打印“var2 is define”
endif
# ifdef 判断 var2 是否被定义(即变量名是否声明,不管值是否为空)
ifdef var2
@echo "var2 is define" # 如果定义了,打印“var2 is define”
else
@echo "var2 is not define" # 否则,打印“var2 is not define”
# $(eval bm += q) # 这行被注释掉,若取消注释会给 bm 变量追加 q
# @echo "bm: $(bm)" # 打印 bm 的值
endif
# ifdef 判断 var_m 是否被定义
ifdef var_m
@echo "var_m is define" # 如果定义了,打印“var_m is define”
else
@echo "var_m is not define" # 否则,打印“var_m is not define”
endif
# ifdef 判断 var3 是否被定义
ifdef var3
@echo "var3 is define" # 如果定义了,打印“var3 is define”
else
@echo "var3 is not define" # 否则,打印“var3 is not define”
endif
# ifeq 判断 $(var4) 是否为空字符串
ifeq ($(var4),)
@echo "ifeq var4 is empty" # 若为空,打印“ifeq var4 is empty”
else
@echo "ifeq var4 is not define" # 否则,打印“ifeq var4 is not define”
endif
# ifdef 判断 var4 是否被定义
ifdef var4
@echo "var4 is define" # 如果定义了,打印“var4 is define”
else
@echo "var4 is not define" # 否则,打印“var4 is not define”
endif 小甲鱼 发表于 2025-6-12 00:10
这个比较麻烦的点在于默认 Latex 就是在 $ 符号间触发,但如果改成其他符号的话,原来那些也得一并修改… ...
那就加个提示,“因论坛有 Latex 功能,故请用户使用记事本等文本编辑工具将不希望显示 Latex 的 $ 符号统一改成 <_DOLLAR_4_>” 之类的? player-none 发表于 2025-6-12 18:42
那就加个提示,“因论坛有 Latex 功能,故请用户使用记事本等文本编辑工具将不希望显示 Latex 的 $ 符号 ...
上面我编辑了一下,使用代码格式就还行吧
页:
[1]