Makefile 变量、条件判断
嘻嘻发布于2020-10-16
最后更新于2020年10月23日
浏览在makefile中定义变量就像在其他编程java,golang语言中一样,变量也有不同的作用域,全局变量和局部变量,变量,条件判断,函数可以构造出复杂的业务逻辑。
变量
定义 Makefile 中为变量赋值可用四种操作符:=、:=、?=、+=, 这四个符号的主要区别是
- = 赋值是 lazy 的,也就是在使用的时候才会递归的获取变量的值(递归指的是可以通过一个变量为另一个变量赋值)
- := 则是在声明的时候变量的值就确定了
- ?= 表示在变量没有值的时候才给其赋值
- += 则是在原来的值上 append 一个其他的值(自动添加空格)
全局变量
name1 := $(lastword $(MAKEFILE_LIST))
include inc.mk
name2 := $(lastword $(MAKEFILE_LIST))
all:
@echo name1 = $(name1)
@echo name2 = $(name2)
局部变量
target … : variable-assignment
前面我们所讲的在 Makefile 中定义的变量都是全局变量, 但是也可以为某个目标设置局部变量,这种变量被称为 Target-specific Variable,因为它的作用范围只在这条规则以及连带规则中,所以其值也只在作用范围内有效。而不会影响规则链以外的全局变量的值,因为局部变量的名称可与全局变量的名称相同。
其一般语法如下,首先在 target 中定义局部变量,则在 target 及其依赖的目标中使用该变量即可
prog : CFLAGS = -g
prog : prog.o foo.o bar.o
判断
使用条件判断,可以让 make 根据运行时的不同情况选择不同的执行分支,主要有以下几个关键字: ifeq、ifneq、ifdef、ifndef、else 和 endif;
根据名称其实也能基本能猜出各个关键字的作用了, ifeq 和 ifneq 是一对关键字,表示其后面跟随的两个参数是够相等,ifdef 和 ifndef 是一对关键字,表示其后跟随的变量是否已经被定义过。
ifeq ($(UNAME), x86_64)
all: unistd_32.h
endif
all:
@make -C $(KDIR) M=$(PWD) modules