首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Linux 核心模組 Makefile 中 ifeq 與 else 的執行邏輯說明

     編輯:程式設計綜合問答

撰寫 Linux 核心模組 Makefile 時,常見的 ifeq($(KERNELRELEASE),) ... else ... endif 結構常讓初學者困惑,覺得兩個分支似乎都生效了。實際上,這兩個分支是根據呼叫情境互斥執行的。

KERNELRELEASE 的意義

  • 當 Makefile 被核心建置系統(kbuild)呼叫時,KERNELRELEASE 會被設定為目前的核心版本字串,因此 ifeq 條件為假,執行 else 分支中的 obj-m := globalmem.o。
  • 當開發者直接在終端機執行 make 時,KERNELRELEASE 為空,if 條件為真,執行第一個分支,透過 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules 進入核原始碼目錄進行編譯。

為什麼修改任何一側都會影響編譯

因為兩個分支分別對應「直接編譯」與「被 kbuild 呼叫」兩種不同路徑。無論哪種情況,最終都需要正確的模組宣告與建置規則,因此任一側的語法錯誤都會導致編譯失敗。

簡單來說:這不是兩個分支同時執行,而是根據環境變數 KERNELRELEASE 是否存在,自動選擇對應的建置流程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved