Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5544465
  • 博文数量: 763
  • 博客积分: 12108
  • 博客等级: 上将
  • 技术积分: 15717
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-28 21:21
个人简介

业精于勤,荒于嬉

文章分类

全部博文(763)

文章存档

2018年(6)

2017年(15)

2016年(2)

2015年(31)

2014年(14)

2013年(87)

2012年(75)

2011年(94)

2010年(190)

2009年(38)

2008年(183)

2007年(28)

分类: C/C++

2008-04-26 20:35:06

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

示例

下面的例子,判断$(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

可见,在上面示例的这个规则中,目标foo可以根据变量$(CC)的值选取不同的函数库来编译程序。

可以从上面的示例中看到3个关键字:ifeqelseendififeq表示条件语句的开始,并指定一个条件表达式,表达式包含两个参数,以逗号分隔,表达式以圆括号括起。else表示条件表达式为假的情况。endif表示一个条件语句的结束,任何一个条件表达式都应该以endif结束。

当变量$(CC)的值是gcc时,目标foo的规则是:   

foo: $(objects)

          $(CC) -o foo $(objects) $(libs_for_gcc)

而当变量$(CC)值不是gcc(比如cc),目标foo的规则是: 

foo: $(objects)

          $(CC) -o foo $(objects) $(normal_libs)

当然,还可以把上面的那个例子写得更简洁一些,如实例5-44

实例5-44

ibs_for_gcc = -lgnu

    normal_libs =

    ifeq ($(CC),gcc)

      libs=$(libs_for_gcc)

    else

      libs=$(normal_libs)

    endif

    foo: $(objects)

            $(CC) -o foo $(objects) $(libs)

语法

条件表达式的语法为:   

   

    endif

以及

   

    else

   

    endif

其中表示条件关键字ifeq。这个关键字有4个。第一个是前面所见过的ifeq

ifeq (, )

    ifeq '' ''

    ifeq "" ""

    ifeq "" ''

    ifeq '' ""

比较参数arg1arg2的值是否相同。当然,参数中还可以使用make的函数。如   

ifeq ($(strip $(foo)),)

   

    endif

这个示例中使用了strip函数如果这个函数的返回值是空(Empty)就生效。

2个条件关键字是ifneq。语法是:   

ifneq (, )

    ifneq '' ''

    ifneq "" ""

    ifneq "" ''

    ifneq '' ""

其比较参数arg1arg2的值是否相同,如果不同,则为真。

3个条件关键字是ifdef。语法是:

ifdef

如果变量的值非空,那么表达式为真;否则,表达式为假。当然,同样可以是一个函数的返回值。注意,ifdef只是测试一个变量是否有值,其并不会把变量扩展到当前位置。还是来看两个例子:

实例5-45

示例一:

bar =

    foo = $(bar)

    ifdef foo

    frobozz = yes

    else

    frobozz = no

    endif

示例二:

    foo =

    ifdef foo

    frobozz = yes

    else

    frobozz = no

    endif

实例5-46

    foo =

    ifdef foo

    frobozz = yes

    else

    frobozz = no

    endif

实例5-45$(frobozz)值是yes实例5-46则是no

4个条件关键字是ifndef。其语法是:

ifndef

这个和ifdef是相反的意思。在这一行上,多余的空格是允许的,但是不能以[Tab]键作为开始(不然就被认为是命令)。而注释符“#”同样也是安全的。elseendif也一样,只要不是以[Tab]键开始就行了。

注意:

make在读取makefile文件时就计算条件表达式的值,并根据条件表达式的值来选择语句,所以,最好不要把自动化变量($@)放入条件表达式中,因为自动化变量是在运行时才有的。而且,为了避免混乱,make不允许把整个条件语句分成两部分放在不同的文件中。

阅读(2117) | 评论(0) | 转发(2) |
0

上一篇:makefile(5)

下一篇:makefile(7)

给主人留下些什么吧!~~