Makefile中的-C和M=解析

转载地址:http://blog.csdn.net/xiaowulang20082008/article/details/50586985


在进行嵌入式开发过程中,经常需要编写和运行Makefile,且在大型项目开发过程中,一般也都是使用Makefile来进行管理、编译、运行的,所以对Makefile的读写是嵌入式软件工程师必须具备的基本能力。
Makefile中,特别是在内核模块编译过程中最常使用到的两个参数就是“-C”和“M=”。

常用Makefile:
# Makefile
ifneq ($(KERNELRELEASE),)

#kbuild syntax. dependency relationshsip of files and target modules are listed here.

obj-m := helloworld.o  

else

PWD  := $(shell pwd)

KERNEL_VER ?= $(shell uname -r)

KERNEL_DIR := /lib/modules/$(KERNEL_VER)/build
all:

$(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules

clean:

rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions *.order *symvers

endif

KERNELRELEASE 是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,KERNELRELEASE没有被定义, 所以make将读取执行else之后的内容。
当make的目标为all时,-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD) 表明然后返回到当前 目录继续 读入、执行 当前的Makefile。
当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容, 其为kbuild语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。

Makefile编译运行结果:

shawn@shawn-VirtualBox:~/fly/tmp$ make

make -C /lib/modules/3.16.0-30-generic/build M=/home/shawn/fly/tmp

make[1]: 正在进入目录 `/usr/src/linux-headers-3.16.0-30-generic'

  LD      /home/shawn/fly/tmp/built-in.o

  CC [M]  /home/shawn/fly/tmp/helloworld.o

  Building modules, stage 2.

  MODPOST 1 modules

  CC      /home/shawn/fly/tmp/helloworld.mod.o

  LD [M]  /home/shawn/fly/tmp/helloworld.ko

make[1]:正在离开目录 `/usr/src/linux-headers-3.16.0-30-generic'

shawn@shawn-VirtualBox:~/fly/tmp$ 


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值