在学习Linux驱动开发过程中,需要将我们写的驱动程序编译为模块,然后装载的系统或者开发板上进行测试,在编译过程中,我们经常执行如下命令进行编译:
- make -C /lib/modules/`uname -r`/build/ M=`pwd` modules
由于命令比较长,而且有时候需要采用开发板中移植的linux内核,每次都输入上述命令进行操作的话比较复杂,一种解决办法是采用Makefile进行,当然这也是比较方便的。在《linux设备驱动程序》这本书有这个Makefile的例子,另一种方法,也是我今天记录的脚本,脚本网上整理来的,结合最近所学的shell脚本编程进行修改:脚本(脚本名称mm)如下:
- #! /bin/bash
- command=“make -C /lib/modules/`uname -r`/build M=`pwd` modules”
- name=`pwd`;name=`basename $name`
- if [ $# -gt 0 ]
- then
- while true
- do
- case $1 in
- ”) break;;
- c|C|-c|-C) touch Makefile;make -C /lib/modules/`uname -r`/build M=`pwd` clean;rm -rf Module* Makefile;exit 0;;
- b|B|-b|-B) command=“make -C /work/sysbuild/linux_kernel/linux-2.6.22.6 M=`pwd` modules”;shift;;
- h|H|-h|-H) shift;;
- *) name=$1;shift;;
- esac
- done
- fi
- echo “obj-m := ${name}.o”>Makefile
- for file in `ls .`
- do
- case $file in
- *.c) echo “${name}-objs += ${file%”.c“}.o”>>Makefile;;
- esac
- done
- $command
上述脚本第12行的路径可以根据我们板子上的内核树进行修改,然后保存放到/bin目录下就可以进行使用,这个脚本支持如下几种选项:
- mm -c 删除生成的文件,清理当前目录中的目标文件
- mm -h 根据当前系统内核源码树(/lib/modules/`uname -r`/build)进行编译模块
- mm moduleName 指定目录名,并且根据当前内核源码树编译
- mm -b 根据开发板上linux内核源码树(目录需要根据个人实际目录进行指定)进行编译。
在使用过程中,建议指定的模块名不要是当前所在目录名重复,否则会出现嵌套依赖,从脚本上也可以看出,生成的模块文件名是根据当前所在目录名指定的,这也是这个脚本的不足之处,不过不影响使用,最近一直在使用该脚本进行模块编译。
linux编译模块脚本