linux(1)之build构建系统基础(一)

Linux(1)之buildroot构建系统(一)

Author:Onceday Date:2023年11月12日

漫漫长路,才刚刚开始…

参考文档:

  • The Yocto Project
  • Buildroot - Making Embedded Linux Easy

文章目录

      • Linux(1)之buildroot构建系统(一)
        • 1. 概述
          • 1.1 如Ubuntu等系统如何做到在许多设备上启动
          • 1.2 不同的CPU特性功能代码是如何兼容的
          • 1.3 嵌入式设备和通用x86兼容机的区别
          • 1.4 BIOS和UEFI的介绍
          • 1.5 BIOS和UEFI的作用
          • 1.6 设备树的作用
        • 2. buildroot编译环境搭建
          • 2.1 必须要安装的软件包
          • 2.2 可选的软件包
          • 2.3 开发环境
          • 2.4 获取源码
          • 2.5 生成配置config文件
          • 2.6 编译流程
          • 2.7 编译输出

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 的比较

  • 简单性:Buildroot更简单,易于学习和使用。Yocto的学习曲线较陡,但提供了更强大的功能和更多的自定义选项。

  • 配置和扩展性:Buildroot使用Kconfig系统,易于配置,并且包管理器简洁。Yocto使用BitBake和复杂的元数据系统,更适合大型、复杂的项目,需要处理复杂的依赖关系和多层次的软件包。

  • 社区支持和文档:Yocto的社区更大,文档更全面,但是更复杂。Buildroot的社区规模较小,但更易于上手。

  • 构建时间:通常,Buildroot的构建时间比Yocto的短,因为Yocto的构建过程更复杂。

总的来说,Buildroot和Yocto都是强大的工具,适合于嵌入式Linux开发。你应该根据你的具体需求和项目的复杂性来选择哪一个更适合。对于小型项目和需要快速原型的场合,Buildroot可能是一个更好的选择。对于需要高度定制和复杂的大型项目,Yocto可能是更好的选择。

buildroot介绍:

Buildroot is a simple, efficient and easy-to-use tool to generate embedded Linux systems through cross-compilation.

buildroot的特点如下:

  • 可以处理任何事情,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发行版都能在多种硬件上启动,这主要得益于以下几个方面的设计:

  1. 通用内核:Ubuntu使用一个“通用”或“通用”内核,这个内核包含了许多不同硬件设备的驱动。这意味着,只要硬件设备的驱动包含在内核中,Ubuntu就可以在该硬件上运行。

  2. 模块化的驱动:Linux内核支持模块化的驱动,这意味着驱动可以在运行时动态加载和卸载,而不需要重新编译整个内核。这使得Ubuntu能够根据需要加载特定的硬件驱动。

  3. 设备树:对于某些类型的设备(特别是很多嵌入式设备),Ubuntu可以使用设备树来描述硬件。设备树是一个数据结构,它描述了硬件的布局和配置。虽然Ubuntu的默认内核可能不包含所有可能的设备树,但用户可以提供自己的设备树以支持特定的硬件配置。

  4. UEFI和BIOS:Ubuntu支持UEFI(统一可扩展固件接口)和传统的BIOS启动方式。这意味着Ubuntu可以在各种不同的计算机系统上启动,包括新的基于EFI的系统和老的基于BIOS的系统。

  5. 自动硬件检测和配置: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在计算机启动时运行,执行以下主要任务:

  1. 硬件初始化:BIOS 会检查并初始化计算机的硬件设备,包括 CPU,内存,键盘,鼠标,显示设备等。
  2. 自检:BIOS 进行一系列的自检(POST,Power-On Self Test),以确保硬件设备工作正常。
  3. 引导加载:BIOS 会查找一个可启动设备(如硬盘,USB驱动或网络),并从该设备加载操作系统的引导加载程序。

尽管 BIOS 非常可靠并且被广泛使用,但是它有一些限制,例如它不能直接引导超过 2TB 的硬盘,不支持预引导环境的网络连接等。

UEFI 是一个现代的固件接口,设计用来取代 BIOS。UEFI 提供了更多的功能和更大的灵活性。UEFI 的主要功能包括:

  1. 硬件初始化和自检:就像 BIOS 一样,UEFI 在计算机启动时检查并初始化硬件设备,然后执行自检。
  2. 引导管理:UEFI 有一个更先进的引导管理器,可以支持多个操作系统并从多个设备引导。UEFI 可以直接引导超过 2TB 的硬盘。
  3. 预引导环境: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 必须要安装的软件包

