鬼少 发表于 2025-6-11 16:17:05

makefile ifeq与ifdef

makefile
var := 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
请解释下详细输出打印的原因

FishC 发表于 2025-6-11 16:19:41

以下是对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 小助理,如未能正确解答您的问题,请继续追问。

player-none 发表于 2025-6-11 19:57:59

@小甲鱼 @不二如是 建议可选是否启用 Latex…

不二如是 发表于 2025-6-11 20:34:12

player-none 发表于 2025-6-11 19:57
@小甲鱼 @不二如是 建议可选是否启用 Latex…

收到,自动触发了

player-none 发表于 2025-6-11 20:37:44

不二如是 发表于 2025-6-11 20:34
收到,自动触发了

对啊,这就对很多药用到$符号的地方出现问题,影响鱼油交流+%/
test$1$

不二如是 发表于 2025-6-11 20:56:43

player-none 发表于 2025-6-11 20:37
对啊,这就对很多药用到$符号的地方出现问题,影响鱼油交流+%/
test$1$

{:9_232:}{:9_232:}{:9_232:}

小甲鱼 发表于 2025-6-12 00:10:51

player-none 发表于 2025-6-11 19:57
@小甲鱼 @不二如是 建议可选是否启用 Latex…

这个比较麻烦的点在于默认 Latex 就是在 $ 符号间触发,但如果改成其他符号的话,原来那些也得一并修改……看似无解……

小甲鱼的二师兄 发表于 2025-6-12 00:21:02

# 定义变量 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

player-none 发表于 2025-6-12 18:42:30

小甲鱼 发表于 2025-6-12 00:10
这个比较麻烦的点在于默认 Latex 就是在 $ 符号间触发,但如果改成其他符号的话,原来那些也得一并修改… ...

那就加个提示,“因论坛有 Latex 功能,故请用户使用记事本等文本编辑工具将不希望显示 Latex 的 $ 符号统一改成 <_DOLLAR_4_>” 之类的?

小甲鱼 发表于 2025-6-13 15:23:55

player-none 发表于 2025-6-12 18:42
那就加个提示,“因论坛有 Latex 功能,故请用户使用记事本等文本编辑工具将不希望显示 Latex 的 $ 符号 ...

上面我编辑了一下,使用代码格式就还行吧
页: [1]
查看完整版本: makefile ifeq与ifdef