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发行版都能在多种硬件上启动,这主要得益于以下几个方面的设计:
-
通用内核: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环境变量中定义的目录中查找文件。 -
sed:
sed是一个流式文本编辑器,用于在命令行中处理和转换文本。它可以非交互地执行文本替换,删除和其他操作。 -
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生成的差异应用到一个或多个原始文件中,从而更新或创建文件。 -
gzip:
gzip是一个在Unix和Unix-like系统上用于文件压缩的工具。 -
bzip2:
bzip2是一个开源的数据压缩工具,它通常提供比gzip更高的压缩率,但压缩和解压速度较慢。 -
perl:
perl是一种高级、通用、解释型、动态的编程语言。在系统管理,网络编程,GUI开发和更多其他领域中被广泛使用。(version 5.8.7 or any later) -
tar:
tar是一个在Unix和Unix-like系统上用于文件归档的工具,它可以将多个文件和目录组合成一个归档文件。 -
cpio:
cpio是一个在Unix和Unix-like系统上用于创建和提取归档文件的工具。 -
unzip:
unzip是一个在Unix和Unix-like系统上用于解压缩ZIP文件的工具。 -
rsync:
rsync是一个在Unix和Unix-like系统上用于同步文件和目录的工具,它可以在本地或者两台计算机之间复制和同步文件。 -
file:
file是一个在Unix和Unix-like系统上用于确定文件类型的工具。(must be in /usr/bin/file) -
bc:
bc是一种命令行计算器程序,它支持任意精度的算术运算和许多其他数学函数。 -
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替代,但在许多企业和大型项目中仍然广泛使用。
(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编译流程执行以下步骤:
- 下载源代码(如果需要的话),可通过指定不同获取方式,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/只包含运行所选目标应用程序所需的文件和库:开发文件(头文件等)不存在,二进制文件被剥离。
相关文章:
linux(1)之build构建系统基础(一)
Linux(1)之buildroot构建系统(一) Author:Onceday Date:2023年11月12日 漫漫长路,才刚刚开始… 参考文档: The Yocto ProjectBuildroot - Making Embedded Linux Easy 文章目录 Linux(1)之buildroot构建系统(一)1. 概述1.1 如…...
25 Linux I2C 驱动
一、I2C简介 I2C老朋友了,在单片机里面也学过,现在再复习一下。I2C使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线),另外一条是 SDA(串行数据线),这两条数据线需要接上拉电阻,总线空闲的时候 SCL…...
API 设计:使用 Node.js 和 Express.js 的综合教程
API(应用程序编程接口)设计涉及创建一个高效而强大的接口,允许不同的软件应用程序相互交互。 说明 本教程将指导您使用 Node.js 和 Express.js 作为核心技术来规划、设计和构建 API。但是,这些原则可以应用于任何语言或框架。我们…...
vite和webpack的区别和练习
Vite和Webpack都是现代化的前端构建工具,但它们之间存在一些区别: 构建性能:Vite使用ES Modules提高了构建性能,可以在构建时只构建需要的部分,而Webpack则需要在构建时处理整个应用程序。 开发体验:Vite具…...
Python与设计模式--装饰器模式
6-Python与设计模式–装饰器模式 一、快餐点餐系统 又提到了那个快餐点餐系统,不过今天我们只以其中的一个类作为主角:饮料类。 首先,回忆下饮料类: class Beverage():name ""price 0.0type "BEVERAGE"…...
flutter之graphic图表自定义tooltip
renderer graphic中tooltip的TooltipGuide类提供了renderer方法,接收三个参数Size类型,Offset类型,Map<int, Tuple>类型。可查到的文档是真的少,所以只能在源码中扒拉例子,做符合需求的修改。 官方github示例 …...
逆向扒cocosjs安卓包教程-破解加密的js源码
本文只适用于cocosjs引擎打包的游戏apk,针对此类apk进行源码级别的逆向破解,可直接逐个破解工程内的源码部分,让游戏逻辑大白于你的面前,你可以针对js源码进行二次开发。按照我的教程破解过程中遇到什么问题,欢迎留言。 目录 准备apk包 查找加密key 解密jsc文件 方案1…...
Kafka(一)
一:简介 解决高吞吐量项目的需求 是一款为大数据而生的消息中间件,具有百亿级tps的吞吐量,在数据采集、传输、存储的过程中发挥着作用 二:为什么要使用消息队列 一个普通访问量的接口和一个大并发的接口,它们背后的…...
【Amazon】安装卸载AWS CLI操作流程(Windows 、Linux系统)
AWS 命令行界面(AWS CLI)是用于管理 AWS 产品的统一工具。只需要下载和配置一个工具,您就可以使用命令行控制多个 AWS 产品并利用脚本来自动执行这些服务。 AWS CLI v2 提供了多项新功能,包括改进的安装程序、新的配置选项&#…...
Django同时连接多种数据库
我的使用场景需要同时连接达梦数据库和MYSQL数据库,有的功能需要查询达梦,有的功能则需要查询MYSQL。 第一步:在 Django 的 settings.py 文件中,配置多个数据库连接。你可以在 DATABASES 字典中添加多个数据库配置。每个数据库配置…...
【链表之练习题】
文章目录 翻转链表找到链表的中间节点返回倒数第k个节点合并两个有序链表判断链表是否回文注意 翻转链表 //反转链表//实质上是把每一个节点头插法,原本第一个节点变成最后一个节点public ListNode reverseList(){//链表为空if (head null){return null;}//链表只有一个节点if…...
情感对话机器人的任务体系
人类在处理对话中的情感时,需要先根据对话场景中的蛛丝马迹判断出对方的情感,继而根据对话的主题等信息思考自身用什么情感进行回复,最后结合推理出的情感形成恰当的回复。受人类处理情感对话的启发,情感对话机器人需要完成以下几…...
【笔记 Pytorch 08】深度学习模板 (未完)
文章目录 一、声明二、工程结构三、文件内容main.pymodel.pydataset.pyutils.py 四、问题汇总 一、声明 非常感谢这些资料的作者: 【参考1】、【PyTorch速成教程 (by Sung Kim)】 二、工程结构 ├── main.py:实现训练 (train) 、验证(validation)和…...
【如何学习Python自动化测试】—— Cookie 处理
前提 网络通信是当今社会最为普及和繁荣的技术之一,其承载了人们生活中瞬息万变的信息传递和交流。而作为网络通信的核心要素,网络协议、socket、cookie和session则是网络通信的灵魂。 一、网络协议 网络协议是计算机和网络设备之间相互通信的规则和标准…...
IOS+Appium+Python自动化全实战教程
由于公司的产品坐落于不同的平台,如ios、mac、Android、windows、web。因此每次有新需求的时候,开发结束后,留给测试的时间也不多。此外,一些新的功能实现,偶尔会影响其他的模块功能正常的使用。 网上的ios自动化方面的…...
华硕灵耀XPro(UX7602ZM)原装Win11系统恢复安装教程方法
华硕灵耀XPro(UX7602ZM)原装Win11系统恢复安装教程方法: 第一步:需要自备华硕6个底包工厂安装包(EDN.KIT.OFS.SWP.HDI.TLK)或者自己备份的iso/esd/wim等镜像恢复 支持系列: 灵耀系列原装系统 无畏系列原装系统 枪…...
SpringBoot整合Redis,redis连接池和RedisTemplate序列化
SpringBoot整合Redis 1、SpringBoot整合redis1.1 pom.xml1.2 application.yml1.3 配置类RedisConfig,实现RedisTemplate序列化1.4 代码测试 2、SpringBoot整合redis几个疑问?2.1、Redis 连接池讲解2.2、RedisTemplate和StringRedisTemplate 3、RedisTemp…...
学习课题:逐步构建开发播放器【QT5 + FFmpeg6 + SDL2】
目录 一、播放器开发(一):播放器组成大致结构与代码流程设计 二、播放器开发(二):了解FFmpeg与SDL常用对象和函数 三、播放器开发(三):FFmpeg与SDL环境配置 四、播放器开发(四):多线程解复用与解码模块实现 五、播放器开发(五…...
Linux 6.7全面改进x86 CPU微码加载方式
导读最近,社区在清理 Linux 上的 Intel/AMD x86 CPU 微代码加载方面做了大量的工作,这些工作现已合并到 Linux 6.7 中。 由于在启动时加载 CPU 微代码对于减少不断出现的新 CPU 安全漏洞以及有时解决功能问题非常重要,Thomas Gleixner 最近开…...
【Python】Fastapi swagger-ui.css 、swagger-ui-bundle.js 无法加载,docs无法加载,redocs无法使用
使用fastapi的时候,swagger-ui.css 、swagger-ui-bundle.js、redoc.standalone.js 有时候无法加载(国内环境原因或者是局域网屏蔽),此时就需要自己用魔法下载好对应文件,然后替换到fastapi里面去。 fastapi里面依靠这…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
