u-boot-2015.07 autoconf.mk生成過程分析
阿新 • • 發佈:2019-01-08
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.mk和autoconf.mk.dep;
2) autoconf.mk.dep是為了在頂層目錄Makefile中生autoconf.mk所被包含;
3) 把include/common.h以及它所包含的標頭檔案中的以“CONFIG_”為字首的所有巨集提取出來,按tools/scripts/define2mk.sed 巨集處理規則來處理巨集定義,並寫入autoconf.mk檔案,在make 命令編譯原始碼的時候,包括autoconf.mk檔案,形成原始碼或模組的編譯規則,決定哪些模組編入映象。