makefile中ifeq和ifneq能否嵌套?

yinluming 2009-12-04 02:52:29
ifneq(A,B)
ifneq(C,D)
ifneq(E,F)
a语句
b语句
c语句
endif
endif
endif
要是A=B是不是直接跳出了?
要是A=B为假(ifneq(A,B)成立),C=D成立执行了那个语句?

在网上看到一篇帖子说ifeq不能够嵌套???但是我的makefile明明就有这样的嵌套语句,望各位大侠指点!
...全文
4528 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hrx1989 2011-08-21
  • 打赏
  • 举报
回复
讲解的例子很好!!
懂了,谢谢!!
JianqunXu 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yinluming 的回复:]
A:ifneq ($(A),$(B))
RESULT=" A != B"

endif
endif
A:endif

我想知道这里会不会直接跳出到最后一个endif?
[/Quote]
会,只要条件不满足,就会跳到这个条件对应的elif,如果没有elif,就找到这个条件对应的endif退出
zhanghuifang1987 2011-07-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 skysoshy 的回复:]
引用 8 楼 yinluming 的回复:
谢谢!我懂了!


呵呵, 看来我讲的还行~ 那记得结贴哦, 嘿嘿
[/Quote]


输出结果怎么会是那样呢?不是代码里出现的词啊!基本知识不知道,呃
zhanghuifang1987 2011-07-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 skysoshy 的回复:]
引用 2 楼 yinluming 的回复:
if($(CONFIG_DIST),"micro")
if($(CONFIG_DIST),"micro-special")
语句a
if($(CONFIG_MISSID),y)
语句b
endif
语句c
endif
endif

Q1:CONFIG_DIST = "micro",CONFIG_MISSID……
[/Quote]

一头雾水,完全看不懂啊
imzjwa608 2011-03-04
  • 打赏
  • 举报
回复
其实你当初认为的就是对的
lishuang_miao 2010-01-07
  • 打赏
  • 举报
回复
好好学习,天天向上!
skysoshy 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yinluming 的回复:]
谢谢!我懂了!
[/Quote]

呵呵, 看来我讲的还行~ 那记得结贴哦, 嘿嘿
yinluming 2009-12-09
  • 打赏
  • 举报
回复
谢谢!我懂了!
skysoshy 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yinluming 的回复:]
if($(CONFIG_DIST),"micro")
if($(CONFIG_DIST),"micro-special")
  语句a
if($(CONFIG_MISSID),y)       
  语句b
endif
  语句c
endif
endif

Q1:CONFIG_DIST = "micro",CONFIG_MISSID = y时候执行那些语句?
Q2:CONFIG_DIST = "std"(不是micro和micro-special时候),CONFIG_MISSID =y时候执行那些语句?
Q3:CONFIG_DIST = "std",CONFIG_MISSID = no 时候执行那些语句?

[/Quote]


测试代码:


export CONFIG_DIST = "micro"
export CONFIG_MISSID = y
export RESULT1 = "Start: "
export RESULT2 = "Start: "
export RESULT3 = "Start: "


ifeq ($(CONFIG_DIST),"micro")

ifeq ($(CONFIG_DIST),"micro-special")

RESULT1 += "operation a"

ifeq ($(CONFIG_MISSID),y)
RESULT1 += "operation b"
endif

endif

RESULT1 += "operation c"
endif

export CONFIG_DIST = "std"
export CONFIG_MISSID = y

ifeq ($(CONFIG_DIST),"micro")

ifeq ($(CONFIG_DIST),"micro-special")

RESULT2 += "operation a"

ifeq ($(CONFIG_MISSID),y)
RESULT2 += "operation b"
endif

endif

RESULT2 += "operation c"
endif

export CONFIG_DIST = std
export CONFIG_MISSID = n

ifeq ($(CONFIG_DIST),"micro")

ifeq ($(CONFIG_DIST),"micro-special")

RESULT3 += "operation a"

ifeq ($(CONFIG_MISSID),y)
RESULT3 += "operation b"
endif

endif

RESULT3 += "operation c"
endif

