1. 程式人生 > >openwrt之一個Makefile例項

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:
    [email protected]
    _ramips_mt7688 +wireless-tools +maccalc #所需的依賴 endef define Package/ralink-wifi-mt7688/description#描述 Ralink APSoC WiFi driver for DreamBox endef define Build/Prepare#編譯前準備工作 mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR)/ $(Build/Patch) $(if $(QUILT),touch $(PKG_BUILD_DIR)/.quilt_used) endef define Build/Compile#進行編譯 cd $(LINUX_DIR); \ ARCH=mips CC=$(TARGET_CC) \ $(MAKE) M=$(PKG_BUILD_DIR)/rt2860v2_ap/ V=1 modules endef define Package/ralink-wifi-mt7688/install $(INSTALL_DIR) $(1)/lib/modules/$(LINUX_VERSION) $(1)/etc/Wireless/RT2860/ $(CP) -rf ./files/* $(1)/ $(CP) modules/* $(1)/lib/modules/$(LINUX_VERSION) endef $(eval $(call BuildPackage,ralink-wifi-mt7688))

    以上例項是我在網上搬一個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