转载地址:https://www.cnblogs.com/WMCH/articles/7738071.html
在此之前,我也只是学习了韦东山的课程,里面有讲解uboot2012版本和更早的一个版本。
工作中直接拿到的uboot是2015.04版的,配置过程跟原来完全不同。Makefile看起来也是一脸懵x
但看得出来uboot一直在学习内核的配置过程,现在都支持make menuconfig了。
还有一个投机取巧的办法,就是直接看更高版本的配置过程的讲解。或者直接找内核配置过程的讲解。
网上有一些2016版的讲解,但对于2015版的很少有。
对于详细的分析,我也不清楚,就不记录了。只是记录一下比较简单的东西。配置过程中生成的几个文件,涉及到Makefile的东西,就不写了,太复杂。
先把编译脚本文件发上来:
一.配置过程如下:
make menuconfig时可以修改配置项,这主要是Kconfig的功能,
然后最终的配置结果会保存在.config文件中。下次再执行make menuconfig时回去读取这个文件。
make distclean 会删除.config
PS.
问:怎么生成的.config文件?
答:make xxx_config或者make menuconfig生成.config
另外飞凌的是根据include/configs/mx6dlsabre_common.h和include/configs/mx6dlsabre.h进行配置的更改的!即导致最后更改了.config文件。
可以通过cp /configs/xx_defconfig .config来使用这些配置模板 ,通过图形界面变更配置选项会自动更新到.config文件中 。
configs/xxx_defconfig是一些配置模版:
.config是配置之后生成的:
=y表示编进内核,=m表示编译成模块,=n表示不参与编译
二.编译过程:
make -j(cpu number) 的前期工作,四类文件。
<1>Makefile
<2>c源码
<3>/include/config/auto.conf
<4>include/generated/autoconf.h
当编译刚开始时,内核会根据.config自动生成 auto.conf 和 autoconf.h 这两个文件。
其中autoconf.h是供c源码使用(宏开关),而auto.conf供Makefile使用(是否被编译)。
auto.conf和.config内容很类似,都是下面这种格式:
CONFIG_CRC32=y
CONFIG_I2C_BOARDINFO=y
CONFIG_HAVE_AOUT=y
CONFIG_MINI6410_SD_CH0=y
autoconf.h有点不同,在.config中被定义为m/y的配置项在autoconf.h被define为1,在.config中被定义为n的配置项在autoconf.h被define为0。
它的格式如下:
#define CONFIG_TOUCHSCREEN_MINI6410 1
#define CONFIG_HAS_DMA 1
#define CONFIG_USB_SERIAL_VISOR 1
#define CONFIG_SCSI 1
。。。
3.分析Makefile
把整个内核的makefile分成三类:
<1>各级子目录makefile(每个子目录都有makefile)
<2>/arch/arm/Makefile(架构相关的makefile)
<3>顶层目录makefile(auto.conf和/arch/arm/Makefile被包含在其中:
include include/config/auto.conf
和include $(srctree)/arch/$(SRCARCH)/Makefile)
随便打开一个子目录makefile,可以看到类似的内容:
obj-$(CONFIG_BFIN_JTAG_COMM) += bfin_jtag_comm.o
obj-$(CONFIG_MVME147_SCC) += generic_serial.o vme_scc.o
obj-$(CONFIG_MVME162_SCC) += generic_serial.o vme_scc.o
obj-$(CONFIG_BVME6000_SCC) += generic_serial.o vme_scc.o
obj-$(CONFIG_ROCKETPORT) += rocket.o
。。。
很显然,
在auto.conf中CONFIG_XXX=y,对应的源码文件会被Makefile编译进内核;
在auto.conf中CONFIG_XXX=m,对应的源码文件会被Makefile编译成模块;
在auto.conf中CONFIG_XXX=n,对应的源码文件不会被makefile编译;
后略,本来以为自己搞明白了,发现也只是很肤浅的部分。仅仅记录一下吧,做个纪念。