makefile中ifeq和ifneq能否嵌套?

与非门   2009-12-4 14:52 楼主
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明明就有这样的嵌套语句,望各位大侠指点!

回复评论 (10)



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

  7. RESULT_AB = "A == B"
  8. RESULT_CD = "C == D"
  9. RESULT_EF = "E == F"

  10. ifneq (A,B)
  11.   RESULT_AB = "A != B"

  12.   ifneq (C,D)
  13.     RESULT_CD = "C != D"

  14.     ifneq (E,F)
  15.       RESULT_EF = "E != F"
  16.                 else
  17.       RESULT_EF = "E == F"
  18.     endif
  19.   else
  20.     RESULT_CD = "C == D"
  21.   endif
  22. else
  23.   RESULT_AB = "A == B"
  24. endif

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



不知道够不够明白
点赞  2009-12-4 15:21
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 时候执行那些语句?
点赞  2009-12-4 15:43
不好意思, 我上面发的有错误, 补一个正确的:


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

  7. ifneq ($(A),$(B))
  8.     RESULT = " A != B"
  9.     ifneq ($(C),$(D))
  10.         RESULT += " C != D"
  11.         ifneq ($(E),$(F))
  12.             RESULT += " E != F"
  13.         else
  14.             RESULT += " E == F"
  15.         endif
  16.     else
  17.         RESULT += " C == D"
  18.         ifneq ($(E),$(F))
  19.             RESULT += " E != F"
  20.         else
  21.             RESULT += " E == F"
  22.         endif
  23.     endif
  24. else
  25.     RESULT = "A == B"
  26.     ifneq ($(C),$(D))
  27.         RESULT += " C != D"
  28.         ifneq ($(E),$(F))
  29.             RESULT += " E != F"
  30.         else
  31.             RESULT += " E == F"
  32.         endif
  33.     else
  34.         RESULT += " C == D"
  35.         ifneq ($(E),$(F))
  36.             RESULT += " E != F"
  37.         else
  38.             RESULT += " E == F"
  39.         endif
  40.     endif
  41. endif

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

点赞  2009-12-4 15:49
引用: 引用 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)

不知道够不够明白

谢谢回复,但是没看的很明白,我刚刚给出例子,你看看结果是什么我就了解了!
点赞  2009-12-4 15:49
我上面的makefile 对你说的所有case 都有覆盖, 你可以调整里面ABCDEF的值来试验一下, 直观上可以看出来的就是 找ifeq(或ifneq) 和endif 的范围, 这个范围里面的代码对这个判断有效。
点赞  2009-12-4 15:52


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

我想知道这里会不会直接跳出到最后一个endif?大哥写的代码我看的不是很懂
点赞  2009-12-4 15:54
引用: 引用 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 时候执行那些语句?



测试代码:


  1. export CONFIG_DIST = "micro"
  2. export CONFIG_MISSID = y
  3. export RESULT1 = "Start: "
  4. export RESULT2 = "Start: "
  5. export RESULT3 = "Start: "


  6. ifeq ($(CONFIG_DIST),"micro")

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

  8.         RESULT1 += "operation a"

  9.         ifeq ($(CONFIG_MISSID),y)
  10.             RESULT1 += "operation b"
  11.         endif

  12.     endif

  13.         RESULT1 += "operation c"
  14. endif

  15. export CONFIG_DIST = "std"
  16. export CONFIG_MISSID = y

  17. ifeq ($(CONFIG_DIST),"micro")

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

  19.         RESULT2 += "operation a"

  20.         ifeq ($(CONFIG_MISSID),y)
  21.             RESULT2 += "operation b"
  22.         endif

  23.     endif

  24.         RESULT2 += "operation c"
  25. endif

  26. export CONFIG_DIST = std
  27. export CONFIG_MISSID = n

  28. ifeq ($(CONFIG_DIST),"micro")

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

  30.         RESULT3 += "operation a"

  31.         ifeq ($(CONFIG_MISSID),y)
  32.             RESULT3 += "operation b"
  33.         endif

  34.     endif

  35.         RESULT3 += "operation c"
  36. endif

  37. RESULT1 += " End"
  38. RESULT2 += " End"
  39. RESULT3 += " End"

  40. all:
  41.         @echo result1: $(RESULT1)
  42.         @echo result2: $(RESULT2)
  43.         @echo result3: $(RESULT3)



输出结果:


  1. [michael@Dot8Server tmp]$ make
  2. result1: Start:  operation c  End
  3. result2: Start:   End
  4. result3: Start:   End
点赞  2009-12-4 16:07
谢谢!我懂了!
点赞  2009-12-9 15:32
引用: 引用 8 楼 yinluming 的回复:
谢谢!我懂了!


呵呵,  看来我讲的还行~  那记得结贴哦, 嘿嘿
点赞  2009-12-9 15:47
好好学习,天天向上!
点赞  2010-1-7 16:58
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复