1、makefile
MKCONFIG := $(srctree)/mkconfig
export MKCONFIG
%_config:: outputmakefile
@$(MKCONFIG) -A $(@:_config=)
#########################################################################
#
%代表着任意字符
#%_config目標後面是雙冒號,而我們平常看的只有一個冒號,這個就是makefile
的雙冒號規則了,
#而平常我們見的單冒號就是普通規則。Makefile
中規定:一個目標可以出現在多個規則中。
#但是這些規則必須是同一類型的規則,要麼都是普通規則,要麼都是雙冒號規則。
#而不允許一個目標同時出現在兩種不同類型的規則中。雙冒號規則和普通規則的處理的不同點表現在以下幾個方面:
#1.
雙冒號規則中,當依賴文件比目標更新時。規則將會被執行。對於一個沒有依賴而只有命令行的雙冒號規則,
#
當引用此目標時,規則的命令將會被無條件執行。而普通規則,當規則的目標文件存在時,
#
此規則的命令永遠不會被執行(目標文件永遠是最新的)。
#2.
當同一個文件作爲多個雙冒號規則的目標時。這些不同的規則會被獨立的處理,
#
而不是像普通規則那樣合併所有的依賴到一個目標文件。這就意味着對這些規則的處理就像多個不同
#
的普通規則一樣。就是說多個雙冒號規則中的每一個的依賴文件被改變之後,make只執行此規則定義的命令,
#
而其它的以這個文件作爲目標的雙冒號規則將不會被執行。
#@的作用是在執行這條命令的時候不進行顯示,$(MKCONFIG)是取變量MKCONFIG,
#由MKCONFIG
:= $(SRCTREE)/mkconfig這條語句知,就是當前目錄下的mkconfig文件,
#$(@:_config=)的意思是,講目標文件名字中含有的_config用等號後面的的字符替換掉,
#這裏=後面爲空,所以其效果就是把_config去掉
#
格式爲“$(VAR:A=B)”(或者“${VAR:A=B}”),意思是:替換變量“VAR”中所有“A”字符結尾的字爲“B”結尾的字。
#########################################################################
其實就是調用命令mkconfig -A am335x_evm
執行結果:
GEN /home/fz/build/forlinx_uboot/Makefile
Configuring for am335x_evm - Board: am335x_evm, Options: SERIAL1,CONS_INDEX=1,EMMC_BOOT
outputmakefile就是在輸出目錄,生成一個makefile
mkconfig是一個shell腳本,最終的目的只用一個,根據boards.cfg文件裏與am335x_evm匹配的board行所提供的參數Target Architecture CPU Board [VENDOR] [SOC]來產生一個config.h和config.mk。
config.h是uboot源碼的頂層配置頭文件,它包括了對uboot產生影響的所有配置選項。
config.mk爲make提供了幾個變量,並根據boards.cfg中匹配行所提供的參數爲這幾個變量賦值,後面make將會用到的。