1. 程式人生 > >一步一步學習 Linux 驅動之驅動模組 MakeFile 解析

一步一步學習 Linux 驅動之驅動模組 MakeFile 解析

make命令執行時,需要一個 Makefile 檔案,以告訴make命令需要怎麼樣的去編譯和連結程式。

一、使用條件判斷

    下面的例子,判斷$(CC)變數是否“gcc”,如果是的話,則使用GNU函式編譯目標。 

libs_for_gcc = -lgnu 
normal_libs = 

foo: $(objects) 
ifeq ($(CC),gcc) 
     $(CC) -o foo $(objects) $(libs_for_gcc) 
else 
     $(CC) -o foo $(objects) $(normal_libs) 
endif 

      可見,在上面示例的這個規則中,目標“foo”可以根據變數“$(CC)”值來選取不同的函式庫來編譯程式。 

我們可以從上面的示例中看到三個關鍵字:ifeq、else和endif。ifeq的意思表示條件語句的開始,並指定一個條件表示式,表示式包含兩個引數,以逗號分隔,表示式以圓括號括起。else表示條件表示式為假的情況。endif表示一個條件語句的結束,任何一個條件表示式都應該以endif結束。 

libs_for_gcc = -lgnu 
normal_libs = 

ifeq ($(CC),gcc) 
    libs=$(libs_for_gcc) 
else 
    libs=$(normal_libs) 
endif 

foo: $(objects) 
     $(CC) -o foo $(objects) $(libs) 
下面是關於一段arm驅動程式的分析
obj-m :=hello.o

KERNELDIR :=/home/ZP1015/Desktop/linux-2.6.32.2

