前言
(1)在學(xué)習(xí)韋東山Linux教學(xué)視頻的時候,他的makefile并沒有做詳細(xì)的介紹。以至于我學(xué)了很長時間對他的makefile文件不理解。所以本文將會詳細(xì)介紹韋東山Linux教學(xué)視頻中的makefile文件含義。
(2)注意:我使用的是韋東山的配套i.max6ull pro開發(fā)板。如果是其他系列開發(fā)板,makefile文件的KERN_DIR = 需要改成你的Linux內(nèi)核路徑。
(3)閱讀本文之前,需要具備一定的makefile語法基礎(chǔ),如果沒有,請先學(xué)習(xí)Linux-GCC介紹+入門級Makefile使用的Makefile介紹部分。
(4)強(qiáng)調(diào):我這里只是幫助各位理解韋東山老師的makefile文件是什么意思,保證你看完之后能夠?qū)@個文件進(jìn)行更改,但是不保證你能夠自己從0寫一個makefile。
韋東山makefile文件源代碼
以下是韋東山老師的makefile文件,我加了一些注釋。
# 1. 使用不同的開發(fā)板內(nèi)核時, 一定要修改KERN_DIR
# 2. KERN_DIR中的內(nèi)核要事先配置、編譯, 為了能編譯內(nèi)核, 要先設(shè)置下列環(huán)境變量:
# 2.1 ARCH, 比如: export ARCH=arm64
# 2.2 CROSS_COMPILE, 比如: export CROSS_COMPILE=aarch64-linux-gnu-
# 2.3 PATH, 比如: export PATH=$PATH:/home/book/100ask_roc-rk3399-pc/ToolChain-6.3.1/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin
# 注意: 不同的開發(fā)板不同的編譯器上述3個環(huán)境變量不一定相同,
# 請參考各開發(fā)板的高級用戶使用手冊
# 內(nèi)核源碼路徑
KERN_DIR = /home/book/100ask_imx6ull-sdk/Linux-4.9.88
all:
# -C表示將當(dāng)前的工作目錄切換到指定目錄中,也就是Linux內(nèi)核源碼路徑
# M=表示模塊源碼目錄
# pwd表示獲取當(dāng)前文件路徑,因為makefile一般和模塊源碼在同一個路徑,所以這里可以直接使用pwd指令
# modules表示編譯模塊
make -C $(KERN_DIR) M=`pwd` modules
# 將ledtest.c 編譯成開發(fā)板能夠執(zhí)行的可執(zhí)行文件ledtest
$(CROSS_COMPILE)gcc -o ledtest ledtest.c
clean:
# 將模塊清空
make -C $(KERN_DIR) M=`pwd` modules clean
# 清除過度文件modules.order,這句話沒有用處,上一句也會清除modules.order文件
rm -rf modules.order
# 刪除可執(zhí)行文件ledtest
rm -f ledtest
# 參考內(nèi)核源碼drivers/char/ipmi/Makefile
# 要想把a(bǔ).c, b.c編譯成ab.ko, 可以這樣指定:
# ab-y := a.o b.o
# obj-m += ab.o
# make工具根據(jù)名字將.c編譯成.ko模塊
obj-m += leddrv.o chip_demo_gpio.o
前期準(zhǔn)備工作—設(shè)置交叉編譯工具鏈
(1)因為開發(fā)板和電腦端的架構(gòu)是不一樣的。所以他們的可執(zhí)行文件是不同的,在電腦端能夠運(yùn)行的可執(zhí)行文件,開發(fā)板是跑不了的,反之同理。
(2)為了能夠讓我們編譯出開發(fā)板能夠執(zhí)行的可執(zhí)行文件,就需要先設(shè)置交叉編譯工具鏈。
(3)如果是跟著韋東山老師的視頻課程的來的,教程編譯工具鏈應(yīng)該是永久配置好的。(詳情可看嵌入式Linux應(yīng)用開發(fā)完全手冊V5_IMX6ULL_Pro開發(fā)板,第三篇環(huán)境搭建與開發(fā)板操作,2.6.3節(jié)配置交叉工具鏈)
(4)因為韋東山老師的文檔對交叉工具鏈配置已經(jīng)很詳細(xì)了,所以我不再贅述。這里只是會講解如何查看自己是否永久配置好交叉工具鏈。
(5)打開終端,輸入指令: vim ~/.bashrc
(6)
<1>進(jìn)入VIM編輯器之后,輸入: /PATH
<2>如果能夠跳轉(zhuǎn),并且找到如下圖的三行文字,就表示交叉工具鏈已經(jīng)被配置好了。如果沒有進(jìn)行跳轉(zhuǎn),說明沒有被配置好。
(7)如果沒有配置好交叉編譯工具鏈,就在命令行輸入如下三行指令。(注意,如果是韋東山配套的i.max6ull就是執(zhí)行這個。其他的板子請自行尋找你的交叉工具鏈配置方法)
export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihfexport-
PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
代碼詳細(xì)介紹
KERN_DIR = …介紹
(1)這一句是進(jìn)行賦值操作,我們會發(fā)現(xiàn),這個makefile中還有其他的KERN_DIR 。
(2)這個就相當(dāng)于C語言的賦值,a = 3。那么此時變量a就是3了,后面只要出現(xiàn)字符a,并且字符a沒有再次賦值,那么a就是代表數(shù)字3。
(3)這個是用來指定Linux的內(nèi)核路徑的。因為我們編譯文件,需要使用到Linux庫函數(shù),所以需要指定Linux路徑。
KERN_DIR = /home/book/100ask_imx6ull-sdk/Linux-4.9.88
all:介紹
(1)如果有makefile 的基礎(chǔ)概念知識,就知道這是一個判斷語句。
(2)因為all:是第一個判斷語句,而且all永遠(yuǎn)不存在,所以只要在終端執(zhí)行make指令,就會執(zhí)行all:下面的指令。
all:
[TAB]命令
make -C $…介紹
(1)-C表示將當(dāng)前的工作目錄切換到指定目錄中,也就是Linux內(nèi)核源碼路徑。因為我們需要調(diào)用Linux內(nèi)核庫函數(shù)。
(2)M=表示模塊源碼目錄,也就是我們寫的驅(qū)動.c文件。
(3)這里的’pwd’效果和在終端執(zhí)行pwd指令效果是一樣的,都是獲得當(dāng)前文件路徑。為makefile一般和模塊源碼在同一個路徑,所以這里可以直接使用pwd指令。
(4)最后面的modules表示編譯模塊
make -C $(KERN_DIR) M=`pwd` modules
$(CROSS_COMPILE)gcc … 介紹
(1)看到這一段代碼,可能有些人會有疑惑,CROSS_COMPILE是什么東西?代碼里面沒有出現(xiàn)過這個玩意啊。
(2)CROSS_COMPILE就是我們在配置交叉編譯工具鏈的時候設(shè)置的玩意。 export CROSS_COMPILE = arm-buildroot-linux-gnueabihf- ,所以說,CROSS_COMPILE就是arm-buildroot-linux-gnueabihf- 。那么$(CROSS_COMPILE)gcc就是arm-buildroot-linux-gnueabihf-gcc,看到這,大家是不是熟悉起來了。沒錯,就是編譯開發(fā)板能夠執(zhí)行的可執(zhí)行文件。
(3)所以這句話就是讓應(yīng)用層的.c文件編譯成開發(fā)板能夠執(zhí)行的可執(zhí)行文件。
$(CROSS_COMPILE)gcc -o ledtest ledtest.c
clean: 介紹
這個其實是makefile基礎(chǔ)知識,如果我們在命令行輸入make clean。就會執(zhí)行clean:下面的命令。
make -C $(KERN_DIR)…介紹
這個指令就是刪除產(chǎn)生的.ko文件,.o文件,過渡文件modules.order等東西。
make -C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order介紹
清除過渡文件modules.order,這句話沒有用處,make -C $(KERN_DIR) M=
pwd
modules clean也會清除modules.order文件
rm -rf modules.order
rm -f ledtest介紹
這個就是刪除開發(fā)板的可執(zhí)行文件ledtest
rm -f ledtest
obj-m += …介紹(重點(diǎn)?。。。?/h3>
(1)make工具根據(jù)名字將.c編譯成.ko模塊。例如,leddrv.c就會被識別到,編譯成leddrv.ko。chip_demo_gpio.c就會被識別到,編譯成chip_demo_gpio.ko。
obj-m += leddrv.o chip_demo_gpio.o
(2)為了加深理解,如果我們講chip_demo_gpio.o稍微改一下。假如我們不小心少些了一個o,把chip_demo_gpio.o寫成了chip_demo_gpi.o會發(fā)送什么呢?
(1)make工具根據(jù)名字將.c編譯成.ko模塊。例如,leddrv.c就會被識別到,編譯成leddrv.ko。chip_demo_gpio.c就會被識別到,編譯成chip_demo_gpio.ko。
obj-m += leddrv.o chip_demo_gpio.o
(2)為了加深理解,如果我們講chip_demo_gpio.o稍微改一下。假如我們不小心少些了一個o,把chip_demo_gpio.o寫成了chip_demo_gpi.o會發(fā)送什么呢?
如何根據(jù)自身需求更改這個makefile
(1)首先,我們需要知道自己的內(nèi)核源碼路徑。然后將自己的內(nèi)核源碼路徑更改一下。
(2)根據(jù)自己要編譯成模塊的.c文件名字來在obj-m +=寫數(shù)據(jù)。比如我們想讓SR04.c文件編譯成SR04.ko模塊。obj-m += SR04.o這樣寫即可。文章來源:http://www.zghlxwxcb.cn/news/detail-579546.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-579546.html
到了這里,關(guān)于韋東山Linux教學(xué)視頻中的makefile文件詳細(xì)介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!