OpenWrt 21.02编译分析

单独编译内核模块

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

### 回答1: OpenWrt是一种嵌入式Linux操作系统,旨在为网络设备提供自定义的固件。其编译框架是OpenWrt开发中的重要组成部分。 OpenWrt编译框架基于Makefile,具有灵活性和可扩展性。它由多个组件组成,包括Toolchain、Package和Target。 Toolchain是OpenWrt编译工具链的核心组件,用于生成适用于目标硬件的工具和库。它包括交叉编译器、库、头文件等。通过配置Toolchain,可以指定目标硬件的体系结构、处理器类型等信息。这样,在编译软件包时,可以使用正确的工具链生成适用于目标硬件的可执行文件。 PackageOpenWrt的软件包管理系统,用于添加、删除、更新和配置软件包。软件包可以是应用程序、库或驱动程序等。每个软件包都有一个Makefile,用于描述如何编译、安装和配置软件包。通过Package,用户可以方便地选择需要的软件包,并将其集成到OpenWrt固件中。 Target是OpenWrt的目标平台配置,用于定义目标设备的硬件和软件环境。通过选择合适的Target,可以定制不同类型的OpenWrt固件,如路由器、无线电、音频设备等。在Target中,可以配置目标设备的参数,如处理器类型、内存大小、网络接口等。这样,在编译固件时,可以根据目标设备的需求进行优化。 OpenWrt编译框架的优点是具有灵活性和可扩展性。用户可以自定义编译选项、添加自己的软件包和功能,满足个性化需求。此外,OpenWrt社区也提供了丰富的软件包和插件,方便用户快速构建功能丰富的固件。 总之,OpenWrt编译框架是一个强大的工具,可以帮助开发者定制和构建高度定制化的嵌入式Linux固件。通过灵活配置Toolchain、Package和Target,用户可以实现各种硬件平台的定制需求,并扩展功能以满足特定的应用场景。 ### 回答2: OpenWrt是一个开放源代码的嵌入式操作系统,可用于路由器和其他嵌入式设备。它基于Linux内核,并提供了一个灵活、可定制的编译框架。 OpenWrt编译框架是一个为用户定制操作系统的工具集合。它提供了一套规范的构建脚本和配置文件,可以进行针对特定硬件平台的编译和配置。 OpenWrt编译框架的主要组成部分包括: 1. 源码管理:使用Git作为版本控制系统,可以方便地获取、更新和管理OpenWrt的源代码。 2. 构建系统:使用Makefile来管理编译过程,可以定制所需软件包的编译选项、依赖关系等。 3. 配置文件:使用menuconfig工具来配置打包进OpenWrt固件的软件包。可以选择需要的功能和驱动程序,并进行一些简单的配置,如网络设置、用户管理等。 4. 软件包管理:提供了opkg包管理工具,可以方便地安装、升级、删除软件包,也可以通过自定义软件包仓库来扩展功能。 5. 交叉编译OpenWrt支持在常见的硬件平台上进行交叉编译,可以在个人电脑上进行编译,然后将生成的固件安装到目标设备上。 6. 文档和社区:OpenWrt提供了详细的文档和丰富的社区资源,用户可以查阅文档了解各种配置和编译选项,也可以在社区中寻求帮助和交流。 通过使用OpenWrt编译框架,用户可以根据自己的需求构建一个定制化的嵌入式操作系统。无论是增加特定的功能模块,还是优化性能和资源占用,OpenWrt编译框架都能提供灵活和方便的工具和选项。此外,OpenWrt的庞大社区也为用户提供了丰富的经验和资源,可以更好地支持用户在使用和定制过程中遇到的问题。 ### 回答3: OpenWrt是一个基于Linux的嵌入式操作系统,专为路由器和其他网络设备设计。OpenWrt提供了一个开放的源代码编译框架,允许用户自定义和编译自己的固件。 OpenWrt编译框架的分析主要包括以下几个方面: 1. 源代码管理:OpenWrt使用git进行源代码管理,用户可以通过git命令进行代码的版本控制和更新。通过git,用户可以轻松地切换到不同的分支或标签,以获取不同版本的代码。 2. 软件包管理:OpenWrt采用了自己的软件包管理系统,即使用makefile构建软件包。软件包以源代码的方式进行管理,并可以根据用户的需要进行定制。用户可以通过make menuconfig命令选择需要的软件包,并自动生成对应的makefile脚本。 3. 编译环境配置:在编译OpenWrt之前,需要先配置编译环境。这包括选择交叉编译工具链、设置编译参数和路径等。用户可以根据自己的需求进行配置,以确保编译环境的正确性和兼容性。 4. 系统配置:OpenWrt提供了一个web界面用于系统配置。用户可以通过web界面进行网络配置、系统升级、软件安装等操作。在编译过程中,用户也可以在make menuconfig中进行系统配置,如选择网络协议、网络服务和驱动程序等。 5. 编译过程:OpenWrt编译过程基本上是通过make命令和makefile脚本完成的。在make命令的驱动下,makefile会根据用户的配置选择需要编译的软件包,并生成可执行文件。编译过程可能需要一定的时间,取决于计算机的性能和编译的软件包数量。 总之,OpenWrt编译框架提供了一个灵活和可定制的环境,使用户能够轻松地配置、编译和定制自己的嵌入式操作系统。通过对编译框架的分析,用户可以更好地理解和使用OpenWrt,并满足自己特定的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值