A. Linux內核Makefile obj-y & obj-m
Linux內核下的Makefile是構建過程的關鍵組成部分,它位於內核源代碼的各個子目錄中,並通過嵌入主目錄的Rule.make文件相互關聯。在這些Makefile中,兩個核心概念是obj-y和obj-m,分別用於指定需要編譯進內核的.o文件和將這些文件編譯為模塊。
obj-y表示需要編譯進內核的目標文件集合,通過定義變數O_TARGET將這些文件連接為一個特定名的目標文件,定義L_TARGET則將這些文件合並為庫文件。同樣,obj-m用於標識需要編譯為模塊的目標文件集合。
除了obj-y和obj-m,Makefile還提供了subdir-y和subdir-m來處理子目錄的特定需求。例如,使用"obj-$(CONFIG_BINFMT_ELF) += binfmt_elf.o"和"subdir-$(CONFIG_EXT2_FS) += ext2"這樣的語句自動為集合添加文件名,同時通過條件語句實現更復雜的編譯策略。
在Rule.make文件中,make通過subdir-y和subdir-m處理子目錄的Makefile,生成子make任務並設定起始目錄參數。mod-subdirs變數用於識別模塊子目錄,進一步簡化了構建過程。
頂層目錄的Makefile和Makefile.build共同構建了構建流程的核心。頂層目錄的Makefile負責定義全局構建參數,如工具鏈前綴、編譯參數等。Makefile.build則負責將各個目錄及其子目錄中的文件編譯為built-in.o文件。各級子目錄的Makefile則根據特定需求定義額外的編譯選項。
構建流程主要分為六個步驟:在頂層目錄創建Makefile和Makefile.build,修改obj-y和相關變數以確定編譯文件,調整CFLAGS和LDFLAGS以設置編譯和鏈接選項,配置CROSS_COMPILE以指定工具鏈,設定TARGET以命名最終程序,最後執行make、make clean或make distclean進行構建和清理。
本文旨在介紹Linux內核下Makefile的使用和結構,下一期將更深入探討obj-m的用法,特別是與file_operations文件操作結構體相關的內容。希望讀者能夠從本文中獲得對內核構建流程的基本理解,並期待更多關於內核學習的分享。