以下是必备的各种构建工具的简要介绍:

  1. which: which 是一个在Unix和Unix-like操作系统中用于定位可执行文件的实用程序。它会在系统的PATH环境变量中定义的目录中查找文件。

  2. sed: sed 是一个流式文本编辑器,用于在命令行中处理和转换文本。它可以非交互地执行文本替换,删除和其他操作。

  3. make: make 是一种用于编译和构建项目的工具,它读取名为 Makefile 的文件,该文件描述了如何构建一个或多个目标。(version 3.81 or any later)

  4. binutils: binutils 是GNU项目的一部分,包含一组二进制工具,如 ld (链接器)、as (汇编器)、objdump (显示二进制信息)等。

  5. build-essential: build-essential 是Debian和Ubuntu等Linux发行版提供的一个软件包,包含编译和安装软件所必需的一些基本的工具,如 makegcc 等。

  6. diffutils: diffutils 是一个包含 diffdiff3sdiffcmp 等工具的软件包,用于比较文件和目录。

  7. gcc: gcc 是GNU编译器套装(GNU Compiler Collection)的简写,是一种开源的编译器,可以编译C、C++、Java等多种语言。(version 4.8 or any later)

  8. g++: g++ 是GNU C++编译器的命令行接口,它是gcc的一部分,用于编译C++代码。(version 4.8 or any later)

  9. bash: bash 是一个Unix shell,由GNU项目开发。它是Bourne shell的替代品,支持命令行编辑,shell函数,shell变量等。

  10. patch: patch 是一个Unix工具,用于将由diff生成的差异应用到一个或多个原始文件中,从而更新或创建文件。

  11. gzip: gzip 是一个在Unix和Unix-like系统上用于文件压缩的工具。

  12. bzip2: bzip2 是一个开源的数据压缩工具,它通常提供比gzip更高的压缩率,但压缩和解压速度较慢。

  13. perl: perl 是一种高级、通用、解释型、动态的编程语言。在系统管理,网络编程,GUI开发和更多其他领域中被广泛使用。(version 5.8.7 or any later)

  14. tar: tar 是一个在Unix和Unix-like系统上用于文件归档的工具,它可以将多个文件和目录组合成一个归档文件。

  15. cpio: cpio 是一个在Unix和Unix-like系统上用于创建和提取归档文件的工具。

  16. unzip: unzip 是一个在Unix和Unix-like系统上用于解压缩ZIP文件的工具。

  17. rsync: rsync 是一个在Unix和Unix-like系统上用于同步文件和目录的工具,它可以在本地或者两台计算机之间复制和同步文件。

  18. file: file 是一个在Unix和Unix-like系统上用于确定文件类型的工具。(must be in /usr/bin/file)

  19. bc: bc 是一种命令行计算器程序,它支持任意精度的算术运算和许多其他数学函数。

  20. findutils: findutils 是一个包含 findxargs 等工具的软件包,用于在文件系统中搜索和处理文件。

  21. 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替代,但在许多企业和大型项目中仍然广泛使用。

(4) Java相关的包:

  • 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 语言编写的。

Vagrantfile 中,你可以设置许多参数,包括:

  • 虚拟机的基础镜像(box)
  • 网络设置,如端口映射、私有网络、公共网络等
  • 共享文件夹设置
  • 启动虚拟机后需要执行的自动化脚本(provisioning scripts)
  • 虚拟机的硬件配置,如 CPU、内存大小等

一个基本的 Vagrantfile 示例如下:

Vagrant.configure("2") do |config|config.vm.box = "hashicorp/precise64"config.vm.network "forwarded_port", guest: 80, host: 8080config.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

如果你想跟踪开发,你可以使用每日快照或者克隆Git仓库。

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 文件,这个文件将会被用于驱动内核的编译过程。

在ubuntu上,可以分别按照对应的支持库:

  • 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 builddistclean              - delete all non-source files (including .config)Build:all                    - make worldtoolchain              - build toolchainsdk                    - build relocatable SDKConfiguration:menuconfig             - interactive curses-based configuratornconfig                - interactive ncurses-based configuratorxconfig                - interactive Qt-based configuratorgconfig                - interactive GTK-based configuratoroldconfig              - resolve any unresolved symbols in .configsyncconfig             - Same as oldconfig, but quietly, additionally update depsolddefconfig           - Same as syncconfig but sets new symbols to their default valuerandconfig             - New config with random answer to all optionsdefconfig              - New config with default answer to all options;BR2_DEFCONFIG, if set on the command line, is used as inputsavedefconfig          - Save current config to BR2_DEFCONFIG (minimal config)update-defconfig       - Same as savedefconfigallyesconfig           - New config where all options are accepted with yesallnoconfig            - New config where all options are answered with noalldefconfig           - New config where all options are set to defaultrandpackageconfig      - New config with random answer to package optionsallyespackageconfig    - New config where pkg options are accepted with yesallnopackageconfig     - New config where package options are answered with noPackage-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 stepDocumentation:manual                 - build manual in all formatsmanual-html            - build manual in HTMLmanual-split-html      - build manual in split HTMLmanual-pdf             - build manual in PDFmanual-text            - build manual in textmanual-epub            - build manual in ePubgraph-build            - generate graphs of the build timesgraph-depends          - generate graph of the dependency treegraph-size             - generate stats of the filesystem sizelist-defconfigs        - list all defconfigs (pre-configured minimal systems)Miscellaneous:source                 - download all sources needed for offline-buildexternal-deps          - list external packages usedlegal-info             - generate info about license complianceshow-info              - generate info about packages, as a JSON blurbpkg-stats              - generate info about packages as JSON and HTMLprintvars              - 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 patternmake V=0|1             - 0 => quiet build (default), 1 => verbose buildmake O=dir             - Locate all output files in "dir", including .configFor further details, see README, generate the Buildroot manual, or consult
