在Linux移植之make uImage編譯過程分析中分析了uImage文件產生的過程,在uImage產生的過程中,順帶還產生了其它的一些中間文件。這里主要介紹幾個比較關鍵的文件
1、linux-2.6.22.6\include\config\auto.conf、inux-2.6.22.6\include\linux\autoconf.h文件的生成過程
2、include\asm-arm\Mach-types.h文件的生成過程
1、inux-2.6.22.6\include\config\auto.conf、inux-2.6.22.6\include\linux\autoconf.h文件的生成過程
在頂層Makefile中嘗試尋找auto.conf,找到如下信息:可以看到頂層Makefile中需要包含-include include/config/auto.conf、-include include/config/auto.conf.cmd。-include表示即使文件不存在也不會報錯。
442 # Read in config 443 -include include/config/auto.conf 444 445 ifeq ($(KBUILD_EXTMOD),) 446 # Read in dependencies to all Kconfig* files, make sure to run 447 # oldconfig if changes are detected. 448 -include include/config/auto.conf.cmd 449 450 # To avoid any implicit rule to kick in, define an empty command 451 $(KCONFIG_CONFIG) include/config/auto.conf.cmd: ; 452 453 # If .config is newer than include/config/auto.conf, someone tinkered 454 # with it and forgot to run make oldconfig. 455 # if auto.conf.cmd is missing then we are probably in a cleaned tree so 456 # we execute the config step to be sure to catch updated Kconfig files 457 include/config/auto.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd 458 $(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig
繼續分析生成include/config/auto.conf目標的語句
457 include/config/auto.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd 458 $(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig
可以看到依賴KCONFIG_CONFIG其實就是.config
192 KCONFIG_CONFIG ?= .config
依賴include/config/auto.conf.cmd,這條語句知道,該語句中的目標沒有依賴,也沒有生成它的規則命令,所以可想GNU Make本身無法生成auto.conf.cmd 的。
451 $(KCONFIG_CONFIG) include/config/auto.conf.cmd: ;
然后該條語句后面的一個分號表明,這兩個目標被強制是最新的,所以下面這條命令得以執行:
458 $(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig
繼續往下分析發現這條命令是執行頂層的Makefile生成silentoldconfig目標。找到生成這個目標的規則:
416 config %config: scripts_basic outputmakefile FORCE 417 $(Q)mkdir -p include/linux include/config 418 $(Q)$(MAKE) $(build)=scripts/kconfig $@
這個規則在Linux移植之配置過程分析已經分析過。所以直接去到scripts/kconfig/Makefile找到silentoldconfig目標的規則:
22 silentoldconfig: $(obj)/conf 23 $< -s arch/$(ARCH)/Kconfig
可以看到它依賴於scripts/kconfig/conf這個程序,這個程序的編譯過程就不分析了,繼續看到規則,將規則展開得到
23 conf -s arch/arm/Kconfig
所以需要知道conf的功能,那么就去要看它的源碼。在這里簡單說明一下它的功能:其實就是調用.config文件,保證了 .config 已經最新后,那么調用 conf_write_autoconf() 生成 auto.conf,auto.conf.cmd 以及 autoconf.h 這 3 個文件。詳情分析參考https://blog.csdn.net/lcw_202/article/details/6661364
2、include\asm-arm\Mach-types.h文件的生成過程,在分析內核源碼時發現這個文件如果沒有編譯的話是不存在的,它存放着單板機器編碼,這個編碼就是與uboot傳入的編碼比較的。比如#define MACH_TYPE_S3C2440 362。
來到arch/arm/Makefile文件中,看到如下幾條命令:
221 maketools: include/linux/version.h include/asm-arm/.arch FORCE 222 $(Q)$(MAKE) $(build)=arch/arm/tools include/asm-arm/mach-types.h
這個分析過程類似於第一點產生文件的過程,來到arch/arm/tools/Makefile中,可以看到nclude/asm-arm/mach-types.h是由
7 include/asm-arm/mach-types.h: $(src)/gen-mach-types $(src)/mach-types 8 @echo ' Generating $@' 9 $(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; }
將第9行命令展開得到,它的意思是利用arch/arm/tools/mach-types程序產生include/asm-arm/mach-types.h文件,如果不成功,則刪除。其中arch/arm/tools/mach-types是內核一開始就做好的工具。
awk -f arch/arm/tools/gen-mach-types arch/arm/tools/mach-types > include/asm-arm/mach-types.h || { rm -f include/asm-arm/mach-types.h; /bin/false; }