4.4.3. 文件系统适配指南

4.4.3.1. 使用 Buildroot 制作文件系统

X5 的文件系统通过 Buildroot 制作,支持生成两种类型文件系统: initramfs 和 system。

  • initramfs:包含简化文件系统,与 Linux Kernel 合并打包为 boot.img,主要用于安全启动恢复系统。

  • system:用于提供系统运行环境完整文件系统。

Buildroot 源码

源码地址: https://gitlab.com/buildroot.org/buildroot.git

版本: 2022.08

system/buildroot/source 目录提供用于下载 Buildroot 和制作 rootfs 的脚本补丁。

.
├── buildroot_packages_2025.02         # 存放下载的 Buildroot 软件包源码,避免多次调试时重复下载
├── build.sh                            # 主脚本程序
├── configs                             # 软件包配置文件
├── framework                           # 输出目录
└── hb_patch_buildroot                  # X5 系统在原始 Buildroot 上打的补丁

说明:首次使用 Buildroot 制作文件系统需要联网下载软件源码 tar 包。build.sh 脚本下载源码存储buildroot_packages_2025.02 目录中(通过设置 BR2_DL_DIR 实现)。

如果通过 Buildroot 默认配置下载软件包遇到网络稳定、速度慢下载失败问题,用户https://archive.d-robotics.cc/buildroot/ 下载需要软件包,并存放到 buildroot_packages_2025.02 目录中。

注意:该网址包含 Buildroot 所有依赖包,仅收录当前开发中 2022.08 版本部分软件包。如需新增软件支持,请联系 D-Robotics 技术支持,我们及时更新。

编译文件系统

当前 BSP 提供编译的 rootfs,存放目录如下(注意各个镜像文件版本号实际版本为准):

# system
system/buildroot/prebuilt/dr-system_0.0.21~gcc11.3.1_all.deb

# initramfs
system/initramfs/dr-initramfs_0.0.1~gcc11.3.1_all.deb

# QT支持包
system/buildroot/prebuilt/dr-system-qt5_0.0.1~gcc11.3.1_all.deb

对应的 Buildroot 配置文件位于 system/buildroot/source/configs

.
├── x5_initramfs_defconfig
├── x5_system_defconfig
├── x5_system_qt5_defconfig
├── x5_system_quickstart_defconfig
└── x5_system_with_docker_defconfig

用户根据需要修改配置文件,增加删除软件包。通过以下命令进行图形化配置(配置完成自动覆盖配置):

cd system/buildroot/source
./build.sh menuconfig x5_initramfs_defconfig
./build.sh menuconfig x5_system_defconfig

制作 system

  1. 执行 buildroot 编译操作

    cd system/buildroot/source
    ./build.sh build x5_system_defconfig <version number>  # eg: 0.0.1
    

    比如:

    ./build.sh build x5_system_defconfig 0.0.1
    

    注意: 制作文件系统命令最后一个参数镜像版本号,可以根据需要修改,最终版本号拼接镜像文件名称中,编译出来文件系统镜像system/buildroot/source/framework/output/images 目录中,比如:

    dr-system_0.0.1~gcc11.3.1_all.deb
    
  2. 拷贝镜像预置目录更新索引文件

    编译烧录文件系统镜像时候,需要制作镜像文件复制到 system/buildroot/prebuilt/ 目录,也就是提到编译的 system rootfs 存放目录(注意各个镜像文件版本号实际版本为准):

    system/buildroot/prebuilt$ ls
    boot-utils-runtime                         dr-libgtest_1.14.0~gcc11.3.rel1_arm64.deb   dr-system_0.0.29~gcc11.3.1_all.deb
    dr-initramfs_0.0.1~gcc11.3.1_all.deb       dr-libhpatchz_3.1.1~gcc11.3.rel1_arm64.deb  series
    dr-libdnn_1.24.5~gcc11.3.rel1_arm64.deb    dr-perf_6.1.12~gcc11.3.rel1_arm64.deb
    dr-libgdcbin_1.0.0~gcc11.3.rel1_arm64.deb  dr-system_0.0.1~gcc11.3.1_all.deb
    

    此时需要修改同一目录system/buildroot/prebuilt/series 文件,把版本号改成前面编译配置版本号,例如:

    diff --git a/buildroot/prebuilt/series b/buildroot/prebuilt/series
    index 42ba771..4617101 100644
    --- a/buildroot/prebuilt/series
    +++ b/buildroot/prebuilt/series
    @@ -1,4 +1,4 @@
    -dr-system_0.0.29~gcc11.3.1_all.deb
    +dr-system_0.0.1~gcc11.3.1_all.deb
    dr-libgtest_1.14.0~gcc11.3.rel1_arm64.deb
    dr-libgdcbin_1.0.0~gcc11.3.rel1_arm64.deb
    dr-perf_6.1.12~gcc11.3.rel1_arm64.deb
    

    一般的,建议顺序递增版本号,以便维护。

  3. 重新打包

    回到工程根目录,执行:

    ./bd.sh system clean
    ./bd.sh system
    

    即可out/product/ 目录得到文件系统镜像 system.img,该镜像直接用于烧录。

