注意,内核模块的makefile与普通c语言的makefile编写是有区别的。
0、设定了.vimrc文件的一些默认的缩进以后,真是坑人,vi对于makefile中的tab缩进不识别出现红色警告,并且编译make无反应。此时使用ctrl+v+i方法输入tab可用。 还有license的大写写错,并且有__init __exit这些声明的时候,需要linux/init.h头文件。或者使用 https://jingyan.baidu.com/article/15622f243cad44fdfcbea50d.html 这个链接,将自己的.vimrc文件修改为:set tabstop=4 意思是设置tab宽度为4
set expandtab 表示将tab换为空格。
需要加上专门对makefile特殊处理的: autocmd FileType make set noexpandtab "表示对于make时候不使用将tab换为4个空格使用。
1、用于内核模块编写Makefile时候,$(PWD)可以使用而 小写的要跟$(shell pwd)
2、M=$(shell pwd)选项让该Makefile在构造modules目标之前返回到模块源代码目录并在当前目录生成obj-m指定的xxx.o目标模块
3、kbuild makefile:
obj-m:=xxx.o
xxx-y:=默认文件名1.o 默认文件名2.o
KDIR:=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
4、在makefile中定义宏命令有两种意义:宏用在makefile自身,宏用在源代码中。
前者是CONFIG_DEBUG=y就是说后面句子obj-(CONFIG_DEBUG)+=test.o就等效于:obj-y+=test.o
后者是EXTRA_CFLAGS+=-D KERNEL_MODLE表示用于c语言中的#define KERNEL_MODLE。和EXTRA_CFLAGS+=-D KERNEL_MODLE=3表示在c语言中的#define KERNEL_MODLE =3
5、而定义包含路径为:
INCLUDE:= ../../include
EXTRA_CFLAGS:= -I $(PWD)/$(INCLUDE)\ -I $(PWD)/$(...)
都是EXTRA_CFLAGS 只是后面是-I 还是-D
6、只要obj-m:=xxx.o
和xxx-y:= 1.o 2.o 3.o xx/xx/4.o
这样定义完就是包含了,那么默认的编译第一个target只有:
default :
$(MAKE) -C $(KROOT) M=$(PWD) modules
就够了。不用再考虑怎么生成1.o 2.o这种。但是其他路径的4.o怎么生成?是
从这可以看出来gnu的makefile与kbuild的makefile在多层次目录下也不一样。具体哪不一样,如下所述。