1. 程式人生 > >u-boot-2015.07 autoconf.mk生成過程分析

u-boot-2015.07 autoconf.mk生成過程分析

1、u-boot2015.7版本編譯沒有在頂層目錄中生成.config檔案,而生成了include/autoconf.mk和include/autoconf.mk.dep兩個檔案,並在每個模組編譯的時候包含著兩個檔案,作用相當於高版本u-boot中的.config檔案。

 

2、autoconf.mk的生成過程

在頂層目錄下的Makefile中:

…
1110 quiet_cmd_autoconf_dep = GEN     [email protected]     # log中列印:GEN  include/autoconf.mk.dep
1111      cmd_autoconf_dep = $(CC) -x c -DDO_DEPS_ONLY -M $(c_flags) \
1112     -MQ include/autoconf.mk $(srctree)/include/common.h > 
[email protected]
|| rm [email protected] # -DDO_DEPS_ONLY -> #define DO_DEPS_ONLY # -M生成依賴關係,如:gcc –M main.c -> main.o : main.c /usr/include/xx1.h /usr/include/xx2.h … # -MQ 指定依賴關係中的目標名字 # -M -MQ include/autoconf.mk include/common.h -> include/autoconf.mk : include/common.h # > [email protected]
結合1114、1115兩行程式碼分析,將以上依賴關係寫到目標檔案autoconf.mk.dep # || 如果前面命令返回失敗,執行rm [email protected],即rm autoconf.mk.dep,否則不執行。
1113 1114 include/autoconf.mk.dep: include/config.h include/common.h 1115 $(call cmd,autoconf_dep) # $(call <expression>,parm1,parm2,…) 呼叫cmd_autoconf_dep命令 1116 1117 quiet_cmd_autoconf = GEN
[email protected]
# log中列印:GEN include/autoconf.mk 1118 cmd_autoconf = \ 1119 $(CPP) $(c_flags) -DDO_DEPS_ONLY -dM $(srctree)/ include/common.h > [email protected] && \ 1120 sed -n -f $(srctree)/tools/scripts/define2mk.sed [email protected] > [email protected]; \ 1121 rm [email protected] # -dM 輸出include/common.h中所有的巨集定義到include/autoconf.mk.tmp檔案 # && 如果前面的命令成功,執行下一步,否則不執行 # tools/scripts/define2mk.sed 巨集處理規則,處理以“#define CONFIG_”為字首的所有巨集 # sed -n -f tools/scripts/define2mk.sed [email protected] > [email protected] 取出include/autoconf.mk.tmp檔案 # 以“#define CONFIG_”為字首的所有巨集,按define2mk.sed 巨集處理規則處理後寫入include/autoconf.mk 1122 1123 include/autoconf.mk: include/config.h 1124 $(call cmd,autoconf) # 呼叫cmd_autoconf命令

以上兩段程式碼可以簡化為:

include/autoconf.mk.dep: include/config.h include/common.h
         @echo GEN     [email protected]
         $(CC) -x c -DDO_DEPS_ONLY -M $(c_flags) \
                   -MQ include/autoconf.mk $(srctree)/include/common.h > [email protected] || rm [email protected]

include/autoconf.mk: include/config.h
         @echo GEN     [email protected]
         $(CPP) $(c_flags) -DDO_DEPS_ONLY -dM $(srctree)/ include/common.h > [email protected] && \
         sed -n -f $(srctree)/tools/scripts/define2mk.sed [email protected] > [email protected]; \
         rm [email protected]

 

3、總結

這段程式碼都做了些什麼,有什麼用:

1)       生成了兩個檔案autoconf.mkautoconf.mk.dep

2)       autoconf.mk.dep是為了在頂層目錄Makefile中生autoconf.mk所被包含;

3)       把include/common.h以及它所包含的標頭檔案中的以“CONFIG_”為字首的所有巨集提取出來,按tools/scripts/define2mk.sed 巨集處理規則來處理巨集定義,並寫入autoconf.mk檔案,在make 命令編譯原始碼的時候,包括autoconf.mk檔案,形成原始碼或模組的編譯規則,決定哪些模組編入映象。