制作 initramfs

cd system/buildroot/source
./build.sh build x5_initramfs_defconfig <version number>  # eg: 0.0.1

比如:

./build.sh build x5_initramfs_defconfig 0.0.1

关于版本号说明制作 system 相同,不再赘述。

制作 QT支持

如果需要系统支持 Qt5,需单独制作带有 Qt 支持文件系统(QT 支持包),其制作方法与 system 的制作流程完全一致,仅配置文件(defconfig)的选择使用 Qt5 相关配置。具体步骤如下:

  1. 执行 buildroot 编译操作

    cd system/buildroot/source
    ./build.sh build x5_system_qt5_defconfig <version number>  # 例如: 0.0.1
    

    比如:

    ./build.sh build x5_system_qt5_defconfig 0.0.1
    

    注意: 制作 QT 支持包根文件系统时,命令最后一个参数镜像版本号,可以根据需要修改。最终版本号拼接镜像文件名称中,编译文件系统镜像system/buildroot/source/framework/output/images 目录中,比如:

    dr-system-qt5_0.0.1~gcc11.3.1_all.deb
    
  2. 拷贝镜像预置目录更新索引文件

    编译烧录文件系统镜像时候,需要制作镜像文件复制到 system/buildroot/prebuilt/ 目录,也就是提到编译的 system rootfs 存放目录(注意各个镜像文件版本号实际版本为准):

    system/buildroot/prebuilt$ ls
    boot-utils-runtime
    dr-initramfs_0.0.1~gcc11.3.1_all.deb
    dr-libdnn_1.24.5~gcc11.3.rel1_arm64.deb
    dr-libgdcbin_1.0.0~gcc11.3.rel1_arm64.deb
    dr-libgtest_1.14.0~gcc11.3.rel1_arm64.deb
    dr-libhpatchz_3.1.1~gcc11.3.rel1_arm64.deb
    dr-perf_6.1.12~gcc11.3.rel1_arm64.deb
    dr-system-qt5_0.0.1~gcc11.3.1_all.deb
    dr-system_0.0.1~gcc11.3.1_all.deb
    dr-system_0.0.30~gcc11.3.1_all.deb
    dr-system_0.0.31~gcc11.3.1_all.deb
    dr-system_1.1.2~gcc11.3.1_all.deb
    series
    

    此时需要修改同一目录system/buildroot/prebuilt/series 文件,把版本号改成前面编译配置版本号,例如:

    diff --git a/buildroot/prebuilt/series b/buildroot/prebuilt/series
    index 793d99b..0993a86 100644
    --- a/buildroot/prebuilt/series
    +++ b/buildroot/prebuilt/series
    @@ -1,4 +1,4 @@
    -dr-system_0.0.30~gcc11.3.1_all.deb
    +dr-system-qt5_0.0.1~gcc11.3.1_all.deb
    dr-libgtest_1.14.0~gcc11.3.rel1_arm64.deb
    dr-libgdcbin_1.0.0~gcc11.3.rel1_arm64.deb
    dr-perf_6.1.12~gcc11.3.rel1_arm64.deb
    

    一般的,建议顺序递增版本号,以便维护。

  3. 重新打包

    回到工程根目录,执行:

    ./bd.sh system clean
    ./bd.sh system
    

    即可out/product/ 目录得到文件系统镜像 system.img,该镜像直接用于烧录。

