目录
makefile>makefile_3">makefile>makefile简介
makefile>makefile 是一种类似shell的脚本文件,需要make工具进行解释 makefile>makefile 内的语句,然后执行内部语句。Makefile的作用是去管理工程项目,比如一个项目有很多c文件,需要利用Makefile去统一进行编译或者其他操作。[1]
变量全解
变量是makefile>makefile中非常重要的组成部分,下面是变量的使用全解。
变量基础
使用 $()
来获取变量,太简单了,略。
变量高级使用
1. 将变量里的值进行替换后输出
src = a.c b.c d.c e.so
# 下面的例子是将src 的末尾含 .c 的替换为 .o
obj = $(src:.c=.o)all:@echo $(obj)
#输出
a.o b.o d.o e.so
2. 使用变量的嵌套使用
$
符号可以嵌套获取值
av = bv
bv = cv
cv = embed
all:@echo $($($(av)))#输出
embed
3. $
可以组合使用
first = Donald
last = Trump
Donald_Trump = "I'M BACK!"all:@echo $($(first)_$(last)) #输出
I'M BACK!#甚至 $ 符号可以作为左值
Donald_$(last) = "I'M BACK!"#甚至 $ 符号 可以代表函数内的值
src= a b d c z y w o
res = $(sort $(src))
all:@echo $(res)
#输出
a b c d o w y z
override 指示符
这个指示符的作用是给make 命令添加的参数进行修改
#执行命令 make a=10 b="time.c show.c" fun="@echo 20" all
override a=100override b+= fun.c
#override 还可以重新定义命令包
override define fun@echo 200
endefall:@echo $(a)@echo $(b)$(fun)#输出
100
time.c show.c fun.c
200#如果写成下面的样子,那么不仅会输出命令,还会执行命令,上面的写法只会执行命令,而不会输出命令
override define funecho 200
endef
#输出
100
time.c show.c fun.c
echo 200
200
目标指定变量
这个变量可以理解成,因为某个目标而改变的依赖所具有的变量。相当于局部变量,这个局部变量只用于这些依赖。
CFLAG=-gplay: CFLAG=-c
play: main.o a.o b.ogcc $^ -o $@main.o:main.cgcc $(CFLAG) $^ -o $@a.o:a.cgcc $(CFLAG) $^ -o $@b.o:b.cgcc $(CFLAG) $^ -o $@.PHONY:clean
clean:-rm *.o play
#执行 make play
#输出
gcc -c main.c -o main.o
gcc -c a.c -o a.o
gcc -c b.c -o b.o
gcc main.o a.o b.o -o play
#执行 make b.o
#输出
gcc -MM b.c -o b.o
上面案例可以看出,全局的 CFLAG 并没有作用在局部。
模式变量
这个模式变量和上面的类似,只不过目标变成了模式,也就是说这一模式的目标都使用这个局部变量代替全局变量。
CFLAG=-MM
%.i: CFLAG=-E
b.i:b.c gcc $(CFLAG) $^ -o $@
%.s: CFLAG=-S
b.s:b.igcc $(CFLAG) $^ -o $@
%.o: CFLAG=-c
b.o:b.sgcc $(CFLAG) $^ -o $@a.d:a.cgcc $(CFLAG) $^ -o $@
#执行 make b.o
#输出
gcc -E b.c -o b.i
gcc -S b.i -o b.s
gcc -c b.s -o b.o
#执行 make a.d
#输出
gcc -MM a.c -o a.d
上面案例中的模式必须使用到 % ,用法和上面的类似。
总结
暂时只有以上使用总结,其他使用可参考帮助文档。