Lichee (六) 优化配置的微内核
我們的分析《Lichee(二) 在sun4i_crane平臺(tái)下的編譯?》的時(shí)候。竟然沒(méi)有一個(gè)步驟是在配置內(nèi)核
make ARCH=arm menuconfig細(xì)致的讀過(guò)的代碼的會(huì)發(fā)現(xiàn),在build_kernel有這么一段話
?if [ ! -e .config ]; then ? echo -e "\n\t\tUsing default config... ...!\n" ? cp arch/arm/configs/sun4i_crane_defconfig .config ?fi
作用是,當(dāng)不存在.config時(shí),就將arch/arm/configs/sun4i_crane_defconfig復(fù)制到.config。這樣我們就不須要在編譯kernel的時(shí)候去運(yùn)行make menuconfig來(lái)配置內(nèi)核了。
但是我們?cè)趯?shí)際移植驅(qū)動(dòng)的過(guò)程中,往往須要改動(dòng).config。
這時(shí)就不得不面臨一個(gè)問(wèn)題了。到底什么時(shí)候不存在.config文件呢。當(dāng)然是我們第一次從GIT 克隆下來(lái)代碼的時(shí)候。
隨之就有一個(gè)新的問(wèn)題,當(dāng)我們想給我們項(xiàng)目?jī)?nèi)部的人共享代碼的時(shí)候,他編譯的內(nèi)核并非我們這邊配置好的.config文件,而是arch/arm/configs/sun4i_crane_defconfig,這樣非常有可能導(dǎo)致你和你的伙伴編譯的并非同一套配置產(chǎn)生的kernel。還有另外一個(gè)問(wèn)題,比方我們有2個(gè)產(chǎn)品,方案基本同樣,僅僅是幾個(gè)外設(shè)不同。我們又認(rèn)為弄多套代碼維護(hù)起來(lái)過(guò)于麻煩。就這樣的需求來(lái)說(shuō),我們有一種最簡(jiǎn)單的解決方式,我們?cè)趦?nèi)核文件夾arch/arm/configs/下,也創(chuàng)建一個(gè)新的defconfig文件。依據(jù)前面幾篇文章對(duì)于目標(biāo)產(chǎn)品的命名,我們就叫mt7332_defconfig。
我們分析了這么多關(guān)于Lichee BSP自己主動(dòng)化的過(guò)程。這些內(nèi)容所有都是人家的。這次我們檢驗(yàn)一下我們學(xué)習(xí)成果。弄一點(diǎn)咱們自己的東西。
就像我們?cè)凇禠ichee(二) 在sun4i_crane平臺(tái)下的編譯?》中的分析。lichee中的build.sh直接指向了buildroot/scripts/common.sh,之前我們一直沒(méi)有分析以下的代碼段
while getopts hp:m:k: OPTION do case $OPTION in h) show_help exit 0 ;; p) PLATFORM=$OPTARG ;; m) MODULE=$OPTARG ;;? k) KERN_VER=$OPTARG update_kdir $KERN_VER ;; *) show_help exit 1 ;; esac done 非常明顯這段代碼是在接收腳本的參數(shù)。還記不記得我們編譯的命令 ./build.sh -p sun4i_crane -k 3.0 這里我們新加一個(gè)參數(shù) -v 意思就是VERNDOR
修改后例如以下: VENDOR="" ..................
while getopts hp:m:k:v: OPTION do case $OPTION in h) show_help exit 0 ;; p) PLATFORM=$OPTARG ;; m) MODULE=$OPTARG ;; v) VENDOR=$OPTARG ;;? k) KERN_VER=$OPTARG update_kdir $KERN_VER ;; *) show_help exit 1 ;; esac done
這里我們的-v傳進(jìn)來(lái)的值僅僅是在lichee文件夾下的build.sh, 經(jīng)過(guò)《Lichee(二) 在sun4i_crane平臺(tái)下的編譯》的分析,我們須要將VENDOR的值傳入到lichee/linux-3.0/文件夾下的build.sh 相同地,在linux-3.0文件夾下也要新增-v參數(shù)
while getopts hp:m:v: OPTION docase $OPTION inh) show_help;;p) PLATFORM=$OPTARG;;m) MODULE=$OPTARG;;v) VENDOR=$OPTARG;;*) show_help;; esac done
這里我們就要對(duì)VENDOR的值進(jìn)行推斷了(如果我們另一款產(chǎn)品叫mt7xxx)
if [ "$VENDOR" = mt7332 ]; thenmake ARCH=arm mt7332_defconfig elif [ "$VENDOR" = mt7xxx ]; thenmake ARCH=arm mt7xxx_defconfig elseecho "use current .config $VENDOR" fi
當(dāng)我們-v傳進(jìn)來(lái)的是mt7332的話,我們就用mt7332_defconfig這個(gè)配置。假設(shè)是mt7xxx的話,就用mt7xxx_defconfig,以此類(lèi)推。
假設(shè)不帶-v參數(shù)。就代表用的是當(dāng)前的.config文件
這段腳本一定要放在實(shí)際編譯之前,也就是要放在以下這段代碼之前if [ -x ./scripts/build_${PLATFORM}.sh ]; then./scripts/build_${PLATFORM}.sh $MODULE elseprintf "\nERROR: Invalid Platform\n"show_helpexit 1 fi
怎樣創(chuàng)建mt7332_defconfig?這個(gè)問(wèn)題事實(shí)上也非常easy,當(dāng)我們?cè)趕un4i_crane_defconfig的基礎(chǔ)上進(jìn)行make menuconfig結(jié)束的時(shí)候,將產(chǎn)生的.config文件復(fù)制到arch/arm/configs/文件夾下 如果。我們的mt7332產(chǎn)品,剛剛換了一款3G模,實(shí)比例如以下
# 配置自己的新增的驅(qū)動(dòng)模塊 make ARCH=arm menuconfig? #將配置好的.config文件復(fù)制到mt7332_defconfig cp .config arch/arm/configs/mt7332_defconfig # 回到lichee文件夾 cd .. #編譯 ./build.sh -p sun4i_crane -k 3.0 -v mt7332
至此,我們就能夠在同一套內(nèi)核代碼中。維護(hù)多款目標(biāo)產(chǎn)品了
版權(quán)聲明:本文博主原創(chuàng)文章,博客,未經(jīng)同意不得轉(zhuǎn)載。
轉(zhuǎn)載于:https://www.cnblogs.com/zfyouxi/p/4800399.html
總結(jié)
以上是生活随笔為你收集整理的Lichee (六) 优化配置的微内核的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Session or Cookie?是否
- 下一篇: 遗传算法Demo