注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

makefile学习(八)—LINUX内核中MAKEFILE的理解1  

2011-12-01 21:09:54|  分类: LINUX编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

makefile学习(八)—LINUX内核中MAKEFILE的理解1

先看一个例子,

ifeq ($(KERNELRELEASE),)
        KERNELDIR ?= /home/linux/linux-2.6.22.6
        PWD := $(shell pwd)
        modules:
                $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
        modules_install:
                $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
        clean:
                rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
        .PHONY: modules modules_install clean
        else
                obj-m := myhello.o
        endif

再看一个例子:
ifneq ($(KERNELRELEASE),)
obj-m:=hello.o
else
KERNELDIR:=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
default:        $(MAKE) -C $(KERNELDIR)  M=$(PWD) modules
clean:        rm -rf *.o *.mod.c *.mod.o *.ko
endif

还有一个:
Makefile文件(修改自示例代码):
obj-m := hello.o

#KERNELDIR := /lib/modules/2.6.24-21-generic/build
#KERNELDIR := /usr/src/linux-headers-2.6.24-21-generic/
KERNELDIR := /lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

modules:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
   
clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
   
.PHONY: modules modules_install clean

这三个MAKEFILE大同小异,没有本质上的区别,都是一个很简单的驱动编译到内核中去。首先在新的内核也就是LINUX2.6以上,变量改为了obj-m :这种定义的方式。不再使用$(OBJ)自己单独定义。
程序开始KERNELRELEASE未有定义,则略过if,直接执行下面的语句:
$(MAKE),这个可以是一个路径下的make,比如“/bin/make”,这样做的好处是:当我们使用一个其它版本的make程序时,可以保证最上层使用的make程序和其子目录下执行的make程序保持一致。
M=$(PWD) modules,引起注意的是这个M不是选项,是一个变量,网上有好多人甚至是高手都这么讲,个人估计是觉得这么理解或者说明起来比较容易些吧。
$(MAKE) -C $(KERNELDIR):这个-C表示进入后面路径的目录下make,这里当然就是$(KERNELDIR),而KERNELDIR这个变量代表着“/usr/src/linux-headers-2.6.24-21-generic/”,这三个都不一样,但是都差不多,表示内核的路径。有的还用了shell,比如:/lib/modules/$(shell uname -r)/build,但结果是一样的,而且这个有一个要说明,build是一个连接符号,指向内核源码“/usr/src/linux”。

$(MAKE) -C $(KERNELDIR) M=$(PWD) modules这句话在LDD3中说执行了两次makefile,一次是(例2)来说,就是hello模块的源代码所在目录/home/s tudy/prog/mod/hello/下的Makefile,第二次指/usr/src/linux/下的Makefile,运行的结果是在当前路径下生成一个hello.ko文件,也就是说在执行M= 选项使 makefile在试图建立模块目标前, 回到你的模块源码目录.而这时候儿,KERNELRELEASE被定义,进入上面忽略的if语句,开始编译模块,将本路径下的hello.ko编译到内核当中去。

重点其实就是,由于KERNELDIR没有定义,执行默认的部分,进入内核目录调用make,而-M则又使内核makefile在编译模块前进入到当前目录编译当前驱动makefile, 这也是说的调用了两次make,而此时KERNELDIR已经定义,顶层的内核makefile继续回到试图建立目标模块前的地方被执行,开始makefile,调用进入开始未执行的if中去

  评论这张
 
阅读(956)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017