原创 Makedile之七 使用条件判断

2009-6-26 11:20 1632 5 5 分类: MCU/ 嵌入式
#使用条件判断

    使用条件判断, 可以让make根据运行时的不同情况选择不同的执行分支. 条件表达式可以是
比较变量的值, 或是比较变量和常量的值.

一. 示例

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#Exampke make start
#例1-1 判断$(CC)变量是否 "gcc", 如果是的话, 则使用GNU函数编译目标.
libs_for_gcc = -lgnu
normal_libs =

foo: $(objects)
ifeq ($(CC),gcc)
    $(CC) -o foo $(objects) $(libs_for_gcc)
else
    $(CC) -o foo $(objects) $(normal_libs)
endif
#Example make end
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    可见, 目标 "foo" 可以根据变量 "$(CC)" 值来选取不同的函数库来编译程序.
    上面的示例中有三个关键字: ifeq, else和endif.
    ifeq:    表示条件语句的开始, 并指定一个条件表达式, 表达式包含两个参数, 以逗号分隔
            表达式以圆括号括起.
    else:    表示条件表达式为假的情况.
    endif:    表示一个条件语句的结束, 任何一个条件表达式都应该以endif结束.

所以, 当我们的变量$(CC)值是 "gcc" 时, 目标foo的规则是:
foo: $(objects)
    $(CC) -o foo $(objects) $(libs_for_gcc)
而当我们的变量$(CC)值不是 "gcc" 时, 目标foo的规则是:
foo: $(objects)
    $(CC) -o foo $(objects) $(normal_libs)

当然,我们还可以把上面的那个例子写得更简洁一些:
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#Exampke make start
#例1-2 1-1的改进程序
libs_for_gcc = -lgnu
normal_libs =

ifeq ($(CC),gcc)
    libs=$(libs_for_gcc)
else
    libs=$(normal_libs)
endif

foo: $(objects)
    $(CC) -o foo $(objects) $(libs)
#Example make end
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

二. 语法

条件表达式的语法为:
<conditional-directive>
    <text-if-true>
endif
以及:
<conditional-directive>
    <text-if-true>
else
    <text-if-false>
endif
其中<conditional-directive>表示条件关键字, 如 "ifeq", 这个关键字有四个:

1. ifeq

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ifeq (<arg1>, <arg2>)
ifeq <arg1> <arg2>
ifeq "<arg1>" "<arg2>"
ifeq "<arg1>" <arg2>
ifeq <arg1> "<arg2>"
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
比较参数 "arg1" 和 "arg2" 的值是否相同. 参数中可以使用make的函数. 如:
ifeq ($(strip $(foo)),)
    <text-if-empty>
endif
这个示例中使用了 "strip" 函数, 如果这个函数的返回值是空(Empty),那么<text-if-empty>就
生效.

2. ifneq

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ifneq (<arg1>, <arg2>)
ifneq <arg1> <arg2>
ifneq "<arg1>" "<arg2>"
ifneq "<arg1>" <arg2>
ifneq <arg1> "<arg2>"
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
比较参数 "arg1" 和 "arg2" 的值是否不同, 如果不同, 则为真. 和 "ifeq" 相反.

3. ifdef

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ifdef <variable-name>
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
如果<variable-name>的值非空, 表达式为真; 否则, 表达式为假. 当然, <variable-name>同样
可以是一个函数的返回值. 注意: ifdef只是测试一个变量是否有值,其并不会把变量扩展到当前
位置.

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#Exampke make start
#例2-1
bar =
foo = $(bar)
ifdef foo
    frobozz = yes
else
    frobozz = no
endif

all:
    @echo frobozz
#输出结果是: yes
#Example make end
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#Exampke make start
#例2-2
foo =
ifdef foo
    frobozz = yes
else
    frobozz = no
endif

all:
    @echo frobozz
#输出结果是: no
#Example make end
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

4. ifndef

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ifndef <variable-name>
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
这个结构和ifdef相同, 只是语法上与之相反.

    在条件关键字(<conditional-directive>)这一行, 多余的空格是允许的, 但是不能以Tab键
做为开始. 而注释符 '#' 同样也是安全的. "else" 和 "endif" 也一样, 只要不是以Tab键开始
就可以.
    特别注意的是, make是在读取Makefile时就计算条件表达式的值, 并根据条件表达式的值来
选择语句, 所以, 最好不要把自动变量(如 "$@" 等) 放入条件表达式中,因为自动变量是在运行
时才有的.
    为了避免混乱, make不允许把整个条件语句分成两部分放在不同的文件中.

 


【2006-12-25】

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /3 下一条