本仓库是借助buildroot的qemu平台构建来验证intellif芯片的SDK构建设计思路,要求:
一级目录 | 二级目录 | 用途 |
---|---|---|
buildroot | buildroot子仓库链接,用于构建soc 镜像,支持灵活升级到最新版本 | |
intellif | buildroot | intellif soc芯片的buildroot配置,包括board, configs, package等 |
intellif | source | intellif soc芯片开源的package, 包括linux, sdk apps, libs |
tools | intellif soc芯片发布的工具 | |
tools | br2_build | intellif soc芯片发布的buildroot编译构建python包 |
sample | intellif soc芯片发布的sample代码,包括构建,sdk api sample等 | |
doc | intellif soc芯片发布的文档等 |
udo apt update
sudo apt-get install python-is-python3
sudo apt install qemu qemu-kvm libvirt-daemon libvirt-daemon-system bridge-utils virt-manager
仓库下载,编译sample,启动qemu
git clone --recurse-submodules https://github.com/gupeng1978/qemu_builds.git
cd qemu_builds
python sample/qemu_linux_build.py # 脚本编译
sh output/qemu_aarch64/images/start-qemu.sh
进入qemu(以root账号)linux,cd /usr/bin/,执行app开头的sample示例:
package名称以及链接 | buildroot功能 |
---|---|
app_hello_world | 1.通过cmake 源码构建; 2. 通过环境变量构建 |
app_opencv_resize | 1. 三方库opencv构建; 2. 如何存放图片数据 3. 通过cmake -D传输构建参数 |
linux | 1. linux内核源码构建 |
ko_hello_world | 1. linux 内核ko模块构建; 2. 多个子模块ko构建 |
sdk_drv | 1. 复杂包(ko,lib,app)构建; 2. 标准cmake install写法 |
该例子演示简单的cmake的源码包构建,不依赖任何三方库。
源码扩展:在intellif/source目录里增加app_hello_world目录以及对应的源码以及CMakeLists.txt;
BT2 External package扩展:在intellif/buildroot/package增加app_hello_world配置,其中配置文件见下,使用标准cmake package接入,选择local本地文件;参见app_hello_world.mk
Tools脚本编译扩展:在tools/br2_build的config.py增加接口扩展, 参见config.py中函数 app_hello_world:
在脚本sample/qemu_linux_build.py中增加app_hello_world配置
执行:qemu下进入/user/bin目录,执行app_hello_world
该例子演示依赖opencv库开发,app如何存放图片数据文件,如何传递构建参数。
该例子演示如何构建linux kernel module(ko), 该包下有两个ko模块,分别是hello_1.ko, hello_2.ko。
源码扩展:在intellif/source目录里增加ko_hello_world目录以及对应的源码以及Makefile,参见Makefile;
BT2 External package扩展:在intellif/buildroot/package增加ko_hello_world配置
Tools脚本编译扩展:在tools/br2_build的config.py增加接口扩展, 参见config.py中函数 ko_hello_world:
在脚本sample/qemu_linux_build.py中增加ko_hello_world配置
执行:qemu下, 安装insmod /lib/modules/5.10.0/extra/hello_1.ko, insmod /lib/modules/5.10.0/extra/hello_2.ko
该例子演示如何构建复杂包,包括ko模块,lib模块,app模块。
# 1. 配置写入到 buildroot/.config
make BR2_DEFCONFIG=/home/gupeng/github/qemu_builds/intellif/buildroot/configs/qemu_intellif_defconfig defconfig
# 2. GUI修改配置,自动解决依赖关系,保存到.config
make menuconfig
# 3. .config精简后写回到qemu_intellif_defconfig, 此处可以看到三方库的BR2配置修改;
make BR2_DEFCONFIG=/home/gupeng/github/qemu_builds/intellif/buildroot/configs/qemu_intellif_defconfig savedefconfig
# Build the kernel module(s)
# Force PWD for those packages that want to use it to find their
# includes and other support files (Booo!)
define $(2)_KERNEL_MODULES_BUILD
@$$(call MESSAGE,"Building kernel module(s)")
$$(foreach d,$$($(2)_MODULE_SUBDIRS), \
$$(LINUX_MAKE_ENV) $$($$(PKG)_MAKE) \
-C $$(LINUX_DIR) \
$$(LINUX_MAKE_FLAGS) \
$$($(2)_MODULE_MAKE_OPTS) \
PWD=$$(@D)/$$(d) \
M=$$(@D)/$$(d) \
modules$$(sep))
endef
$(2)_POST_BUILD_HOOKS += $(2)_KERNEL_MODULES_BUILD
define $(2)_KERNEL_MODULES_INSTALL @$$(call MESSAGE,"Installing kernel module(s)") $$(foreach d,$$($(2)_MODULE_SUBDIRS), \ $$(LINUX_MAKE_ENV) $$($$(PKG)_MAKE) \ -C $$(LINUX_DIR) \ $$(LINUX_MAKE_FLAGS) \ $$($(2)_MODULE_MAKE_OPTS) \ PWD=$$(@D)/$$(d) \ M=$$(@D)/$$(d) \ modules_install$$(sep)) endef $(2)_POST_INSTALL_TARGET_HOOKS += $(2)_KERNEL_MODULES_INSTALL
以具体例子展开来看,
$(LINUX_MAKE_ENV)会设置:
$(LINUX_MAKE_FLAGS)会设置: