Linux移植之auto.conf、autoconf.h、Mach-types.h的生成過程簡析


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; }
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM