目录
1、一个简单 makefile例子
2、make指令参数
2.1、make -f filename
2.2、make -C M=
代码变成可执行文件,叫做编译(compile);先编译这个,还是先编译那个(即编译的安排),叫做构建(build)。Make是最常用的构建工具,诞生于1977年,主要用于C语言的项目。但是实际上 ,任何只要某个文件有变化,就要重新构建的项目,都可以用Make构建。
Make这个词,英语的意思是"制作"。Make命令直接用了这个意思,就是要做出某个文件。比如,要做出文件a.txt,就可以通过以下步骤实现:
1)书写规则,描述如何通过调用其它命令实现这个功能。
比如,假设文件 a.txt 依赖于 b.txt 和 c.txt ,是后面两个文件连接(cat命令)的产物。那么,make 需要知道下面的规则。
a.txt: b.txt c.txt
cat b.txt c.txt > a.txt
也就是说,make a.txt 这条命令的背后,实际上分成两步:第一步,确认 b.txt 和 c.txt 必须已经存在,第二步使用 cat 命令 将这个两个文件合并,输出为新文件。
像这样的规则,都写在一个叫做Makefile的文件中,Make命令依赖这个文件进行构建。Makefile文件也可以写为makefile。
2)命令执行
$ make a.txt
此时, 会默认读取当前目录Makefile或makefile的文件,根据makfile中的规则执行,生成a.txt文件。
测试:
结果:
1)生成a.txt文件,内容为:
make test.
2)终端打印出执行命令:
执行make指令默认查找解析makefile文件中的规则,也可通过用命令行参数指定为其他文件名。如:
$ make -f rules.txt
# 或者
$ make --file=rules.txt
上面代码指定make命令依据rules.txt文件中的规则,进行构建。
-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;
M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。
Makefile:
PWD = $(shell pwd)
KERNEL_SRC = /usr/src/linux-source-2.6.15/
obj-m := test.o
module-objs := test.o
all:
$(MAKE) -C $(KERNEL_SRC) M=$(PWD) modules
clean:
rm *.ko
rm *.o
执行:make -C /usr/src/linux-source-2.6.15/ M=/home/vmeth modules,在test.c和Makefile所在的目录下运行make,如果看到类似输出:
make[1]: Entering directory `/usr/src/linux-source-2.6.15'
CC [M] /home/vmeth/hello.o
Building modules, stage 2.
MODPOST
CC /home/vmeth/hello.mod.o
LD [M] /home/vmeth/hello.ko
make[1]: Leaving directory `/usr/src/linux-source-2.6.15'
摘抄自:make -C M= - 屁屁侠 - 博客园
总之,make只是一个根据指定的Shell命令进行构建的工具。它的规则很简单,你规定要构建哪个文件、它依赖哪些源文件,当那些文件有变动时,如何重新构建它。