使用Buildroot编译第三方工具
1. 概述¶
本sdk的第三方开源工具统一使用Buildroot进行维护管理及构建,本文档简单描述Buildroot的使用及可能出现的问题处理。
2. 基本使用¶
-
设置编译工具链
使用export将编译工具链的路径添加到PATH环境变量中,与平常使用无异不再赘述。这里使用gcc 10.2.1 aarch64版本进行描述。
-
make defconfig
当前根据实际需要用到的软件列表添加了一个新的defconfig,类似kernel的构建,先使用make sstar_gcc_10_2_1_aarch64_defconfig生成正确的“.config”文件
-
使用make source提前单独下载所需源码(可忽略)
因Buildroot本身只是一堆编译的脚本,编译时会自动从指定的位置下载源码及patch进行构建。为避免因网络等问题可能出现下载较慢或出错影响构建的速度,我们可以使用make source提交单独下载所需的源码,必要时可通过本地pc机下载然后放到适当的位置。如:make source时发现procps-ng-3.3.15.tar.xz包下载太慢,我们可以从输出的log中找到这个包的下载路径,之后通过pc端手动下载并放到dl/procps-ng/目录。
-
make开始构建
直接make构建已选择的所有包,也可以使用make xxx单独编译某个包,如make procps-ng
-
添加一个自己的package
可参考
package/vendor_storage/
(本地源码方式)修改中添加vendor_storage的方式,也可参考其他现有的包通过网络下载源码的方式处理,使用方法与kernel的Kconfig基本一致。 -
通过patch添加开源代码的客制化修改
参考
package/procps-ng/0001-Fix_garbled_code_issue_when_using_top_cmd_via_adb.patch
添加procps-ng的本地修改patch,基本使用方法是修改一份文件后通过diff -u命令与原生文件对比生成patch并放到package中相应的目录下,构建时将会按照序号使用patch命令对源码进行patch。
3. 构建问题处理¶
-
toolchain & kernel header问题
需要更换默认的toolchain时可能会发现toolchain使用的kernel header版本与defconfig中指定的不匹配问题,在编译过程中出现类似如下的log,defconfig指定使用5.10的版本,而实际我们的toolchain是依赖4.19版本的kernel header构建的
通过make menuconfig或直接编辑defconfig将kernel版本修改为指定的版本即可,如下
-
LD_LIBRARY_PATH问题
设置了LD_LIBRARY_PATH环境变量的话编译使会报以下错误,通过unset去除环境变量设置即可
-
iconv相关问题
编译服务器若是安装了libiconv,在编译libglib库是会出现libiconv_open等相关报错,这是因为搜索头文件时优先搜索的是libiconv的头文件,会通过宏定义强制将iconv_open转为libiconv_open。而实际链接时使用的又是GNU iconv(没有libiconv_open等接口)导致链接失败。错误信息如下:
处理方式可以选择卸载掉libiconv或设置C_INCLUDE_PATH环境变量修改默认的头文件搜索顺序(当前Buildroot构建不可行,会导致c++的boost编译异常)等方式处理,但我们没有编译服务器的root权限无法处理。目前修改的方法是找到出错的文件,在最开头的位置添加LIBICONV_PLUG宏定义以强制使用原始的iconv_open接口,如下: