• 一、buildroot 介绍


    1.1 介绍

    Buildroot 是一种工具,它使用交叉编译简化并自动化为嵌入式系统构建完整的 Linux 系统的过程。

    为了实现这一点,Buildroot 能够为我们的目标生成交叉编译工具链、根文件系统、Linux 内核映像和引导加载程序。Buildroot可以单独用于这些选项的任何组合(例如,我们可以使用现有的交叉编译工具链,并用 Buildroot 只构建我们的根文件系统)。

    Buildroot 主要对使用嵌入式系统的人有用。嵌入式系统通常使用的处理器不是每个人在其 PC 中都使用过的常规x86处理器。它们可以是 PowerPC 处理器、MIPS 处理器、ARM 处理器等等。

    Buildroot 支持许多处理器和他们的变种,它还提供了一些现成的板的默认配置。除此之外,许多第三方项目都是基于或在 Buildroot 上开发 BSP 或 SDK 。

    • BSP:板载支持包
    • SDK:软件开发工具包

    1.2 环境要求

    1.2.1 必须的工具包

    buildroot 在构建的过程中需要宿主机上存在一些工具,有了这些工具,buildroot 的构建工具才能建立:

    1 sudo apt-get install make binutils build-essential gcc g++ bzip2 gzip perl cpio unzip rsync wget

     1.2.2 可选的工具包

    • 推荐的依赖关系:
      • Buildroot中的一些特性或工具,如法律信息或图形生成工具,具有额外的依赖性。虽然它们不是一个简单的构建必须的,但仍然强烈推荐:
        • python:版本至少 2.7 或以上
    • 配置接口依赖关系:
      • 对于这些库,您需要同时安装运行时和开发数据,这些数据在许多发行版中是单独打包的。开发包通常具有 -dev 或 -devel 后缀。
        • ncurse5 或 libncurse5 的接口用于 menuconfig
        • qt5 的接口用于 xconfig:sudo apt-get install qt5-default
        • glib2,gtk2 和 glade2 的接口用于 gocnig
    • 源码包获取工具:
      • 在官方树中,大多数包源都是使用 wget 从 ftp、http 或 https 位置检索的。少数软件包只能通过版本控制系统获得。此外,Buildroot 还可以通过其他工具下载源代码,比如 rsync 或 scp 。如果您启用包使用任何这些方法,您将需要安装相应的工具在主机系统:
        • 这些工具有 bazaar、cvs、git、mercurial、rsync、scp、subversion
    • 与 Java 相关的包,如果 Java 需要在目标系统上构建:
      • javac 编译器和 jar 工具
    • 文档生成工具:
      • asciidoc、w3m、python(包含 argparse 模块的版本)、dblatex(pdf 手册使用)
    • 图形生成工具:
      • graphviz
      • python-matplotlib

    1.3 获取 buildroot

    buildroot 下载:

    官网下载:https://buildroot.org/

    buildroot 官网文档下载:https://buildroot.org/docs.html

    下载完成后,进行解压即可。

    1.4 buildroot 的使用

    使用 Buildroot 的第一步是创建配置。Buildroot 有一个很好的配置工具,类似于 Linux 内核或 BusyBox 中的配置工具。

    在根目录下使用命令 make menuconfig/nconfig/xconfig/gconfig 可以使用不同 host 工具进入不同的配置界面。

    具体的可以在根目录下使用 make help 查看各个配置命令的不同。

    默认情况下,Buildroot不支持顶层的并行构建,因此没有必要运行 make -jN。然而,对于顶级并行构建有实验性的支持。

    • make 命令通常执行以下步骤:
      • 按配置要求下载源码文件
      • 配置,编译和安装交叉编译工具链,或者简单的导入一个外部工具链
      • 配置,编译和安装选择的目标包
      • 如果选择了内核,则编译一个内核镜像
      • 如果选择了一个 bootloader,则编译一个 bootloader 镜像
      • 如果选择了根文件系统的格式,则创建一个根文件系统

    buildroot 的输出存放在 output/ 目录下,此目录的构建如下:

    目录 说明
    images/ 所有映像(内核映像、引导加载程序映像和根文件系统映像)都存储在这里。这些是需要放在目标系统上的文件。
    build/ 在其中构建所有组件(包括宿主上的 Buildroot 所需的工具和为目标编译的包)。此目录为每个组件包含一个子目录。
    host/

    包含为主机构建的工具和目标工具链的sysroot。

    前者安装了为主机编译的工具,这些工具是正确执行Buildroot所需要的,包括交叉编译工具链。

    后者是类似于根文件系统层次结构的层次结构。它包含提供和安装其他包使用的库的所有用户空间包的头文件和库文件。但是,这个目录并不打算成为目标的根文件系统:它包含许多开发文件、未剥离的二进制文件和库,使得它对于嵌入式系统来说太大了。这些开发文件用于为依赖于其他库的目标编译库和应用程序。

    staging/ 是指向 host/ 内部目标工具链 sysroot 的符号链接,存在它是为了向后兼容。
    target/ 它包含了目标的几乎完整的根文件系统:除了/dev/ 中的设备文件(Buildroot不能创建它们,因为 Buildroot 不是作为 root 用户运行,也不想作为 root 用户运行)之外,所需的所有文件都在其中。而且,它没有正确的权限(例如 busybox 二进制文件的 setuid)。因此,不应该在目标上使用 /dev 目录。相反,您应该使用在images/目录中构建的映像之一。如果需要在NFS上引导根文件系统的一个提取的映像,那么使用在 images/ 中生成的 tarball 映像并将其提取为 root。与 staging/ 相比,target/ 只包含运行所选目标应用程序所需的文件和库:开发文件(头文件等)不存在,二进制文件被剥离。

    1.5 make 命令

    在根目录下运行 make help 可以查看到所有的命令:

    分类 命令 说明
    Cleaning clean  当任何架构或工具链配置选项被更改时,需要显式清理。删除所有构建产品(包括目录 buiild、host、stagint 和 target trees、images 和 toolchain)
    distclean  为新目标重置Buildroot:删除所有构建产品和配置
    Build all  相当于 make world,world 是 buildroot 的第一个目标
    toolchain  构建交叉编译工具链
    sdk  构建可移植的 SDK
    Configuration menuconfig  交互式 curses-based 配置器
    nconfig  交互式 ncurses-based 配置器
    xconfig  交互式 Qt-based 配置器
    gconfig  交互式 GTK-based 配置器
    oldconfig  解析 .config 中未解析的符号
    syncconfig  和 oldconfig 一样,但是悄声地,增加了 deps 的更新
    olddefconfig  与 syncconfig 相同,但将新符号设置为默认值
    randconfig  新配置随机回答所有选项
    defconfig  带有所有选项默认答案的新配置;如果在命令行上设置,则使用 BR2_DEFCONFIG 作为输入
    savedefconfig  将当前配置保存为 BR2_DEFCONFIG(最小配置)
    update-defconfig  与 savedefconfig 一样
    allyesconfig  新配置中所有选项都被接受
    allnoconfig  新配置中所有选项都被拒绝
    alldefconfig  新配置中所有选项都被设置为默认
    randpackageconfig  新配置随机回答包选项
    allyespackageconfig  新的配置,pkg 选项是接受的
    allnopackageconfig  新配置中包选项的答案是 no
    Package-specific <pkg>  建立和安装 <pkg> 以及它所有的依赖关系
    <pkg>-source  只下载 <pkg> 源文件
    <pkg>-extract  解压 <pkg> 源码
    <pkg>-patch  应用补丁到 <pkg>
    <pkg>-depends  构建 <pkg> 的依赖
    <pkg>-configure  构建 <pkg> 直到配置步骤
    <pkg>-build  构建 <pkg> 直到编译步骤
    <pkg>-show-info  生成关于 <pkg> 的信息,作为 JSON 简介
    <pkg>-show-depends  显示 <pkg> 的依赖
    <pkg>-show-rdepends  显示以 <pkg> 为依赖的包
    <pkg>-show-recursive-depends  递归显示 <pkg> 的依赖
    <pkg>-show-recursive-rdepends  递归显示以 <pkg> 为依赖的包
    <pkg>-graph-depends  生成 <pkg> 的依赖关系图
    <pkg>-graph-rdepends  生成 <pkg> 的被依赖关系图
    <pkg>-dirclean  删除 <pkg> 的构建目录
    <pkg>-reconfigure  从配置步骤重新启动构建
    <pkg>-rebuild  从编译步骤重新启动生成
    Documentation manual  以所有格式构建手册
    manual-html  以 HTML 格式构建手册
    manual-split-html  以 分割的 HTML 格式构建手册
    manual-pdf  以 pdf 格式构建手册
    manual-text  以 test 格式构建手册
    manual-epub  以 epub 格式构建手册
    graph-build  生成构建时间的图表
    graph-depends  生成依赖树的图
    graph-size  生成文件系统大小的统计数据
    list-defconfigs 列出所有预配置的最小系统,支持的所有板子的 xxx_defconfig
    Miscellaneous source 下载离线构建所需的所有资源
    external-deps 列出使用的外部包
    legal-info  生成关于许可证遵从性的信息
    show-info 生成关于包的信息,作为JSON简介
    printvars

    转储用VARS=…选择的内部变量,可以转储已知的要生成的变量及其值,如

    $ make -s printvars VARS='VARIABLE1 VARIABLE2'
    VARIABLE1=value_of_variable
    VARIABLE2=value_of_variable

    它是可能的调整输出使用一些变量:

    • VARS 将把列表限制为名称与指定 make 模式匹配的变量——这必须设置,否则不会打印任何内容

    • QUOTED_VARS,如果设置为 YES,将单引号引用该值

    • RAW_VARS,如果设置为 YES,将打印未展开的值

    例如:

    $ make -s printvars VARS=BUSYBOX_%DEPENDENCIES
    BUSYBOX_DEPENDENCIES=skeleton toolchain
    BUSYBOX_FINAL_ALL_DEPENDENCIES=skeleton toolchain
    BUSYBOX_FINAL_DEPENDENCIES=skeleton toolchain
    BUSYBOX_FINAL_PATCH_DEPENDENCIES=
    BUSYBOX_RDEPENDENCIES=ncurses util-linux

    make V=0|1 

    make V=1 target:显示所有执行的命令

    make V=0 target:不显示命令

    make O=dir 在“dir”中存放所有输出文件,包括.config

    不是所有的命令都会在 make help 中显示出来,有些配置命令需要在某些软件包在 .config 中配置之后才能生效:

    • busybox-menuconfig 只在启用 busybox 时工作;
    • linux-menuconfig 和 linux-savedefconfig 只在启用 linux 时工作;
    • uClibc-menuconfig 仅在内部工具链后端选择 uClibc C库时可用;

    • barebox-menuconfig 和 barebox-savedefconfig 只在 barebox 引导加载程序启用时工作。、

    • uboot-menuconfig ·和 +

    • boot-savedefconfig 只在 U-Boot 引导加载程序启用时工作。

  • 相关阅读:
    .net中数据库事务机制
    位图排序
    JavaScript实现手动画线
    CSS 样式
    我的知识计划
    开发民政信息采集工具有感
    系统小技巧
    C++的学习笔记
    Android核心服务学习笔记
    突然想到的“社会发展历程”
  • 原文地址:https://www.cnblogs.com/kele-dad/p/13101057.html
Copyright © 2020-2023  润新知