makefile中使用条件判断语句

条件判断语句举例

Make 可以根据运行时不同情况选择执行不同分支。

libs_for_gcc = -lgnu
normal_libs =

foo : $(OBJS)
ifeq ($(CC), gcc)  # 不缩进
    $(CC) -o foo $(OBJ) $(libs_for_gcc) # 传递命令,缩进
else                
    $(CC) -o foo $(OBJ) $(normal_libs)
endif

注意:条件语句部分不需要缩进, 否则会被认为是传递给 shell 的命令
简单地说,上面表达的是,如果使用的编译器是 gcc,则编译时添加参数libs_for_gcc,否则给另一个参数normal_libs。

条件判断语句的语法
# if-endif语句
conditional-directive 
    text-if-true 
endif 

# if-else-endif语句
conditional-directive 
    text-if-true 
else 
    text-if-false 
endif 

# if-elsif0-elsif1..-elsifn-else-endif语句
conditional-directive-one 
    text-if-one-is-true 
else  conditional-directive-two 
    text-if-two-is-true 
else 
    text-if-one-and-two-are-false 
endif 

# 多分支例子语句
ifeq $(STRING), 'AA'
    echo AA
else ifeq $(STRING), 'BB'
    echo BB
else
    echo XX
endif
判断是否相等
ifeq (ARG1, ARG2)
ifeq 'ARG1' 'ARG2'
ifeq "ARG1" "ARG2"
ifeq "ARG1" 'ARG2'
ifeq 'ARG1' "ARG2"
# 对应
#ifneq与ifeq类似
判断是否定义
ifdef variable_name
ifndef variable_name

注意,ifdef只是测试一个变量是否有值,其并不会把变量扩展到当前位置。如下例:

bar =
foo = $(bar)
ifdef foo               
# 展开 foo -> $(bar)
# 所以认为定义了, 即使 foo 最终是空
    echo foo
endif

ifdef bar
# 展开 bar, 空,认为未定义
    echo bar
endif

特别注意的是,make是在读取Makefile时就计算条件表达式的值,并根据条件表达式的值来选择语句,所以,你最好不要把自动化变量(如“$@”等)放入条件表达式中,因为自动化变量是在运行时才有的。
对于嵌套 Makefile, 不允许一个完整的 if-endif 语句跨越两个 Makefile
参考:
1.https://www.jianshu.com/p/5982ccb87af0
2.http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile:%E4%BD%BF%E7%94%A8%E6%9D%A1%E4%BB%B6%E5%88%A4%E6%96%AD

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值