Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 101 additions & 13 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -255,57 +255,144 @@ 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
Comment thread
coderabbitai[bot] marked this conversation as resolved.
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"
export CXX_aarch64_linux_android="$NDK_BIN/aarch64-linux-android24-clang++"
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
run: |
# 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
Expand Down Expand Up @@ -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
Expand Down
12 changes: 12 additions & 0 deletions scripts/zig-cc.sh
Original file line number Diff line number Diff line change
@@ -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[@]}"
12 changes: 12 additions & 0 deletions scripts/zig-linker.sh
Original file line number Diff line number Diff line change
@@ -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[@]}"
Loading