Buildroot是一个工具,它可以使用交叉编译来简化和自动化为嵌入式系统构建完整的Linux系统的过程。
为了实现这一目标,Buildroot能够为您的目标生成交叉编译工具链,根文件系统,Linux内核映像和引导加载程序。 Buildroot可以独立地用于这些选项的任何组合(例如,您可以使用现有的交叉编译工具链,并仅通过Buildroot来构建根文件系统)。
Buildroot主要对使用嵌入式系统的人有用。 嵌入式系统通常使用的处理器不是每个人都已经习惯在其PC中使用的常规x86处理器。 它们可以是PowerPC处理器,MIPS处理器,ARM处理器等。
Buildroot支持众多处理器及其变体。 它还提供了一些现成可用板卡的默认配置。 除此之外,许多第三方项目都基于Buildroot或基于其开发BSP 1或SDK 2。
1.BSP:板级支持包
2.SDK:软件开发套件
Buildroot旨在在Linux系统上运行。
尽管Buildroot会自行构建编译所需的大多数主机软件包,但某些标准Linux实用程序预计已安装在主机系统上。 您将在下面找到强制性软件包和可选软件包的概述(请注意,软件包名称在发行版之间可能有所不同)。
构建工具:
which
sed
make (version 3.81 or any later)
binutils
build-essential (only for Debian based systems)
gcc (version 2.95 or any later)
g++ (version 2.95 or any later)
bash
patch
gzip
bzip2
perl (version 5.8.7 or any later)
tar
cpio
python (version 2.6 or any later)
unzip
rsync
file (must be in /usr/bin/file) – bc
源获取工具:
配置接口依赖性:
对于这些库,您需要同时安装运行时和开发数据,在许多发行版中,这些数据是单独打包的。
开发软件包通常具有-dev或-devel后缀。
– ncurses5使用menuconfig界面
– qt4使用xconfig接口
– glib2,gtk2和glade2使用gconfig接口
源获取工具:
在官方树中,大多数软件包源都是使用wget从ftp,http或https位置检索的。 只有版本控制系统才能提供一些软件包。 此外,Buildroot能够通过其他工具(例如rsync或scp)下载源代码(有关更多详细信息,请参见第19章)。 如果使用以下任何一种方法启用软件包,则需要在主机系统上安装相应的工具:– bazaar
– cvs
– git
– mercurial
– rsync
– scp
– subversion
与Java有关的软件包,如果需要为目标系统构建Java Classpath:
– javac编译器
– jar工具
文档生成工具:
– asciidoc,版本8.6.3或更高版本
– w3m
–带有argparse模块的python(在2.7+和3.2+中自动存在)
– dblatex(仅适用于pdf手册)
图形生成工具:
– graphviz使用图依赖和
依赖
– python-matplotlib使用图构建
Buildroot版本每2个月,2月,5月,8月和11月发布一次。 版本号的格式为YYYY.MM,例如2013.02、2014.08。
可从http://buildroot.org/downloads/获得发行压缩包。
为方便起见,Buildroot源树中的support / misc / Vagrantfile中提供了Vagrantfile,可快速设置具有所需依赖关系的虚拟机以开始使用。
如果要在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网站的“下载”页面。
重要提示:您可以并且应该以普通用户身份来构建所有内容。 无需root用户即可配置和使用Buildroot。 通过以常规用户身份运行所有命令,可以保护系统免受在编译和安装过程中表现异常的软件包的侵害。
使用Buildroot的第一步是创建配置。 Buildroot有一个不错的配置工具,类似于在Linux内核或BusyBox中可以找到的工具。
从buildroot目录运行
$ make menuconfig
对于原始的基于curses的配置器,或者
$ make nconfig
对于新的基于curses的配置器,或者
$ make xconfig
基于Qt的配置器,或
$ make gconfig
用于基于GTK的配置器。
所有这些“ make”命令都将需要构建配置实用程序(包括接口),因此您可能需要为配置实用程序使用的相关库安装“开发”包。 有关更多详细信息,请参见第2章,尤其是第2.2节中的可选要求,以获取您喜欢的接口的依赖性。
对于配置工具中的每个菜单条目,您都可以找到描述条目目的的相关帮助。 有关某些特定配置方面的详细信息,请参见第6章。
完成所有配置后,配置工具将生成一个包含整个配置的.config文件。 该文件将由顶级Makefile读取。
要开始构建过程,只需运行:
$ make
永远不要将make -jN与Buildroot一起使用:当前不支持顶级并行make。 而是使用BR2_JL EVEL选项告诉Buildroot使用make -jN运行每个软件包的编译。
make命令通常将执行以下步骤:
Buildroot的输出存储在单个目录output /中。 该目录包含几个子目录:
这些命令,make menuconfig | nconfig | gconfig | xconfig和make是基本的命令,它们使您可以轻松,快速地生成符合您需求的图像,并启用所有功能和应用程序。
有关“ make”命令用法的更多详细信息,请参见第8.1节
像任何开源项目一样,Buildroot具有在社区内和外部共享信息的不同方式。
如果您正在寻找帮助,想了解Buildroot或为项目做贡献,那么每种方式都可能使您感兴趣。
邮件列表
Buildroot有一个讨论和开发邮件列表。 它是Buildroot用户和开发人员进行交互的主要方法。
仅Buildroot邮件列表的订阅者可以发布到该列表。 您可以通过邮件列表信息页面进行订阅。
发送到邮件列表的邮件也可以在邮件列表档案中找到,也可以通过Gmane在gmane.comp.lib.uclibc.buildroot中获得。 在问问题之前,请先搜索邮件列表档案,因为很有可能其他人之前也曾问过同样的问题。
IRC
Buildroot IRC频道#buildroot托管在Freenode上。 这是一个提出快速问题或讨论某些主题的有用地方。
在IRC上寻求帮助时,请使用代码共享网站(例如http://code.bulix.org)共享相关日志或代码段。
请注意,对于某些问题,将其发布到邮件列表可能会更好,因为它将吸引更多的开发人员和用户。
错误追踪器
可以通过邮件列表或通过Buildroot Bugtracker报告Buildroot中的错误。 创建错误报告之前,请参阅第21.6节。
维基
Buildroot Wiki页面位于eLinux Wiki上。 它包含一些有用的链接,过去和即将发生的事件的概述以及TODO列表。
patchwork
Patchwork是一个基于Web的补丁跟踪系统,旨在促进对开源项目的贡献和贡献的管理。 已发送到邮件列表的补丁被系统“捕获”,并显示在网页上。
发布的任何引用该修补程序的注释也将附加到修补程序页面。 有关Patchwork的更多信息,请参见http://jk.ozlabs.org/projects/patchwork/。
Buildroot的Patchwork网站主要供Buildroot的维护者使用,以确保不会丢失补丁。 Buildroot修补程序审阅者也使用它(另请参阅第21.3.1节)。 但是,由于该网站在简洁明了的Web界面中公开了补丁及其相应的评论,因此它对所有Buildroot开发人员都是有用的。
Buildroot修补程序管理界面可从http://patchwork.buildroot.org获得。
make * config中的所有配置选项都有一个帮助文本,其中提供有关该选项的详细信息。
make * config命令还提供了搜索工具。 阅读不同的前端菜单中的帮助消息以了解如何使用它:
搜索结果显示匹配项的帮助消息。 在menuconfig中,左栏中的数字提供了相应条目的快捷方式。 只需键入此数字即可直接跳至该条目,或在由于缺少相关性而无法选择该条目的情况下跳至包含菜单。
尽管条目的菜单结构和帮助文本应该很容易解释,但是许多主题需要额外的说明,这些内容很难在帮助文本中介绍,因此在以下各节中进行介绍。
编译工具链是允许您为系统编译代码的一组工具。 它由一个编译器(在我们的情况下为gcc),二进制utils(例如汇编程序和链接程序)(在我们的情况下为binutils)和一个C标准库(例如GNU Libc,uClibc-ng)组成。
开发工作站上安装的系统肯定已经具有一个编译工具链,可用于编译在系统上运行的应用程序。 如果您使用的是PC,则您的编译工具链可在x86处理器上运行,并为x86处理器生成代码。 在大多数Linux系统中,编译工具链使用GNU libc(glibc)作为C标准库。 该编译工具链称为“主机编译工具链”。 在其上运行并在其上工作的计算机称为“主机系统”。此术语不同于GNU configure所使用的术语,GNU configure所使用的主机是运行应用程序的计算机(通常与目标计算机相同)。
分发工具提供了编译工具链,并且Buildroot与它无关(除了使用它来构建交叉编译工具链和在开发主机上运行的其他工具之外)。
如上所述,系统随附的编译工具链可在其上运行并为主机系统中的处理器生成代码。 由于您的嵌入式系统具有不同的处理器,因此您需要交叉编译工具链-一种在您的主机系统上运行但为目标系统(和目标处理器)生成代码的编译工具链。 例如,如果您的主机系统使用x86,而目标系统使用ARM,则主机上的常规编译工具链在x86上运行并为x86生成代码,而交叉编译工具链在x86上运行并为ARM生成代码。
Buildroot为交叉编译工具链提供了两种解决方案:
可以使用“工具链”菜单中的“工具链类型”选项在这两种解决方案之间进行选择。 选择一种解决方案后,将出现许多配置选项,以下各节将详细介绍这些选项。
内部工具链后端是Buildroot在构建目标嵌入式系统的用户空间应用程序和库之前,自行构建交叉编译工具链的后端。
该后端支持多个C库:uClibc-ng,glibc和musl。
选择此后端后,将显示许多选项。 最重要的允许:
值得注意的是,无论何时修改这些选项之一,都必须重建整个工具链和系统。 请参阅第8.2节。
值得注意的是,无论何时修改这些选项之一,都必须重建整个工具链和系统。 请参阅第8.2节。
该后端的优点:
该后端的缺点:
外部工具链后端允许使用现有的预先构建的交叉编译工具链。 Buildroot知道许多著名的交叉编译工具链(来自ARM的Linaro,ARM的Sourcery CodeBench,x86-64,PowerPC和MIPS,并且能够自动下载它们,或者可以指向自定义工具链。 ,可以下载或在本地安装。
然后,您有三种使用外部工具链的解决方案:
我们的外部工具链支持已通过CodeSourcery和Linaro的工具链,crosstool NG生成的工具链以及Buildroot本身生成的工具链进行了测试。 通常,所有支持sysroot功能的工具链都应该起作用。 如果没有,请立即与开发人员联系。
我们不支持OpenEmbedded或Yocto生成的工具链或SDK,因为这些工具链不是纯工具链(即仅编译器,binutils,C和C ++库)。 相反,这些工具链带有大量预编译的库和程序。 因此,Buildroot无法导入工具链的sysroot,因为它将包含通常由Buildroot生成的数百兆字节的预编译库。
我们也不支持使用发行版工具链(即您的发行版中安装的gcc / binutils / C库)作为为目标构建软件的工具链。 这是因为您的分发工具链不是“纯”工具链(即仅使用C / C ++库),因此我们无法将其正确导入到Buildroot构建环境中。 因此,即使您正在为x86或x86_64目标构建系统,也必须使用Buildroot或crosstool NG生成交叉编译工具链。
如果要为您的项目生成自定义工具链,可以将其用作Buildroot中的外部工具链,则我们的建议绝对是使用crosstool-NG进行构建。 我们建议与Buildroot分开构建工具链,然后使用外部工具链后端将其导入Buildroot。
该后端的优点:
使用外部工具链时,Buildroot会生成包装程序,该程序将适当的选项(根据配置)透明地传递给外部工具链程序。 如果您需要调试此包装器以检查传递的参数是正确的,则可以将环境变量BR2_DEBUG_WRAPPER设置为以下任意一个:
在Linux系统上,/ dev目录包含称为设备文件的特殊文件,这些文件允许用户空间应用程序访问Linux内核管理的硬件设备。 没有这些设备文件,即使Linux内核正确识别了硬件设备,您的用户空间应用程序也将无法使用它们。 在系统配置/ dev管理下,Buildroot提供了四种不同的解决方案来处理/ dev目录:
第一个解决方案是使用设备表的静态。这是在Linux中处理设备文件的传统方法。使用这种方法,设备文件会永久存储在根文件系统中(即它们在重新引导后仍然存在),并且在从系统中添加或删除硬件设备时,没有什么东西会自动创建和删除这些设备文件。因此,Buildroot使用设备表创建一组标准的设备文件,默认文件存储在Buildroot源代码的system / device_table_dev.txt中。当Buildroot生成最终的根文件系统映像时,将处理此文件,因此在输出/目标目录中看不到设备文件。 BR2_ROOTFS_STATIC_DEVICE_TABLE选项允许更改Buildroot使用的默认设备表,或添加其他设备表,以便Buildroot在构建过程中创建其他设备文件。因此,如果您使用此方法,而系统中缺少设备文件,则可以例如创建包含其他设备文件描述的board /
文件,然后您可以将BR2_ROOTFS_STATIC_DEVICE_TABLE设置为system / dev ice_table_dev.txt板/ <您的公司> / <您的项目> /device_table_dev.txt
。有关设备表文件格式的更多详细信息,请参见第23章。
第二种解决方案是仅使用devtmpfs进行动态处理。 devtmpfs是Linux内核中的一个虚拟文件系统,已在内核2.6.32中引入(如果使用较旧的内核,则无法使用此选项)。 在/ dev中挂载时,此虚拟文件系统将自动使设备文件在添加和从系统中删除硬件设备时显示和消失。 该文件系统在重新启动后并不持久:它由内核动态填充。 使用devtmpfs要求启用以下内核配置选项:CONFIG_DEVTMPFS和CONFIG_DEVTMPFS_MOUNT。 当Buildroot负责为嵌入式设备构建Linux内核时,请确保启用了这两个选项。 但是,如果在Buildroot之外构建Linux内核,则有责任启用这两个选项(如果失败,则Buildroot系统将不会启动)。
第三种解决方案是使用devtmpfs + mdev进行动态处理。此方法还依赖于上面详述的devtmpfs虚拟文件系统(因此仍然需要在内核配置中启用CONFIG_DEVTMPFS和CONFIG_DEVTMPFS_MOUNT的要求),但是在其之上添加了mdev用户空间实用程序。 mdev是BusyBox的程序部分,内核在每次添加或删除设备时都会调用。借助/etc/mdev.conf配置文件,可以将mdev配置为例如在设备文件上设置特定的权限或所有权,在设备出现或消失时调用脚本或应用程序,等等。基本上,它允许用户空间执行以下操作:对设备添加和删除事件做出反应。例如,当设备出现在系统上时,可以使用mdev自动加载内核模块。如果您的设备需要固件,则mdev也很重要,因为它将负责将固件内容推送到内核。 mdev是udev的轻量级实现(功能较少)。有关mdev及其配置文件的语法的更多详细信息,请参见http://git.busybox.net/- busybox / tree / docs / mdev.txt
。
第四个解决方案是使用devtmpfs + eudev进行动态处理。 此方法还依赖于上面详细介绍的devtmpfs虚拟文件系统,但在其上面添加了eudev用户空间守护程序。 eudev是一个后台运行的守护程序,当从系统中添加或删除设备时,内核会调用它。 与mdev相比,它是重量级的解决方案,但具有更高的灵活性。 eudev是udev的独立版本,udev是大多数桌面Linux发行版中使用的原始用户空间守护程序,现已成为Systemd的一部分。 有关更多详细信息,请参见http://en.wikipedia.org/wiki/Udev
Buildroot开发人员的建议是从仅使用devtmpfs的Dynamic解决方案开始,直到需要在添加/删除设备或需要固件时通知用户空间为止,在这种情况下,通常最好使用devtmpfs + mdev进行Dynamic处理。 解。
请注意,如果选择systemd作为初始化系统,则/ dev管理将由systemd提供的udev程序执行。
Buildroot开发人员的建议是从仅使用devtmpfs的Dynamic解决方案开始,直到需要在添加/删除设备或需要固件时通知用户空间为止,在这种情况下,通常最好使用devtmpfs + mdev进行Dynamic处理 ,请注意,如果选择systemd作为初始化系统,则/ dev管理将由systemd提供的udev程序执行。
init程序是内核启动的第一个用户空间程序(带有PID号1),它负责启动用户空间服务和程序(例如:Web服务器,图形应用程序,其他网络服务器等)。
Buildroot允许使用三种不同类型的初始化系统,可以从系统配置(初始化系统)中进行选择:
第一个解决方案是BusyBox。 在许多程序中,BusyBox都有一个基本的初始化程序的实现,对于大多数嵌入式系统而言,这已经足够了。 启用BR2_INIT_BUSYBOX将确保BusyBox将生成并安装其init程序。 这是Buildroot中的默认解决方案。 BusyBox初始化程序将在引导时读取/ etc / inittab文件,以了解操作方法。 可以在http://git.busybox.net/busybox/tree/examples/inittab
中找到此文件的语法(请注意,BusyBox inittab语法很特殊:请勿使用Internet上的随机inittab文档来了解BusyBox inittab )。 Buildroot中的默认inittab存储在system / skeleton / etc / inittab中。 除了安装一些重要的文件系统之外,默认的inittab的主要工作是启动/etc/init.d/rcS shell脚本,并启动一个getty程序(提供登录提示)。
第二种解决方案是systemV。 该解决方案使用旧的传统sysvinit程序,该程序打包在Buildroot中,位于package / sysvinit中。 这是大多数桌面Linux发行版中使用的解决方案,直到他们切换到更新的替代版本(如Upstart或Systemd)为止。 sysvinit也可用于inittab文件(其语法与BusyBox中的语法略有不同)。 随此init解决方案一起安装的默认inittab位于package / sysvinit / inittab中。
第三种解决方案是systemd。 systemd是用于Linux的新一代init系统。 它的功能远远超过传统的init程序:积极的并行化功能,使用套接字和D-Bus激活来启动服务,按需启动守护进程,使用Linux控制组跟踪进程,支持快照和恢复系统状态, systemd在相对复杂的嵌入式系统上很有用,例如需要D-Bus和服务之间相互通信的系统。 值得注意的是,systemd带来了大量的大型依赖项:dbus,udev等。 有关systemd的更多详细信息,请参见http://www.freedesktop.org/wiki/Software/systemd
。
Buildroot开发人员推荐的解决方案是使用BusyBox初始化,因为它对于大多数嵌入式系统来说已经足够。 systemd可用于更复杂的情况。
在尝试修改下面的任何组件之前,请确保您已经配置了Buildroot本身,并启用了相应的软件包。
BusyBox
如果您已有BusyBox配置文件,则可以使用BR2_PACKAGE_BUSYBOX_CONFIG在Buildroot配置中直接指定此文件。 否则,Buildroot将从默认的BusyBox配置文件开始。 要对配置进行后续更改,请使用make busybox-menuconfig打开BusyBox配置编辑器。 也可以通过环境变量指定BusyBox配置文件,尽管不建议这样做。 有关更多详细信息,请参见第8.6节。
uClibc
uClibc的配置与BusyBox的配置相同。 用于指定现有配置文件的配置变量为BR2_UCLIBC_CONFIG。 进行后续更改的命令是make uclibc-menuconfig。
Linux内核
如果已经有了内核配置文件,则可以使用BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG在Buildroot配置中直接指定此文件。 如果您还没有内核配置文件,则可以使用BR2_LINUX_KERNEL_USE_DEFCONFIG在Buildroot配置中指定一个defconfig开始,或者使用BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG创建一个空文件并将其指定为自定义配置文件开始。 要对配置进行后续更改,请使用make linux-menuconfig打开Linux配置编辑器。
Barebox
Barebox的配置与Linux内核的配置相同。 相应的配置变量是BR2_TARGET_BAREBOX_USE_CUSTOM_CONFIG和BR2_TARGET_BAREBOX_USE_DEFCONFIG。 要打开配置编辑器,请使用make nudebox-menuconfig
U-Boot
U-Boot(版本2015.04或更高版本)的配置与Linux内核的配置相同。 相应的配置变量是BR2_TARGET_UBOOT_USE_CUSTOM_CONFIG和BR2_TARGET_UBOOT_USE_DEFCONFIG。 要打开配置编辑器,请使用make uboot-menuconfig。
这是一系列技巧,可帮助您充分利用Buildroot。
显示make执行的所有命令:
$ make V=1
显示带有defconfig的板列表:
$ make list-defconfigs
显示所有可用的目标:
$ make help
并非所有目标都始终可用,.config文件中的某些设置可能会隐藏一些目标:
清理:更改任何体系结构或工具链配置选项时,都需要显式清洁。 要删除所有构建产品(包括构建目录,主机,暂存和目标树,映像和工具链):
$ make clean
**生成手册:**当前的手册源位于docs / manual目录中。 生成手册:
$ make manual-clean
$ make manual
手动输出将在output / docs / manual中生成。
注意:需要一些工具来构建文档(请参阅:2.2节)
为新目标重置Buildroot:删除所有构建产品和配置:
$ make distclean
注意如果启用了ccache,则运行make clean或distclean不会清空Buildroot使用的编译器缓存。 要删除它,请参阅第8.12.3节。
转储内部make变量:可以转储已知的所有make变量及其值:
$ make -s printvars
VARIABLE=value_of_variable
…
可以使用一些变量来调整输出:
例如:
$ 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 -s printvars VARS=BUSYBOX_%DEPENDENCIES QUOTED_VARS=YES
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 -s printvars VARS=BUSYBOX_%DEPENDENCIES RAW_VARS=YES
BUSYBOX_DEPENDENCIES=skeleton toolchain
BUSYBOX_FINAL_ALL_DEPENDENCIES=$(sort $(BUSYBOX_FINAL_DEPENDENCIES) $(BUSYBOX_FINAL_PATCH_DEPENDENCIES))
BUSYBOX_FINAL_DEPENDENCIES=$(sort $(BUSYBOX_DEPENDENCIES))
BUSYBOX_FINAL_PATCH_DEPENDENCIES=$(sort $(BUSYBOX_PATCH_DEPENDENCIES))
BUSYBOX_RDEPENDENCIES=ncurses util-linux
带引号的变量的输出可以在shell脚本中重用,例如:
$ eval $(make -s printvars VARS=BUSYBOX_DEPENDENCIES QUOTED_VARS=YES)
$ echo $BUSYBOX_DEPENDENCIES
skeleton toolchain
当通过make menuconfig,make xconfig或其他配置工具之一更改系统配置时,Buildroot不会尝试检测应重建系统的哪些部分。 在某些情况下,Buildroot应该重建整个系统,在某些情况下,仅应重建软件包的特定子集。 但是以完全可靠的方式检测到这一点非常困难,因此Buildroot开发人员已决定不尝试这样做。
相反,用户有责任知道何时需要完全重建。 作为提示,这里有一些经验法则可以帮助您了解如何使用Buildroot:
一般来说,当您遇到构建错误并且不确定所做的配置更改可能带来的后果时,请进行完全重建。 如果您遇到相同的构建错误,则可以确定该错误与软件包的部分重建无关,并且如果官方Buildroot的软件包发生此错误,请立即报告该问题! 随着您对Buildroot的了解的发展,您将逐步了解何时真正需要进行完全重建,并且可以节省越来越多的时间。
供参考,可以通过运行来完全重建
$ make clean all
Buildroot用户提出的最常见问题之一是如何重建给定的软件包或如何删除软件包而不重新构建所有内容。
Buildroot不支持删除软件包,而无需从头开始重建。 这是因为Buildroot不会跟踪哪个软件包安装了output / staging和output / target目录中的哪些文件,或者哪个软件包将根据另一个软件包的可用性进行不同的编译。
从头开始重建单个软件包的最简单方法是在output / build中删除其构建目录。 然后,Buildroot将从头开始重新提取,重新配置,重新编译和重新安装此软件包。 您可以要求makeroot使用make
命令执行此操作。
另一方面,如果只想从编译步骤重新开始软件包的构建过程,则可以运行make
,然后运行make或make
。 它将重新启动软件包的编译和安装,但不会从头开始:它基本上在软件包内部重新执行make和make install,因此它将仅重建已更改的文件。
如果要从配置步骤重新启动软件包的构建过程,可以运行make
,然后运行make或make
。
它将重新启动软件包的配置,编译和安装。
在内部,Buildroot创建所谓的图章文件以跟踪每个软件包已完成的构建步骤。 它们存储在软件包的构建目录下,即output / build /
,并命名为.stamp_
。 上面详细介绍的命令仅操作这些标记文件即可强制Buildroot重新启动软件包构建过程的一组特定步骤。
有关包装特殊制造目标的更多详细信息,请参见第8.12.5节。
如果打算进行脱机构建,而只想下载以前在配置器中选择的所有源(menuconfig,nconfig,xconfig或gconfig),则输入:
make source
现在,您可以断开dl目录的内容或将其复制到构建主机。
默认情况下,Buildroot生成的所有内容都存储在Buildroot树的目录输出中。
Buildroot还支持使用类似于Linux内核的语法从树中构建。 要使用它,请将O =
添加到make命令行:
$ make O=/tmp/build
或者
$ cd /tmp/build; make O=$PWD -C path/to/buildroot
所有输出文件将位于/ tmp / build下。 如果O路径不存在,则Buildroot将创建它。
注意:O路径可以是绝对路径,也可以是相对路径,但是如果以相对路径传递,则需要注意的是,它是相对于Buildroot主目录而不是当前工作目录进行解释的。
使用树外版本时,Buildroot .config和临时文件也存储在输出目录中。 这意味着只要它们使用唯一的输出目录,就可以使用同一源代码树安全地并行运行多个构建。
为了易于使用,Buildroot在输出目录中生成一个Makefile包装器-因此,在第一次运行后,您不再需要传递O = <...>
和-C <...>
,只需在输出目录中运行 )
$
make
当传递给环境中的make或set时,Buildroot还尊重一些环境变量:
使用位于顶层目录和$ HOME中的配置文件的示例:
$ make UCLIBC_CONFIG_FILE = uClibc.config BUSYBOX_CONFIG_FILE = $ HOME / bb.config
如果要使用默认gcc或g ++以外的其他编译器在主机上构建辅助二进制文件,请执行
$ make HOSTCXX = g +±4.3-HEAD HOSTCC = gcc-4.3-HEAD
文件系统映像可能会变得很大,这取决于您选择的文件系统,程序包数,是否已配置可用空间。 。 。 但是,文件系统映像中的某些位置可能只是空的(例如,长时间为零); 这样的文件称为稀疏文件。
大多数工具可以有效地处理稀疏文件,并且只会存储或写入稀疏文件中不为空的部分。
例如:
其他工具可能具有类似的选项。 请查阅各自的手册页。
如果您需要存储文件系统映像(例如,从一台计算机传输到另一台计算机),或者需要将它们发送(例如,发送给问答团队),则可以使用稀疏文件。
但是请注意,在使用dd的稀疏模式时将文件系统映像刷新到设备可能会导致文件系统损坏(例如,ext2文件系统的块位图可能已损坏;或者,如果文件系统中的文件稀疏,则这些部分可能会损坏)。 读回时不是全零)。 您仅应在构建计算机上处理文件时使用稀疏文件,而不是在将文件传输到将在目标计算机上使用的实际设备时使用稀疏文件。
Buildroot的工作之一就是了解软件包之间的依赖关系,并确保它们以正确的顺序构建。 这些依赖有时可能非常复杂,对于给定的系统,通常不容易理解为什么Buildroot将这样的软件包引入了构建。 为了帮助理解依赖性,从而更好地理解嵌入式Linux系统中不同组件的作用,Buildroot能够生成依赖性图。 要生成已编译的整个系统的依赖关系图,只需运行:
make graph-depends
您可以在output / graphs / graph-depends.pdf中找到生成的图形。 如果您的系统很大,则依赖关系图可能太复杂且难以阅读。 因此,可以仅针对给定的包生成依赖关系图:
make
-graph-depends
您可以在output / graph /
中找到生成的图形。
请注意,依赖关系图是使用Graphviz项目中的点工具生成的,您必须已将其安装在系统上才能使用此功能。 在大多数发行版中,它可以作为graphviz软件包使用。 默认情况下,依赖关系图以PDF格式生成。 但是,通过传递BR2_GRAPH_OUT环境变量,可以切换到其他输出格式,例如PNG,PostScript或SVG。 支持点工具的-T选项支持的所有格式。
BR2_GRAPH_OUT=svg make graph-depends
可以通过设置BR2_GRAPH_DEPS_OPTS环境变量中的选项来控制依赖图形的行为。
可接受的选项是:
BR2_GRAPH_DEPS_OPTS='-d 3 --no-transitive --colours=red,green,blue' make graph-depends
当系统构建花费很长时间时,有时能够了解最长构建哪些软件包,查看是否可以采取任何措施来加快构建速度有时会很有用。 为了帮助进行此类构建时间分析,Buildroot收集每个软件包每个步骤的构建时间,并允许从该数据生成图形。 要在构建后生成构建时间图,请运行:
make graph-build
这将在输出/图形中生成一组文件:
此图形构建目标需要安装Python Matplotlib和Numpy库(在大多数发行版中均安装python-matplotlib和python-numpy),如果要使用的Python版本早于2.7,则还需要安装argparse模块(在大多数情况下,使用python-argparse 分布)。
默认情况下,图形的输出格式为PDF,但是可以使用BR2_GRAPH_OUT环境变量选择其他格式。 支持的唯一其他格式是PNG:
BR2_GRAPH_OUT=png make graph-build
当目标系统增长时,了解每个Buildroot软件包对整个根文件系统大小的贡献有时会很有用。 为了帮助进行此类分析,Buildroot收集有关每个软件包安装的文件的数据,并使用此数据,生成图形和CSV文件,详细说明不同软件包的大小。
要在构建后生成这些数据,请运行:
make graph-size
这将产生:
此图形大小的目标需要安装Python Matplotlib库(在大多数发行版中都需要安装python-matplotlib),并且如果您使用的Python版本早于2.7(在大多数发行版中则是python-argparse),则还需要安装argparse模块。
就像持续时间图一样,支持BR2_GRAPH_OUT环境来调整输出文件格式。 有关此环境变量的详细信息,请参见第8.8节。
注意仅在完全干净的重建之后,收集的文件系统大小数据才有意义。 使用make graph-size之前,请确保全部运行make clean。
要比较两个不同Buildroot编译的根文件系统大小,例如在调整配置后或切换到另一个Buildroot版本时,请使用size-stats-compare脚本。 它需要两个file-size-stats.csv文件(由make graph-size生成)作为输入。 有关更多详细信息,请参考此脚本的帮助文本:
utils/size-stats-compare -h
嵌入式Linux开发人员的一部分,例如Vim或Emacs等经典文本编辑器,以及基于命令行的界面,而其他许多嵌入式Linux开发人员,例如更丰富的图形界面,来完成他们的开发工作。 Eclipse是最受欢迎的集成开发环境之一,Buildroot与Eclipse集成在一起以简化Eclipse用户的开发工作。
我们与Eclipse的集成简化了在Buildroot系统上构建的应用程序和库的编译,远程执行和远程调试。 它不集成Buildroot配置,也不使用Eclipse构建自身的进程。 因此,我们的Eclipse集成的典型用法模型为:
使用make menuconfig,make xconfig或Buildroot提供的任何其他配置界面来配置Buildroot系统。
https://github.com/mbats/eclipse-buildroot-bundle/wiki
中详细描述了Buildroot Eclipse集成安装过程和用法。
您可能希望针对自己的目标,编译自己的程序或其他未打包在Buildroot中的软件。 为此,您可以使用Buildroot生成的工具链。
默认情况下,由Buildroot生成的工具链位于output / host /中。 最简单的使用方法是将output / host / bin /添加到PATH环境变量中,然后使用ARCH-linux-gcc,ARCH-linux-objdump,ARCH linux-ld等。
可以重新定位工具链,这可以将工具链分发给其他开发人员以为您的目标构建应用程序。 为达到这个:
Buildroot允许进行交叉调试,其中调试器在构建计算机上运行,并与目标上的gdbserver通信以控制程序的执行。
为达到这个:
gdbserver :2345 foo
这将导致gdbserver在TCP端口2345上侦听来自交叉gdb的连接。
然后,在主机上,应该使用以下命令行启动交叉gdb:
`<buildroot>/output/host/bin/<tuple>-gdb -x <buildroot>/output/staging/usr/share/buildroot/gdbinit foo`
当然,foo必须在使用调试符号构建的当前目录中可用。 通常,您从构建foo的目录(而不是从output / target /)中启动此命令,因为该目录中的二进制文件被剥离了。
文件将告诉交叉gdb在哪里找到目标库。最后,从交叉gdb连接到目标:
(gdb) target remote
:2345
ccache是编译器缓存。 它存储每个编译过程产生的目标文件,并能够通过使用预先存在的目标文件来跳过将来对同一源文件(具有相同的编译器和相同的参数)的编译。 从头开始进行几乎相同的构建多次时,它可以很好地加快构建过程。
ccache支持集成在Buildroot中。 您只需要在“生成”选项中启用“启用编译器缓存”即可。 这将自动构建ccache并将其用于每个主机和目标编译。
缓存位于$ HOME / .buildroot-ccache中。 它存储在Buildroot输出目录之外,以便可以由单独的Buildroot构建共享。 如果要摆脱缓存,只需删除该目录。
您可以通过运行make ccache-stats来获取有关缓存的统计信息(其大小,命中次数,未命中次数等)。maketarget ccache-options和CCACHE_OPTIONS变量提供对ccache的更通用访问。 例如
# set cache limit size
make CCACHE_OPTIONS="--max-size=5G" ccache-options
# zero statistics counters
make CCACHE_OPTIONS="--zero-stats" ccache-options
ccache对源文件和编译器选项进行哈希处理。 如果编译器选项不同,则将不使用缓存的目标文件。 但是,许多编译器选项都包含登台目录的绝对路径。 因此,在不同的输出目录中构建将导致许多高速缓存未命中。
为避免此问题,buildroot具有使用相对路径选项(BR2_CCACHE_USE_BASEDIR)。 这会将指向输出目录内部的所有绝对路径重写为相对路径。 因此,更改输出目录不再导致
缓存未命中。
相对路径的一个缺点是它们最终还会成为目标文件中的相对路径。 因此,例如,除非您先cd到输出目录,否则调试器将不再找到该文件。
有关重写绝对路径的更多详细信息,请参见ccache手册的“在不同目录中编译”部分。
Buildroot下载的各种压缩文件都存储在BR2_DL_DIR中,默认情况下为dl目录。 如果您想保留一个完整的Buildroot版本,该版本可以与相关的tarball一起使用,则可以复制此目录。 这将允许您使用完全相同的版本重新生成工具链和目标文件系统。
如果维护多个Buildroot树,则最好具有共享的下载位置。 这可以通过将BR2_DL_DIR环境变量指向目录来实现。 如果设置了此设置,则Buildroot配置中的BR2_DL_DIR的值将被覆盖。 将以下行添加到<〜/ .bashrc>
中。 export BR2_DL_DIR = <共享下载位置>
也可以使用BR2_DL_DIR选项在.config文件中设置下载位置。 与.config文件中的大多数选项不同,此值被BR2_DL_DIR环境变量覆盖。
运行make
将构建并安装该特定的软件包及其依赖项。
对于依赖Buildroot基础结构的软件包,有许多特殊的make目标,可以像这样单独调用:
make
-
软件包构建目标是(按照它们执行的顺序):
命令/目标 | 描述 |
---|---|
资源 | 获取源代码(下载压缩包,克隆源代码仓库等) |
依赖 | 构建并安装构建程序包所需的所有依赖项 |
解压 | 将源代码放入包构建目录中(解压缩tarball,复制源代码等) |
补丁 | 应用补丁(如果有) |
配置 | 运行configure命令(如果有) |
构建 | 运行编译命令 |
安装阶段 | 目标软件包:如果需要,请在登台目录中运行软件包的安装 |
安装目标 | 目标软件包:如有必要,在目标目录中运行软件包的安装 |
安装 | 目标软件包:运行之前的2个安装命令 主机软件包:在主机目录中运行软件包的安装 |
此外,还有一些其他有用的make目标:
命令/目标 | 描述 |
---|---|
显示依赖 | 显示构建程序包所需的依赖关系 |
图形化依赖 | 在当前Buildroot配置的上下文中,生成程序包的依赖关系图。 有关依赖关系图的更多详细信息,请参见第8.8节。 |
完全清理 | 删除整个软件包构建目录 |
重新安装 | 重新运行安装命令 |
重建 | 重新运行编译命令-仅在使用OVERRIDE_SRCDIR功能或直接在构建目录中修改文件时,这才有意义 |
重新配置 | 重新运行configure命令,然后重新构建-仅在使用OVERRIDE_SRCDIR功能或直接在构建目录中修改文件时,这才有意义 |
Buildroot的正常操作是下载tarball,解压缩,配置,编译和安装该tarball中的软件组件。 源代码被提取到output / build /
中,这是一个临时目录:每当使用make clean时,此目录将被完全删除,并在下一次make调用时重新创建。 即使将Git或Subversion存储库用作包源代码的输入,Buildroot也会从中创建一个tarball,然后像对待tarball一样正常工作。
当Buildroot主要用作集成工具来构建和集成嵌入式Linux系统的所有组件时,此行为非常适合。 但是,如果在系统的某些组件的开发过程中使用Buildroot,则此行为不是很方便:而是希望对一个软件包的源代码进行少量更改,并能够使用Buildroot快速重建系统。
直接在output / build /
中进行更改是不合适的解决方案,因为在make clean时会删除此目录。
因此,Buildroot针对此用例提供了一种特定的机制:
机制。 Buildroot读取一个覆盖文件,该文件允许用户告诉Buildroot某些软件包的源位置。 默认情况下,此替代文件名为local.mk,位于Buildroot源树的顶层目录中,但是可以通过BR2_PACKAGE_OVERRIDE_FILE配置选项指定其他位置。
在此替代文件中,Buildroot希望找到以下形式的行:
_OVERRIDE_SRCDIR = /path/to/pkg1/sources
_OVERRIDE_SRCDIR = /path/to/pkg2/sources
For example:
LINUX_OVERRIDE_SRCDIR = /home/bob/linux/
BUSYBOX_OVERRIDE_SRCDIR = /home/bob/busybox/
当Buildroot发现给定软件包时,已经定义了
,它将不再尝试下载,提取和修补软件包。 而是直接使用指定目录中可用的源代码,make clean不会触摸此目录。 这允许将Buildroot指向您自己的目录,该目录可以由Git,Subversion或任何其他版本控制系统进行管理。 为此,Buildroot将使用rsync将组件的源代码从指定的
复制到output / build /
。
此机制最好与make
和make
目标结合使用。
一个make
序列将把源代码从
同步到output / build /
(由于rsync,仅复制修改过的文件),并重新开始构建过程包。
在上述linux软件包的示例中,开发人员可以在/ home / bob / linux中更改源代码,然后运行:
make linux-rebuild all
并在几秒钟内在输出/图像中获取更新的Linux内核图像。 同样,可以在/ home / bob / busybox中以及之后对BusyBox源代码进行更改:
make busybox-rebuild all
输出/映像中的根文件系统映像包含更新的BusyBox。
对于给定的项目,您可能需要执行的典型操作是:
有关此类特定于项目的自定义项的重要说明:请仔细考虑哪些更改确实是特定于项目的,哪些更改对项目外的开发人员也有用。 Buildroot社区强烈建议并鼓励上游改进,软件包和董事会对Buildroot官方项目的支持。 当然,由于更改是高度特定的或专有的,因此有时上游不可能或不希望这样做。
本章介绍了如何在Buildroot中进行此类特定于项目的自定义,以及如何以一种可重现的方式构建同一映像的方式来存储它们,即使在运行make clean之后也是如此。 通过遵循推荐的策略,您甚至可以使用同一Buildroot树来构建多个不同的项目!
为项目自定义Buildroot时,将创建一个或多个需要存储在某个地方的特定于项目的文件。 尽管大多数这些文件可以放置在任何位置,因为它们的路径将在Buildroot配置中指定,但是Buildroot开发人员建议使用本节中描述的特定目录结构。
与该目录结构正交,您可以选择将其本身放置在何处:在Buildroot树中还是在外部使用br2-external树。 这两个选项均有效,选择取决于您。
+-- board/
| +-- <company>/
| +-- <boardname>/
| +-- linux.config
| +-- busybox.config
| +-- <other configuration files>
| +-- post_build.sh
| +-- post_image.sh
| +-- rootfs_overlay/
| | +-- etc/
| | +-- <some file>
| +-- patches/
| +-- foo/
| | +-- <some patch>
| +-- libbar/
| +-- <some other patches> |
+-- configs/
| +-- <boardname>_defconfig
|
+-- package/
| +-- <company>/
| +-- Config.in (if not using a br2-external tree)
| +-- <company>.mk (if not using a br2-external tree)
| +-- package1/
| | +-- Config.in
| | +-- package1.mk
| +-- package2/
| +-- Config.in
| +-- package2.mk
|
+-- Config.in (if using a br2-external tree)
+-- external.mk (if using a br2-external tree)
本章将进一步介绍上面显示的文件的详细信息。
注意:如果您选择将此结构放置在Buildroot树之外但在br2-external树中,则
以及可能的
组件可能是多余的,可以省去。
用户拥有一些需要部分自定义项的相关项目是很常见的。 建议不要使用分层的自定义方法,而不是为每个项目复制这些自定义,如本节中所述。
Buildroot中几乎所有可用的自定义方法(例如,生成后脚本和根文件系统覆盖)都接受以空格分隔的项目列表。 始终按从左到右的顺序处理指定的项目。 通过创建多个这样的项目,一个用于通用的自定义项,另一个用于真正的特定于项目的自定义项,可以避免不必要的重复。 每层通常由board /
中的单独目录体现。 根据您的项目,您甚至可以引入两个以上的层。
用户具有两个通用和fooboard自定义层的目录结构示例是:
+-- board/
+-- `<company>/`
+-- common/
| +-- post_build.sh
| +-- rootfs_overlay/
| | +-- ...
| +-- patches/
| +-- ...
|
+-- fooboard/
+-- linux.config
+-- busybox.config
+-- `<other configuration files>`
+-- post_build.sh
+-- rootfs_overlay/
| +-- ...
+-- patches/
+-- ...
例如,如果用户将BR2_GLOBAL_PATCH_DIR配置选项设置为:
BR2_GLOBAL_PATCH_DIR=
"board/
/common/patches board/ /fooboard/patches"
然后首先将应用来自公共层的补丁,然后是来自fooboard层的补丁。
如9.1节所述,您可以在两个位置放置特定于项目的自定义项:
直接在Buildroot树中,通常使用版本控制系统中的分支来维护它们,以便轻松升级到较新的Buildroot版本。
使用br2-external机制在Buildroot树之外。 这种机制允许将软件包配方,电路板支持和配置文件保留在Buildroot树之外,同时仍将它们很好地集成到构建逻辑中。 我们将此位置称为br2外部树。 本节说明如何使用br2外部机制以及在br2外部树中提供的内容。
通过将BR2_EXTERNAL生成变量设置为要使用的br2外部树的路径,可以告诉Buildroot使用一棵或多棵br2外部树。 可以将其传递给任何Buildroot make调用。 它会自动保存在输出目录中隐藏的
.br-external.mk文件中。 因此,无需在每次make调用时都传递BR2_EXTERNAL。 但是,可以随时通过传递新值来更改它,也可以通过传递空值来删除它。
注意br2外部树的路径可以是绝对路径或相对路径。 如果将其作为相对路径传递,则必须注意,它是相对于主Buildroot源目录而不是相对于Buildroot输出目录进行解释的。
注意:如果使用Buildroot 2016.11之前的br2-external树,则需要先对其进行转换,然后才能将其用于Buildroot 2016.11及更高版本。 请参阅第25.1节以获取帮助。
一些例子:
buildroot/ $ make BR2_EXTERNAL=/path/to/foo menuconfig
从现在开始,将使用/ path / to / foo br2-external树中的定义:
buildroot/ $ make
buildroot/ $ make legal-info
我们可以随时切换到另一棵br2-external树:
buildroot/ $ make BR2_EXTERNAL=/where/we/have/bar xconfig
我们还可以使用多个br2外部树:
buildroot/ $ make BR2_EXTERNAL=/path/to/foo:/where/we/have/bar menuconfig
或禁用任何br2-external树的用法:
buildroot/ $ make BR2_EXTERNAL= xconfig
br2外部树必须至少包含这三个文件,如以下各章所述:
该文件描述了br2-external树:该br2-external树的名称和描述。
该文件的格式基于行,每行以关键字开头,后跟冒号和一个或多个空格,然后是分配给该关键字的值。 当前识别出两个关键字:
[A-Za z0-9_]
中使用ASCII字符;禁止使用其他任何字符。 Buildroot将变量BR2_EXTERNAL _ $(NAME)_PATH
设置为br2外部树的绝对路径,以便您可以使用它来引用br2外部树。该变量在Kconfig中都可用,因此您可以使用它来为您的Kconfig文件(请参见下文)和Makefile提供源,以便可以使用它来包含其他Makefile(请参见下文)或引用其他文件(如数据文件) )从您的br2外部树中。BR2_EXTERNAL _ $(NAME)_DESC
变量中可用。名称和相应的BR2_EXTERNAL _ $(NAME)_PATH
变量的示例:
BR2_EXTERNAL _ $(NAME)_PATH
和BR2_EXTERNAL _ $(NAME)_DESC
。 它们也可以在环境中导出,因此可以在构建后,图像后和fakeroot脚本中使用。这些文件(可能每个都为空)可用于定义程序包配方(即foo / Config.in和foo / foo.mk,就像Buildroot本身捆绑的程序包一样)或其他自定义配置选项或make逻辑。
Buildroot自动从每个br2-external树中包含Config.in,使其出现在顶层配置菜单中,并从每个br2-external树中包含external.mk以及其余的makefile逻辑。
此方法的主要用途是存储包装配方。 推荐的方法是编写一个如下所示的Config.in文件:
source “ B R 2 E X T E R N A L B A R 4 2 P A T H / p a c k a g e / p a c k a g e 1 / C o n f i g . i n " s o u r c e " BR2_EXTERNAL_BAR_42_PATH/package/package1/Config.in" source " BR2EXTERNALBAR42PATH/package/package1/Config.in"source"BR2_EXTERNAL_BAR_42_PATH/package/package2/Config.in”
然后,创建一个external.mk文件,如下所示:
include $(sort $(wildcard $(BR2_EXTERNAL_BAR_42_PATH)/package//.mk))
然后在 ‘ ( B R 2 E X T E R N A L B A R 4 2 P A T H ) / p a c k a g e / p a c k a g e 1 ‘ 和 `(BR2_EXTERNAL_BAR_42_PATH)/ package / package1`和 ‘(BR2EXTERNALBAR42PATH)/package/package1‘和(BR2_EXTERNAL_BAR_42_PATH)/ pac kage / package2中,创建常规的Buildroot软件包配方,如第17章所述。如果愿意,还可以将软件包分组在名为
的子目录中, 相应地调整上述路径。
您还可以在Config.in中定义自定义配置选项,并在external.mk中定义自定义生成逻辑。
可以将Buildroot defconfigs存储在br2-external树的configs子目录中。 Buildroot将在make list-defconfigs的输出中自动显示它们,并允许使用常规的make
命令加载它们。 它们将显示在make list-defconfigs输出中的“外部配置”标签下,该标签包含定义它们的br2-external树的名称。
注意:如果多个br2外部树中存在defconfig文件,则使用最后一个br2外部树中的一个。 因此,可以覆盖Buildroot或另一个br2-external树中捆绑的defconfig。
可以在其中存储所有特定于主板的配置文件,例如内核配置,根文件系统覆盖或Buildroot允许为其设置位置的任何其他配置文件(通过使用BR2_EXTERNAL _ $(NAME)_PATH
变量)。
例如,您可以按以下方式将路径设置为全局补丁目录,rootfs覆盖图和内核配置文件的路径(例如,通过运行make menuconfig并填写以下选项):
BR2_GLOBAL_PATCH_DIR=$(BR2_EXTERNAL_BAR_42_PATH)/patches/
BR2_ROOTFS_OVERLAY=$(BR2_EXTERNAL_BAR_42_PATH)/board/<boardname>/overlay/
BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE=$(BR2_EXTERNAL_BAR_42_PATH)/board/<boardname>/kernel.config
这是一个使用br2-external的所有功能的示例布局(示例内容显示在其上方的文件中,当与br2外部树的解释相关时;当然,所有这些都是为了说明而完全组成的 )
/path/to/br2-ext-tree/
|- external.desc
| |name: BAR_42
| |desc: Example br2-external tree
| `----
|
|- Config.in
| |source "$BR2_EXTERNAL_BAR_42_PATH/package/pkg-1/Config.in"
| |source "$BR2_EXTERNAL_BAR_42_PATH/package/pkg-2/Config.in"
| |
| |config BAR_42_FLASH_ADDR
| | hex "my-board flash address"
| | default 0x10AD
| `----
|
|- external.mk
| |include $(sort $(wildcard $(BR2_EXTERNAL_BAR_42_PATH)/package/*/*.mk))
| |
| |flash-my-board:
| | $(BR2_EXTERNAL_BAR_42_PATH)/board/my-board/flash-image \
| | --image $(BINARIES_DIR)/image.bin \
| | --address $(BAR_42_FLASH_ADDR)
| `----
|
|- package/pkg-1/Config.in
| |config BR2_PACKAGE_PKG_1
| | bool "pkg-1"
| | help
| | Some help about pkg-1
| `----
|- package/pkg-1/pkg-1.hash
|- package/pkg-1/pkg-1.mk
| |PKG_1_VERSION = 1.2.3
| |PKG_1_SITE = /some/where/to/get/pkg-1
| |PKG_1_LICENSE = blabla
| |
| |define PKG_1_INSTALL_INIT_SYSV
| | $(INSTALL) -D -m 0755 $(PKG_1_PKGDIR)/S99my-daemon \
| | $(TARGET_DIR)/etc/init.d/S99my-daemon
| |endef
| |
| |$(eval $(autotools-package))
| `----
|- package/pkg-1/S99my-daemon
|
|- package/pkg-2/Config.in
|- package/pkg-2/pkg-2.hash
|- package/pkg-2/pkg-2.mk
|
|- configs/my-board_defconfig
| |BR2_GLOBAL_PATCH_DIR="$(BR2_EXTERNAL_BAR_42_PATH)/patches/"
| |BR2_ROOTFS_OVERLAY="$(BR2_EXTERNAL_BAR_42_PATH)/board/my-board/overlay/"
| |BR2_ROOTFS_POST_IMAGE_SCRIPT="$(BR2_EXTERNAL_BAR_42_PATH)/board/my-board/post-image.sh"
| |BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="$(BR2_EXTERNAL_BAR_42_PATH)/board/my-board/kernel.config"
| `----
|
|- patches/linux/0001-some-change.patch
|- patches/linux/0002-some-other-change.patch
|- patches/busybox/0001-fix-something.patch
|
|- board/my-board/kernel.config
|- board/my-board/overlay/var/www/index.html
|- board/my-board/overlay/var/www/my.css
|- board/my-board/flash-image
`- board/my-board/post-image.sh
|#!/bin/sh
|generate-my-binary-image \
| --root ${
BINARIES_DIR}/rootfs.tar \
| --kernel ${
BINARIES_DIR}/zImage \
| --dtb ${
BINARIES_DIR}/my-board.dtb \
| --output ${
BINARIES_DIR}/image.bin
`----
br2-external树然后将在menuconfig中可见(布局已展开):
External options --->
*** Example br2-external tree (in /path/to/br2-ext-tree/)
[ ] pkg-1
[ ] pkg-2
(0x10AD) my-board flash address
如果您使用了不止一棵br2-external树,则它看起来像(扩展了布局,第二棵树的名称为FOO_27,但external.desc中没有desc:字段):
External options --->
Example br2-external tree --->
*** Example br2-external tree (in /path/to/br2-ext-tree)
[ ] pkg-1
[ ] pkg-2
(0x10AD) my-board flash address
FOO_27 --->
*** FOO_27 (in /path/to/another-br2-ext)
[ ] foo
[ ] bar
可以使用命令make savedefconfig来存储Buildroot配置。
通过删除默认值的配置选项,可以简化Buildroot配置。 结果存储在名为defconfig的文件中。 如果要将其保存在其他位置,请在Buildroot配置本身中更改BR2_DEFCONFIG选项,或使用make savedefconfig BR2_DEFCONFIG =
调用make。
推荐的存储该defconfig的位置是configs /
。 如果遵循此建议,则配置将列在make帮助中,并且可以通过运行make
g进行重新设置。
或者,您可以将文件复制到任何其他位置,并使用make defconfig BR2_DEFCONFIG =
进行重建。
如果已更改,还应该存储BusyBox,Linux内核,Barebox,U-Boot和uClibc的配置文件。 对于这些组件中的每一个,都存在Buildroot配置选项以指向输入配置文件,例如 BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE。 要存储它们的配置,请将这些配置选项设置为要保存配置文件的路径,然后使用下面描述的帮助器目标实际存储配置。
如9.1节所述,建议存储这些配置文件的路径是board /
。
更改BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE等选项之前,请确保已创建配置文件。 否则,Buildroot将尝试访问该配置文件,该配置文件尚不存在,并且将失败。 您可以通过运行make linux menuconfig等来创建配置文件。
Buildroot提供了一些帮助程序目标,以简化配置文件的保存。
除了通过make * config更改配置之外,还有其他几种方法可以自定义生成的目标文件系统。
可以共存的两种推荐方法是根文件系统覆盖和后构建脚本。
根文件系统覆盖(BR2_ROOTFS_OVERLAY)
文件系统覆盖是一棵文件树,在构建目标文件系统后,将其直接复制到目标文件系统上。 要启用此功能,请将配置选项BR2_ROOTFS_OVERLAY(在“系统配置”菜单中)设置为覆盖的根。 您甚至可以指定多个以空格分隔的叠加层。 如果指定相对路径,则它将相对于Buildroot树的根。 版本控制系统的隐藏目录(如.git,.svn,.hg等),名为.empty的文件和以〜结尾的文件将从副本中排除。
如9.1节所示,此覆盖的推荐路径是board /
覆盖。
生成后脚本(BR2_ROOTFS_POST_BUILD_SCRIPT
生成后脚本是在Buildroot生成所有选定软件之后但在组装rootfs映像之前调用的shell脚本。要启用此功能,请在配置选项BR2_ROOTFS_POST_BUILD_SCRIPT中(在系统配置菜单中)指定以空格分隔的后生成脚本列表。如果指定相对路径,则它将相对于Buildroot树的根。
使用构建后脚本,可以删除或修改目标文件系统中的任何文件。但是,您应谨慎使用此功能。每当发现某个程序包生成错误或不需要的文件时,都应修复该程序包,而不要使用某些生成后的清理脚本来解决它。
如9.1节所示,此脚本的推荐路径为board /
构建后脚本以Buildroot主树作为当前工作目录运行。目标文件系统的路径作为第一个参数传递给每个脚本。如果配置选项BR2_ROOTFS_POST_SCRIPT_ARGS不为空,则这些参数也将传递给脚本。所有脚本都将传递完全相同的参数集,不可能将不同的参数集传递给每个脚本。
此外,您还可以使用以下环境变量:
直接修改目标文件系统
对于临时修改,您可以直接修改目标文件系统并重建映像。 目标文件系统在output / target /下可用。 进行更改后,运行make来重建目标文件系统映像。
此方法允许您对目标文件系统执行任何操作,但是如果您需要使用make clean清理Buildroot树,这些更改将丢失。 在某些情况下,必须进行此类清洁,有关详细信息,请参阅第8.2节。 因此,该解决方案仅对快速测试有用:更改无法在make clean命令中保留。 确认更改后,您应确保使用根文件系统覆盖或构建后脚本在清理后仍将其保留。
自定义目标框架(BR2_ROOTFS_SKELETON_CUSTOM)
根文件系统映像是从目标框架创建的,所有软件包都在其上面安装其文件。在构建和安装任何软件包之前,将框架复制到目标目录输出/目标。默认的目标框架提供了标准的Unix文件系统布局以及一些基本的初始化脚本和配置文件。
如果默认框架(在system / skeleton下可用)不符合您的需求,则通常会使用根文件系统覆盖或构建后脚本来适应它。但是,如果默认框架与您所需的框架完全不同,则使用自定义框架可能更合适。
要启用此功能,请启用配置选项BR2_ROOTFS_SKELETON_CUSTOM并将BR2_ROOTFS_SKELETON_CUSTOM_PATH设置为自定义框架的路径。这两个选项在系统配置菜单中均可用。如果指定相对路径,则它将相对于Buildroot树的根。
不建议使用此方法,因为它会复制整个框架,从而阻止利用Buildroot更高版本中对默认框架带来的修复或改进。
仿制后根脚本(BR2_ROOTFS_POST_FAKEROOT_SCRIPT)
汇总最终映像时,该过程的某些部分需要root权限:在/ dev中创建设备节点,设置文件和目录的权限或所有权。 。 。为了避免需要实际的root用户权限,Buildroot使用fakeroot模拟root用户权限。这并不能完全代替实际成为root用户,但足以满足Buildroot的需求。
假根目录后脚本是外壳脚本,它们在fakeroot阶段结束时即在调用文件系统映像生成器之前被调用。因此,它们在fakeroot上下文中被调用。
如果需要调整文件系统以执行通常仅对root用户可用的修改,则后fakeroot脚本可能会很有用。
注意:建议使用现有机制来设置文件权限或在/ dev中创建条目(请参阅第9.5.1节)或创建用户(请参阅第9.6节)
注意:生成后脚本(上面)和fakeroot脚本之间的区别在于,在fakeroot上下文中不调用生成后脚本。
注意;使用fakeroot并不能绝对替代实际成为root。 fakeroot只伪造文件访问权限和类型(常规,块或字符设备…)和uid / gid;这些是在内存中模拟的。
有时需要在文件或设备节点上设置特定的权限或所有权。例如,某些文件可能需要由root拥有。由于构建后脚本不是作为root用户运行的,因此除非您在构建后脚本中使用显式的falseroot,否则您无法从那里进行此类更改。
而是,Buildroot为所谓的权限表提供支持。要使用此功能,请将配置选项BR2_ROOTFS_DEVICE_TABLE设置为权限表的空格分隔列表,这些权限表是遵循makedev语法第23章的常规文本文件。
如果您使用的是静态设备表(即未使用devtmpfs,mdev或(e)udev),则可以使用相同的语法在所谓的设备表中添加设备节点。要使用此功能,请将配置选项BR2_ROOTFS_STATIC_DEVICE_TABLE设置为设备表的空格分隔列表。
如9.1节所示,此类文件的推荐位置是board /
。
请注意,如果特定的权限或设备节点与特定的应用程序相关,则应在程序包的.mk文件中设置变量FOO_PERMISSIONS和FOO_DEVICES(请参见第17.5.2节)。
有时需要在目标系统中添加特定用户。 为了满足此要求,Buildroot为所谓的用户表提供支持。 要使用此功能,请将配置选项BR2_ROOTFS_USERS_TABLES设置为以空格分隔的用户表列表,这是遵循makeusers语法第24章的常规文本文件。
如9.1节所示,此类文件的推荐位置是board /
。
请注意,如果自定义用户与特定应用程序相关,则应在程序包的.mk文件中设置变量FOO_USERS(请参见第17.5.2节)。
在构建文件系统映像,内核和引导加载程序之前运行构建后脚本(第9.5节)时,在创建所有图像之后,可以使用后映像脚本执行某些特定操作。
例如,映像后脚本可用于在NFS服务器导出的位置中自动提取根文件系统tarball,或创建捆绑根文件系统和内核映像的特殊固件映像,或项目所需的任何其他自定义操作。
要启用此功能,请在配置选项BR2_ROOTFS_POST_IMAGE_SCRIPT中(在系统配置菜单中)指定以空格分隔的后映像脚本列表。如果指定相对路径,则它将相对于Buildroot树的根。
就像生成后脚本一样,运行后映像脚本时会将Buildroot主树作为当前工作目录。图像输出目录的路径作为第一个参数传递给每个脚本。如果配置选项BR2_ROOTFS_POST_SCRIPT_ARGS不为空,则这些参数也将传递给脚本。所有脚本都将传递完全相同的参数集,不可能将不同的参数集传递给每个脚本。
同样,就像生成后脚本一样,脚本可以访问环境变量BR2_CONFIG,HOST_DIR,STAGING_DIR,TARGET_DIR,BUILD_DIR,BINARIES_DIR和BASE_DIR。
映像后脚本将以执行Buildroot的用户身份执行,该用户通常不应该是root用户。因此,在这些脚本之一中需要root权限的任何操作都将需要特殊处理(使用fakeroot或sudo),该处理留给脚本开发人员。
在Buildroot中提供的补丁程序之上,有时将额外的补丁程序应用于软件包很有用。 例如,这可能用于支持项目中的自定义功能,或者在使用新体系结构时。
BR2_GLOBAL_PATCH_DIR配置选项可用于指定一个或多个包含软件包补丁程序的目录的空格分隔列表。
对于特定软件包
的特定版本
,将从BR2_GLOBAL_PATCH_DIR应用补丁,如下所示:
-
,将按以下方式确定
:
/ / /
(如果目录存在)。 /
。
应用补丁,如下所示:
* .patch
的补丁文件将按字母顺序应用。 因此,为确保以正确的顺序应用它们,强烈建议使用以下名称来命名补丁文件:- .patch
,其中
是指应用顺序。有关如何将补丁应用于软件包的信息,请参见第18.2节。
BR2_GLOBAL_PATCH_DIR选项是为软件包指定自定义补丁目录的首选方法。 它可用于为buildroot中的任何软件包指定补丁程序目录。 还应使用它代替可用于软件包(例如U-Boot和Barebox)的自定义补丁程序目录选项。 这样,它将允许用户从一个顶级目录管理其补丁程序。
BR2_GLOBAL_PATCH_DIR是指定自定义补丁的首选方法,其例外是BR2_LINUX_KERNEL_PATCH。 应该使用BR2_LINUX_KERNEL_PATCH来指定URL上可用的内核补丁。 注意:BR2_LINUX_KERNEL_PATCH指定在BR2_GLOBAL_PATCH_DIR中可用的补丁之后应用的内核补丁,因为它是从Linux软件包的补丁后挂钩完成的。
通常,任何新软件包都应直接添加到软件包目录中,然后提交给Buildroot上游项目。 通常,如何在Buildroot中添加软件包的方法将在第17章中详细介绍,在此不再赘述。 但是,您的项目可能需要一些无法上游的专有软件包。 本节将说明如何将此类特定于项目的软件包保存在特定于项目的目录中。
如9.1节所示,针对特定项目的软件包的推荐位置为package /
。 如果您使用br2-external树功能(请参见9.2节),建议的位置是将其放在br2-external树中名为package /的子目录中。
但是,除非我们执行一些其他步骤,否则Buildroot将无法识别此位置的软件包。 如第17章所述,Buildroot中的软件包基本上由两个文件组成:.mk文件(描述如何构建软件包)和Config.in文件(描述此软件包的配置选项)。
Buildroot将自动在包目录的第一级子目录中包含.mk文件(使用模式package / * / *。mk)。 如果我们希望Buildroot从更深的子目录(如package /
)中包含.mk文件,则只需在包含这些附加.mk文件的第一级子目录中添加.mk文件。 因此,使用以下内容创建文件package /
(假定package /
下只有一个额外的目录级别):
include $(sort $(wildcard package/
/*/*.mk))
对于Config.in文件,创建一个文件包/
,其中包括所有包的Config.in文件。 由于kconfig的source命令不支持通配符,因此必须提供详尽的列表。 例如:
source “package//package1/Config.in”
source “package//package2/Config.in”
从package / Config.in中包含此新文件package /
,最好包含在公司特定的菜单中,以使与以后的Buildroot版本的合并更加容易。
如果使用br2-external树,请参见第9.2节以了解如何填写这些文件
在本章的前面,已经描述了进行特定于项目的自定义的不同方法。 现在,本节将通过提供有关存储特定于项目的自定义设置的分步说明来总结所有这一切。 显然,可以跳过与您的项目无关的步骤。
make menuconfig配置工具链,软件包和内核。
使linux-menuconfig更新内核配置,类似于其他配置,例如busybox,uclibc 、。 。 。
mkdir -p board / <制造商> /
将以下选项设置为board / <制造商> /
(只要相关)。
编写配置文件:
cp <输出> / build / at91bootstrap3-* /。configboard / <制造商> / <板名> /at91bootstrap3.config
创建board / <制造商> /
,并在rootfs上填充所需的其他文件,例如board / <制造商> /
。将BR2_ROOTFS_OVERLAY设置为board / <制造商> /
。
创建一个构建后脚本board / <制造商> /
。将BR2_ROOTFS_POST_BUILD_SCRIPT设置为board / <制造商> /
如果必须设置其他setuid权限或必须创建设备节点,请创建board / <制造商> /
并将该路径添加到BR2_ROOTFS_DEVICE_TABLE。
如果必须创建其他用户帐户,请创建board / <制造商> /
。 txt,然后将该路径添加到BR2_ROOTFS_USERS_TABLES。
要将自定义补丁添加到某些软件包,请将BR2_GLOBAL_PATCH_DIR设置为board /
,然后将每个软件包的补丁添加到以该软件包命名的子目录中。每个修补程序应称为<程序包名称>-
。
特别针对Linux内核,还存在选项BR2_LINUX_KERNEL_PATCH,其主要优点是它还可以从URL下载补丁。如果不需要它,则首选BR2_GLOBAL_PATCH_DIR。 U Boot,Barebox,at91bootstrap和at91bootstrap3也具有单独的选项,但与BR2_GLOBAL_PATCH_DIR相比,它们没有任何优势,将来可能会被删除。
如果需要添加特定于项目的软件包,请创建package /
,然后将软件包放在该目录中。创建一个整体的
文件,其中包括所有软件包的.mk文件。创建一个整体Config.in文件,该文件将为所有软件包提供Config.in文件。包括Buildroot的package / Config.in文件中的Config.in文件。
make savedefconfig保存buildroot配置。
cp defconfig configs / <板名> _defconfig
如果引导过程似乎在以下消息之后挂起(消息不一定完全相似,具体取决于所选软件包的列表):
Freeing init memory: 3972K
Initializing random number generator... done.
Starting network...
Starting dropbear sshd: generating rsa key... generating dsa key... OK
则表示您的系统正在运行,但没有在串行控制台上启动外壳程序。 为了使系统在串行控制台上启动外壳,您必须进入Buildroot配置,在系统配置中,在启动后修改Run a getty(登录提示符),并在getty options子菜单中设置适当的端口和波特率。 。 这将自动调整生成的系统的/ etc / inittab文件,以便外壳程序在正确的串行端口上启动。
已决定从Buildroot-2012.11版本中停止对目标上的本机编译器的支持,因为:
由于目标上没有可用的编译器(请参见第10.2节),因此浪费头文件或静态库的空间是没有意义的。
因此,自Buildroot-2012.11发行以来,这些文件总是从目标中删除。
由于Buildroot主要针对具有有限板载资源(CPU,内存,大容量存储)的小型或小型目标硬件,因此浪费文档数据空间是没有意义的。 如果仍然需要有关目标的文档数据,则Buildroot不适合您的目的,您应该寻找一个真正的发行版(请参阅:10.2节)
如果某个软件包存在于Buildroot树中,并且没有出现在config菜单中,则最有可能意味着未满足某些软件包的依赖关系。
要了解有关软件包依赖性的更多信息,请在配置菜单中搜索软件包符号(请参见第8.1节)。
然后,您可能必须递归启用几个选项(与未满足的依赖项相对应)才能最终选择包。
如果由于某些未满足的工具链选项而导致该包不可见,那么您当然应该运行完整的重建(有关更多说明,请参见第8.1节)。
有很多原因不使用chroot目标目录,其中包括:
由于这些原因,使用目标目录作为新根目录通过chroot运行的命令很可能会失败。
如果要在chroot中或作为NFS根目录运行目标文件系统,请使用images /中生成的tarball图像并将其提取为root。
Buildroot列表上经常讨论的一项功能是“程序包管理”的一般主题。 总而言之,该想法是增加对哪个Buildroot软件包安装哪些文件的跟踪,目标是:
通常,大多数人认为这很容易做到:只跟踪安装了哪个软件包,然后在取消选择该软件包时将其删除。 但是,它比这复杂得多:
由于所有这些原因,得出的结论是,添加跟踪已安装文件以在未选择软件包时将其删除,或生成二进制软件包的存储库是很难可靠实现的,并且会增加很多复杂性。在此问题上,Buildroot开发人员发表以下立场声明:
由于Buildroot通常涉及对整个系统进行完整的重建,这可能会很长,因此我们在下面提供了一些技巧来帮助减少构建时间:
使用预构建的外部工具链,而不是默认的Buildroot内部工具链。 通过使用预构建的Linaro工具链(在ARM上)或Sourcery CodeBench工具链(用于ARM,x86,x86-64,MIPS等),您将在每次完全重建时节省该工具链的构建时间,大约为15 20分钟。 请注意,在系统的其余部分正常工作后,临时使用外部工具链并不能防止您切换回内部工具链(这可能提供更高级别的自定义)。
使用ccache编译器缓存(请参阅第8.12.3节);
了解有关仅重建您实际关心的少数软件包的信息(请参阅第8.3节),但请注意,有时仍然需要完全重建(请参阅第8.2节);
确保您没有将虚拟机用于运行Buildroot的Linux系统。 众所周知,大多数虚拟机技术都会对I / O产生重大的性能影响,这对于构建源代码确实非常重要。
确保仅使用本地文件:请勿尝试通过NFS进行构建,这会显着降低构建速度。 在本地拥有Buildroot下载文件夹也有帮助。
购买新硬件。 SSD和大量RAM是加快构建速度的关键。
Buildroot的所有最终产品(工具链,根文件系统,内核,引导加载程序)均包含开源软件,并已获得各种许可。
使用开放源代码软件,您可以自由地构建丰富的嵌入式系统,可以从各种程序包中进行选择,但还必须承担一些必须了解和兑现的义务。 某些许可证要求您在产品文档中发布许可证文本。 其他要求您将软件的源代码重新分发给接收产品的软件。
每个软件包中都记录了每个许可证的确切要求,并且您(或您的法律办公室)有责任遵守这些要求。 为了使您更轻松,Buildroot可以为您收集一些您可能需要的材料。 要生成此材料,请使用make menuconfig,make xconfig或make gconfig配置Buildroot后,运行:
make legal-info
Buildroot将在您的输出目录中legal-info /子目录下收集与法律相关的资料。在那里您会发现:
_REDISTRIBUTE = NO
的软件包的源代码将不会保存。还保存了已应用的补丁以及名为series的文件,该文件按应用顺序列出了补丁。修补程序与其修改的文件具有相同的许可证。注意:Buildroot将附加补丁程序应用于基于自动工具的软件包的Libtool脚本。这些修补程序可以在Buildroot源文件中的support / libtool下找到,由于技术限制,它们不会与软件包源文件一起保存。您可能需要手动收集它们。请注意,Buildroot的legal-info功能的目的是生产与合法遵守软件包许可证相关的所有材料。 Buildroot不会尝试生成必须以某种方式公开的确切材料。当然,所生产的材料超过了严格遵守法律所需要的材料。例如,它为在类似BSD的许可证下发布的软件包生成源代码,您无需以源形式重新分发。
此外,由于技术限制,Buildroot不会生成您将需要或可能需要的某些材料,例如工具链源代码和Buildroot源代码本身(包括需要分发源代码的软件包的补丁程序)。当您运行make legal-info时,Buildroot会在README文件中生成警告,以通知您无法保存的相关材料。
最后,请记住,make legal-info的输出基于每个软件包配方中的声明性语句。 Buildroot开发人员会尽其所能,尽最大努力使这些声明性语句尽可能准确。但是,这些声明性陈述很可能不是全部完全准确也不是详尽无遗。您(或您的法律部门)必须先检查make legal-info的输出,然后才能将其用作自己的合规性交付。请参阅Buildroot发行版根目录下COPYING文件中的NO WARRANTY子句(第11和12条)。
Buildroot本身是一个开放源代码软件,根据GNU通用公共许可证版本2或(可选)任何更高版本发布,以下详述的软件包修补程序除外。但是,作为构建系统,它通常不是最终产品的一部分:如果您为设备开发根文件系统,内核,引导加载程序或工具链,则Buildroot的代码仅存在于开发计算机上,而不存在于设备存储中。
但是,Buildroot开发人员的普遍看法是,在发布包含GPL许可软件的产品时,您应同时发布Buildroot源代码和其他软件包的源代码。这是因为GNU GPL将可执行文件的“完整源代码”定义为“它包含的所有模块的所有源代码,加上任何相关的接口定义文件,以及用于控制可执行文件的编译和安装的脚本”。 Buildroot是用于控制可执行文件的编译和安装的脚本的一部分,因此,它被视为必须重新分发的材料的一部分。
请记住,这只是Buildroot开发人员的意见,如果有任何疑问,应咨询法律部门或律师。
Buildroot还捆绑了补丁文件,这些补丁文件应用于各种软件包的源。 这些修补程序不受Buildroot许可的保护。 相反,它们受应用了补丁的软件的许可保护。 当上述软件在多个许可证下均可用时,Buildroot修补程序仅在可公开访问的许可证下提供。
有关技术细节,请参见第18章。
要实现NFS引导,请在“文件系统映像”菜单中启用tar根文件系统。 完成构建后,只需运行以下命令即可设置NFS根目录:
sudo tar -xavf /path/to/output_dir/rootfs.tar -C /path/to/nfs_root_dir
切记将此路径添加到/ etc / exports。 然后,您可以从目标执行NFS引导。
要生成实时CD映像,请在“文件系统映像”菜单中启用iso映像选项。 注意,此选项仅在x86和x86-64体系结构上可用,并且如果您正在使用Buildroot构建内核。
您可以使用IsoLinux,Grub或Grub 2作为引导加载程序来构建实时CD映像,但是只有Isolinux支持将此映像同时用作实时CD和实时USB(通过“构建混合映像”选项)。
您可以使用QEMU测试现场CD映像:
qemu-system-i386 -cdrom output/images/rootfs.iso9660
如果是混合ISO,也可以将其用作硬盘映像:
qemu-system-i386 -hda output/images/rootfs.iso9660
可以使用dd轻松将其刷新到USB驱动器:
dd if=output/images/rootfs.iso9660 of=/dev/sdb
如果要在生成的映像中使用chroot,那么您应该注意的几件事:
如上所述,Buildroot基本上是一组Makefile,可以使用正确的选项下载,配置和编译软件。它还包括各种软件包的补丁-主要是交叉编译工具链(gcc,binutils和uClibc)中涉及的软件包。
每个软件包基本上只有一个Makefile,并且以.mk扩展名命名。 Makefile分为许多不同的部分。
每个目录至少包含2个文件:
主Makefile执行以下步骤(一旦完成配置):
总体而言,这些编码样式规则可以帮助您在Buildroot中添加新文件或重构现有文件。
如果您稍微修改一些现有文件,那么重要的是保持整个文件的一致性,因此您可以:
Config.in文件包含Buildroot中几乎所有可配置项目的条目。
条目具有以下模式:
config BR2_PACKAGE_LIBFOO
bool "libfoo"
depends on BR2_PACKAGE_LIBBAZ
select BR2_PACKAGE_LIBBAR
help
This is a comment that explains what libfoo is. The help text
should be wrapped.
` http://foosoftware.org/libfoo/`
http://kernel.org/doc/Documentation/kbuild/kconfig-language.txt
。#################
#
# libfoo
#
#################
LIBFOO_VERSION = 1.0
LIBFOO_CONF_OPTS += --without-python-support
不要将=符号对齐。
define LIBFOO_REMOVE_DOC
$(RM) -fr $(TARGET_DIR)/usr/share/libfoo/doc \
$(TARGET_DIR)/usr/share/man/man3/libfoo*
endef
请注意,定义块内的命令应始终以制表符开头,因此make会将其识别为命令。
– Prefer multi-line syntax.
YES:
ifeq ($(BR2_PACKAGE_PYTHON),y)
LIBFOO_CONF_OPTS += --with-python-support
LIBFOO_DEPENDENCIES += python
else
LIBFOO_CONF_OPTS += --without-python-support
endif
NO:
LIBFOO_CONF_OPTS += --with$(if $(BR2_PACKAGE_PYTHON),,out)-python-support
LIBFOO_DEPENDENCIES += $(if $(BR2_PACKAGE_PYTHON),python,)
– 保持配置选项和依赖关系紧密靠近。
YES:
ifneq ($(BR2_LIBFOO_INSTALL_DATA),y)
define LIBFOO_REMOVE_DATA
$(RM) -fr $(TARGET_DIR)/usr/share/libfoo/data
endef
LIBFOO_POST_INSTALL_TARGET_HOOKS += LIBFOO_REMOVE_DATA
endif
NO:
define LIBFOO_REMOVE_DATA
$(RM) -fr $(TARGET_DIR)/usr/share/libfoo/data
endef
ifneq ($(BR2_LIBFOO_INSTALL_DATA),y)
LIBFOO_POST_INSTALL_TARGET_HOOKS += LIBFOO_REMOVE_DATA
endif
该文档使用asciidoc格式。
有关asciidoc语法的更多详细信息,请参见http://www.methods.co.nz/asciidoc/userguide.html
。
support /和utils /目录中的某些脚本是用Python编写的,应遵循PEP8 Style Guide for Python Code。
Buildroot包含几个公开可用的硬件板的基本配置,因此该板的用户可以轻松地构建已知可以正常工作的系统。也欢迎您为Buildroot添加对其他板的支持。
为此,您需要创建一个普通的Buildroot配置,该配置为硬件构建一个基本系统:工具链,内核,引导加载程序,文件系统和一个仅BusyBox专用的用户空间。不应选择特定的程序包:配置应尽可能少,并且应仅为目标平台构建可运行的基本BusyBox系统。当然,您可以为内部项目使用更复杂的配置,但是Buildroot项目将仅集成基本的电路板配置。这是因为软件包选择是高度特定于应用程序的。
有了已知的工作配置后,运行make savedefconfig。这将在Buildroot源树的根目录下生成一个最小的defconfig文件。将此文件移到configs /目录,并将其重命名为
。
建议使用尽可能多的Linux内核和引导程序上游版本,并使用尽可能多的默认内核和引导程序配置。如果它们对于您的电路板不正确或不存在默认值,我们建议您将修复程序发送到相应的上游项目。
但是,与此同时,您可能需要存储特定于目标平台的内核或引导程序配置或补丁。为此,创建一个目录板/ <制造商>
和一个子目录板/ <制造商> / <板名>
。然后,您可以将修补程序和配置存储在这些目录中,并从Buildroot主配置中引用它们。有关更多详细信息,请参见第9章。