4412 make menuconfig和make
一、Menuconfig的操作
• Linux编译器通过.config文件确认哪些代码编译进内核,哪些被裁减掉
• menuconfig是生成.config的一个工具
• 在Linux发展过程中,配置内核可以使用一下命令:
– #make config(基于文本的最为传统的配置界面,不推荐使用)
– #make menuconfig(基于文本菜单的配置界面)
– #make xconfig(要求QT被安装)
– #make gconfig(要求GTK+被安装)
• 在Linux源码目录下输入命令make Menuconfig,可以进入配置界面
– menuconfig实现的代码在源码“scripts”目录下(了解即可)
常用操作
– 上下选择→按键“上下方向键”
– 左右选择→按键“左右方向键”
– 进入下级界面→按键“回车”
– 返回上级界面→选择“Exit”+按键“回车”
– 帮助→选择“help”+按键“回车”
• 搜索
– 界面输入“/”,输入查找关键词,输入“回车”即可搜索
• 使用“空格”键选择具体驱动配置,有三种状态
– “M”编译成模块(需要在编译文件里面特殊定义,后面介绍)
– “空”不编译状态
– “*”编译进内核
• 退出
– 不保存退出
– 保存退出
• Kconfig也是通过脚本编写而成,所以学会“仿写”即可
• Kconfig文件在每一级目录下都有,源码下的如下图所示。
– mainmenu菜单可以看到平台“arm”和内核版本“3.0.15”
Kconfig文件——源码目录下的Kconfig
• Kconfig也是通过脚本编写而成,所以学会“仿写”即可
• Kconfig文件在每一级目录下都有,源码下的如下图所示。
– mainmenu菜单可以看到平台“arm”和内核版本“3.0.15”
driver目录下的Kconfig分析
• menu "Device Drivers"菜单类
– source “xxx”
• menu "Character devices"
– source "xxx"
• 最终选项
– Enable LEDS config
• 看到这么复杂的配置不要慌,记住以下点
– 拿到Linux源代码的时候,已经将基本的配置好了
– 常用的配置基本在drivers目录下
– 所有你想要的配置方式都带有例子
• 千万别花太多精力去学习脚本语法!
个人感觉,目录下有个Kconfig文件,driver目录下也有Kconig,char目录下也有Kconfig。这些config文件都是为Makfile准备的
.config文件
• 源码中带的config_for_xxx都是针对不同的操作系统或者功能裁减的.config文件
Linux内核配置裁减
• 在Kconfig中的添加HELLO,然后查看menuconfig
在driver/char目录下,修改Kconfig。在LEDS上插入Hello部分
config HELLO_CTL tristate "Enable Hello config" default m help Enable Hello config #tristate是三态的,前面用tab
• 配置和裁减HELLO的驱动,查看.config文件的变化
• 将HELLO定义为“tristate”,可选为“M”状态
小结
• Menuconfig熟练使用即可,不用知道Linux怎么实现的
• Kconfig能够仿写即可
二、Make
编译器路径设置
• 拿到源码后一般需要设置一下编译器路径,在源码目录Makefile文件中可以设置编译路径“CROSS_COMPILE”
• 前面编译环境搭建的时候,解压arm-2009q3的目录和这里对应
vim Makfile
强制编译
– 源码开发者强制要求编译进内核的文件
• 打开drivers/Makefile文件
– 类似下面的写法,只要编译内核就必须编译这个文件
– obj-y += gpio/
配置编译
– 驱动开发人员可以通过配置选择编译
• 打开drivers/Makefile文件
– 强制编译char目录下的文件
– obj-y += char/
• 打开drivers/char/Makefile文件
– 如果定义了宏CONFIG_LEDS_CTL则将itop4412_leds.c文件编译进内核
– obj-$(CONFIG_LEDS_CTL) += itop4412_leds.o
依赖编译
– 一个驱动的编译需要另外驱动的支持
– 这一部分不需要另外写编译脚本,只需要在Kconfig中配置即可
• 例如显卡驱动VIDEO_JPEG_V2X中需要MEDIA_SUPPORT等驱动,那么编译显卡驱动的同时也需要将依赖的驱动选上
简单测试(实验)
• 将LEDS驱动编译进内核
– 测试
• 将LEDS驱动不编译进内核
– 测试