Makefile 是和 make 命令一起配合使用的. makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。很多大型项目的编译都是通过Makefile来组织的,如果没有Makefile, 那很多项目中各种库和代码之间的依赖关系不知会多复杂。
Makefile的组织流程的能力如此之强,不仅可以用来编译项目, 还可以用来组织我们平时的一些日常操作。
1、makefile使用规则
规则的三要素:目标、指令、依赖
target: components
TAB rule
第一个目标是终极目标,之后的目标为子目标。
更新目标会自动检查依赖是不是最新的,生产最新的目标。
实例中当前目录中有main.c、add.c、div.c、mul.c、sub.c、add.h、div.h、mul.h、sub.h共9个源文件,main.c中通过include调用add、div、mul、sub中提供的方法,下面就一步一步的深入学习makefile中基本的书写。
#makefile v1
main:main.c add.c div.c mul.c sub.c
gcc main.c add.c div.c mul.c sub.c -o main
当源文件过多时,一条指令会很长,每次添加新的源文件则需要更改一次makefile,所以换下面一种方式书写makefile:
#makefile v2
app:main.o add.o div.o mul.o sub.o
gcc main.o add.o div.o mul.o sub.o -o app
main.o: main.c
gcc -c main.c
main.o: add.c
gcc -c add.c
main.o: sub.c
gcc -c sub.c
main.o: mul.c
gcc -c mul.c
main.o: div.c
gcc -c div.c
2、makefile中的变量
1、自定义变量:直接使用=号定义赋值,使用$取值
2、自动变量
makefile中系统自己维护的变量,通常是大写,可直接使用=号修改它的值,如下:
CC = cc
CPPFLAGS = i
3、变量的赋值:
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值
了解完这些之后,可将makefile中不变的字符串用变量替换,当然还需要记住下面两点:
1、变量的三种用法只能在命令中使用:
2、在规则的目标定义和依赖条件中可使用%做通配符
#makefile v3
#obj target
obj=main.o add.o div.o mul.o sub.o
target=app
#self maintaining var: CC CPPFLAGS
CC = gcc
CPPFLAGS = -I
$(target):$(obj)
$(CC) $(obj) -o $(target)
%.o:%.c
$(CC) -c $< -o $@
clean:
rm $(obj) $(target)
3、函数的使用
搜索函数 —— wildcard ./ .c
匹配替换函数 —— patsubst ./%.c ./%.o src
伪目标 —— .PHONY
Makefile中所有的函数都是有返回的,上面是几个常见的函数,这样我们的makefile也写的比较规范了。
#makefile v4
#obj target
#obj=main.o add.o div.o mul.o sub.o
target=app
src=$(wildcard ./*.c)
obj=$(patsubst ./%.c, ./%.o, $(src))
#self maintaining var: CC CPPFLAGS
CC = gcc
CPPFLAGS = -I
$(target):$(obj)
$(CC) $(obj) -o $(target)
%.o:%.c
$(CC) -c $< -o $@
#phony target
.PHONY:clean
clean:
-echo "hello"
rm $(obj) $(target) -f
#auto var
#$<: first depend at the rule
#$@: target at the rule
#$^: all depends at the rule
#just used at the rule command
4、esp8266中makefile的学习
esp8266工程代码中使用了一套python和xtensa编译工具配合makefile完成项目的管理,还是挺复杂的,找了网上的资料大概了解了一番,表示很复杂,大概熟悉了makefile的层级结构、如何添加新的源文件目录和更改编译下载的参数对应的修改makefile,先收藏着后续如果用到可做参考。
收藏:
ESP8266 SDK学习笔记(四):Makefile分析
ESP8266学习笔记之makefile
ESP8266_NONOS_SDK开发包生成的镜像文件构建步骤分析
Makefile学习之ESP8266官方工程的Makefile