)
【声明】本博客所有内容均为个人业余时间创作所述技术案例均来自公开开源项目如GithubApache基金会不涉及任何企业机密或未公开技术如有侵权请联系删除背景上篇 blog【Agent】【OpenCode】源码构建项目构建开始构建 OpenCode 项目其中指出了bun run build命令中的build代表的不是 Bun 内置命令而是package.json中定义的脚本接着进入packages/opencode目录在其中进行构建动作构建成功后dist/目录下可以看到构建出的 OpenCode 多平台二进制文件独立可执行无需 Bun/Node.js接着介绍了单独构建当前平台的方法并列出了 OpenCode 支持构建的所有平台目标allTargets最后分析了allTargets的os属性下面继续OpenCode上篇 blog 分析完了os属性Bun 工具集支持的操作系统平台下面继续看剩余属性下面看arch属性该属性表示 CPU 指令集架构常见有x64也叫 amd64表示 64 位 Intel/AMD 处理器适用于绝大多数服务器和 PCarm64也叫 aarch64表示 64 位 ARM 处理器比如 Apple Silicon M1/M2树莓派等正如操作系统是软件底座一般CPU 架构则是硬件底座不同架构的 CPU 无法直接运行对方的二进制代码比如能在 x64 上运行的程序不能在树莓派ARM上面跑OK下面是abiApplication Binary Interface应用二进制接口这是 Linux 特有的概念主要指 C 标准库的实现方式Linux 上有两个主流的 C 标准库libc 类型特点常见发行版glibc功能全兼容性好体积大UbuntuDebianCentOSFedoramusl轻量静态链接友好更纯净Alpine Linux而 glibc 和 musl 二进制不兼容用 glibc 编译的程序在 Alpine Linux 上运行会报错Error loading shared library ld-linux-x86-64.so.2同样用 musl 编译的程序在 Ubuntu 等上也会报错这个也属于软件兼容性问题类似os上层应用程序所用的 C 标准库要和 Linux 操作系统所用动态库保持一致所以 OpenCode 这里的abi有两种选择undefine或省略默认是 glibc适用于大多数 Linux 操作系统musl专为 Apline Linux 构建在容器化场景中很多人用 Alpine 做基础镜像因为占用空间小所以这里单独提供了 musl 版本OK最后是avx2属性AVX2 全称 Advanced Vector Extension 2是Intel/AMD CPU 的 SIMD 指令集用于加速计算现代 CPU2013 年后基本都支持 AVX2但一些老旧机器虚拟机或低功耗设备可能不支持所以可以看到这里avx2有两种配置默认为true也就是使用 SIMD 指令集进行优化加速性能更好avx2: false也就是 baseline 版本这个版本不使用 AVX2 指令可以兼容更老的 CPU但性能略低编译的时候可以通过编译器标志比如-mno-avx2实现Bun 在交叉编译时可以控制OK本篇先到这里如有疑问欢迎评论区留言讨论祝各位功力大涨技术更上一层楼更多内容见下篇 blog