欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

makefile中使用条件判断语句

程序员文章站 2022-05-03 08:24:23
...

条件判断语句举例

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时就计算条件表达式的值,并根据条件表达式的值来选择语句,所以,你最好不要把自动化变量(如“[email protected]”等)放入条件表达式中,因为自动化变量是在运行时才有的。
对于嵌套 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