OpenWrt 21.02编译分析

本文介绍了内核模块的编译流程,包括单独编译内核模块的具体步骤、dnsmasq的编译实例,以及如何定义和使用PKG_BUILD_DIR进行编译路径设置。此外,还详细解释了下载过程中的关键函数Download的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单独编译内核模块

make target/linux/compile
make package/kernel/linux/compile
make package/install
make target/install

package编译路径

include\package.mk

PKG_BUILD_DIR ?= $(BUILD_DIR)/$(if $(BUILD_VARIANT),$(PKG_NAME)-$(BUILD_VARIANT)/)$(PKG_NAME)$(if $(PKG_VERSION),-$(PKG_VERSION))

如果定义了PKG_BUILD_DIR,那就用PKG_BUILD_DIR;否则就是$(BUILD_DIR)/$(if $(BUILD_VARIANT),$(PKG_NAME)-$(BUILD_VARIANT)/)$(PKG_NAME)$(if $(PKG_VERSION),-$(PKG_VERSION))

以dnsmasq为例

  • Makefile中定义了VARIANT:=nodhcpv6
  • include/package-dumpinfo.mk,将Build-Variant: nodhcpv6写入tmp/.packageinfo
  • scripts\metadata.pm,将tmp/.packageinfo中的Build-Variant: nodhcpv6写入$pkg->{variant}
  • scripts\package-metadata.pl,将$(curdir)/network/services/dnsmasq/variants += $(if $(CONFIG_PACKAGE_dnsmasq),nodhcpv6)写入tmp/.packagedeps 
  • include\subdir.mk,通过$(call log_make,$(1)/$(bd),$(target),,$(filter-out __default,$(variant)))传递到package.mk

include\download.mk

  • 下载过程的入口为package.mk中的"$(call Download,default)",代码如下,其中default是Download函数的参数。
define Build/DefaultTargets
  $(if $(USE_SOURCE_DIR)$(USE_GIT_TREE)$(USE_GIT_SRC_CHECKOUT),,$(if $(strip $(PKG_SOURCE_URL)),$(call Download,default)))
  $(if $(DUMP),,$(Build/CoreTargets))

  define Build/DefaultTargets
  endef
endef
  • Download通过"$(eval $(Download/$(1)))"调用Download/default函数,定义下载的URL,文件名等变量。
  • 为了避免dl下的文件重复下载,可以将Download函数做如下修改(增加了ifeq ("$(wildcard $(DL_DIR)/$(FILE))","")):
    define Download
      $(eval $(Download/Defaults))
      $(eval $(Download/$(1)))
      ifeq ("$(wildcard $(DL_DIR)/$(FILE))","")
        $(foreach FIELD,URL FILE $(Validate/$(call dl_method,$(URL),$(PROTO))),
          ifeq ($($(FIELD)),)
            $$(error Download/$(1) is missing the $(FIELD) field.)
          endif
        )
    
        $(foreach dep,$(DOWNLOAD_RDEP),
          $(dep): $(DL_DIR)/$(FILE)
        )
        download: $(DL_DIR)/$(FILE)
    
        $(DL_DIR)/$(FILE):
    		mkdir -p $(DL_DIR)
    		$(call locked, \
    			$(if $(DownloadMethod/$(call dl_method,$(URL),$(PROTO))), \
    				$(call DownloadMethod/$(call dl_method,$(URL),$(PROTO)),check,$(if $(filter default,$(1)),PKG_,Download/$(1):)), \
    				$(DownloadMethod/unknown) \
    			),\
    			$(FILE))
      endif
    endef

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值