首页 > 代码库 > Makefile学习笔记
Makefile学习笔记
1,什么是makefile?
makefile是一个文件。这个文件用来做什么的?答:文件里面的内容,指明了工程编译的规则。比如:哪些文件先编译,哪些后编译,哪些需要更新,如何编译,链接到哪些库等等。
2,makefile的好处?
如上所述,它能实现自动化编译,只需输入make命令,就能得到想要的执行文件。会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。
3,makefile的规则:
target ... : prerequisites ...
command
target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)
这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。
4,多说无益,先来个例:
##Makefile
# If KERNELRELEASE is defined, we‘ve been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
# Otherwise we were called directly from the command
# line; invoke the kernel build system
else
KERNEL_DIR ?= /lib/modules/`uname -r`/build
MODULEDIR := $(shell pwd)
default:
make -C $(KERNEL_DIR) M=$(MODULEDIR) modules
endif
clean:
rm -f *.o *.ko *.mod.c Module.* modules.*
分析:
http://blog.csdn.net/isnipe/article/details/3933941
补充:
KERNEL_DIR表示内核源码目录,目录中包含了内核驱动模块所需要的各种头文件及依赖。
-C表示 指定进入指定的目录即KERNEL_DIR,是内核源代码目录,调用该目录顶层下的Makefile,目标为modules。
M=$(shell pwd)选项让该Makefile在构造modules目标之前返回到模块源代码目录并在当前目录生成obj-m指定的xxx.o目标模块。
疑问:obj-m := hello.o不是在ifneq里么?到底哪定义了hello.o? makefile里有很多隐藏规则,这个难道是它里面隐藏的????
5,:= ,=,?=的区别
:=不递归赋值
= 递归赋值
?=默认值
“:=” 的意思是,它右边赋得值如果是变量,只能使用在这条语句之前定义好的,而不能使用本条语句之后定义的变量;
于此对应的是“=”,当它的右边赋值是变量时,这个变量的定义在本条语句之前或之后都可以;
而“?=”是指,该符号左边的变量,如果在本条语句之前没有定义过,则执行本语句,如果已经定义,那么本语句什么都不做。
6,写得有点乱了,不知道该怎么写下去了,其中一些规则或变量什么的,蛮繁杂的。边看边记录吧。
7,第一次博客,失败。
Makefile学习笔记