撰寫 Linux 核心模組 Makefile 時,常見的 ifeq($(KERNELRELEASE),) ... else ... endif 結構常讓初學者困惑,覺得兩個分支似乎都生效了。實際上,這兩個分支是根據呼叫情境互斥執行的。
因為兩個分支分別對應「直接編譯」與「被 kbuild 呼叫」兩種不同路徑。無論哪種情況,最終都需要正確的模組宣告與建置規則,因此任一側的語法錯誤都會導致編譯失敗。
簡單來說:這不是兩個分支同時執行,而是根據環境變數 KERNELRELEASE 是否存在,自動選擇對應的建置流程。