openwrt之一個Makefile例項
-
一個Makefile例項
Makefile規則比較複雜,小白只能一點點學習,這裡以一個Makefile例項說明Makefile的一般結構
include $(TOPDIR)/rules.mk#一般在 Makefile 的開頭 PKG_NAME:=ralink-wifi-mt7688#表示軟體包名稱,將在 menuconfig 和 ipkg 可以看到 PKG_RELEASE:=1#表示軟體包版本號 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) PKG_INSTALL_DIR:=$(PKG_BUILD_DIR)/ipkg-install include $(INCLUDE_DIR)/kernel.mk#檔案對於軟體包為核心時是不可缺少 include $(INCLUDE_DIR)/package.mk#一般在軟體包的基本資訊完成後再引入 define Package/ralink-wifi-mt7688#編譯包定義,應用程式軟體包使用Package,核心驅動使用KernelPackage SUBMENU:=Ralink #進行分類 可以在make menuconfig中看到 FILES:=$(PKG_BUILD_DIR)/ralink-wifi-mt7688.ko#模組檔案 TITLE:=Ralink APSoC WiFi SoftAP driver DEPENDS:
以上例項是我在網上搬一個wifi驅動時的驅動檔案,當我按照教程將整個驅動檔案置於package目錄下後,make menuconfig能夠看到menu增加了Ralink專案,但無法載入其中的內容,我百思不得其解。
首先懷疑的是否是路徑問題,但仔細排查,這裡並沒有絕對路徑,因此應該不是路徑的問題。
再注意到DEPENDS的內容,懷疑是依賴檔案缺失因此載入不起來,這裡有@TARGET_ramips_mt7688 +wireless-tools +maccalc三個依賴,通過make menuconfig仔細查詢到wireless-tools +maccalc勾選後,還是不行。
最後一個TARGET_ramips_mt7688 沒看明白什麼意思,後來好像是網上搜了搜,make menuconfig的target沒有勾選mt7688選項,但是拉的程式碼本來就沒這個mt7688,而是mt76x8,咋辦?暴力一點直接將@TARGET_ramips_mt7688改為@TARGET_ramips_mt76x8,這樣子果然解決了問題。(這是個wifi驅動,驅動與核心有關,不是隨便搬來就能用的,這種操作是錯誤的,果不其然,韌體寫到板子後wifi並沒驅動起來,報bug)
-
linux中的make menuconfig
Linux的程式碼配置項由Kconfig來完成的,關於Kconfig語法可參見:linux/Documentation/kbuild/kconfig-language.txt。在編譯時,先進行配置,目的是根據需求選擇功能以及編譯生成方式型別(模式或包含在核心中),配置項操作可以由如下命令中的其中一條來完成
- make config:這個要求你手動選擇所有配置項,配置完成後生成.config檔案
- make menuconfig:顯示以curses的圖形配置選單,當已有.config檔案存在時,它會根據.config檔案設定預設項。若不存在.config檔案,則根據各級Kconfig檔案來設定選單項,完成配置後生成.config檔案
- make oldconfig:與make menuconfig相同,區別在於這個沒有圖形介面,當已有.config檔案存在時,它根據.config檔案設定預設項,若kconfig有新配置項時,會提示你進行選擇,若不存在.config檔案,則根據各級Kconfig檔案來設定選單項,完成配置後生成.config檔案。若已存在.config檔案, make menuconfig及make oldconfig都會把原.config另存為.config.old
- make xx_defconfig: 一般原始碼中都有不同硬體平臺的預設配置檔案,你也可以製做自己的預設配置檔案,當這個命令執行時,它會根據kconfig及xx_defconfig來生成.config檔案。在執行完其中一條config命令後,會生成.config及autoconf檔案,autoconf是根據配置項生成的相應巨集定義,供makefile使用,當執行make命令時,就會根據autoconf定義的巨集及makefile去編譯原始碼
-
參考連結
Linux中的 make config, make menuconfig, make oldconfig, make xx_defconfig