it on-line at http://buildroot.org/docs.html

默认情况下,buildroot不支持顶层级别的并行编译,make -jN并无必要,不过存在一个实验性质的功能,用于支持并行构建

通常,Make编译流程执行以下步骤:

  1. 下载源代码(如果需要的话),可通过指定不同获取方式,wget、git、svn、rsync等等。
  2. 配置、编译、安装交叉工具链,或者简单的导入一个外部的工具链。
  3. 配置、编译、安装指定的目标软件包。
  4. 可选编译一个内核镜像包。
  5. 可选编译一个bootloader镜像包。
  6. 创建一个指定格式的根文件系统。
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/只包含运行所选目标应用程序所需的文件和库:开发文件(头文件等)不存在,二进制文件被剥离

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/165925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业数字化转型转什么?怎么转?这份攻略请收好

目录 -01-数字化转型“是什么” -02-数据驱动推动企业数字化转型 -03-企业数字化转型的行动路线图 数字化转型&#xff0c;转什么&#xff1f;怎么转&#xff1f;这些问题仍在困扰不少企业&#xff0c;也是每个企业转型升级不得不思考的重要问题。对此&#xff0c;中关村数字…

Python潮流周刊#1:如何系统地自学Python?

这里记录每周值得分享的 Python 及通用技术内容&#xff0c;部分内容为英文&#xff0c;已在小标题注明。&#xff08;本期标题取自其中一则分享&#xff0c;不代表全部内容都是该主题&#xff0c;特此声明。&#xff09; 文章&教程 1、编程语言的错误处理模式 文章讨论…

requests请求django接口跨域问题处理

参考&#xff1a; https://zhuanlan.zhihu.com/p/416978320 https://blog.csdn.net/SweetHeartHuaZai/article/details/130983179 使用httpx代替requests import httpxheaders {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.3…

销售为什么会选择使用电销这种方式 ?

在网络经济时代的大环境下&#xff0c;网络营销作为一种新型营销模式和营销理念&#xff0c;已经抢占了大部分市场。 网络营销&#xff0c;是指利用互联网技术和现代信息技术&#xff0c;以及社交媒体平台&#xff0c;进行产品宣传、销售、服务、品牌传播等活动的一种营销模式。…

MySQL-进阶

存储引擎 MySQL体系结构 连接层&#xff1a; 最上层是一些客户端和连接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。服务层&#xff1a; 第二层架构主要完成大多数的核心服务功能&…

财报解读:三季度的美国零售,“沃尔玛效应”仍在持续

经济学中常用“沃尔玛效应”来指代“消费者减少消费时&#xff0c;会选择每种类别中价格最低的商品”这一现象。作为全球最大的零售商&#xff0c;沃尔玛一定程度上成为了消费市场的风向标。 近日&#xff0c;沃尔玛发布的2024财年第三季度财报显示&#xff0c;其相较去年同期…

虚拟机(Linux)系统知识普及:什么是Linux发行版 以及各发行版的区别

什么是Linux发行版 以及各发行版的区别 一. 什么是linux发行版简单来说正式定义区别资料1区别资料2区别资料3区别资料4注意事项二. Linux发行版:CentOS、Ubuntu、RedHat、Android、Tizen、MeeGoLinux 发行版:RedhatDebianUbuntuGentooFreeBSD

22款奔驰S400L升级主动式氛围灯 光影彰显奔驰的完美

新款奔驰S级原车自带64色氛围灯&#xff0c;还可以升级原厂的主动式氛围灯&#xff0c;增加车内的氛围效果。主动式环境氛围灯包含263个LED光源&#xff0c;每隔1.6厘米就有一个LED光源&#xff0c;照明效果较过去明亮10倍&#xff0c;视觉效果更加绚丽&#xff0c;它还可结合智…

