buildroot简介
    原文https://buildroot.org/downloads/manual/manual.html
    一、简介
    Buildroot是一个工具,可以使用交叉编译来简化和自动化为嵌入式系统构建完整的Linux系统的过程。
    Buildroot能够为您的目标生成交叉编译工具链,根文件系统,Linux内核映像和引导程序。
    如果可以熟练使用可以说是非常方便了。
    二、系统要求
    buildroot在linux上运行。
    buildroot有必须使用的包和可选择的包,这些包如下(请注意,软件包名称在发行版之间可能有所不同)
    2.1 必须用的包
    构建工具(也就是你的linux要有这些命令,没有可以使用功能apt-get或yum):

    • which
    • sed
    • make (版本3.81或更高版本)
    • binutils
    • build-essential (仅适用于基于Debian的系统)
    • gcc (版本4.4或更高版本)
    • g++ (版本4.4或更高版本)
    • bash
    • patch
    • gzip
    • bzip2
    • perl (版本5.8.7或更高版本)
    • tar
    • cpio
    • python (2.7版或更高版本)
    • unzip
    • rsync
    • file(必须在/usr/bin/file)
    • bc

    源码获取工具

    • wget

    2.2 可选的包
    配置接口依赖性:

    对于这些库,您需要同时安装运行时和开发数据,在许多发行版中,这些数据是单独打包的。开发软件包通常具有-dev或-devel后缀。

    • ncurses5使用menuconfig界面
    • qt4使用xconfig界面
    • glib2,gtk2并glade2使用gconfig界面

    源获取工具:

    • 如果使用以下任何一种方法启用软件包,则需要在主机系统上安装相应的工具:
      • bazaar
      • cvs
      • git
      • mercurial
      • rsync
      • scp
      • subversion
    • 与Java有关的软件包,如果需要为目标系统构建Java Classpath:
      • 该javac编译器
      • 该jar工具
    • 文档生成工具:
      • asciidoc,版本8.6.3或更高版本
      • w3m
      • python与argparse模块(自动存在于2.7+和3.2+中)
      • dblatex (仅适用于pdf手册)
    • 图生成工具:
      • graphviz使用图依赖-图依赖
      • python-matplotlib使用图构建

    以上应属于环境搭建,接下来是获取源码。
    在我目前的工作中buildroot都是由芯片供应商给的BSP包中获得的,我需要知道怎么定制我的根文件系统和一些设置。
    三、获取buildroot
    Buildroot版本每2个月,2月,5月,8月和11月发布一次。版本号的格式为YYYY.MM,例如2013.02、2014.08。在
    可以从http://buildroot.org/downloads/获得发行包。
    四、快速入门

    这是我目前需要的,就是如何使用buildroot
    重要:您可以并且应该以普通用户身份来构建所有内容。无需root用户即可配置和使用Buildroot。通过以常规用户身份运行所有命令,可以保护系统免受在编译和安装过程中表现异常的软件包的侵害。
    从buildroot目录运行
    $ make menuconfig
    对于原始的基于curses的配置器,或者
    $make nconfig
    用于新的基于curses的配置器,或
    $make xconfig
    基于Qt的配置器,或
    $make gconfig

    目前只使用过make menuconfig。用来配置编译选项
    在Buildroot里面不要使用make -jN来编译,目前不支持顶级并行make。
    make命令通常将执行以下步骤:

    • 下载源文件(根据需要);
    • 配置,构建和安装交叉编译工具链,或仅导入外部工具链;
    • 配置,构建和安装选定的目标软件包;
    • 构建内核映像(如果选择);
    • 构建引导加载程序映像(如果选择);
    • 以选定的格式创建一个根文件系统。

    在编译某个芯片的程序源码时,发现编译buildroot的时间是最长的,编译生成文件也很多,有的会达到几个G的大小。
    Buildroot输出存储在单个目录中output/。该目录包含几个子目录:

    • images/存储所有映像(内核映像,引导加载程序和根文件系统映像)的位置。这些是您需要放在目标系统上的文件。
    • build/构建所有组件的位置(包括主机上Buildroot所需的工具和针对目标编译的软件包)。该目录为每个组件包含一个子目录。
    • staging/其中包含类似于根文件系统层次结构的层次结构。该目录包含交叉编译工具链的标题和库,以及为目标选择的所有用户空间包。但是,该目录并非旨在作为目标的根文件系统:它包含许多开发文件,未剥离的二进制文件和库,这些文件对于嵌入式系统而言太大了。这些开发文件用于为依赖于其他库的目标编译库和应用程序。
    • target/它几乎包含了目标的完整根文件系统:除了设备文件/dev/(Buildroot无法创建它们,因为Buildroot不能以root身份运行并且不想以root身份运行)之外,所需的一切都存在 。另外,它没有正确的权限(例如,busybox二进制文件的setuid)。因此,该目录 不应在您的target上使用。相反,您应该使用images/目录中内置的图像之一。如果您需要提取根文件系统的映像以通过NFS引导,请使用生成的tarball映像images/并将其提取为root。相比staging/,target/ 仅包含运行所选目标应用程序所需的文件和库:不存在开发文件(标头等),剥离了二进制文件。
    • host/ 包含为主机正确编译Buildroot所需的工具的安装,包括交叉编译工具链。

    以上对个目录解释很清楚,怎么生成的呢?继续网往下看

    五 、社区资源
    论坛之类的

    六、buildroot配置

    其中的所有配置选项make *config都有帮助文本,其中提供了有关该选项的详细信息。

    这些make *config命令还提供了搜索工具。阅读不同的前端菜单中的帮助消息以了解如何使用它:

    • 在menuconfig中,通过按调用搜索工具/;
    • 在xconfig中,通过按Ctrl+ 调用搜索工具f。

    6.1 交叉编译工具
    编译工具链是允许您编译系统代码的工具集。它由一个编译器(在我们的情况下为gcc),二进制utils(例如汇编程序和链接程序)(在我们的情况下为binutils)和一个C标准库(例如 GNU LibcuClibc-ng)组成。开发工作站上安装的系统肯定已经具有一个编译工具链,可用于编译在系统上运行的应用程序。如果您使用的是PC,则编译工具链可在x86处理器上运行并为x86处理器生成代码。在大多数Linux系统中,编译工具链使用GNU libc(glibc)作为C标准库。该编译工具链称为“主机编译工具链”。在其上运行并且在其上工作的计算机称为“主机系统” 。
    对交叉编译解释的很清楚
    Buildroot为交叉编译工具链提供了两种解决方案:
    内部工具链后端,在配置接口中称为buildroot toolchain。
    外部工具链后端,在配置接口中称为外部工具链。
    可以使用菜单中的Toolchain Type选项在这两种解决方案之间进行选择Toolchain。选择一种解决方案后,将出现许多配置选项,以下各节将详细介绍它们。
    6.1.1 内部工具链后端
    该后端的优点:
    该后端支持多个C库: uClibc-ngglibcmusl
    与Buildroot良好集成
    快速,只构建必要的内容
    该后端的缺点:
    做时需要重建工具链make clean,这需要时间。如果您想减少构建时间,请考虑使用External toolchain backend。
    6.1.2 外部工具链后端
    在外部工具链后端允许使用现有的预建交叉编译工具链。Buildroot知道许多著名的交叉编译工具链(来自 ARM的Linaro,ARM的 Sourcery CodeBench,x86-64,PowerPC和MIPS,并能够自动下载它们,也可以指向自定义工具链。 ,可以下载或在本地安装。
    然后,您有三种使用外部工具链的解决方案:

    1. 使用预定义的外部工具链配置文件,并让Buildroot下载,提取和安装工具链。Buildroot已经知道一些CodeSourcery和Linaro工具链。只需Toolchain从可用的工具链配置文件中选择。这绝对是最简单的解决方案。

    2. 使用预定义的外部工具链配置文件,而不是让Buildroot下载并解压缩该工具链,而是可以告诉Buildroot您的工具链已在系统上安装的位置。只需Toolchain通过可用的工具链配置文件中选择工具链配置文件,取消选择Download toolchain automatically,然后Toolchain path使用交叉编译工具链的路径填充 文本条目。

    3. 使用完全自定义的外部工具链。这对于使用crosstool-NG或Buildroot本身生成的工具链特别有用。为此,请Custom toolchain在Toolchain列表中选择解决方案 。您需要填写的Toolchain path,Toolchain prefix和External toolchain C library选项。然后,您必须告诉Buildroot您的外部工具链支持什么。如果您的外部工具链使用glibc库,则只需告诉您工具链是否支持C ++,以及它是否具有内置的RPC支持。如果您的外部工具链使用uClibc 库,然后您必须告诉Buildroot它是否支持RPC,宽字符,语言环境,程序调用,线程和C ++。在执行开始时,Buildroot会告诉您所选的选项是否与工具链配置不匹配。

    该后端的优点:
    允许使用众所周知且经过测试的交叉编译工具链。
    避免了交叉编译工具链的构建时间,这在嵌入式Linux系统的总体构建时间中通常非常重要。
    该后端的缺点:
    如果您预先构建的外部工具链有错误,则可能很难从工具链供应商处获得修复,除非您自己使用Crosstool-NG来构建外部工具链。

    以上是交叉工具链的生成说明,现在暂时不管,了解一下就行。
    6.2 /dev管理
    看标题像是我想要的东西了。
    在Linux系统上,该/dev目录包含称为设备文件的特殊文件,这些 文件允许用户空间应用程序访问Linux内核管理的硬件设备。没有这些设备文件,即使Linux内核正确识别了硬件设备,您的用户空间应用程序也将无法使用它们。
    在之下System configuration,/dev 管理,Buildroot提供了四种不同的解决方案来处理/dev目录:
    第一种解决方案是使用设备表进行静态处理;
    第二种解决方案是仅使用devtmpfs进行动态处理;
    第三种解决方案是使用devtmpfs + mdev进行动态处理;
    第四个解决方案是使用devtmpfs + eudev的Dynamic。
    详细内容见源文档。工作中嵌入式使用过的是第三中
    6.3 初始化系统
    该INIT程序是由内核(它携带PID号1)开始的第一用户空间程序,并且是负责启动用户空间服务和程序(例如:网络服务器,图形应用程序,其他网络服务器等)。
    buildroot允许使用三种不同类型的init系统,可以从系统配置init system中选择:

    • 第一个解决方案是BusyBox。在许多程序中,BusyBox具有一个基本init程序的实现,对于大多数嵌入式系统而言,这已经足够了。启用BR2_INIT_BUSYBOX将会确保BusyBox将生成并安装其init程序。这是Buildroot中的默认解决方案。BusyBox init程序将/etc/inittab在启动时读取文件以了解操作。可以在http://git.busybox.net/busybox/tree/examples/inittab中找到此文件的语法 。inittab Buildroot中的默认值存储在 system/skeleton/etc/inittab。除了挂载一些重要的文件系统外,默认inittab的主要工作是启动 /etc/init.d/rcSshell脚本并启动getty程序(提供登录提示)。
    • 第二种解决方案是systemV。该解决方案使用旧的传统sysvinit程序,该程序包装在的Buildroot中 package/sysvinit。这是大多数桌面Linux发行版中使用的解决方案,直到他们切换到更新的替代版本(如Upstart或Systemd)为止。sysvinit也可用于inittab文件(其语法与BusyBox中的语法略有不同)。inittab带有此初始化解决方案的默认安装位于package/sysvinit/inittab中。
    • 第三种解决方案是systemd。systemd是linux的新一代init系统。它比传统的init程序做得更多:积极的并行化功能,使用socket和d-bus激活启动服务,提供按需启动守护进程,跟踪使用linux控制组的进程,支持快照和恢复系统状态,systemd在相对复杂的嵌入式系统中非常有用,例如需要D-Bus和相互通信的服务的嵌入式系统。值得注意的是,systemd带来了相当多的大型依赖项:dbu、udev等等。