Table of Contents

构建系统基础知识

简介

构建系统用于从源代码构建OpenWrt,需要大量的硬件资源、时间和知识。 您可以应用自定义补丁,并使用特定的编译标志和选项构建单个软件包和OpenWrt镜像。 作为替代方案,您可以使用镜像生成器以更快、更简单的方式构建OpenWrt镜像,但定制性有限。

先决条件

构建系统基于buildroot,需要具有区分大小写的文件系统的GNU/Linux环境。 这可以通过运行本机或虚拟化的Linux发行版(如VirtualBoxVMwareQEMU等)来实现。 一些用户也在WSLmacOS上有积极的使用经验,但这些系统不受官方支持。 要生成一个可刷写的固件镜像文件并包含默认软件包,您至少需要10-15 GB的可用磁盘空间(最好更多),以及至少2 GB的RAM用于编译阶段。 编译x86镜像需要4 GB的RAM。 进行额外的优化,如启用LTO编译标志,也会增加构建过程中的RAM消耗。

您在镜像中添加的附加软件包越多,所需的空间就越多,但空间需求应该会缓慢增加,大部分存储需求是用于构建基础设施和固件镜像的核心组件。

请注意,这些数字仅为粗略估计,您可能在某些设备上可以使用更少的资源,但不能保证。

描述

构建系统是一组Makefiles补丁,它自动化了构建交叉编译工具链的过程,然后使用该工具链构建Linux内核、根文件系统和可能需要的其他软件(如uboot),以在特定设备上运行OpenWrt。 典型的工具链包括:

通常,工具链会为与其运行在同一指令集架构(ISA)上的代码生成器生成代码(例如大多数个人电脑和服务器上的x86_64)。 然而,在OpenWrt中,情况并非如此。 大多数路由器使用的处理器与我们用于运行构建系统的处理器架构不同。 如果我们使用构建系统的工具链为我们的路由器构建OpenWrt,它将生成在我们的路由器上无法运行的代码。 不能使用主机系统的任何内容。 包括C标准库、Linux内核和所有用户空间程序在内的所有内容都必须使用这个交叉编译工具链进行编译。

让我们来看一个例子。 我们在一个x86_64系统上为一个使用MIPS32架构的路由器构建OpenWrt,因此我们不能使用用于在x86_64系统上运行的相同工具链。 我们需要首先为MIPS32系统构建一个工具链,然后使用该工具链构建运行OpenWrt所需的所有内容。

创建交叉编译器的过程可能会很棘手。 这不是经常尝试的事情,因此它有一定的神秘和黑魔法。 当您处理嵌入式设备时,通常会提供一个编译器和基本库的二进制副本,而不是提供创建自己的指令 - 这是一个节省时间的步骤,但同时通常意味着您将使用一个相当陈旧的工具集。 通常还会提供来自板卡或芯片供应商的补丁过的Linux内核副本,但这也是过时的,很难准确地发现为使内核在嵌入式平台上运行而进行了哪些更改。

虽然可以手动创建工具链,然后使用它构建OpenWrt,但这很困难且容易出错。 OpenWrt构建系统采用了一种不同的方法来构建固件:它从头开始下载、打补丁和编译所有内容,包括交叉编译器。 或者用更简单的话说,OpenWrt的构建系统不包含任何可执行文件甚至源代码。 它是一个自动化系统,用于下载源代码,将其打补丁以适应给定的平台,并正确地为该平台编译它们。 这意味着只需更改模板,就可以更改流程中的任何步骤。 当然,这样做的附带好处是构建是自动化的,节省时间,并且每次都能保证相同的结果。

例如,如果发布了一个新的内核,只需更改一个Makefile,就可以下载最新的内核,对其进行打补丁以在请求的平台上运行,并生成一个新的固件镜像。 不需要费力去追踪未修改的现有内核副本以查看进行了哪些更改 - 补丁已经提供,该过程几乎完全透明。 这不仅适用于内核,还适用于OpenWrt中包含的任何内容 - 正是这种策略使得OpenWrt能够始终使用最新的编译器、内核和应用程序。

目录结构

构建系统中有四个关键目录:

targetpackage包步骤都将使用build_<arch>目录作为编译的临时目录。

build_dir和staging_dir之间的区别

build_dir目录用于存放解压后的源代码和编译过程中生成的临时文件。在构建过程中,所有的编译工作都在build_dir目录中进行。

staging_dir目录用于存放编译后的程序和库文件,这些文件将被安装到staging_dir目录中,以备后续构建其他软件包或准备固件镜像时使用。staging_dir目录中的文件是构建系统生成的最终结果,可以被用于构建固件镜像或其他目标设备上的应用程序。

build_dir下有三个区域::

在staging目录下,也有三个区域:

特点

Make目标

构建顺序

补丁管理

打包考虑事项

参考资料