[makefile]5_条件判断_循环_自定义函数

1.Makefile中的条件判断

(1)ifeq/ifneq、ifdef/ifndef
  • ifeq 判断是否相等,相等返回true,不相等返回false
  • ifneq 判断是否不相等,相等返回 true,不相等返回 false
  • ifdef判断变量是否存在,存在返回true,不存在返回false
  • Ifndef判断变量是否不存在,不存在返回true,存在返回false
(2)没有elseif的用法,如果要实现elseif,就要写嵌套。
(3)示例
A:=123
RS1:=
RS2:=
RS3:=
RS4:=
ifeq ($(A),123)
    RS1:=123
else    
    ifeq ($(A),321)
        RS1:=321
    else
        RS1:=no-123-321
    endif
endif
ifdef A
    RS3=yes
else
    RS3:=no
endif
ifndef FLAG
    FLAG:=default-flag
endif
all:
    echo $(RS1)
    echo $(RS3)
    echo flag=$(FLAG)
(4)命令行传参
make FLAG=123 -f Makefile //如果有 Makefile,则可写成 make FLAG=123

2.循环

(1)Makefile 有两种循环方式:for、foreach
(2)for
# 非常注意, 命令后面的分号必不可少, 比如cmd1; cmd2;
for item in $(value_list); do cmd1; cmd 2; done
for item in $(value_list); do \
    cmd1; \
    cmd2; \
    cmdn; \
done
(3)foreach
#注意:有$(),逗号和分号
$(foreach item, $(value_list), cmd 1; cmd 2;)
$(foreach item, $(value_list) \
    cmd1; \
    cmd2; \
    cmdn; \
)
(4)两种循环的差异
  • 对循环变量上的引用, for使用$$, foreach使用$;
  • 对于函数的支持, for循环无法支持函数运算;
(5)示例1
list = one two three four
###################################################
# for循环格式
# 注意,此处回声消除要写在for处, 写在echo处报错
# 可写在一行, 也可写在多行(此时需用续行符'\')
###################################################
test1:
    @for item in $(list); do \
        echo '***> ' $$item; \
    done
    @for var in $(list); do echo '---> ' $$var; done
###################################################
# foreach循环格式
###################################################
test2:
    @$(foreach x, $(list),\
        echo '===> ' $x; \            
    )
    @$(foreach x, $(list), echo '@@@> ' $x;)  # 此处分号至关重要
(6)示例2
#可以在循环中逐个的修改值
TARGET:=a b c d
FILE:=$(foreach v, $(TARGET),$v.txt)
all:
    #echo $(TARGET)
    #echo $(foreach v, $(TARGET),$v)
    #touch $(TARGET)
    #touch $(foreach v, $(TARGET),$v.txt) 
    #mkdir $(foreach v, $(TARGET),$v_txt) 
    echo $(FILE)
    for v in $(TARGET);do touch $$v.txt; done;
clean:
    $(RM) -rf $(TARGET) *txt

3.自定义函数,不是真正的函数,本质上是多行命令放在了外面。没有返回值。

4.代码示例

A:=123

B:=$(A)

define FUNC1

    #自己的函数名

    echo $(0)  

    #传参      

    echo $(1) $(2)

    echo func1 

    echo $CA) $(B) 

endef

A:=456 

all:

    $(call FUNC1,abc,def)

    echo $(A)

A:=789

3.示例

打印A的是最终值。

5.示例

LS1=$(call FUNC3) #用:=会打印不出来LS1

define FUNC3 

    echo $(shell ls)

    $(RM) abcd 

endef

LS2:=$(call FUNC3)

define FUNC2 

    return 123 

endef

default:

    #echo $(call FUNC2)

    #echo retrun 123

    $(call FUNC3)

    $(LS2)

    $(LS1)

6.报错,echo 是空的

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值