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:=@TARGET_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

猜你喜欢

转载自blog.csdn.net/robothj/article/details/84566167