1.2.3 Makfile常用关键字

1.ifneq关键字

这个关键字是用来判断两个参数是否不相等。格式为:

        ifneq “Value1”“Value2”
        ifneq (Value1,Value2)

在判断之前先要将Value1和Value2的值进行展开和替换,如在U-Boot-2013.04的顶层目录Makefile中,对U-Boot的版本参数就使用了ifneq关键字进行判断。

        VERSION     = 2013
        PATCHLEVEL   = 04
        SUBLEVEL    =
        EXTRAVERSION =
        ifneq "$(SUBLEVEL)" ""
        U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
        else
        U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL)$(EXTRAVERSION)
        endif

先将SUBLEVEL使用$()展开和替换,如果SUBLEVEL的值不是空,则执行:

        U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)

也就是说,如果$(SUBLEVEL) = 1的话,那么U_BOOT_VERSION = 2013.04.1。

如果SUBLEVEL的值是空,则执行:

        U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL)$(EXTRAVERSION)

那么此时U_BOOT_VERSION = 2013.04。

2.ifeq关键字

ifeq关键字和ifneq关键字是相对而言的,用来判断两个参数是否相等。格式为:

        ifeq “Value1”“Value2”
        ifeq (Value1,Value2)

和ifneq一样,先要将Value1和Value2展开替换之后,再进行比较。

        ifeq ($(HOSTARCH),$(ARCH))
        CROSS_COMPILE=/usr/local/arm/4.4.1/bin/arm-linux-
        endif

如果HOSTARCH展开替换之后和ARCH展开替换之后相等,则:

        CROSS_COMPILE=/usr/local/arm/4.4.1/bin/arm-linux-

否则CROSS_COMPILE不等于/usr/local/arm/4.4.1/bin/arm-linux-。

3.ifndef关键字

ifndef关键字用来判断一个变量是否没有进行定义。格式:

        ifndef Value

由于在Makefile中,没有定义的变量的值为空。

        ifndef CONFIG_SANDBOX
        SUBDIRS += $(SUBDIR_EXAMPLES)
        endif

如果CONFIG_SANDBOX值为空,条件成立,执行如下语句:

        SUBDIRS += $(SUBDIR_EXAMPLES)

否则不执行。

4.ifdef关键字

ifdef关键字用来判断一个变量是否已经进行定义过。格式:

        ifdef Value

如:

        ifdef CONFIG_SYS_LDSCRIPT
                  # need to strip off double quotes
                  LDSCRIPT := $(subst ",,$(CONFIG_SYS_LDSCRIPT))
        endif

如果CONFIG_SYS_LDSCRIPT定义过,则执行:

        LDSCRIPT := $(subst ",,$(CONFIG_SYS_LDSCRIPT))

否则不执行。