#make //编译驱动模块
由于make没有指定选项和目标,将默认使用Makefile文件,并且先去执行all下的文件
Makefile的内容:
KERN_DIR =/opt/workspace/linux-3.2.0-psp04.06.00.10/
//KERN_DIR表示内核源码目录,这种方式适用于嵌入式开发的交叉编译,KERN_DIR目录中包含了内核驱动模块所需要的各种头文件及依赖。
all:
make-C $(KERN_DIR) M=`pwd` modules
clean:
make-C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order
obj-m+=myleds.o
-c表示 指定进入指定的目录,即KERN_DIR,是内核源代码目录,调用该目录顶层下的makefile,目标为moudules。
M=`pwd`选项让该makefile在构造moudules目标之前返回到模块源代码目录并在当前目录生成obj-m指定的mvleds.o目标模块。
Clean这个目标表示将模块清理掉
Obj-m +=mvleds.o即指定当前目录要生成的目标模块,然后moudules目标指向obj-m变量中设定的模块。
拓展:
编译内核很简单,只需要配置完毕后执行make命令,将指定的文件编译进内核
bzImage或者编译成模块。
make = makebzImage + make modules
因此如果值编译内核,即只编译配置文件中-y选项,可以直接用命令
make bzImage
如果值编译模块,即只编译配置文件中的-m选项,可以之直接使用命令
make modules
模块可以编译当然也可以清除,使用命令
make modulesclean
如果只想单独编译一个模块,可以使用命令
makeM=drivers/test/ modules //只单独编译drivers/test中的.ko
makeM=drivers/test/ modules clean //清除
上面的是在内核目录下的操作,但当我写驱动时,我并不可能在内核目录下编写,但我编译时却要依赖内核中的规则和Makefile,所以就有了以下的方法,同时这也是一般的编写驱动时Makefile的格式。
指定内核Makefile并单独编译
make -C/root/linux-2.6.29 M=`pwd` module
make -C/root/linux-2.6.29 M=`pwd` module clean
//-C 指定内核Makefile的路径,可以使用相对路径。
//-M 指定要编译的文件的路径,同样使用相对路径。
编译生成的模块可以指定存放的目录
make -C /root/linux-2.6.29 M=`pwd` modules_installINSTALL_MOD_PATH=/nfsroot