From d4b3075075e48d9aefc6e4de4ecb7916df9998b8 Mon Sep 17 00:00:00 2001 From: Bet4 <0xbet4@gmail.com> Date: Fri, 16 Oct 2026 17:15:14 +0800 Subject: [PATCH] ci(c): package C developer bundle --- .github/workflows/release.yaml | 114 +++++++++++++++++++++++++++++---- scripts/zig-cc.sh | 12 ++++ scripts/zig-linker.sh | 12 ++++ 3 files changed, 125 insertions(+), 13 deletions(-) create mode 100755 scripts/zig-cc.sh create mode 100755 scripts/zig-linker.sh diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index ce90bff4c..cdc4eaa3a 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -255,19 +255,39 @@ jobs: with: version: 0.16.0 - - name: Install cargo-zigbuild - if: contains(matrix.os, 'ubuntu') - run: cargo install cargo-zigbuild + - name: Install cargo-c + uses: taiki-e/install-action@v2 + with: + tool: cargo-c - name: Build for Linux if: contains(matrix.os, 'ubuntu') && !contains(matrix.target, 'android') run: | - cargo zigbuild --profile ci --target ${{ matrix.zigbuild_target || matrix.target }} -p fff-c --no-default-features --features zlob - mv "${{ matrix.artifact_name }}" "c-lib-${{ matrix.target }}.${{ matrix.ext }}" + TARGET="${{ matrix.target }}" + DIST_DIR="fff-c-$TARGET" + ZIG_TRIPLE="${{ matrix.zigbuild_target || matrix.target }}" + export ZIG_TARGET="${ZIG_TRIPLE/-unknown/}" + + TARGET_ENV=$(echo "$TARGET" | tr '[:lower:]' '[:upper:]' | tr '-' '_') + TARGET_LOWER=$(echo "$TARGET" | tr '-' '_') + + export CC="$GITHUB_WORKSPACE/scripts/zig-cc.sh" + export "CC_${TARGET_LOWER}"="$GITHUB_WORKSPACE/scripts/zig-cc.sh" + export "CARGO_TARGET_${TARGET_ENV}_LINKER"="$GITHUB_WORKSPACE/scripts/zig-linker.sh" + export AR="zig ar" + + cargo cinstall -p fff-c --profile ci --no-default-features --features zlob \ + --target "$TARGET" \ + --destdir "$DIST_DIR" \ + --prefix / + + cp "$DIST_DIR/lib/${{ matrix.lib_filename }}" "c-lib-$TARGET.${{ matrix.ext }}" - name: Build for Android (Termux) if: contains(matrix.target, 'android') run: | + TARGET="${{ matrix.target }}" + DIST_DIR="fff-c-$TARGET" NDK_BIN="$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin" export CC_aarch64_linux_android="$NDK_BIN/aarch64-linux-android24-clang" @@ -275,25 +295,70 @@ jobs: export AR_aarch64_linux_android="$NDK_BIN/llvm-ar" export CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="$NDK_BIN/aarch64-linux-android24-clang" - cargo build --profile ci --target ${{ matrix.target }} -p fff-c --no-default-features --features zlob - mv "${{ matrix.artifact_name }}" "c-lib-${{ matrix.target }}.${{ matrix.ext }}" + cargo cinstall -p fff-c --profile ci --no-default-features --features zlob \ + --target "$TARGET" \ + --destdir "$DIST_DIR" \ + --prefix / + + cp "$DIST_DIR/lib/${{ matrix.lib_filename }}" "c-lib-$TARGET.${{ matrix.ext }}" - name: Build for macOS if: contains(matrix.os, 'macos') run: | - MACOSX_DEPLOYMENT_TARGET="13" cargo build --profile ci --target ${{ matrix.target }} -p fff-c --no-default-features --features zlob - mv "${{ matrix.artifact_name }}" "c-lib-${{ matrix.target }}.${{ matrix.ext }}" + TARGET="${{ matrix.target }}" + DIST_DIR="fff-c-$TARGET" + + MACOSX_DEPLOYMENT_TARGET="13" cargo cinstall -p fff-c --profile ci --no-default-features --features zlob \ + --target "$TARGET" \ + --destdir "$DIST_DIR" \ + --prefix / + + # Set install_name to @rpath for relocatability + for dylib in "$DIST_DIR/lib"/*.dylib; do + [ -f "$dylib" ] || continue + install_name_tool -id "@rpath/libfff_c.dylib" "$dylib" || true + done + + cp "$DIST_DIR/lib/${{ matrix.lib_filename }}" "c-lib-$TARGET.${{ matrix.ext }}" - name: Ad-hoc sign macOS binary if: contains(matrix.os, 'macos') - run: codesign --force --sign - "c-lib-${{ matrix.target }}.${{ matrix.ext }}" + run: | + codesign --force --sign - "c-lib-${{ matrix.target }}.${{ matrix.ext }}" + for dylib in "fff-c-${{ matrix.target }}/lib"/*.dylib; do + [ -f "$dylib" ] || continue + codesign --force --sign - "$dylib" || true + done - name: Build for Windows if: contains(matrix.os, 'windows') shell: bash run: | - cargo build --profile ci --target ${{ matrix.target }} -p fff-c --no-default-features --features zlob - mv "${{ matrix.artifact_name }}" "c-lib-${{ matrix.target }}.${{ matrix.ext }}" + TARGET="${{ matrix.target }}" + DIST_DIR="fff-c-$TARGET" + + export MSYS_NO_PATHCONV=1 + export MSYS2_ARG_CONV_EXCL="*" + + cargo cinstall -p fff-c --profile ci --no-default-features --features zlob \ + --target "$TARGET" \ + --destdir "$DIST_DIR" \ + --prefix / + + if [ -f "$DIST_DIR/bin/${{ matrix.lib_filename }}" ]; then + cp "$DIST_DIR/bin/${{ matrix.lib_filename }}" "c-lib-$TARGET.${{ matrix.ext }}" + mkdir -p "$DIST_DIR/lib" + cp "$DIST_DIR/bin/${{ matrix.lib_filename }}" "$DIST_DIR/lib/${{ matrix.lib_filename }}" + elif [ -f "$DIST_DIR/lib/${{ matrix.lib_filename }}" ]; then + cp "$DIST_DIR/lib/${{ matrix.lib_filename }}" "c-lib-$TARGET.${{ matrix.ext }}" + else + DLL_FOUND=$(find "$DIST_DIR" -name "${{ matrix.lib_filename }}" | head -n 1) + if [ -n "$DLL_FOUND" ]; then + cp "$DLL_FOUND" "c-lib-$TARGET.${{ matrix.ext }}" + mkdir -p "$DIST_DIR/lib" + cp "$DLL_FOUND" "$DIST_DIR/lib/${{ matrix.lib_filename }}" + fi + fi - name: Prepare npm package shell: bash @@ -301,11 +366,33 @@ jobs: # Copy the built binary into the platform npm package directory cp "c-lib-${{ matrix.target }}.${{ matrix.ext }}" "packages/${{ matrix.npm_package }}/${{ matrix.lib_filename }}" + - name: Package C developer bundle (.a, .h, .pc) + shell: bash + run: | + TARGET="${{ matrix.target }}" + EXT="${{ matrix.ext }}" + DIST_DIR="fff-c-$TARGET" + + # Make pkg-config file relocatable + if [ -f "$DIST_DIR/lib/pkgconfig/fff_c.pc" ]; then + # shellcheck disable=SC2016 + sed -i.bak 's|^prefix=.*|prefix=${pcfiledir}/../..|' "$DIST_DIR/lib/pkgconfig/fff_c.pc" + rm -f "$DIST_DIR/lib/pkgconfig/fff_c.pc.bak" + fi + + # Archive package + tar -czf "fff-c-$TARGET.tar.gz" "$DIST_DIR" + if [ "$EXT" = "dll" ]; then + 7z a "fff-c-$TARGET.zip" "$DIST_DIR" + fi + - name: Upload C library artifact uses: actions/upload-artifact@v4 with: name: c-lib-${{ matrix.target }} - path: c-lib-${{ matrix.target }}.* + path: | + c-lib-${{ matrix.target }}.* + fff-c-${{ matrix.target }}.* - name: Upload npm package artifact uses: actions/upload-artifact@v4 @@ -633,6 +720,7 @@ jobs: ## C FFI Library (for Bun/Node/Python) - `c-lib-{target}.so` / `.dylib` / `.dll` - C FFI library + - `fff-c-{target}.tar.gz` (or `.zip` for Windows) - C SDK bundle (.a static lib, .h header, .pc pkg-config) ## MCP Server - `fff-mcp-{target}` - MCP server binary diff --git a/scripts/zig-cc.sh b/scripts/zig-cc.sh new file mode 100755 index 000000000..568c54fc3 --- /dev/null +++ b/scripts/zig-cc.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +args=() +for arg in "$@"; do + case "$arg" in + --target=*) + ;; + *) + args+=("$arg") + ;; + esac +done +exec zig cc -target "$ZIG_TARGET" "${args[@]}" diff --git a/scripts/zig-linker.sh b/scripts/zig-linker.sh new file mode 100755 index 000000000..acd68074e --- /dev/null +++ b/scripts/zig-linker.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +args=() +for arg in "$@"; do + case "$arg" in + --fix-cortex-a53-843419|-Wl,--fix-cortex-a53-843419) + ;; + *) + args+=("$arg") + ;; + esac +done +exec zig cc -target "$ZIG_TARGET" "${args[@]}"