使用 Nix 作为 Yocto 的替代品 | KDAB

主要观点

  • 从头为嵌入式设备构建系统镜像过程复杂,传统上 Yocto 项目和 Buildroot 较流行,它们利于设置交叉编译工具链等。
  • 介绍 Nix 作为 Yocto 和 Buildroot 的替代方案,它是纯函数式语言,在服务器和桌面 Linux 场景受欢迎,在嵌入式场景虽不普及但已有成功案例,其有大量官方维护包。
  • Nix 有两种交叉编译方法,一种是模拟目标指令集,可利用官方包缓存但编译慢;另一种是实际交叉编译,多数包可正常工作但需自行构建,可设置自定义缓存服务器。
  • 以在树莓派 3 Model B 上构建系统镜像为例,展示 Nix 构建过程,包括编译内核、构建软件栈等,利用 nixpkgs 的工具函数和模块,还可添加覆盖层解决依赖问题,可编写测试脚本在 qemu 中测试。
  • 最后总结 Nix 近年来发展迅速,其纯函数式语言能简洁解决复杂打包任务,适合构建嵌入式系统镜像,但与 Yocto 项目相比在嵌入式方面的支持和学习曲线等方面有不足。

关键信息

  • 传统构建系统:Yocto 项目、Buildroot。
  • Nix 特点:纯函数式语言,有 20 多年历史,在服务器和桌面 Linux 场景受欢迎,在嵌入式场景有成功案例,有大量官方维护包。
  • 交叉编译方法:模拟目标指令集(利用官方包缓存但编译慢)、实际交叉编译(多数包可正常工作但需自行构建)。
  • 构建树莓派系统镜像示例:利用 nixpkgs 工具函数和模块,添加覆盖层解决依赖问题,编写测试脚本在 qemu 中测试。
  • Nix 优缺点:能简洁解决复杂打包任务,适合构建嵌入式系统镜像,但在嵌入式方面支持不足,学习曲线较陡。

重要细节

  • Nix 语法中 lambda 语法为{ x, y }: x + y
  • 在树莓派构建系统镜像中,利用sd-card/sd-image.nix模块创建 MBR 分区的 SD 卡镜像,可自定义设置。
  • 添加 GammaRay 到系统包时会自动添加 Qt6 作为依赖,需通过覆盖层解决交叉编译问题。
  • 构建过程会创建flake.lock文件固定输入版本以保证可重复性。
  • KDAB 提供多种软件服务,在嵌入式和跨平台桌面应用等领域有专长。
阅读 14
0 条评论