单独编译内核模块
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