The Buildroot user manual
The Buildroot user manual
https://buildroot.org/downloads/manual/manual.html
Firefly-RK3288 Manual >> Buildroot 开发
编译软件包
我们可以执行 make <package>
单独编译某个软件包。软件包的编译主要包括下载,解压,打补丁,配置,编译,安装等过程,具体可以查看 package/pkg-generic.mk
。
-
下载
Buildroot 会根据配置
package/<package>/<package>.mk
,自动从网络获取对应的软件包,包括一些第三方库,插件,实用工具等,放在dl/
目录。 -
解压
软件包会解压在
output/rockchip_rk3288/build/<package>-<version>
目录下。 -
打补丁
补丁集中放在
package/<packgae>/
目录,Buildroot 会在解压软件包后为其打上相应的补丁。如果要修改源码,可以通过打补丁的方式进行修改。 -
配置
-
编译
-
安装
编译完成后,会将需要的编译生成文件拷贝到
output/rockchip_rk3288/target/
目录。
对于某个软件包,我们可以通过 make <package>-<target>
调用软件包构建中的某一步骤,如下:
Package-specific:
<pkg> - Build and install <pkg> and all its dependencies
<pkg>-source - Only download the source files for <pkg>
<pkg>-extract - Extract <pkg> sources
<pkg>-patch - Apply patches to <pkg>
<pkg>-depends - Build <pkg>'s dependencies
<pkg>-configure - Build <pkg> up to the configure step
<pkg>-build - Build <pkg> up to the build step
<pkg>-graph-depends - Generate a graph of <pkg>'s dependencies
<pkg>-dirclean - Remove <pkg> build directory
<pkg>-reconfigure - Restart the build from the configure step
<pkg>-rebuild - Restart the build from the build step
编译输出目录
编译完成后,在编译输出目录 output/rockchip_rk3288
会生成子目录,说明如下:
-
build/
包含所有的源文件,包括 Buildroot 所需主机工具和选择的软件包,这个目录包含所有软件包源码。 -
host/
主机端编译需要的工具,包括交叉编译工具。 -
images/
包含压缩好的根文件系统镜像文件。 -
staging/
这个目录类似根文件系统的目录结构,包含编译生成的所有头文件和库,以及其他开发文件,不过他们没有裁剪,比较庞大,不适用于目标文件系统。 -
target/
包含完整的根文件系统,对比staging/
,它没有开发文件,不包含头文件,二进制文件也经过strip
处理。
交叉编译工具
Buildroot 编译完成后,会在 output/rockchip_rk3288/host/
目录下,生成交叉编译工具,我们可以用来编译目标程序。
-
交叉编译工具目录
output/rockchip_rk3288/host/bin/
-
编译示例 hello.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
printf("Hello World!\n");
return 0;
}
-
编译
.../host/bin/arm-buildroot-linux-gnueabihf-gcc hello.c -o hello
-
运行
将可执行程序 hello
拷贝到设备,运行 ./hello
,则会看到打印信息 Hello World!
。
新增本地源码包
开发过程中,Buildroot 自带的软件包有时可能无法满足我们的需求,为此我们需要添加自定义的软件包。Buildroot 支持多种格式的软件包,包括 generic-package、cmake-package、autotools-package 等,我们以 generic-package 举例说明。
-
创建工程目录
cd path/to/SDK/
mkdir buildroot/package/rockchip/firefly_demo/
-
新建 Config.in
在 firefly_demo/
下添加 Config.in:
config BR2_PACKAGE_FIREFLY_DEMO
bool "Simple Firefly Demo"
-
新建 firefly_demo.mk
在 firefly_demo/
下添加 firefly_demo.mk:
##################################################
###########
#
### firefly_demo
#
##################################################
###########
ifeq ($(BR2_PACKAGE_FIREFLY_DEMO), y)
FIREFLY_DEMO_VERSION:=1.0.0
FIREFLY_DEMO_SITE=$(TOPDIR)/../external/firefly_demo/src
FIREFLY_DEMO_SITE_METHOD=local
define FIREFLY_DEMO_BUILD_CMDS
$(TARGET_MAKE_ENV) $(MAKE) CC=$(TARGET_CC) CXX=$(TARGET_CXX) -C $(@D)
endef
define FIREFLY_DEMO_CLEAN_CMDS
$(TARGET_MAKE_ENV) $(MAKE) -C $(@D) clean
endef
define FIREFLY_DEMO_INSTALL_TARGET_CMDS
$(TARGET_MAKE_ENV) $(MAKE) -C $(@D) install
endef
define FIREFLY_DEMO_UNINSTALL_TARGET_CMDS
$(TARGET_MAKE_ENV) $(MAKE) -C $(@D) uninstall
endef
$(eval $(generic-package))
endif
-
创建源码目录
上文的 Makefile 文件里已经指定了源码目录 external/firefly_demo/src
。
cd path/to/SDK/
mkdir external/firefly_demo/src
-
编写源码 firefly_demo.c
在 firefly_demo/src/
下添加 firefly_demo.c:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
printf("Hello World!\n");
return 0;
}
-
编写 Makefile
在 firefly_demo/src/
下添加 Makefile:
DEPS =
OBJ = firefly_demo.o
CFLAGS =
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
firefly_demo: $(OBJ)
$(CXX) -o $@ $^ $(CFLAGS)
.PHONY: clean
clean:
rm -f *.o *~ firefly_demo
.PHONY: install
install:
cp -f firefly_demo $(TARGET_DIR)/usr/bin/
.PHONY: uninstall
uninstall:
rm -f $(TARGET_DIR)/usr/bin/firefly_demo
-
修改上一级 Config.in
在 buildroot/package/rockchip/Config.in
末尾添加一行:
source "package/rockchip/firefly_demo/Config.in"
-
配置软件包
打开配置菜单 make menuconfig
,找到 firefly_demo 并选中配置。
-
编译
# 编译 firefly_demo
make firefly_demo
# 打包进根文件系统
make
# 若修改源码,重新编译软件包
make firefly_demo-rebuild
http://wiki.t-firefly.com/zh_CN/Firefly-RK3288/buildroot_develop.html#xin-zeng-ben-di-yuan-ma-bao
其他参考设计
快速添加应用包的方法,官方网站例子
https://blog.csdn.net/sheji105/article/details/79406286
利用 buildroot 构建一个最基础的rootfs