《跟我一起学makefile》学习笔记(四)

学习记录(对应文档的p31-p40)

一、变量的基础
    例子:
objects = program.o foo.o utils.o  
program : $(objects)  
cc -o program $(objects)
$(objects) : defs.h
二、变量中的变量
    例子:
foo = $(bar)  
bar = $(ugh)  
ugh = Huh?  
 
all:  
    echo $(foo)
    用变量定义变量 := 例子
x := foo  
y := $(x) bar  
x := later  
其等价于:
y := foo bar  
x := later
    复杂例子,make的函数、条件表达式、系统变量MAKELEVEL
ifeq (0, ${MAKELEVEL})
cur-dir := $(shell pwd)
whoami := $(shell whoami)
host-type := $(shell arch)
MAKE := ${MAKE} host-type=${host-type} whoami=${whoami}
endif
    说明:若make有一个嵌套执行的动作,MAKELEVEL记录当前Makefile的调用层数
    
    操作符?=
FOO ?= bar    
如果 FOO 没有被定义过,那么变量 FOO 的值就是“bar”,如果 FOO 先前被定义
过,那么这条语将什么也不做,其等价于:  
ifeq ($(origin FOO), undefined)  
FOO = bar  
endif  
三、变量高级用法
    变量值的替换$(var:a=b)或${var:a=b}    把变量var中所有以a结尾的a,替换成b
    把变量的值再当成变量
例子:$(a)的值是“z”
x = y  
y = z  
a := $($(x))
    例子:
a_objects := a.o b.o c.o  
1_objects := 1.o 2.o 3.o  
sources := $($(a1)_objects:.o=.c)  
这个例子中,如果$(a1)的值是“a”的话,$(sources)的值就是“a.c b.c c.c”;
如果$(a1)的值是“1”,那么$(sources)的值是“1.c 2.c 3.c”。
四、追加变量值
    给变量追加值+=
objects = main.o foo.o bar.o utils.o  
objects += another.o  
于是,$(objects)值变成:“main.o foo.o bar.o utils.o another.o”    
五、override指示符
    如果有变量是通常make的命令行参数设置的,那么Makefile中对这个变量的赋值会被忽略。
    如果你想在Makefile 中设置这类参数的值,那么,你可以使用“override”指示符。
override <variable> = <value>   
override <variable> := <value>  
    可以追加:    
override <variable> += <more text>  
对于多行的变量定义,我们用define指示符,在define指示符前,也同样可以使用ovveride
override define foo  
bar  
endef
六、多行变量
    设置变量值的方法define
define two-lines  
echo foo  
echo $(bar)  
endef
七、环境变量
    make 运行时的系统环境变量可以在 make 开始运行时被载入到 Makefile 文件中
    如果 Makefile 中已定义了这个变量,或是这个变量由 make 命令行带入,那么系统的环境变
量的值将被覆盖。(如果 make 指定了“-e”参数,那么,系统环境变量将覆盖 Makefile 中
定义的变量)  
    如果在环境变量中设置了“CFLAGS”环境变量,就可以在所有的Makefile 中使用这个变量。
    这对于我们使用统一的编译参数有比较大的好处。
    如果Makefile中定义了CFLAGS,那么则会使用 Makefile 中的这个变量,
    如果没有定义则使用系统环境变量的值
八、目标变量
    为某个目标设置局部变量,这种变量被称为“Target-specific  Variable”,可以和“全局变
量”同名,因为它的作用范围只在这条规则以及连带规则中
<target ...> : <variable-assignment>  
 <target ...> : overide <variable-assignment>  
    说明:<variable-assignment>可以是前面讲过的各种赋值表达式,如“=”、“:=”、“+=”
是“?=”。
九、模式变量Pattern-specific Variable
    make 的“模式”一般是至少含有一个“%”
    以如下方式给所有以[.o]结尾的目标定义目标变量:  
%.o : CFLAGS = -O   
同样,模式变量的语法和“目标变量”一样:  
<pattern ...> : <variable-assignment>  
<pattern ...> : override <variable-assignment>  
override 同样是针对于系统环境传入的变量,或是make命令行指定的变量。
第八部分 使用条件判断
一、示例:判断$(CC)变量是否“gcc”,如果是,则使用 GNU 函数编译目标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值