在学习Linux驱动开发过程中,需要将我们写的驱动程序编译为模块,然后装载的系统或者开发板上进行测试,在编译过程中,我们经常执行如下命令进行编译:

  1. make -C /lib/modules/`uname -r`/build/ M=`pwd` modules  

由于命令比较长,而且有时候需要采用开发板中移植的linux内核,每次都输入上述命令进行操作的话比较复杂,一种解决办法是采用Makefile进行,当然这也是比较方便的。在《linux设备驱动程序》这本书有这个Makefile的例子,另一种方法,也是我今天记录的脚本,脚本网上整理来的,结合最近所学的shell脚本编程进行修改:脚本(脚本名称mm)如下:

  1. #! /bin/bash   
  2.   
  3. command=“make -C /lib/modules/`uname -r`/build M=`pwd` modules”  
  4. name=`pwd`;name=`basename $name`    
  5. if [ $# -gt 0 ]   
  6. then  
  7.     while true  
  8.     do   
  9.         case $1 in  
  10.         )     break;;   
  11.         c|C|-c|-C)      touch Makefile;make -C /lib/modules/`uname -r`/build M=`pwd` clean;rm -rf Module* Makefile;exit 0;;   
  12.         b|B|-b|-B)  command=“make -C /work/sysbuild/linux_kernel/linux-2.6.22.6 M=`pwd` modules”;shift;;   
  13.         h|H|-h|-H)  shift;;   
  14.             *)      name=$1;shift;;   
  15.         esac   
  16.     done   
  17. fi   
  18. echo “obj-m := ${name}.o”>Makefile   
  19. for file in `ls .`   
  20. do   
  21.         case $file in  
  22.         *.c)    echo “${name}-objs += ${file%”.c“}.o”>>Makefile;;   
  23.         esac   
  24. done   
  25.     $command  

上述脚本第12行的路径可以根据我们板子上的内核树进行修改,然后保存放到/bin目录下就可以进行使用,这个脚本支持如下几种选项:

  • mm -c  删除生成的文件,清理当前目录中的目标文件
  • mm -h 根据当前系统内核源码树(/lib/modules/`uname -r`/build)进行编译模块
  • mm moduleName 指定目录名,并且根据当前内核源码树编译
  • mm -b  根据开发板上linux内核源码树(目录需要根据个人实际目录进行指定)进行编译。

在使用过程中,建议指定的模块名不要是当前所在目录名重复,否则会出现嵌套依赖,从脚本上也可以看出,生成的模块文件名是根据当前所在目录名指定的,这也是这个脚本的不足之处,不过不影响使用,最近一直在使用该脚本进行模块编译。

linux编译模块脚本

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.