4.4.3.2. 使用 Multistrap 制作 Ubuntu 根文件系统

X5 支持通过 Multistrap 制作基于 Ubuntu 的文件系统。目前默认提供基于 Ubuntu 22.04 (Jammy) 的文件系统。

编译文件系统

当前 BSP 提供编译的 rootfs,存放目录如下(注意各个镜像文件版本号实际版本为准):

system/ubuntu/prebuilt/dr-system-jammy_0.0.1_all.deb

对应的 Multistrap 配置文件位于 system/ubuntu/source/configs

.
└── x5_system_jammy.conf

用户根据需要修改配置文件,增加删除软件包。

制作 system

cd system/ubuntu/source
./build.sh clean
sudo ./build.sh build x5_system_jammy.conf 0.0.1
注意:
使用 Multistrap 制作文件系统需要联网下载软件 deb 包。配置文件默认使用清华大学镜像作为 apt 的源。
制作 jammy 的文件系统一定使用 sudo 权限,否则需要第一次烧录镜像dpkg --configure -a 逐个安装配置尚未配置软件包

4.4.3.3. 使用 APPSDK 进行应用开发

APPSDK(Application SDK,下面简称 SDK)是一套包含交叉编译环境。应用开发者无需下载完整项目源码,也无需主机预装 arm-gnu-toolchain,拿到 SDK deb 包后执行 install.sh 即可安装,source environment-setup 激活环境变量直接编译 X5 应用(也支持 X5 hbre 中各个单独编译)。

sysroot 取自 BSP 解包的 rootfs 运行库(out/deploy/system)+ hbre 产物 + 工具链自带的 crt/libc 头。打包了 hbre 后./bd.sh hbre && ./bd.sh appsdk 即可打包,无需重编 Buildroot 根文件系统。

SDK 版本号与 BSP 大版本号对齐,便于开发人员快速匹配对应版本。

