Zig 模块本体与关键文件

Linux 安装示例

未安装 Zig 时的典型表现

labs/zig/adapter/CMakeLists.txtlabs/zig/adapter/zig_target.cmake 都会通过 find_program() 查找 zig。 如果开发机未安装 Zig,或者 PATH 中找不到 zig,配置阶段会直接失败。

Zig 支持的核心文件如下:

  • labs/zig/adapter/CMakeLists.txt:注册共享 arcs-zig 目标并导出头文件路径

  • labs/zig/adapter/build.zig:定义 Zig 侧库构建入口、目标平台与 include 路径

  • labs/zig/adapter/zig_target.cmake:为 target 编译单独的 .zig 源文件并参与链接

  • labs/zig/adapter/src/root.zig:定义 @import(“arcs”) 暴露的总入口

架构分层

labs/zig/adapter/src/root.zig 将能力分成两层:

  1. bindings 层

    直接映射底层 C API,适合:

    • 保持与 C 数据结构/ABI 严格一致

    • 做绑定验证、结构体布局检查

    • 在 Zig 中直接访问底层接口

  2. HAL 层

    提供更符合 Zig 风格的封装,适合:

    • 以对象/方法方式使用设备

    • 统一错误处理

    • 在 sample 中快速编写应用逻辑

@import(“arcs”) 提供的主要能力

系统与基础设施:

  • allocator

  • log

  • Thread

  • Mutex

  • Semaphore

  • Channel

  • Timer

  • RingBuffer

设备与外设:

  • Device

  • Gpio

  • Uart

  • I2c

  • Spi

  • Adc

  • Pwm

  • Flash

  • Display

  • Rtc

  • Audio

连接相关:

  • Bluetooth

  • WiFi

构建集成方式

典型的 target CMakeLists.txt 需要完成两件事:

  1. 正常创建 ARCS SDK 可执行目标

  2. 通过 LISTENAI_ZIG_APP 声明 target 自己的 .zig 文件

参考写法:

cmake_minimum_required(VERSION 3.19)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

find_package(listenai-cmake REQUIRED HINTS $ENV{ARCS_BASE})
project(zig_helloworld)

set(LISTENAI_ZIG_APP ${CMAKE_CURRENT_SOURCE_DIR}/src/zig_app.zig)

listenai_add_executable(${PROJECT_NAME})
listenai_maybe_enable_zig_target(${PROJECT_NAME})
target_sources(${PROJECT_NAME} PRIVATE src/main.c)

listenai_maybe_enable_zig_target() 会在检测到 LISTENAI_ZIG_APP 后自动完成以下工作:

  • 链接 arcs-zig

  • 编译并链接 target 自己的 .zig 文件

zig_target.cmake 内部会执行以下工作:

  • 调用共享 Zig adapter 的按需初始化逻辑

  • 编译 target 中的 .zig 文件并挂接到当前目标

更具体地说,helper 内部会继续完成这些底层步骤: - 查找本机 Zig 编译器 - 将 target 中的 .zig 文件编译为目标文件 - 为 root module 注入 arcs 依赖 - 追加 ARCS SDK 头文件搜索路径,以满足 @cImport 所需的 C 头文件访问

目标平台与工具链约束

根据 labs/zig/adapter/build.ziglabs/zig/adapter/zig_target.cmake 的定义,当前 Zig 构建链路面向:

  • riscv32-freestanding-none

  • 与现有 ARCS SoC / RISC-V 工具链兼容的 CPU 特性配置

  • 与 SDK 现有 C 代码一致的 include 体系

这意味着 Zig 代码并不是脱离 ARCS SDK 独立构建,而是作为当前 SDK 工程的一部分参与交叉编译和链接。

最小工作流

  1. 在 sample 中保留一个 C 入口文件,例如 src/main.c

  2. 在 Zig 侧导出可由 C 调用的函数,例如:

const arcs = @import("arcs");

export fn zig_hello_main() callconv(.C) i32 {
    arcs.log.init() catch return -1;
    arcs.log.info("Hello from Zig on ARCS SDK!", .{});
    return 0;
}

注意事项

  • Zig sample 仍依赖 C 入口和现有 ARCS SDK 工程骨架,不是纯 Zig 裸工程

  • 工程必须能找到 Zig 编译器,否则 labs/zig/adapter/CMakeLists.txtzig_target.cmake 会直接报错

  • Zig bindings 与 HAL 暂时以当前已封装模块为准,后续能力范围可能继续扩展

  • 某些 sample 依赖特定板级外设、panel、WiFi 或音频设备,阅读 sample README 时需先确认硬件条件