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)