Makefile 变量、条件判断

在makefile中定义变量就像在其他编程java,golang语言中一样,变量也有不同的作用域,全局变量和局部变量,变量,条件判断,函数可以构造出复杂的业务逻辑。

变量

定义 Makefile 中为变量赋值可用四种操作符:=、:=、?=、+=, 这四个符号的主要区别是

  1. = 赋值是 lazy 的,也就是在使用的时候才会递归的获取变量的值(递归指的是可以通过一个变量为另一个变量赋值)
  2. := 则是在声明的时候变量的值就确定了
  3. ?= 表示在变量没有值的时候才给其赋值
  4. += 则是在原来的值上 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
Linux ss命令: 不要再用只会用netstat
linux pkill命令