前面一文主要讲了buildroot的使用及一些结构。 这里讲一下如何使用buildroot来编译一个package。
Config.in和.mk
首先,编译package需要使用到2个主要的文件, Config.in和<package>.mk。
Config.in文件
Config.in文件包含了buildroot里面可配置的所有项目。
范例:
1 | config BR2_PACKAGE_LIBFOO |
Config.in文件是buildroot配置工具的输入,使用的是Kconfig格式。具体见·http://kernel.org/doc/Documentation/kbuild/kconfig-language.txt.
可以通过make menuconfig命令选择编译的包。
.mk文件
开始是一个文件头,包含模块名,一般都是小写的,前后被80个#包含。头部后面紧跟着空行:
1 | ################################################################################ |
然后是赋值语句,等号两边有空格
1 | LIBFOO_VERSION = 1.0 |
缩进使用tab符号
1 | define LIBFOO_REMOVE_DOC |
命令前面必须是tab,才会被识别为命令。
紧跟着是依赖和配置选项。
1 | ifeq ($(BR2_PACKAGE_PYTHON),y) |
最后是 eval 语句, 表示包是使用何种编译系统。
如何新增一个package到buildroot
新增package目录
首先在package目录下创建对应的目录, 比如:package/nginx.
然后再在该目录创建Config.in文件或者Config.in.host文件。
Config.in文件
用于编译运行在目标平台的包使用的Config.in文件。这个文件包含一些package相关的选项,并用于在配置工具中显示。
1 | config BR2_PACKAGE_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 on和select。
A depends on B ,只有A被选择了之后,B才可见(B是否可见取决于A)
B select C ,B被选择了,就会自动选择C(C的可见性与B无关)
.mk文件
.mk文件用于描述package是怎么下载, 配置、编译和安装的。根据package的类型, .mk文件使用不同的格式编写。
.hash文件
包含下载文件的hash值, 用于校验下载包。
格式如下:
1 | # Hashes from: http://www.foosoftware.org/download/libfoo-1.2.3.tar.bz2.{sha1,sha256}: |
如果下载后比较了不匹配,那么下载包将被删除,并且放弃编译。
buildroot官网提供了一个完整的压缩包,里面包含了很多需要交叉编译的常用的包。可以下载来了看一下别人是怎么写的,这里贴一个最新的链接。
https://buildroot.org/downloads/buildroot-2021.02.3.tar.gz
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。