转自:https://www.aliyun.com/jiaocheng/144874.html
- 摘要:在进行嵌入式开发过程中,经常需要编写和运行Makefile,且在大型项目开发过程中,一般也都是使用Makefile来进行管理、编译、运行的,所以对Makefile的读写是嵌入式软件工程师必须具备的基本能力。Makefile中,特别是在内核模块编译过程中最常使用到的两个参数就是“-C”和“M=”。常用Makefile:#Makefileifneq($(KERNELRELEASE),)#kbuildsyntax.dependencyrelationshsipoffilesandt
- 在进行嵌入式开发过程中,经常需要编写和运行Makefile,且在大型项目开发过程中,一般也都是使用Makefile来进行管理、编译、运行的,所以对Makefile的读写是嵌入式软件工程师必须具备的基本能力。
Makefile中,特别是在内核模块编译过程中最常使用到的两个参数就是“-C”和“M=”。常用Makefile:
# Makefile
ifneq ($(KERNELRELEASE),)
#kbuild syntax. dependency relationshsip of files and target modules are listed here.
mymodule-objs := helloworld.o
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)
clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions*.order *symvers
endifKERNELRELEASE 是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,KERNELRELEASE没有被定义,所以make将读取执行else之后的内容。
当make的目标为all时,-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD)
表明然后返回到当前目录继续读入、执行当前的Makefile。
当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容,其为kbuild语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。Makefile编译运行结果:aliyunzixun@xxx.com:~/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'
aliyunzixun@xxx.com:~/fly/tmp$
- 以上是Makefile中的-C和M=解析的内容,更多 Makefile 解析 的内容,请您使用右上方搜索功能获取相关信息。