Makefile学习6 - 条件判断

一. 前言

        条件判断语句可以根据一个变量的值来控制make执行或者忽略Makefile的特定部分。条件语句可以是两个不同变量或者变量与常量值的比较。条件语句只能用于控制make实际执行的Makefile文件部分,不能控制规则的shell的执行过程。Makefile使用条件控制可以做到处理的灵活性和高效性。举例如下:

target:$(objects)
ifeq ($(ARCH),arm)
    arm-linux-gcc -o target $(object)
else
    gcc -o target $(objects)
endif

        例子中,条件判断语句使用到了三个关键词"ifeq","else","endif",其中:

        1. "ifeq"表示条件语句的开始,并指定了一个比较条件(相等)。之后用圆括号包围,使用逗号","分割两个参数,圆括号和关键字"ifeq"用空格分开。参数中的变量引用在进行变量值比较时被展开。"ifeq"之后就是当条件满足时会执行的,条件不满足忽略。

        2. "else"之后就是当条件不满足时的执行部分。这个部分是可选的。

        3. "endif"表示一个条件语句的结束,任何一个条件表达式都必须以"endif"结束。

二. 关键字介绍

        条件判断的基本语法,如下

CONDITIONAL-DIRECTIVE
TEXT-IF-TRUE
endif

        TEXT-IF-TRUE可以是若干任何文本行,当条件为真时,它就当做make执行的一部分,当条件为假,则不会执行。

        包含"else"关键字的语法如下:

CONDITIONAL-DIRECTIVE
TEXT-IF-TRUE
else
TEXT-IF-FALSE
endif

         如果条件为真,则"TEXT-IF-TRUE"被执行,否则,"TEXT-IF-FALSE"被执行。示例如下:

ARCH:=arm

define test
ifeq ($(ARCH),arm)
  CC:=arm-linux-gcc
else
  CC:=gcc
endif
endef

$(warning $(eval $(call test)))

all:
        @echo CC=$(CC)

结果:
CC=arm-linux-gcc

        注意:"CONDITIONAL-DIRECTIVE"这一行可以以若干个空格开始,make处理时会忽略这些空格,但是不能以TAB字符开始。

1. ifeq

格式

ifeq (ARG1,ARG2)

        判断ARG1和ARG2是否相等。

2. ifneq

格式

ifneq (ARG1,ARG2)

        与"ifeq"的作用相反。

3. ifdef

格式

ifdef VARIABLE-NAME

        注意,ifdef只测试一个变量是否有值,不会测试变量是否为空。对于变量"VARIABLE-NAME",除了"VARIABLE-NAME="情况外,使用其他方式对它定义都会使"ifdef"返回真,也就是通过其他方式给他赋了一个空值,"ifdef"也会返回真。示例如下:

bar=
foo=$(bar)
ifdef foo
frobzz = yes
else
frobozz = no
endif

结果:
frobozz=yes

foo=
ifdef foo
frobzz = yes
else
frobozz = no
endif

结果:
frobozz=no

4. ifndef

格式:

ifndef VARIABLE-NAME

        作用和"ifdef"相反。

三. 总结

        本文介绍了条件判断的用法和关键字"ifeq","ifneq","ifdef","ifndef",并通过举例介绍其用法。

你可能感兴趣的:(Makefile,linux)