0%

buildroot的简单使用(二)

前面一文主要讲了buildroot的使用及一些结构。 这里讲一下如何使用buildroot来编译一个package

Config.in和.mk

首先,编译package需要使用到2个主要的文件, Config.in<package>.mk

Config.in文件

Config.in文件包含了buildroot里面可配置的所有项目。

范例:

1
2
3
4
5
6
7
8
9
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/

Config.in文件是buildroot配置工具的输入,使用的是Kconfig格式。具体见·http://kernel.org/doc/Documentation/kbuild/kconfig-language.txt.

可以通过make menuconfig命令选择编译的包。

.mk文件

开始是一个文件头,包含模块名,一般都是小写的,前后被80个#包含。头部后面紧跟着空行:

1
2
3
4
5
6
################################################################################
#
# libfoo
#
################################################################################

然后是赋值语句,等号两边有空格

1
2
LIBFOO_VERSION = 1.0
LIBFOO_CONF_OPTS += --without-python-support

缩进使用tab符号

1
2
3
4
define LIBFOO_REMOVE_DOC
$(RM) -fr $(TARGET_DIR)/usr/share/libfoo/doc \
$(TARGET_DIR)/usr/share/man/man3/libfoo*
endef

命令前面必须是tab,才会被识别为命令。

紧跟着是依赖和配置选项。

1
2
3
4
5
6
ifeq ($(BR2_PACKAGE_PYTHON),y)
LIBFOO_CONF_OPTS += --with-python-support
LIBFOO_DEPENDENCIES += python
else
LIBFOO_CONF_OPTS += --without-python-support
endif

最后是 eval 语句, 表示包是使用何种编译系统。

如何新增一个packagebuildroot

新增package目录

首先在package目录下创建对应的目录, 比如:package/nginx.

然后再在该目录创建Config.in文件或者Config.in.host文件。

Config.in文件

用于编译运行在目标平台的包使用的Config.in文件。这个文件包含一些package相关的选项,并用于在配置工具中显示。

1
2
3
4
5
6
7
config BR2_PACKAGE_LIBFOO
bool "libfoo"
help
This is a comment that explains what libfoo is. The help text
should be wrapped.

http://foosoftware.org/libfoo/

这些属性有相对固定的顺序:

  • bool、string属性
  • default值
  • target 依赖
  • toolchain依赖
  • packages依赖
  • select依赖
  • help text

然后再在外层的Config.in中添加引用。

1
source "package/libfoo/Config.in"

Config.in.host文件

用于编译运行在host的package, 使用的Config.in.host。

略过

Config.in文件需要保证依赖的包.

主要有2种选项, depends onselect

A depends on B ,只有A被选择了之后,B才可见(B是否可见取决于A)
B select C ,B被选择了,就会自动选择C(C的可见性与B无关)

.mk文件

.mk文件用于描述package是怎么下载, 配置、编译和安装的。根据package的类型, .mk文件使用不同的格式编写。

.hash文件

包含下载文件的hash值, 用于校验下载包。

格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Hashes from: http://www.foosoftware.org/download/libfoo-1.2.3.tar.bz2.{sha1,sha256}:
sha1 486fb55c3efa71148fe07895fd713ea3a5ae343a libfoo-1.2.3.tar.bz2
sha256 efc8103cc3bcb06bda6a781532d12701eb081ad83e8f90004b39ab81b65d4369 libfoo-1.2.3.tar.bz2

# md5 from: http://www.foosoftware.org/download/libfoo-1.2.3.tar.bz2.md5, sha256 locally computed:
md5 2d608f3c318c6b7557d551a5a09314f03452f1a1 libfoo-data.bin
sha256 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b libfoo-data.bin

# Locally computed:
sha256 ff52101fb90bbfc3fe9475e425688c660f46216d7e751c4bbdb1dc85cdccacb9 libfoo-fix-blabla.patch

# No hash for 1234:
none xxx libfoo-1234.tar.gz

# Hash for license files:
sha256 a45a845012742796534f7e91fe623262ccfb99460a2bd04015bd28d66fba95b8 COPYING
sha256 01b1f9f2c8ee648a7a596a1abe8aa4ed7899b1c9e5551bda06da6e422b04aa55 doc/COPYING.LGPL

如果下载后比较了不匹配,那么下载包将被删除,并且放弃编译。

buildroot官网提供了一个完整的压缩包,里面包含了很多需要交叉编译的常用的包。可以下载来了看一下别人是怎么写的,这里贴一个最新的链接。

https://buildroot.org/downloads/buildroot-2021.02.3.tar.gz

行动,才不会被动!

欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。