RESULT1 += " End"
RESULT2 += " End"
RESULT3 += " End"

all:
@echo result1: $(RESULT1)
@echo result2: $(RESULT2)
@echo result3: $(RESULT3)



输出结果:


[michael@Dot8Server tmp]$ make
result1: Start: operation c End
result2: Start: End
result3: Start: End
yinluming 2009-12-04
  • 打赏
  • 举报
回复


A:ifneq ($(A),$(B))
RESULT=" A != B"

endif
endif
A:endif

我想知道这里会不会直接跳出到最后一个endif?大哥写的代码我看的不是很懂
skysoshy 2009-12-04
  • 打赏
  • 举报
回复
我上面的makefile 对你说的所有case 都有覆盖, 你可以调整里面ABCDEF的值来试验一下, 直观上可以看出来的就是 找ifeq(或ifneq) 和endif 的范围, 这个范围里面的代码对这个判断有效。
yinluming 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 skysoshy 的回复:]
C/C++ code

A=1
B=2
C=3
D=4
E=5
F=6

RESULT_AB="A == B"
RESULT_CD="C == D"
RESULT_EF="E == F"

ifneq (A,B)
RESULT_AB="A != B"

ifneq (C,D)
RESULT_CD="C != D"

ifneq (E,F)
RESULT_EF="E != F"else
RESULT_EF="E == F"
endifelse
RESULT_CD="C == D"
endifelse
RESULT_AB="A == B"
endif

all:
@echo AB:$(RESULT_AB) CD:$(RESULT_CD) EF:$(RESULT_EF)

不知道够不够明白
[/Quote]
谢谢回复,但是没看的很明白,我刚刚给出例子,你看看结果是什么我就了解了!
skysoshy 2009-12-04
  • 打赏
  • 举报
回复
不好意思, 我上面发的有错误, 补一个正确的:


export A = 2
export B = 2
export C = 3
export D = 4
export E = 5
export F = 6

ifneq ($(A),$(B))
RESULT = " A != B"
ifneq ($(C),$(D))
RESULT += " C != D"
ifneq ($(E),$(F))
RESULT += " E != F"
else
RESULT += " E == F"
endif
else
RESULT += " C == D"
ifneq ($(E),$(F))
RESULT += " E != F"
else
RESULT += " E == F"
endif
endif
else
RESULT = "A == B"
ifneq ($(C),$(D))
RESULT += " C != D"
ifneq ($(E),$(F))
RESULT += " E != F"
else
RESULT += " E == F"
endif
else
RESULT += " C == D"
ifneq ($(E),$(F))
RESULT += " E != F"
else
RESULT += " E == F"
endif
endif
endif

all:
@echo A:$(A) B:$(B) C:$(C) D:$(D) E:$(E) F:$(F) result: $(RESULT)

yinluming 2009-12-04
  • 打赏
  • 举报
回复
if($(CONFIG_DIST),"micro")
if($(CONFIG_DIST),"micro-special")
语句a
if($(CONFIG_MISSID),y)
语句b
endif
语句c
endif
endif

Q1:CONFIG_DIST = "micro",CONFIG_MISSID = y时候执行那些语句?
Q2:CONFIG_DIST = "std"(不是micro和micro-special时候),CONFIG_MISSID =y时候执行那些语句?
Q3:CONFIG_DIST = "std",CONFIG_MISSID = no 时候执行那些语句?
skysoshy 2009-12-04
  • 打赏
  • 举报
回复


A = 1
B = 2
C = 3
D = 4
E = 5
F = 6

RESULT_AB = "A == B"
RESULT_CD = "C == D"
RESULT_EF = "E == F"

ifneq (A,B)
RESULT_AB = "A != B"

ifneq (C,D)
RESULT_CD = "C != D"

ifneq (E,F)
RESULT_EF = "E != F"
else
RESULT_EF = "E == F"
endif
else
RESULT_CD = "C == D"
endif
else
RESULT_AB = "A == B"
endif

all:
@echo AB:$(RESULT_AB) CD:$(RESULT_CD) EF:$(RESULT_EF)



不知道够不够明白

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