all:
	 make -C $(KERNELDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
	rm -f *.o *.ko *.mod.o *.mod.c *.symvers modul*

ifneq ($(KERNELRELEASE),)

obj-m :=hello.o

else

KERNELDIR :=/home/ZP1015/Desktop/linux-2.6.32.2

all:
	 make -C $(KERNELDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
	rm -f *.o *.ko *.mod.o *.mod.c *.symvers modul*

endif

1、ifeq”語法是ifeq (<arg1>;, <arg2>;),功能是比較引數“arg1”和“arg2”的值是否相同。ifneq剛好相反,比較兩者的值是否不同其中有一些是我們常見或是見過的,第一個ifneq ($(KERNELRELEASE),)目前,有用處,它的由來是指在Linux原始碼根目錄下的Makefile編譯核心時,KERNELRELEASE巨集會被定義,那麼如果是從原始碼根目錄開始的make則會將hello.o模組編譯進核心。

KERNELDIR :=/home/ZP1015/Desktop/linux-2.6.32.2  這句是對KERNELDIR進行賦值,這個變數是後面我們用到的指代核心原始碼目錄用的。

2、make -C $(KERNELDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-

這句是Makefile的規則:這裡的$(MAKE)就相當於make-C 選項的作用是指將當前工作目錄轉移到你所指定的位置M=”選項的作用是,當用戶需要以某個核心為基礎編譯一個外部模組的話,需要在make modules 命令中加入“M=dir”,程式會自動到你所指定的dir目錄中查詢模組原始碼,將其編譯,生成KO檔案。M不是makefile的選項,是核心根目錄下的Makefile中使用的變數

3、具體編譯過程

KERNELRELEASE:由Kernel頂層Makefile中定義。

判斷變數KERNELRELEASE與空字元是否相同,即判斷變數KERNELRELEASE的值是否為空,為空的話就進入else
第一次執行中,KERNELRELEASE沒有被定義,所以進入else
$(MAKE) -C $(KERNELDIR) M=$(PWD)
此處讀取KERNELDIR中的頂層Makefile。讀取後又返回本目錄。繼續執行本目錄Makefile。
則此時KERNELRELEASE被定義。進入if.
if和else之間的為kbuild語法的語句.

4、兩段makefile對比分析

如何核心原始碼路徑設定正確,其實兩段makefile沒有什麼區別,作用完全一致。但是有用ifneq之後,可以確保是從核心構造系統呼叫的。如果核心原始碼路徑設定錯誤,KERNELRELEASE沒有定義,make就沒有物件。所以建議用後面那段makefile

相關推薦

學習 Linux 驅動驅動模組 MakeFile 解析

make命令執行時,需要一個 Makefile 檔案,以告訴make命令需要怎麼樣的去編譯和連結程式。 一、使用條件判斷     下面的例子,判斷$(CC)變數是否“gcc”,如果是的話,則使用G

起來學習React-Nativereact-navigation基本解析

前言   不久前自己也完整開發了一個React-Native專案,對其中的一些知識存在疑惑,再加上專案時間比較緊張,來不及做系統的學習。現在來回顧自己開發當中存在的疑惑點,和大家分享。第一篇是關於路由框架react-navigation,當時其實也沒有好好看文件,現在回頭看路由設計的確實比

從 0 開始學習 Linux 系列「24.訊號量 semaphore」

訊號量 semaphore 訊號量(semaphore)與之前介紹的管道,訊息佇列的等 IPC 的思想不同,訊號量是一個計數器,用來為多個程序或執行緒提供對共享資料的訪問。 訊號量的原理 常用的訊號量是二值訊號量,它控制單個共享資源,初始值為 1,操作

從 0 開始學習 Linux 系列「27.Socket 程式設計基礎(TCP,UDP)」

Socket 介面簡介 Socket 套接字是由 BSD(加州大學伯克利分校軟體研發中心)開發的一套獨立於具體協議的網路程式設計介面,應用程式可以用這個介面進行網路通訊。要注意:Socket 不是一套通訊協議(HTTP,FTP 等是通訊協議),而是程式設計的介

、web專案開發進階模組管理專案通用模組

  以前的web專案都是統一一個工程,其他人員在這個專案拉取分支進行開發,但是若需要多個人協作同時進行開發時,會造成各種各樣的問題。為了解決這些問題,按照業務邏輯進行區分,將一個專案按照多個模組進行構建。 (一)所有專案的父模組“parent”   父模組的

linux驅動模組基本知識

作為驅動的開始,我們來看一看: 1. 底層函式和上層函式的不同: app(c) 驅動模組 入口函式 main 載入函式 庫 應用層的庫(usr/lib) 核心API 執行空間 使用者空間(高3G的記憶體) 核心空間(低1G) 釋放資

從 0 開始學習 Linux 系列「25.Posix 執行緒」

多執行緒概念 多執行緒技術是應用開發中非常重要的技術之一,幾乎大型的應用軟體都使用這個技術,這次一起來學習下 Linux 中的多執行緒開發基礎(其他的系統中概念也是類似的)。 在 Linux 中,一個簡單的程序可以看成只有一個單執行緒(主執行緒),因為只有一

學習linux字元裝置驅動心得

一、主裝置號和此裝置號主裝置號表示裝置對應的驅動程式;次裝置號由核心使用,用於正確確定裝置檔案所指的裝置。核心用dev_t型別(<linux/types.h>)來儲存裝置編號,dev_t是一個32位的數,12位表示主裝置號,20為表示次裝置號。在實際使用中,是通

從 0 開始學習 Linux 系列「08.15 個 gdb 除錯基礎命令」

gdb 簡介 gdb 是 UNIX 及 UNIX-like 下的除錯工具,在 Linux 下一般都直接在命令列中用 gdb 來除錯程式,相比 Windows 上的整合開發環境 IDE 提供的圖形介面除錯,一開始使用 gdb 除錯可能會讓你感到生無可戀,但是隻要

linux編譯單獨一個模組makefile寫法(轉)

單個檔案編譯一個模組:ifneq ($(KERNELRELEASE),)  obj-m := mini2440_leds.o  else  KDIR := /opt/FriendlyARM/mini2440/linux-2.6.32.2/  all:      make -C

學習 Linux 驅動自動建立裝置節點

extern struct device *device_create(struct class *cls, struct device *parent, dev_t devt, vo

學習IdentityServer4 (4) 處理特殊需求-登錄等待頁面

友好 添加 href 空白頁 gpo nsf sha256 init 處理 用IdentityServer3的時候登錄如果采用Post方式大家會發現有中間有一個等待Submit空白頁面,界面不友好,現在我想把這個修改自定義的頁面Loading 在Identityserve

Java程式設計師從笨鳥到菜鳥(一百零七)學習webservice()開篇

      Webservice技術在web開發中算是一個比較常見技術。這個對於大多數的web開發者,別管是java程式設計師還是.NET程式設計師應該都不是很陌生。今天我就和大家一起來學習一下webservice的基本內容。此篇文章作為webservice的開篇,首先我們來看一下什麼是webservice。

Java程式設計師從笨鳥到菜鳥(一百零八)學習webservice(二)webservice基本原理

為支援結構中的三種操作(publish、find和bind),SOA需要對服務進行一定的描述,這種服務描述(Service Description)應具有下面幾個重要特點:首先,它要宣告Service provider的語義特徵。Service broker使用語義特徵將Service provider進行分

關於蒸米的學ROPlinux_x86的學習筆記

寫在開頭:level2沒有原始碼,所以第二個“Ret2libc – Bypass DEP 通過ret2libc繞過DEP防護”做不動……另外socat還沒學會用==,按照步驟輸入命令後一直沒反應,也不知道怎麼辦,所以後面的遠端攻擊也沒法進行……於是只做了第一個C

Java程式設計師從笨鳥到菜鳥(一百十)學習webservice(四)Axis2開發webservice詳解

        Axis2是Apache提供的一款第三方Web Services引擎,與其前身Apache Axis相比,axis2更加高效、模組化,也更面向於XML的組織。經過精心的設計,axis2提供了更加便利的模組新增功能。  基於新的體系結構進行了全新編寫,而且沒有采用 Axis 1.x 的常用程式碼

跟我學習lucene(6)---lucene索引優化多執行緒建立索引

這兩天工作有點忙,部落格更新不及時,請大家見諒; 前面瞭解到lucene在索引建立的時候一個IndexWriter獲取到一個讀寫鎖,這樣勢在lucene建立大資料量的索引的時候,執行效率低下的問題; 磁碟空間大小,這個直接影響索引的建立,甚至會造成索引寫入提示完成,但是沒

學習Linux裝置模型淺析驅動篇》筆記()

原文中說了,核心版本為2.6.29;這裡都貼3.15的核心原始碼; 檔案/drivers/rtc/rtc-s3c.c static struct platform_driver s3c_rtc_driver = {         .probe= s3c_rtc_pro

跟我學習lucene(11)---lucene搜尋高亮顯示highlighter

highlighter介紹 這幾天一直加班,部落格有三天沒有更新了,望見諒;我們在做查詢的時候,希望對我們自己的搜尋結果與搜尋內容相近的地方進行著重顯示,就如下面的效果 這裡我們搜尋的內容是“一步一步跟我學習lucene”,搜尋引擎展示的結果中對使用者的輸入資訊進行了配色方

學習C++(類)虛擬函式和純虛數

1、該函式必須與基類的虛擬函式有相同的名稱 2、該函式必須與基類的虛擬函式有相同的引數個數和相對應的引數型別 3、該函式必須與基類的虛擬函式有相同的返回值,或滿足型別相容規則的指標,引用型返回值。 4、如果派生類的函式滿足以上三個條件系統就會自動把其定為虛擬函式。這時派生類