一、常用文件介绍
Makefile文件:定义了Linux 内核的编译规则。
Kconfig文件:用于生成menuconfig的各级界面,方便用户配置选择各项功能。
.config文件:通过操作make menuconfig来配置各项的状态.最终改变.config文件各项的值,用于决定make时各项是否被编译链接进内核。
二、Makefile基本语法
1.基本规则:当依赖比目标新时,它就会执行下面的命令
目标:依赖1 依赖2
[tab]命令
2、变量及常用符号
2.1、变量的定义和使用
变量一般都是字符串,像C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上,变量在声明时需要给予初值,而在使用时,需要给在变量名前加上“$”符号,但最好用小括号“()”或是大括号“{}”把变量给包括起来
2.2、变量的赋值
”:=” 直接赋值,赋予当前位置的值
”=” 延时赋值,变量的值是整个makefile中最后被指定的值
“?=” 表示如果该变量没有被赋值,才赋予等号后的值
“+=” 表示将等号后面的值添加到前面的变量上
“+=” 左边的“obj-$(CTL) ”表示如果.config里定义了宏CTL=y才编译链接进内核。=m则编译成动态加载模块
2.3、通配符
$@ 目标文件.o的集合,就像一个数组
$< 所有或者第一个依赖文件.c,视场景而定
$^ 所有的依赖目标的集合
$? 所有比目标新的依赖目标的集合。以空格分隔。
~/test 表示当前用户的/home目录下test文件
2.4、统配符
% 作为统配符,可以表示所有和它文件一类的文件如 %.c代表当前目录下的所有.c文件
3、伪目标
即该目标不存在,但可以方便使用。.PHONY : clean 显示地指明clean是“伪目标”。
4、命令执行和参数
make执行时,带入参数“-n”或“–just-print”,那么其只是显示makefile里的命令,但不会执行命令。
make参数“-s”或“–slient”则是全面禁止命令的显示。
当我们用“@”字符在命令行前,那么,这个命令将不被make显示出来。
make会一条一条的执行其后的命令。需注意的是,如果要让上一条命令的结果应用在下一条命令时,你应该写在同一行然后使用分号分隔这两条命令。
可以在Makefile的命令行前加一个减号“-”(Tab键之后),标记为不管命令出不出错都认为是成功的
三、将新编译项添加进内核的步骤:
1、编写.c等文件源码,并添加到相应的内核子目录中
2、在上述子目录的Kconfig中添加新编译项在配置界面的操作信息。eg:
config LEDS_CTL
bool "Enable LEDS config"
default y
help
Enable LEDS config
3、在上述子目录的Makefile中增加针对新编译项的编译条目。eg:
obj-$(CONFIG_LEDS_CTL) += itop4412_leds.o
四、单独驱动模块编译时makefile示例:
Makefile代码``
#!/bin/bash
obj-m +=hello_module.o
KDIR :=/home/iTop4412_Kernel_3.0
PWD ?=$(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.o
五、生成可执行程序过程
源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。
编译时:编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。
链接程序时:链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error)
六、其他资料
makeflle入门到精通