1. 程式人生 > >【迅為iTop4412學習筆記】3. 編譯linux的Makefile修改

【迅為iTop4412學習筆記】3. 編譯linux的Makefile修改



本節目標

如何把原本編譯進linux核心的LEDS取消掉



首先編譯一個最小的linux燒寫試試

解壓迅為提供過的原始碼包iTop4412_Kernel_3.0_20180604.tar.gz

tar -xvf iTop4412*.tar.gz
cd iTop4412*

因為我是 SCP 1G,我要的是最小linux,所以

cp config_for_linux_scp_elite .config

最後make打包成zImage,進行漫長的等待

make zImage

最後一行告知zImage的路徑和編譯完成通知,然後燒寫進去就行了,燒寫過程就跟著迅為的pdf就行,不多加敘述了。

 Kernel: arch/arm/boot/zImage is ready

此時我們用shell命令看linux的驅動裡面,會有leds的驅動。我們接下來要做的,就是要在linux編譯前修改Makefile,目標是不讓把leds編譯進核心

[[email protected]]# ls /dev/l*
/dev/leds   /dev/loop0  /dev/loop2  /dev/loop4  /dev/loop6
/dev/log    /dev/loop1  /dev/loop3  /dev/loop5  /dev/loop7


下面進入正題

1. 修改編譯器

首先開啟linux根目錄下的Makefile搜尋CROSS_COMPILE,大致看到以下兩行

CROSS_COMPILE   ?= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
#CROSS_COMPILE   ?= /usr/local/arm/4.5.1/bin/arm-none-linux-gnueabi-

CROSS_COMPILE指交叉編譯,我們編譯出來的linux是要跑在ARM平臺的,所以核心編譯器需要使用arm的交叉編譯器,之所以有兩行,是迅為已經幫我們修改好了,被註釋的是原本的linux的編譯器,我們需要改為arm編譯器,第一行就是迅為幫我們改好的arm編譯器,有興趣可以ls檢視這個目錄下有哪些編譯器。

2. 瞭解強制編譯(強制編譯進核心的檔案)

以 drivers/Makefile 為例

vim drivers/Makefile

開啟之後以這倆為例

obj-y                           += gpio/
obj-$(CONFIG_PCI)               += pci/

對於pci來說,只有定義了巨集變數CONFIG_PCI,才會編譯pci
對於gpio來說,直接就yes了,不就是強制編譯…

3. 瞭解配置編譯

我們有了概念之後就繼續往下看,發現了

obj-y                           += char/

char後面有個 / ,意味著強制編譯了char目錄下的內容,那我們就繼續再往裡層資料夾找,所以推斷應該是檢視 drivers/char/ 下的 Makefile 檔案

vim drivers/char/Makefile

檔案裡搜尋 leds就看到了

obj-$(CONFIG_LEDS_CTL)          += itop4412_leds.o

到這裡其實就已經很眼熟了,CONFIG_LEDS_CTL就是仿寫Kconfig的時候寫的,而驅動檔名就是itop4412_leds.c,寫的.o是連結,要編譯成.o自然就是.c咯…

4. 瞭解依賴編譯

這裡就隨便略過吧,有些驅動不是單個檔案就編譯完了,而是可能依賴其他的驅動。如果你要編譯,當然不要你把需要的其他驅動都從頭擼一遍,只需要在Kconfig中選中依賴的那些驅動就可以了。

我現在也只是聽了個理論,具體還沒有實踐過,以後實踐了看還記不記得來更新吧…

現在開始將LEDS不編譯進核心

我們先直接開啟.config檔案看看LEDS被編譯進核心是什麼樣子的

vim .config

搜尋LEDS會發現

CONFIG_LEDS_CTL=y

y就是yes嘛,這就說明了LEDS目前是被編譯進核心的,不編譯進就要改成n嗎?emmm,我們人還是看著工具,使用工具來修改吧

進入圖形化介面

make menuconfig

找到 Devices Drivers/Character devices目錄下的 Enable LEDS config,前面有個星號表示被選中,用空格讓他顯示空,就意味著被取消編譯進核心了。
至於為什麼路徑是這個,因為LED是個字元裝置,所以肯定是驅動/字元裝置目錄下找,為什麼顯示的是Enable LEDS config,仿寫Kconfig中自己寫的,應該回憶起來了吧!

配置完了,就可以make zImage類似最開始那樣編譯成zImage檔案並燒寫了。

進入Linux輸入命令檢視驅動,發現已經沒有LED了

[[email protected]]# ls /dev/l*                                                    
/dev/log    /dev/loop1  /dev/loop3  /dev/loop5  /dev/loop7
/dev/loop0  /dev/loop2  /dev/loop4  /dev/loop6

Linux核心編譯流程圖

等待插圖



本次總結

其實說簡單也簡單,就是make menuconfig中選中就編譯,取消就不編譯。
說簡單好像也不簡單,因為它把之前都綜合起來了,首先要編寫一個驅動LED的驅動,其次就是編寫Kconfig新增巨集定義,才能把這些都顯示在圖形介面上,再才是選擇是否編譯進linux中。
本節應該算是帶我們在最淺顯的地方初探Linux核心編譯?