Python中的下划线使用教程:单下划线、双下划线和头尾双下划线详解

概要 Python是一种简单、易学、功能强大的编程语言&#xff0c;被广泛应用于各种领域。在Python中&#xff0c;下划线的使用有其特殊的含义和用途。本文将详细介绍Python中的单下划线、双下划线和头尾双下划线的使用教程&#xff0c;帮助读者更好地理解和应用这些特性。 一、单…

干货!ERP软件如何帮助企业实现信息化管理?

ERP即企业资源规划&#xff08;Enterprise Resource Planning&#xff09;系统&#xff0c;其核心是物料的追踪流转。而在物料追踪流转的基础上&#xff0c;又衍生出一系列各类资源计划的管理和追踪。因此ERP发展成为一款集成各类资源计划&#xff0c;也就是集成企业核心业务流…

化学气相沉积(CVD)中的TEOS

在半导体制程中&#xff0c;薄膜的沉积是核心的步骤之一&#xff0c;有接触过CVD的小伙伴应该或多或少听过TEOS这种物质&#xff0c;TEOS作为一种重要的沉积源&#xff0c;尤其在低温氧化硅的生成过程中&#xff0c;发挥了无可替代的角色。今天我们就来聊聊这种物质。 什么是TE…

ES开启安全认证

elasticsearch开启安全认证步骤 1.创建证书 进入到es主目录下执行 ./bin/elasticsearch-certutil ca Elasticsearch开启安全认证详细步骤 第一个证书名称默认&#xff0c;直接回车 第二个输入密码&#xff0c;直接回车 完成后会生成一个文件&#xff1a;elastic-stack-ca.p12…

创新研报|顺应全球数字化,能源企业以“双碳”为目标的转型迫在眉睫

能源行业现状及痛点分析 挑战一&#xff1a;数字感知能力较弱 挑战二&#xff1a;与业务的融合度低 挑战三&#xff1a;决策响应速度滞后 挑战四&#xff1a;价值创造有待提升 挑战五&#xff1a;安全风险如影随形 能源数字化转型定义及架构 能源行业数字化转型体系大体…

windows电脑定时开关机设置

设置流程 右击【此电脑】>【管理】 【任务计划程序】>【创建基本任务】 gina 命令 查看 已经添加的定时任务从哪看&#xff1f;这里&#xff1a; 往下滑啦&#xff0c;看你刚才添加的任务&#xff1a;

2015年8月19日 Go生态洞察:Go 1.5版本发布

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

C++学习之路(二)C++如何实现一个超简单的学生信息管理系统?C++示例和小项目实例

这个示例实现了一个简单的学生信息管理系统。它包括了学生类的定义&#xff0c;可以添加学生信息、显示所有学生信息&#xff0c;将学生信息保存到文件并从文件加载信息。通过这个示例&#xff0c;你可以了解到如何使用类、函数和文件操作来构建一个基本的信息管理系统。 一个简…

【数据结构/C++】栈和队列_链队列

#include <iostream> using namespace std; // 链队列 typedef int ElemType; typedef struct LinkNode {ElemType data;struct LinkNode *next; } LinkNode; typedef struct {LinkNode *front, *rear; } LinkQueue; // 初始化 void InitQueue(LinkQueue &Q) {Q.fron…

【Unity实战】零代码实现物理2d绳子和绳桥效果——Hinge Joint 2D的使用

文章目录 最终效果前言一、绳子1. 方法一简单的实现问题&#xff0c;当我们想移动它时&#xff0c;所有节点就都断开了 2. 方法二精灵骨骼编辑使用精灵骨骼简单制作绳子效果限制每个节点旋转角度更大的质量添加稳定性 二、绳桥补充参考完结 最终效果 前言 本文使用Hinge Joint…

使用ListenableFuture进行异步任务执行并进行线程切换

文章目录 一、前言二、关键代码三、参考链接 一、前言 在程序中会经常需要做一些异步任务&#xff0c;但是由于部分操作其实很简单&#xff0c;仅仅是短暂的进行异步操作&#xff0c;然后在结果成功或失败的时候切换回主线程进行下一步处理&#xff0c;这期间不能阻塞主线程。…

被动接受需求

以下所说的运维是指传统运维&#xff0c;比如集成项目&#xff0c;软件实施驻场运维这类。 1. 主动一点困难多一点体验多一点 我作为驻场运维人员&#xff0c;我大多数时候都在被动的等待、被迫接受需求。 这种方式 好处是 有时候有空闲的时间。 坏处是 干着干着不仅是把系统…