SDK 内含:

  • ARM GNU Toolchain 副本(aarch64-none-linux-gnu-gcc 等)

  • bin/交叉工具链相对路径软链(指向 arm-gnu-toolchain/bin/,无 wrapper 中间层)

  • 完整 sysroot(glibc crt + 系统头文件库,如 OpenSSL 3.x、alsa、dbus、bluez、libdrm 等;来自 rootfs 运行库 + 工具链 libc 合并)

  • hbre 库(libcam、libvpf、libalog、libhbmem、libdsp、libpowerctl 等.so头文件,含 versioned runtime 软链 .so.N

  • system 域库(libgdcbin、libcjson、libdnn、libgtest、libhpatchz 等,来自 series 引用的 deb)

  • environment-setup-aarch64-x5-linux 环境脚本(source即可使用)

  • SDK 版 common Makefile(hbre/app Makefile.in 通过 SRC_DEVICE_COMMON_DIR include 该文件)

  • version-aarch64-x5-linux 版本追溯信息

前置条件

SDK 打包者(产出 SDK 的开发者)

打包 SDK 的机器需要完整项目源码构建产物:

  • 完整 X5 项目源码

  • 执行 ./bd.sh lunch <board> 选定板级配置

  • system 已解包:./bd.sh system unpack(产出 out/deploy/system/,是 sysroot 的 system 域库来源;改文件系统重编 dr-system deb 后重新 unpack 刷新)

  • hbre 已构建:./bd.sh hbre(产出 out/build/hbre_deps/out/deploy/hbre/

  • 外部 toolchain tarball:toolchain/arm-gnu-toolchain-11.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xz

建议执行一遍 ./bd.sh 完整编译整个工程源码,即可包括上述所有过程。

无需构建 Buildroot——APPSDK 不依赖 Buildroot host sysroot,sysroot 取自 out/deploy/system(rootfs 运行库)+ hbre 产物 + 工具链 libc 合并。打包了 hbre 后./bd.sh hbre && ./bd.sh appsdk 即可打包。

如果上述产物就绪,./bd.sh appsdk报错提示对应前置命令。

SDK 使用者(应用开发者)

应用开发者开发环境需要:

  • Ubuntu 22.04(或其它 Linux 发行版)

  • build-essentialcmakefile(验收脚本依赖,普通开发建议装)

  • 无需 /opt/arm-gnu-toolchain(SDK 自包含)

Ubuntu 可通过 apt 一键安装上述依赖:

sudo apt update && sudo apt install -y build-essential cmake file

打包 SDK

项目根目录执行(需先 ./bd.sh lunch <board> 选板级):

./bd.sh appsdk

版本号从 BSP 大版本号 HR_V_VERdevice/horizon/x5/dr_release_version.mk 导出,如 _V1.1.2)自动提取小写化(v1.1.2),无需手动指定。

清理 SDK 产物:

./bd.sh appsdk clean       # 清 out/deploy/appsdk/images/ 下的 SDK 产物(等同 distclean)

打包成功后,产物out/deploy/appsdk/images/ 目录:

out/deploy/appsdk/images$ ls platform-appsdk-*
platform-appsdk-v1.1.2.deb         # SDK 本体(deb 格式,含 SDK 全部文件)
platform-appsdk-v1.1.2.tar.gz      # 总包(含 deb + install.sh + relocate-paths.sh + test-sdk.sh)

产物格式 platform-appsdk-<sdk_version>。sdk_version 由 HR_V_VER 提取小写化(如 _V1.1.2v1.1.2),由 BSP 版本管理。

tar.gz 总包内含四件产物:

$ tar tzf platform-appsdk-v1.1.2.tar.gz
platform-appsdk-v1.1.2.deb
install.sh
relocate-paths.sh
test-sdk.sh

应用开发者拿到 tar.gz 总包即可。

安装 SDK

tar.gz 总包拷到应用开发者机器,解压运行安装脚本:

tar xzf platform-appsdk-v1.1.2.tar.gz
./install.sh platform-appsdk-v1.1.2.deb

install.sh交互式询问安装模式:

Found platform-appsdk-v1.1.2.deb

APPSDK supports two install modes:

  [1] sudo mode (recommended, requires sudo)
      - Installs to a fixed path /opt/platform-appsdk
      - Managed by dpkg: upgrade (sudo dpkg -i <new>), remove (sudo dpkg -r)
      - Source /opt/platform-appsdk/environment-setup-aarch64-x5-linux from any directory
      - On upgrade, dpkg replaces old files automatically — no manual cleanup

  [2] no-sudo mode (no sudo required)
      - Choose install path interactively (e.g. current directory)
      - Managed by install.sh: upgrade/remove via install.sh --uninstall
      - WARNING: do not place personal files inside platform-appsdk/ (upgrade removes the whole dir)
      - Source <install-path>/environment-setup-aarch64-x5-linux to use

Select [1/2] (default 1):

模式 1:sudo 模式(推荐)

用户选 1 后,install.sh 执行 sudo dpkg -i(sudo 自身提示输入密码):

sudo dpkg -i platform-appsdk-v1.1.2.deb
  • 安装固定路径 /opt/platform-appsdk

  • 用 dpkg 管理升级卸载

  • source 路径固定,任意目录使用

模式 2:无 sudo 模式

用户选 2 后,install.sh 交互读取安装路径,用 dpkg-deb -x 解包指定路径:

Install path [./]:
# SDK 解到 ./platform-appsdk/
  • 无需 sudo 权限

  • 安装路径自定义

  • 注意:不要platform-appsdk/ 目录放置个人文件(升级整个目录删除重装)

升级卸载

升级

sudo 模式

sudo dpkg -i platform-appsdk-v2.0.0.deb    # dpkg 自动替换旧文件

dpkg 自动处理新旧文件替换,无需手动清理。如果版本修改了 environment-setup,dpkg 会通过 conffile 保护机制判断是否覆盖。

无 sudo 模式

./install.sh platform-appsdk-v2.0.0.deb    # 选模式 2,自动删旧目录 + 解新 deb

实现方式rm -rf 整个platform-appsdk/ 目录重装。因此用户不得platform-appsdk/放置任何个人文件——升级时会一并删除。

卸载

sudo 模式

sudo dpkg -r platform-appsdk        # 软卸载:保留 conffile(environment-setup)
sudo dpkg -P platform-appsdk        # 彻底卸载:连 conffile 一起删

无 sudo 模式

./install.sh --uninstall <安装路径>
# 只删 SDK 文件,用户代码(不在 platform-appsdk/ 内的)保留

dpkg -rdpkg -P 详细对比

维度 sudo dpkg -r platform-appsdk (Remove) sudo dpkg -P platform-appsdk (Purge)
普通文件 删除 删除
conffile(environment-setup) 保留 删除
dpkg 数据库信息 /var/lib/dpkg/info/<pkg>.* 保留 /var/lib/dpkg/info/<pkg>.* 全删
dpkg 状态变化 iirc(removed, config-files remain) iiun/pn(unknown/purged, not installed)
postrm 触发 postrm remove postrm remove + postrm purge
能否再次 dpkg -i 装回 支持 支持

关键差异:conffile 保护机制——dpkg 用 conffiles 机制保护用户改过配置文件:

用 dpkg -r 卸载后:
  /opt/platform-appsdk/environment-setup-aarch64-x5-linux   ← 还在
  /opt/platform-appsdk/sysroot/...                            ← 已删

  dpkg -i platform-appsdk-v1.1.2.deb 重装:
    1. 算 conffile md5
    2. 比对 .dpkg-new(新版本文件):
       - 用户未改 conffile(md5 一致)→ 用新版本覆盖
       - 用户改过 conffile(md5 不一致)→ 保留用户版本,新版本存为 conffile.dpkg-dist
       - 用户删了 conffile → dpkg 静默处理
    3. dpkg 状态:rc → ii

选用建议

  • 临时卸载,要重装sudo dpkg -r(保留 conffile,重装如果未改版本覆盖)

  • 彻底清理,重新sudo dpkg -P(连 conffile 一起删,重装完全等于首次安装)

  • 升级版本sudo dpkg -i <新版.deb>(dpkg 自动 remove + install,行为等同 -r + install)

实际验证建议

# 1. 装好后看 dpkg 状态
dpkg -l platform-appsdk
# 预期:ii  platform-appsdk  1.1.2

# 2. dpkg -r 后看状态
sudo dpkg -r platform-appsdk
dpkg -l platform-appsdk
# 预期:rc  platform-appsdk  1.1.2    ← rc = removed, config-files
ls /opt/platform-appsdk/environment-setup-aarch64-x5-linux
# 预期:文件还在

# 3. dpkg -P 后看状态
sudo dpkg -P platform-appsdk
dpkg -l platform-appsdk
# 预期:un <无描述>  (或找不到)
ls /opt/platform-appsdk/environment-setup-aarch64-x5-linux
# 预期:No such file or directory

使用 SDK 编译应用

方式一:直接用 gcc 编译

source environment-setup 后,CCCXXCFLAGSLDFLAGSSDKTARGETSYSROOT环境变量好(CC 已含 --sysroot 与 arch 参数),直接$CC/$CXX 编译即可:

# source 环境脚本(每个新 shell 都要 source 一次)
source /opt/platform-appsdk/environment-setup-aarch64-x5-linux

# 编译 helloworld
cat > hello.c <<'EOF'
#include <stdio.h>
int main() { printf("hello x5\n"); return 0; }
EOF

$CC hello.c -o hello

# 验证产物架构
file hello
# hello: ELF 64-bit LSB executable, ARM aarch64, ...

# 链接 hbre 库(如 libcam)
$CC app.c -o app -lcam -lvpf -lgdcbin

# 链接系统库(如 OpenSSL)
$CC app.c -o app -lssl -lcrypto

# C++ 项目用 $CXX
$CXX app.cpp -o app -lstdc++

# libdrm:头文件在 include/libdrm 子目录,需显式 -I
$CC app.c -o app -I${SDKTARGETSYSROOT}/usr/include/libdrm -ldrm

CC完整值为 aarch64-none-linux-gnu-gcc -mcpu=cortex-a55 -mabi=lp64 --sysroot=<SDK sysroot>,已含交叉编译器、sysroot 与 arch 参数,直接$CC 即可。

CFLAGS 跟随 HR_TARGET_MODE:debug 模式-O0 -g,release 模式-O2,与 BSP build/common/Makefile 一致。

方式二:CMake 项目

source /opt/platform-appsdk/environment-setup-aarch64-x5-linux

mkdir build && cd build
cmake ..
make

APPSDK 无自带 toolchainfile.cmake,CMake 项目environment-setup 配好$CC。在 CMakeLists.txt 里取环境变量指定 compiler 与 flags:

cmake_minimum_required(VERSION 3.10)
set(CMAKE_C_COMPILER aarch64-none-linux-gnu-gcc)
set(CMAKE_C_FLAGS "-mcpu=cortex-a55 -mabi=lp64 --sysroot=$ENV{SDKTARGETSYSROOT} -isystem $ENV{SDKTARGETSYSROOT}/usr/include -L$ENV{SDKTARGETSYSROOT}/usr/lib")
project(myapp C)
add_executable(myapp main.c)

方式三:autotools 项目

主机安装 autotools 工具链:sudo apt install -y autoconf automake libtool

source /opt/platform-appsdk/environment-setup-aarch64-x5-linux

./configure --host=aarch64-none-linux-gnu
make

environment-setupCONFIGURE_FLAGS(含 --target--host--build--with-libtool-sysroot),autotools 项目 ./configure 时会自动用。

项目PKG_CHECK_MODULES([...],[libdrm]) 探测系统库,configure 会因 sysroot 无 libdrm.pcPackage 'libdrm' not found。SDK 不带 .pc,设 <PREFIX>_CFLAGS/<PREFIX>_LIBS 环境变量不能旁路检查(宏仍调 pkg-config --exists)。需项目自行处理(如预置 cache 变量 pkg_cv_<PREFIX>_CFLAGS/_LIBSPKG_CONFIG=true ./configure、或 patch configure.ac),机制实测,本指南给定配方。

方式四:用 make 编译 X5 项目(platform_samples / hbre 模块)

X5 项目platform_sampleshbre模块的 Makefile 已适配 SDK 环境:检测APPSDK_ROOT(由 environment-setup 设置)即进入 SDK 模式,自动-I/-L 路径指向 SDK sysroot,产物落到模块自身 out/

source /opt/platform-appsdk/environment-setup-aarch64-x5-linux

# 编译 platform_samples 下的某个样例
cd platform_samples/sample_dsp
make clean && make
# 产物 sample_dsp(ELF 64-bit, ARM aarch64)

# 编译 hbre 下的某个模块
cd hbre/dsp
make clean && make
# 产物 out/src/libdsp.so.1.0.0(ELF 64-bit, ARM aarch64)

适用范围:

  • platform_samples:除 sunrise_camera(有独立 config 机制)和 multi_pipe_stereo_infer/client(源码-Werror不过的 warning)外,其余样例在 SDK 环境编译。

  • hbrecamsys/libcamcamsys/libvpfdsphbutilslibefuselibhbmemlibipc/libipcfhallibloglibmmlibspi/spi-halopenssl-engineotaupdatepower-ctlsecure_storageviotool/libhbplayer 共 15 个模块make 产出 .so可执行文件模块自身 out/

SDK 模式项目模式互斥:未 source environment-setup项目逻辑,SDK 改动影响 ./bd.sh 流程。

hbre 模块make 的 install 行为

hbre 多数模块Makefile.indeb:默认目标deb: install,所以make(不带参数)会触发 install。install 产物(dev 软链 libxxx.so + 头文件 xxx.h)写$OUTPUT_HBROOTFS_DIR——SDK 模式指向 ${PWD}/deploy(source 时当前工作目录deploy/),不污染只读的 SDK sysroot。

# source 时 PWD 决定 deploy 落点
cd ~/myproject && source /opt/platform-appsdk/environment-setup-aarch64-x5-linux
# 此时 OUTPUT_HBROOTFS_DIR=~/myproject/deploy,install 产物落这里

cd hbre/dsp && make
# 编译产物 → hbre/dsp/out/src/libdsp.so.1.0.0
# install 产物 → ~/myproject/deploy/usr/lib/libdsp.so(软链→out/)
#               ~/myproject/deploy/include/xxx.h(软链→源码 include/)

deploy/用户工作目录,可随时 rm -rf deploy/ 清理,不影响 SDK。若需要 install 产物,用 make src/make build编译安装。

验收 SDK

SDK 自带验收脚本 test-sdk.sh(在里),用于确认 SDK 是否完整可用:

bash ./test-sdk.sh /opt/platform-appsdk

预期输出:

[PASS] 1. sysroot points to SDK
[PASS] 2. compile helloworld
[PASS] 2b. helloworld is aarch64
[PASS] 3. link hbre (libcam)
[PASS] 4. link system libssl
[PASS] 5. cmake project builds
[PASS] 6a. version file exists
...
[PASS] 6f. version has Timestamp

Results: 12 passed, 0 failed

全 PASS 说明 SDK 完整可用。

SDK 目录结构

/opt/platform-appsdk/                   # sudo 模式固定路径(无 sudo 模式为用户选的路径下/platform-appsdk/)
├── environment-setup-aarch64-x5-linux   # source 入口(导出 APPSDK_ROOT/SDKTARGETSYSROOT/$CC 等)
├── version-aarch64-x5-linux             # 版本追溯信息
├── Makefile                             # SDK 版 common(hbre/app Makefile.in 通过 SRC_DEVICE_COMMON_DIR include)
├── bin/                                 # 交叉工具链相对路径软链(→ ../arm-gnu-toolchain/bin/,无 wrapper)
├── arm-gnu-toolchain/                   # ARM GNU Toolchain 副本
│   └── bin/
└── sysroots/
    └── aarch64-x5-linux/                # sysroot(编译时 --sysroot 指向这里)
        ├── lib -> usr/lib               # 根级软链(rootfs 布局)
        ├── lib64 -> lib
        ├── include -> usr/include
        └── usr/
            ├── include/                  # 头文件(X5 + libc 合并)
            ├── lib/                      # 库(hbre .so/.so.N + system .so + rootfs 运行库)
            └── lib64/                    # crt 启动文件 + libc(来自工具链 libc)

version 文件

version-aarch64-x5-linux 记录 SDK 的来源追溯信息:

$ cat /opt/platform-appsdk/version-aarch64-x5-linux
Toolchain: arm-gnu-toolchain-11.3.rel1 (gcc 11.3.1)
APPSDK Version: v1.1.2
SDK Pack Timestamp: 20260722134800
HR_TARGET_MODE: debug
system debs (from series):
  dr-system_1.0.0~gcc11.3.1_all.deb
  ...
hbre modules git hashes:
  camsys: fdc59db7
  dsp: 2fa6940
  ...

各字段含义:

  • Toolchain:SDK 内置工具链版本与 gcc 版本

  • APPSDK Version:与 BSP HR_V_VER 对齐版本号

  • SDK Pack Timestamp:SDK 打包时刻(UTC)

  • HR_TARGET_MODE:打包板级模式(debug/release),影响 CFLAGS

  • system debs (from series):SDK 的 system 域库来自的 deb 文件名清单

  • hbre modules git hashes:各 hbre 仓库打包的 git commit hash

排查”这个 SDK 是从哪个版本打包的”时看这个文件——把内容给 SDK 提供即可定位来源。

常见问题

source environment-setup 报错 “must be sourced, not executed”

environment-setup 必须source(或 .)加载,不能bash 直接执行:

# 错误
bash /opt/platform-appsdk/environment-setup-aarch64-x5-linux

# 正确
source /opt/platform-appsdk/environment-setup-aarch64-x5-linux

sh source 报错 “requires bash, not sh”

environment-setup了 bash 语法,必须用 bash source:

# 错误(dash/sh 不支持)
sh -c '. /opt/platform-appsdk/environment-setup-aarch64-x5-linux'

# 正确
bash -c 'source /opt/platform-appsdk/environment-setup-aarch64-x5-linux'

链接 hbre 库报错 “cannot find -lxxx”

先跑 test-sdk.sh 确认 SDK 完整。若新增应用链接某个 SDK 未包含库,需联系 SDK 提供确认该库是否纳入。

SDK 升级旧版本残留

  • sudo 模式:sudo dpkg -i <新版本.deb> 自动替换文件,无需手动清理

  • 无 sudo 模式:./install.sh <新版本.deb>(选模式 2)自动删旧 platform-appsdk/目录重装

SDK 移动别的路径不能

sudo 模式/opt/platform-appsdk固定路径,不要手动移动。无 sudo 模式需换路径,在路径重新install.sh 即可。

dpkg -r 后 environment-setup 还

这是 dpkg 标准的 conffile 保护机制——conffile(environment-setup-aarch64-x5-linux)被显式标记配置文件,dpkg -r 时保留它。重新 dpkg -i 安装时:

  • 如果改过这个文件,dpkg 会版本覆盖(看起来像”全新安装”)

  • 如果改过这个文件(比如改了 CFLAGS),dpkg 会保留版本,新版本.dpkg-dist,需要手动合并

如果希望连 conffile 一起彻底干净,用 sudo dpkg -P platform-appsdk

重装/升级时 dpkg 询问 environment-setup 如何处理(conffile 冲突)

症状:sudo 模式重装升级 SDK(sudo dpkg -i platform-appsdk-vX.X.X.deb)时,dpkg 交互式提示:

Configuration file '/opt/platform-appsdk/environment-setup-aarch64-x5-linux'
 ==> Modified (by you or by a script) since installation.
 ==> Package distributor has shipped an updated version.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : start a shell to examine the situation
 The default action is to keep your current version.
*** environment-setup-aarch64-x5-linux (Y/I/N/O/D/Z) [default=N] ?

根因environment-setup-aarch64-x5-linux 被 deb 标记conffile(配置文件),dpkg 对 conffile 有保护机制——检测磁盘文件修改(md5 与 dpkg 记录不符)且新 deb 带版本时,交互式询问如何处理。常见触发场景:

  • 手动编辑/opt/platform-appsdk/environment-setup-aarch64-x5-linux(如调 CFLAGS、改路径变量)

  • 旧版 SDK 装着,新版 deb 的 environment-setup 内容变化

选项含义

选项 行为 适用场景
Y / I 用 deb 里版本覆盖磁盘版本 改过 conffile,或放弃本地修改新版
N / O(默认) 保留磁盘本地版本 改过 conffile 想保留(如自定义了 CFLAGS)
D 显示版本差异 想先哪些内容决定
Z 启动 shell 检查 深入排查

解决方案

  • 改过 / 想新版:输入 Y(推荐,确保最新 environment-setup)

  • 改过保留:输入 N(默认),保留本地修改;之后手动对比版本合并需要部分

  • 想先差异:输入 D 看清楚再选 Y/N

避免交互式询问:用 DEBIAN_FRONTEND=noninteractivedpkg --force-confold/--force-confnew 跳过提示:

# 保留本地 conffile 版本(非交互,等价默认 N)
sudo DEBIAN_FRONTEND=noninteractive dpkg -i platform-appsdk-v1.1.2.deb
# 或显式指定
sudo dpkg -i --force-confold platform-appsdk-v1.1.2.deb   # 保留旧版本
sudo dpkg -i --force-confnew platform-appsdk-v1.1.2.deb   # 用新版本覆盖

中断安装恢复:如果询问处 Ctrl+C 中断,dpkg 会留在 iU(已解包配置)半安装状态。检查恢复:

dpkg -l platform-appsdk | tail -1
# 若显示 iU(Unpacked-not-configured)= 半安装,需重新配置:
sudo dpkg --configure platform-appsdk
# 或直接重装一次(这次正常回答 Y/N):
sudo dpkg -i platform-appsdk-v1.1.2.deb

conffile 保护是 dpkg 标准机制。conffile 被标记配置文件,重装/升级时 dpkg 比较 md5 判断是否用户改过,改过交互式询问——不是 bug。

升级 SDK 后重新 source

升级 SDK(重装 deb)或改动 environment-setup 后,之前已 source 过的 shell 不会自动更新——环境变量在 source 时固化,旧 shell 里 $OUTPUT_HBROOTFS_DIR 还是旧值,继续 make变量。验证当前 shell:

echo $OUTPUT_HBROOTFS_DIR
# 应显示 .../deploy;若显示 .../sysroots/aarch64-x5-linux 则是旧环境
# 旧环境需重新 source:
source /opt/platform-appsdk/environment-setup-aarch64-x5-linux

注意事项

  • 工具链版本:SDK 内置 arm-gnu-toolchain-11.3.rel1,工具链升级时需重新打包 SDK。

  • 路径固定:sudo 模式/opt/platform-appsdk固定路径,不要手动移动;如需换路径,在路径重新install.sh