Linux(1)之buildroot构建系统(一)
Author:Onceday Date:2023年11月12日
漫漫长路,才刚刚开始…
1. 概述
Buildroot和Yocto是两种用于嵌入式Linux系统开发的工具,可以构建完整的根文件系统(root filesystem),包括内核、引导加载器和用户空间应用程序。
Buildroot 是一个简单、高效的嵌入式Linux系统构建工具,使用Makefile和Kconfig配置系统(与Linux内核相同)。Buildroot是高度可配置的,可以为各种目标板构建精简的Linux系统。它使用交叉编译,可以快速生成一个小型的、在目标硬件上运行的Linux系统。
Buildroot提供了大量的包配置,涵盖了各种库和应用程序,并且配置和构建过程相对直观和简单。它特别适合需要快速迭代并且目标硬件资源有限的项目。
Yocto Project 是一个开源协作项目,为嵌入式Linux开发者提供了创建自定义Linux系统的模板、工具和方法。Yocto使用BitBake工具(一个与Gentoo的Portage类似的构建自动化工具)和OpenEmbedded的元数据。
Yocto提供了更强大的自定义能力,可以创建高度定制的嵌入式Linux系统。它拥有大量的“recipe”(描述如何构建软件包的指南),并且支持复杂的依赖关系和层次结构。
总的来说,Buildroot和Yocto都是强大的工具,适合于嵌入式Linux开发。你应该根据你的具体需求和项目的复杂性来选择哪一个更适合。对于小型项目和需要快速原型的场合,Buildroot可能是一个更好的选择。对于需要高度定制和复杂的大型项目,Yocto可能是更好的选择。
Buildroot is a simple, efficient and easy-to-use tool to generate embedded Linux systems through cross–compilation.
- 可以处理任何事情,Cross-compilation toolchain, root filesystem generation, kernel image compilation and bootloader compilation.】
- 非常简单,Thanks to its kernel–like menuconfig, gconfig and xconfig configuration interfaces, building a basic system with Buildroot is easy and typically takes 15-30 minutes.
- 支持广泛,X.org stack, Gtk3, Qt 5, GStreamer, Webkit, Kodi, a large number of network–related and system–related utilities are supported.
1.1 如Ubuntu等系统如何做到在许多设备上启动
Ubuntu和其他许多现代的Linux发行版都能在多种硬件上启动,这主要得益于以下几个方面的设计:
-
通用内核:Ubuntu使用一个“通用”或“通用”内核,这个内核包含了许多不同硬件设备的驱动。这意味着,只要硬件设备的驱动包含在内核中,Ubuntu就可以在该硬件上运行。
-
模块化的驱动:Linux内核支持模块化的驱动,这意味着驱动可以在运行时动态加载和卸载,而不需要重新编译整个内核。这使得Ubuntu能够根据需要加载特定的硬件驱动。
-
设备树:对于某些类型的设备(特别是很多嵌入式设备),Ubuntu可以使用设备树来描述硬件。设备树是一个数据结构,它描述了硬件的布局和配置。虽然Ubuntu的默认内核可能不包含所有可能的设备树,但用户可以提供自己的设备树以支持特定的硬件配置。
-
UEFI和BIOS:Ubuntu支持UEFI(统一可扩展固件接口)和传统的BIOS启动方式。这意味着Ubuntu可以在各种不同的计算机系统上启动,包括新的基于EFI的系统和老的基于BIOS的系统。
-
自动硬件检测和配置:Ubuntu包含了udev(用户设备管理器),它可以在启动时自动检测和配置硬件。这意味着Ubuntu可以在启动时动态地适应不同的硬件环境。
综上所述,Ubuntu的跨硬件兼容性主要是由于它的通用内核、模块化驱动、设备树支持、UEFI/BIOS兼容性以及自动硬件检测和配置的能力。这些特性使得Ubuntu能够在各种各样的硬件配置上运行。
1.2 不同的CPU特性功能代码是如何兼容的
对于核心的CPU特性如内存管理单元(MMU),这些功能通常由内核直接处理,而不是通过驱动程序。这些功能在CPU体系结构的内核代码中实现,例如在Linux内核源代码中的arch/
目录下,你可以找到针对各种CPU体系结构(如x86,ARM,MIPS等)的代码。
这些代码包含处理MMU和其他核心CPU特性的代码。例如,对于ARM架构,arch/arm/mm/
目录包含了内存管理相关的代码,包括MMU的处理。
关于外设,Linux内核包含了大量的设备驱动程序,用于处理各种不同的硬件设备。这些驱动程序通常在内核源代码的drivers/
目录下。对于一些设备,如网络接口卡或图形卡,驱动程序可能来自设备制造商,并被合并到内核中。
对于基本的CPU特性,如MMU,处理这些特性的代码已经被合并到内核中。对于外设,驱动程序可能也已经被合并到内核中,或者在需要时可以动态加载。
在一些情况下,特定的设备可能需要额外的驱动程序,这些驱动程序可能需要从设备制造商那里获取,并安装到系统中。然而,大多数常见的硬件设备都已经有在Linux内核中的驱动程序支持。
1.3 嵌入式设备和通用x86兼容机的区别
比如stm32mp157需要厂家的特殊设备树文件才能启动,那为什么通用ubuntu不能启动,就像树莓派一样,ubuntu需要提供特供版本支持。而对于通用x86兼容机,我们很少有这方面的问题,也没有需要厂家提供设备树这一说法。
这是一个很好的问题,它涉及到了嵌入式系统与通用PC硬件之间的一些关键区别。
在x86兼容的PCs上,硬件的配置和初始化通常由BIOS或UEFI固件完成,内核不需要知道具体的硬件细节。在这种情况下,Linux内核可以使用抽象的、通用的接口(比如ACPI)来与硬件交互。这些接口隐藏了硬件的具体实现,使得同一个内核可以在各种不同的硬件上运行。
然而,在嵌入式系统(如STM32MP157或树莓派)上,情况就完全不同了。这些系统通常没有像BIOS或UEFI这样的固件来进行硬件初始化,也没有像ACPI这样的通用接口。相反,Linux内核需要直接与硬件交互,需要知道硬件的具体布局和配置。这就是设备树在嵌入式Linux中的角色:设备树描述了硬件的布局和配置,使得内核可以正确地初始化和管理础。
所以,对于STM32MP157这样的设备,你需要一个特定的设备树文件,以告诉内核如何与硬件交互。这就是为什么“通用”的Ubuntu不能在这样的设备上启动:通用Ubuntu的内核不知道如何处理这种特定的硬件配置。
对于一些流行的嵌入式硬件(如树莓派),Ubuntu和其他Linux发行版可能提供了特定的版本,这些版本包含了对这些硬件的支持。这通常涉及到使用一个包含了正确设备树和其他硬件特定代码的定制内核。
总的来说,嵌入式硬件的多样性和复杂性,以及缺少像BIOS或UEFI这样的硬件抽象,意味着嵌入式Linux需要更多的硬件特定代码(如设备树),而这在PC硬件上通常是不需要的。
1.4 BIOS和UEFI的介绍
BIOS(基本输入输出系统) 和 UEFI(统一可扩展固件接口) 都是存储在计算机硬件上的一种软件,它们负责在计算机启动时初始化硬件设备,并加载操作系统。
BIOS 是早期的一种固件接口,它存在于计算机主板上的一个特殊的闪存芯片中。BIOS在计算机启动时运行,执行以下主要任务:
- 硬件初始化:BIOS 会检查并初始化计算机的硬件设备,包括 CPU,内存,键盘,鼠标,显示设备等。
- 自检:BIOS 进行一系列的自检(POST,Power-On Self Test),以确保硬件设备工作正常。
- 引导加载:BIOS 会查找一个可启动设备(如硬盘,USB驱动或网络),并从该设备加载操作系统的引导加载程序。
尽管 BIOS 非常可靠并且被广泛使用,但是它有一些限制,例如它不能直接引导超过 2TB 的硬盘,不支持预引导环境的网络连接等。
UEFI 是一个现代的固件接口,设计用来取代 BIOS。UEFI 提供了更多的功能和更大的灵活性。UEFI 的主要功能包括:
- 硬件初始化和自检:就像 BIOS 一样,UEFI 在计算机启动时检查并初始化硬件设备,然后执行自检。
- 引导管理:UEFI 有一个更先进的引导管理器,可以支持多个操作系统并从多个设备引导。UEFI 可以直接引导超过 2TB 的硬盘。
- 预引导环境:UEFI 提供了一个预引导环境,可以在操作系统加载之前运行其他的程序或驱动。这可以用来进行系统恢复,固件更新,网络引导等。
UEFI 还支持安全引导(Secure Boot),这是一种技术,可以在引导过程中验证操作系统的引导加载程序的签名,以防止恶意软件的启动。
总的来说,BIOS 和 UEFI 都是计算机启动过程中的关键部分,它们负责硬件的初始化并加载操作系统。尽管 BIOS 已经被广泛使用了几十年,但是现代的计算机系统越来越多地转向使用 UEFI,由于其提供的更多的功能和灵活性。
1.5 BIOS和UEFI的作用
对于具有BIOS或UEFI的设备,主板的固件(BIOS或UEFI)在引导过程中负责初始化硬件设备,设置内存空间,初始化CPU,检测硬件配置等。在完成这些任务后,固件将控制权交给操作系统的引导加载程序,引导加载程序再将控制权交给操作系统内核。
在这个过程中,固件通过提供一些标准接口(例如,ACPI)来帮助操作系统内核理解硬件配置。ACPI(Advanced Configuration and Power Interface)是一个开放标准,它定义了操作系统如何发现和配置硬件设备,以及如何管理电源和系统事件。通过ACPI,操作系统可以在不知道具体硬件实现细节的情况下,与硬件设备进行交互。
此外,固件也会初始化各种硬件接口,如USB和PCIe,并将它们设置为一个已知的、标准化的状态。这就使得操作系统可以使用标准的协议和接口与这些设备进行通信,而不需要知道具体的硬件细节。例如,Linux内核包含了通用的USB和PCIe驱动,这些驱动使用标准协议与设备进行通信。
总的来说,对于具有BIOS或UEFI的设备,固件在系统启动时进行硬件初始化,然后提供了标准接口(如ACPI)和初始化的硬件设备(如USB和PCIe)供操作系统使用。这就使得操作系统内核可以在不知道具体的硬件细节的情况下,与硬件设备进行交互。这一设计可以增加硬件的兼容性,降低操作系统支持多种硬件的复杂性。
对于传统的BIOS(基本输入/输出系统),它本身并不能直接引导Linux或任何其他操作系统。相反,它会初始化硬件(如CPU、内存和硬盘驱动器),然后寻找一个可引导的设备(如硬盘、CD/DVD或USB存储设备)并运行存储在其中的引导加载程序的第一阶段。
这个引导加载程序通常是像GRUB(GRand Unified Bootloader)这样的工具,用于Linux系统。引导加载程序然后将内核加载到内存中并开始运行。内核接着会继续初始化系统并启动操作系统。
然而,UEFI(统一可扩展固件接口),这是现代的BIOS替代品,可以直接加载和执行Linux内核,前提是内核已构建了EFI引导存根支持。它通过一个名为EFI系统分区(ESP)的机制来实现,ESP是硬盘上的一个特殊分区,用来保存EFI兼容的引导加载器和内核映像。这就是UEFI比传统BIOS更灵活、更强大的部分原因。
这只是引导过程的高级概述。具体的细节可能会更复杂,并且可能会根据具体的硬件和软件配置而变化。
1.6 设备树的作用
在Linux中,设备树(Device Tree,DT)是一种数据结构,用于描述非自发现硬件的信息。自发现硬件,如USB或PCI设备,可以在运行时被系统自动检测和配置。相反,许多嵌入式系统的硬件设备需要在引导时被明确地配置。
在引导过程中,引导加载器将设备树传递给Linux内核。设备树包含了有关系统硬件的信息,如设备的内存映射、中断号和引脚配置。内核使用这些信息来正确地配置和初始化硬件设备。
设备树允许单个Linux内核映像在多个硬件配置上运行。例如,两个不同的嵌入式板可能使用相同的处理器,但具有不同的内存大小、I/O引脚配置和连接的外设。通过使用不同的设备树,相同的内核映像可以在这两个板上运行。
设备树是以一种称为设备树源(Device Tree Source,DTS)的格式编写的,然后被编译成设备树二进制(Device Tree Binary,DTB)形式,以便引导加载器和内核使用。设备树源文件通常按照硬件平台或板级规格进行组织,可以通过包含和覆盖技术来共享公共定义,这样可以减少重复的工作并提高可维护性。
总的来说,设备树在Linux系统中起着至关重要的作用,特别是在嵌入式系统中。通过描述硬件配置,它使得单个内核映像能够在多种硬件平台上运行。
2. buildroot编译环境搭建
Buildroot可以在Linux系统上运行。虽然Buildroot自己将构建它进行编译所需的大多数主机包,但某些标准的Linux实用程序预计已经安装在主机系统上。下面是强制性包和可选包的概述(请注意,包名可能在不同的发行版中有所不同)。
2.1 必须要安装的软件包
以下是必备的各种构建工具的简要介绍:
-
which:
which
是一个在Unix和Unix-like操作系统中用于定位可执行文件的实用程序。它会在系统的PATH环境变量中定义的目录中查找文件。 -
make:
make
是一种用于编译和构建项目的工具,它读取名为Makefile
的文件,该文件描述了如何构建一个或多个目标。(version 3.81 or any later) -
binutils:
binutils
是GNU项目的一部分,包含一组二进制工具,如ld
(链接器)、as
(汇编器)、objdump
(显示二进制信息)等。 -
build-essential:
build-essential
是Debian和Ubuntu等Linux发行版提供的一个软件包,包含编译和安装软件所必需的一些基本的工具,如make
、gcc
等。 -
diffutils:
diffutils
是一个包含diff
、diff3
、sdiff
和cmp
等工具的软件包,用于比较文件和目录。 -
gcc:
gcc
是GNU编译器套装(GNU Compiler Collection)的简写,是一种开源的编译器,可以编译C、C++、Java等多种语言。(version 4.8 or any later) -
g++:
g++
是GNU C++编译器的命令行接口,它是gcc
的一部分,用于编译C++代码。(version 4.8 or any later) -
bash:
bash
是一个Unix shell,由GNU项目开发。它是Bourne shell的替代品,支持命令行编辑,shell函数,shell变量等。 -
patch:
patch
是一个Unix工具,用于将由diff
生成的差异应用到一个或多个原始文件中,从而更新或创建文件。 -
perl:
perl
是一种高级、通用、解释型、动态的编程语言。在系统管理,网络编程,GUI开发和更多其他领域中被广泛使用。(version 5.8.7 or any later) -
tar:
tar
是一个在Unix和Unix-like系统上用于文件归档的工具,它可以将多个文件和目录组合成一个归档文件。 -
rsync:
rsync
是一个在Unix和Unix-like系统上用于同步文件和目录的工具,它可以在本地或者两台计算机之间复制和同步文件。 -
file:
file
是一个在Unix和Unix-like系统上用于确定文件类型的工具。(must be in /usr/bin/file) -
findutils:
findutils
是一个包含find
和xargs
等工具的软件包,用于在文件系统中搜索和处理文件。 -
wget:
wget
是一个自由的,非交互的网络下载器。它在Unix和类Unix系统(例如 Linux,BSD,macOS)中广泛使用,用于从网络上下载文件。wget
支持通过HTTP,HTTPS和FTP协议下载,并能够递归地下载整个网站或者任何HTTP或FTP服务。
2.2 可选的软件包
(1) Python支持,Buildroot中的一些特性或实用程序,如法律信息或图形生成工具,有额外的依赖关系。
(2) 配置接口工具,在许多Linux发行版中,运行时库(runtime libraries)和开发库(development libraries)通常会被分别打包。运行时库包含了程序运行所需的共享库,而开发库包含了额外的头文件、静态库等,用于编译使用到这些库的新程序。开发包通常以 -dev
或 -devel
为后缀。包含以下配置接口工具:
- ncurses5: 这是一个控制台界面库,它允许程序员在没有鼠标的情况下在文本模式下创建用户接口。这是许多经典的文本模式工具(如菜单配置)的基础。
- qt5: 这是一个广泛使用的跨平台应用框架,它用于创建具有图形用户界面的应用程序。对于xconfig界面,qt5提供了丰富的图形用户界面组件和功能。
- glib2, gtk2, glade2: 这些是用于创建图形用户界面的库和工具。GLib是一组低级别的程序库,包括数据结构、输入/输出和字符串处理函数。GTK(GIMP Toolkit)是一个用于创建图形用户界面的库,而Glade是一个GTK+用户界面设计工具。对于gconfig界面,这些库提供了创建和管理窗口、按钮、滑块等图形元素的方法。
(3) 源码拉取工具,一般情况下wget就够用,但是也支持版本控制工具和一些同步工具,如下:
- Bazaar: Bazaar是一种分布式版本控制系统,它易于使用并且灵活。它使得开发者可以在无需服务器的情况下进行协作,也可以轻松地与其他版本控制系统一起使用。
- CVS (Concurrent Versions System): CVS是一种旧的中心化版本控制系统。尽管其已被更现代的工具(如Git和Mercurial)所取代,但在某些旧的项目中仍可能会遇到。
- Git: Git是当前最流行的分布式版本控制系统,由Linux内核的创建者Linus Torvalds开发。它提供了高效的本地分支和合并策略,使得开发者可以轻松地进行并行开发。
- Mercurial: Mercurial是一个易于学习和使用的分布式版本控制工具。它的设计目标是处理大型项目,并提供高度的性能和可靠性。
- rsync: rsync是一个用于同步文件和目录的工具,可以在本地或者通过网络进行操作。它使用了一种高效的算法来仅传输文件中发生变化的部分。
- scp (Secure Copy): scp是一个基于SSH的命令行工具,用于在本地和远程主机之间安全地复制文件。
- sftp (SSH File Transfer Protocol): sftp是一个安全的文件传输协议,它使用SSH来加密所有传输的数据。它提供了一个交互式的接口,开发者可以用该接口浏览远程文件系统并进行文件操作。
- Subversion (svn): Subversion是一个中心化的版本控制系统,它提供了比CVS更强大和灵活的功能,包括版本化的文件和目录重命名。尽管其已被许多开发者用Git替代,但在许多企业和大型项目中仍然广泛使用。
- javac编译器:
javac
是 Java 的官方编译器,用于将Java源代码编译成Java字节代码,字节代码可以运行在Java虚拟机(JVM)上。 - jar工具:
jar
是Java的归档工具,用于打包和解压Java类文件、元数据和资源文件到一个JAR文件。
(5) 文档生成工具:
- asciidoc: Asciidoc是一个用于编写文档和演示的文本文档格式,它易于阅读并且可以转换为多种格式,包括HTML、PDF和EPUB。版本8.6.3及以上被需要。
- w3m: w3m是一个文本模式的web浏览器,也可以用作HTML转文本的工具。
- python的argparse模块: argparse模块是Python的一个标准库,用于编写命令行解析器。它在Python 2.7+和3.2+中默认存在。
- dblatex: dblatex是一个将DocBook格式转换为LaTeX,然后再转换为PDF的工具。它仅在需要生成PDF手册时才需要。
(6) 图形生成工具:
- graphviz: Graphviz是一个开源的图形可视化软件,用于在应用程序中表示结构信息。
graph-depends
和<pkg>-graph-depends
工具使用它来生成依赖图。 - python–matplotlib: Matplotlib是一个Python绘图库,用于生成各种静态、动态、交互式的图表。
graph-build
工具使用它来生成构建图。
2.3 开发环境
可以直接用Vagrant搭建虚拟开发环境。Buildroot源代码树中的support/misc/Vagrantfile提供了一个Vagrantfile,可以快速设置一个带有所需依赖项的虚拟机,以便开始使用。
Vagrantfile
是 Vagrant 项目的核心组成部分。Vagrant 是一个用于构建和管理虚拟机环境的工具,特别适用于开发和测试。Vagrantfile
是一个描述 Vagrant 环境配置的文本文件,它是由 Ruby 语言编写的。
- 虚拟机的基础镜像(box)
- 网络设置,如端口映射、私有网络、公共网络等
- 共享文件夹设置
- 启动虚拟机后需要执行的自动化脚本(provisioning scripts)
- 虚拟机的硬件配置,如 CPU、内存大小等
Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise64"
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.synced_folder "../data", "/vagrant_data"
config.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
end
end
上述 Vagrantfile
做了以下配置:
- 使用名为 “hashicorp/precise64” 的 box 作为虚拟机的基础镜像
- 将虚拟机的80端口映射到宿主机的8080端口
- 将宿主机的 “…/data” 目录映射到虚拟机的 “/vagrant_data” 目录
- 设置虚拟机的内存为1024MB
Vagrant 的目标是通过 Vagrantfile
提供一致的,可移植的,易于使用的开发环境。一旦设置好 Vagrantfile
,其他开发人员只需要运行 vagrant up
就可以启动和配置完全相同的虚拟机环境。
如果你想在Linux或Mac Os X上设置一个隔离的Buildroot环境,请在你的终端上粘贴这行代码:
curl -O https://buildroot.org/downloads/Vagrantfile; vagrant up
如果你在Windows上,把这个粘贴到你的powershell:
(new-object System.Net.WebClient).DownloadFile(
"https://buildroot.org/downloads/Vagrantfile","Vagrantfile");
vagrant up
Buildroot每三个月发布一次,分别在2月、5月、8月和11月。发布编号的格式为 YYYY.MM,发布的tar包可以在 http://buildroot.org/downloads/ 获取。
2.4 获取源码
一般而言,只需在普通用户权限下编译即可,不需要在root权限,这样也能保护Linux环境不被破坏。
首先下载源码,直接从gitlab上面下载源码,然后切换到对应分支:
onceday->buildroot:$ git clone https://gitlab.com/buildroot.org/buildroot.git
Cloning into 'buildroot'...
remote: Enumerating objects: 524162, done.
remote: Counting objects: 100% (255/255), done.
remote: Compressing objects: 100% (151/151), done.
remote: Total 524162 (delta 110), reused 229 (delta 103), pack-reused 523907
Receiving objects: 100% (524162/524162), 123.46 MiB | 2.21 MiB/s, done.
Resolving deltas: 100% (372434/372434), done.
onceday->buildroot:$ git checkout 2023.05
Note: switching to '2023.05'.
2.5 生成配置config文件
make menuconfig, make nconfig, make xconfig, 和 make gconfig 是 Linux 内核源代码编译时常用的配置命令,用于配置内核的功能选项。它们都是用来创建 .config 文件的,这个文件定义了要在内核中包含哪些模块和功能。
make menuconfig: 这个命令提供了一个基于文本的菜单驱动的用户界面,允许用户在不同的配置选项中导航和选择。它依赖于 ncurses 库。
make nconfig: 这个命令提供了一个改进版的基于文本的用户界面,具有更强的导航和搜索功能。它也依赖于 ncurses 库。
make xconfig: 这个命令提供了一个基于图形的用户界面,允许用户在不同的配置选项中使用鼠标导航和选择。它依赖于 Qt 库。
make gconfig: 这个命令也提供了一个基于图形的用户界面,但它依赖于 GTK+ 库。
所以你可以根据你的环境和需求选择适合的命令。例如,如果你在没有图形界面的服务器上,你可能会选择 make menuconfig 或 make nconfig。如果你在具有图形界面的桌面环境上,你可能会选择 make xconfig 或 make gconfig,以便利用鼠标和图形界面提供的更直观的交互。
无论你选择哪个命令,都会生成一个 .config 文件,这个文件将会被用于驱动内核的编译过程。
sudo apt install libncurses-dev
,可以满足menuconfig和nconfig。sudo apt-get install libgtk2.0-dev libglib2.0-dev libglade2-dev
,满足gconfig。sudo apt-get install qtbase5-dev
,安装QT5,支持xconfig。
2.6 编译流程
开始全部编译流程很简单,直接输入make命令即可。也可以使用make help查看帮助信息,如下:
Cleaning:
clean - delete all files created by build
distclean - delete all non-source files (including .config)
Build:
all - make world
toolchain - build toolchain
sdk - build relocatable SDK
Configuration:
menuconfig - interactive curses-based configurator
nconfig - interactive ncurses-based configurator
xconfig - interactive Qt-based configurator
gconfig - interactive GTK-based configurator
oldconfig - resolve any unresolved symbols in .config
syncconfig - Same as oldconfig, but quietly, additionally update deps
olddefconfig - Same as syncconfig but sets new symbols to their default value
randconfig - New config with random answer to all options
defconfig - New config with default answer to all options;
BR2_DEFCONFIG, if set on the command line, is used as input
savedefconfig - Save current config to BR2_DEFCONFIG (minimal config)
update-defconfig - Same as savedefconfig
allyesconfig - New config where all options are accepted with yes
allnoconfig - New config where all options are answered with no
alldefconfig - New config where all options are set to default
randpackageconfig - New config with random answer to package options
allyespackageconfig - New config where pkg options are accepted with yes
allnopackageconfig - New config where package options are answered with no
Package-specific:
<pkg> - Build and install <pkg> and all its dependencies
<pkg>-source - Only download the source files for <pkg>
<pkg>-extract - Extract <pkg> sources
<pkg>-patch - Apply patches to <pkg>
<pkg>-depends - Build <pkg>'s dependencies
<pkg>-configure - Build <pkg> up to the configure step
<pkg>-build - Build <pkg> up to the build step
<pkg>-show-info - generate info about <pkg>, as a JSON blurb
<pkg>-show-depends - List packages on which <pkg> depends
<pkg>-show-rdepends - List packages which have <pkg> as a dependency
<pkg>-show-recursive-depends
- Recursively list packages on which <pkg> depends
<pkg>-show-recursive-rdepends
- Recursively list packages which have <pkg> as a dependency
<pkg>-graph-depends - Generate a graph of <pkg>'s dependencies
<pkg>-graph-rdepends - Generate a graph of <pkg>'s reverse dependencies
<pkg>-dirclean - Remove <pkg> build directory
<pkg>-reconfigure - Restart the build from the configure step
<pkg>-rebuild - Restart the build from the build step
<pkg>-reinstall - Restart the build from the install step
Documentation:
manual - build manual in all formats
manual-html - build manual in HTML
manual-split-html - build manual in split HTML
manual-pdf - build manual in PDF
manual-text - build manual in text
manual-epub - build manual in ePub
graph-build - generate graphs of the build times
graph-depends - generate graph of the dependency tree
graph-size - generate stats of the filesystem size
list-defconfigs - list all defconfigs (pre-configured minimal systems)
Miscellaneous:
source - download all sources needed for offline-build
external-deps - list external packages used
legal-info - generate info about license compliance
show-info - generate info about packages, as a JSON blurb
pkg-stats - generate info about packages as JSON and HTML
printvars - dump internal variables selected with VARS=...
show-vars - dump all internal variables as a JSON blurb; use VARS=...
to limit the list to variables names matching that pattern
make V=0|1 - 0 => quiet build (default), 1 => verbose build
make O=dir - Locate all output files in "dir", including .config
For further details, see README, generate the Buildroot manual, or consult
it on-line at http://buildroot.org/docs.html
默认情况下,buildroot不支持顶层级别的并行编译,make -jN
并无必要,不过存在一个实验性质的功能,用于支持并行构建。
- 下载源代码(如果需要的话),可通过指定不同获取方式,wget、git、svn、rsync等等。
- 配置、编译、安装交叉工具链,或者简单的导入一个外部的工具链。
- 配置、编译、安装指定的目标软件包。
- 可选编译一个内核镜像包。
- 可选编译一个bootloader镜像包。
- 创建一个指定格式的根文件系统。
2.7 编译输出
Buildroot输出存储在单个目录下面output/
,即默认的输出目录,包括数个子目录。
images/
用于存储所有的放在目标系统上面的文件,包括内核镜像、bootloader。根文件系统镜像等等。build/
用于存储所有编译之后的组件包,包括buildroot用于host的编译输出以及目标设备上的编译输出文件。对于每个组件包,都有一个单独的子目录文件夹一一对应。Host/
包含为主机构建的工具和目标工具链的根目录sysroot
。前者用于安装主机编译的工具,这些工具是正确执行Buildroot所需的,包括交叉编译工具链。后者是一个类似于根文件系统层次结构的目录。它包含所有用户空间包的头文件和库,这些包提供和安装其他包使用的库。然而,这个目录并不打算作为目标的根文件系统:它包含许多开发文件、未剥离的二进制文件和库,这些文件对于嵌入式系统来说太大了。这些开发文件用于为依赖于其他库的目标编译库和应用程序staging/
一个链接到host/
目录里目标工具链根目录sysroot
的符号链接,用于保持旧版本的兼容性。target/
包含编译目标的几乎完整的根文件系统:除了/dev/
中的设备文件(Buildroot不能创建它们,因为Buildroot不以root
身份运行,也不想以root
身份运行)。此外,它没有正确的权限(例如,busybox二进制文件的setuid)。因此,不应该在你的编译目标上使用该目录。相反,您应该使用images/
目录中构建的映像之一。如果需要根文件系统的提取映像以便通过NFS引导,那么可以使用images/中生成的tarball映像,并将其作为根提取。与staging/
相比,target/
只包含运行所选目标应用程序所需的文件和库:开发文件(头文件等)不存在,二进制文件被剥离。
原文地址:https://blog.csdn.net/Once_day/article/details/134590694
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_21636.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!