Makefile 条件判断

使用条件判断,可以让make在编译程序时,根据不同的情况,执行不同的分支:可以执行不同的命令,使用不同的编译参数,生成不同的目标。在Makefile中,可以使用ifeq、ifneq、ifdef、ifndef 等关键字来进行条件判断。

ifeq 关键字

ifeq关键字用来判断两个参数是够相等,相等时条件成立为true,不相等为false。ifeq一般和变量结合使用:

mode = debug
hello: hello.c
ifeq ($(mode),debug)
    @echo "debug mode" 
    gcc -g -o hello hello.c
else
    @echo "release mode"
    gcc -o hello hello.c
endif

当使用make编译程序时,就会执行debug分支:

# make
debug mode
gcc -g -o hello hello.c

条件判断语句由三个关键字组成:ifeq、else、endif。ifeq后面的比较语句使用小括号抱起来,ifeq和小括号之间要用空格隔开,小括号里的两个参数用逗号隔开。当小括号里的条件满足时,make就会执行这个分支的命令,否则执行else部分。endif表示一个条件语句的结束。

ifneq 关键字

ifneq 关键字和ifeq关键字恰恰相反,用来判断参数是否不相等。当比较的参数不相等时,条件语句才成立,值为true,否则为false。

mode = debug
hello: hello.c
ifneq ($(mode),)
    @echo "debug mode" 
    gcc -g -o hello hello.c
else
    @echo "release mode"
    gcc -o hello hello.c
endif

在上面的语句中,我们让mode变量和一个空字符串比较,不相等,条件语句成立,执行if 分支:

# make
  debug mode
  gcc -g -o hello hello.c

ifdef 关键字

ifdef 关键字用来判断一个变量是否已经定义。如果变量的值非空(在Makefile中,没有定义的变量的值为空),表达式为真。

mode = 

hello: hello.c
ifdef mode
    @echo "debug mode" 
    gcc -g -o hello hello.c
else
    @echo "release mode"
    gcc -o hello hello.c
endif

如果在Makefile定义一个变量没有赋值,或者没有定义变量,那么这个变量的值都为空。在上面的Makefile中,当使用ifdef判断时,因为mode的值为空,所以make会执行else分支:

# make
release mode
gcc -o hello hello.c
ifndef 关键字

ifndef关键字和ifdef相反,如果一个变量没有定义,表达式为真。

mode = 

hello: hello.c
ifndef mode
    @echo "debug mode" 
    gcc -g -o hello hello.c
else
    @echo "release mode"
    gcc -o hello hello.c
endif

如上面的Makefile,如果没有定义mode,则表达式为真,make执行if分支:

# make
debug mode
gcc -o hello hello.c
《Makefile工程实践》视频教程,一线开发工程师独家录制,网上首家讲解Makefile的实战课程。从零开始,教你一步一步编写一个工程项目的Makefile,支持使用第三方静态库、动态库,支持指定模块或目录编译生成静态库、动态库,赠送企业级的Makefile模板,学完即可拿来使用,投入项目开发实战,具备独立开展项目开发和管理的能力。详情请点击淘宝链接:Linux三剑客