Skip to content

Update Cargo.lock

Update Cargo.lock #7

Workflow file for this run

name: Release Library
on:
push:
branches:
- main
jobs:
check-version:
runs-on: ubuntu-latest
permissions:
contents: read
outputs:
should_release: ${{ steps.check.outputs.should_release }}
version: ${{ steps.check.outputs.version }}
package_name: ${{ steps.get-name.outputs.package_name }}
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 2
- name: Get package name from Cargo.toml
id: get-name
run: |
PACKAGE_NAME=$(grep -m1 '^name' Cargo.toml | sed 's/name\s*=\s*"\(.*\)"/\1/')
echo "package_name=$PACKAGE_NAME" >> $GITHUB_OUTPUT
echo "Package name: $PACKAGE_NAME"
- name: Check if Cargo.toml version changed
id: check
run: |
CURRENT_VERSION=$(grep -m1 version Cargo.toml | cut -d '"' -f2)
git checkout HEAD^1
PREVIOUS_VERSION=$(grep -m1 version Cargo.toml | cut -d '"' -f2)
if [ "$CURRENT_VERSION" != "$PREVIOUS_VERSION" ]; then
echo "should_release=true" >> $GITHUB_OUTPUT
echo "version=$CURRENT_VERSION" >> $GITHUB_OUTPUT
echo "Version changed: $PREVIOUS_VERSION -> $CURRENT_VERSION"
else
echo "should_release=false" >> $GITHUB_OUTPUT
echo "Version unchanged: $CURRENT_VERSION"
fi
create-release:
needs: check-version
if: needs.check-version.outputs.should_release == 'true'
runs-on: ubuntu-latest
permissions:
contents: write
packages: write
outputs:
upload_url: ${{ steps.create_release.outputs.upload_url }}
steps:
- uses: actions/checkout@v3
- name: Create Release
id: create_release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
uses: softprops/action-gh-release@v1
with:
tag_name: v${{ needs.check-version.outputs.version }}
name: Release v${{ needs.check-version.outputs.version }}
draft: false
prerelease: false
build-release:
needs: [check-version, create-release]
if: needs.check-version.outputs.should_release == 'true'
permissions:
contents: write
strategy:
fail-fast: false # Continue with other builds if one fails
matrix:
include:
# Linux shared libraries
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
bin_path: target/x86_64-unknown-linux-gnu/release
lib_prefix: lib
lib_extension: .so
asset_name: -linux-x86_64
# Windows DLLs
- os: windows-latest
target: x86_64-pc-windows-msvc
bin_path: target/x86_64-pc-windows-msvc/release
lib_prefix: ""
lib_extension: .dll
asset_name: -windows-x86_64
- os: windows-latest
target: i686-pc-windows-msvc
bin_path: target/i686-pc-windows-msvc/release
lib_prefix: ""
lib_extension: .dll
asset_name: -windows-i686
- os: windows-latest
target: aarch64-pc-windows-msvc
bin_path: target/aarch64-pc-windows-msvc/release
lib_prefix: ""
lib_extension: .dll
asset_name: -windows-arm64
# macOS dylibs
- os: macos-latest
target: x86_64-apple-darwin
bin_path: target/x86_64-apple-darwin/release
lib_prefix: lib
lib_extension: .dylib
asset_name: -macos-x86_64
- os: macos-latest
target: aarch64-apple-darwin
bin_path: target/aarch64-apple-darwin/release
lib_prefix: lib
lib_extension: .dylib
asset_name: -macos-arm64
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- name: Install Rust
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
target: ${{ matrix.target }}
override: true
# Install dependencies for macOS
- name: Install macOS dependencies
if: runner.os == 'macOS'
run: |
brew update
brew install openssl@1.1 protobuf@3
echo "OPENSSL_DIR=$(brew --prefix openssl@1.1)" >> $GITHUB_ENV
# Add protoc to PATH and check version
echo "PATH=$(brew --prefix protobuf@3)/bin:$PATH" >> $GITHUB_ENV
brew link --force protobuf@3
protoc --version
# Install OpenSSL for Linux
- name: Install Linux dependencies
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y pkg-config libssl-dev
# Configure Cargo.toml for library build
- name: Configure Cargo.toml for library build
shell: bash
run: |
# Backup original Cargo.toml
cp Cargo.toml Cargo.toml.bak
# Check if crate-type is already defined
if grep -q 'crate-type' Cargo.toml; then
echo "crate-type already defined in Cargo.toml"
else
# Add lib section with crate-type if it doesn't exist
if grep -q '^\[lib\]' Cargo.toml; then
# [lib] section exists, add crate-type to it
sed -i.tmp '/^\[lib\]/a crate-type = ["cdylib"]' Cargo.toml
else
# Add [lib] section with crate-type
echo -e "\n[lib]\ncrate-type = [\"cdylib\"]" >> Cargo.toml
fi
fi
# Show the changes
echo "Modified Cargo.toml:"
cat Cargo.toml
# Build using cargo for native targets
- name: Build library
uses: actions-rs/cargo@v1
env:
RUST_BACKTRACE: 1
with:
command: build
args: --release --target ${{ matrix.target }}
- name: Set library path variables
shell: bash
run: |
PACKAGE_NAME="${{ needs.check-version.outputs.package_name }}"
LIB_NAME="${{ matrix.lib_prefix }}${PACKAGE_NAME}${{ matrix.lib_extension }}"
FULL_LIB_PATH="${{ matrix.bin_path }}/${LIB_NAME}"
FULL_ASSET_NAME="${PACKAGE_NAME}${{ matrix.asset_name }}${{ matrix.lib_extension }}"
echo "PACKAGE_NAME=${PACKAGE_NAME}" >> $GITHUB_ENV
echo "LIB_NAME=${LIB_NAME}" >> $GITHUB_ENV
echo "FULL_LIB_PATH=${FULL_LIB_PATH}" >> $GITHUB_ENV
echo "FULL_ASSET_NAME=${FULL_ASSET_NAME}" >> $GITHUB_ENV
# Debug info
echo "Debug info:"
echo "- Package name: ${PACKAGE_NAME}"
echo "- Library name: ${LIB_NAME}"
echo "- Library path: ${FULL_LIB_PATH}"
echo "- Asset name: ${FULL_ASSET_NAME}"
# Verify library exists
if [ -f "${FULL_LIB_PATH}" ]; then
echo "✅ Library exists at: ${FULL_LIB_PATH}"
ls -la "${FULL_LIB_PATH}"
else
echo "❌ Library NOT found at: ${FULL_LIB_PATH}"
echo "Contents of target directory:"
find target -type f -name "*${PACKAGE_NAME}*" | sort
fi
# Windows specific - copy import library (.lib) if it exists
- name: Handle Windows import library
if: runner.os == 'Windows'
shell: bash
run: |
IMPORT_LIB="${{ matrix.bin_path }}/${{ env.PACKAGE_NAME }}.lib"
if [ -f "$IMPORT_LIB" ]; then
echo "Found import library at $IMPORT_LIB"
echo "IMPORT_LIB=$IMPORT_LIB" >> $GITHUB_ENV
echo "IMPORT_LIB_ASSET=${{ env.PACKAGE_NAME }}${{ matrix.asset_name }}.lib" >> $GITHUB_ENV
else
echo "No import library found"
fi
# Create header file from cbindgen if it exists
- name: Generate C header
shell: bash
run: |
cargo install cbindgen || true
if command -v cbindgen &> /dev/null; then
echo "Generating C header file"
cbindgen --output "${{ env.PACKAGE_NAME }}.h"
echo "HEADER_FILE=${{ env.PACKAGE_NAME }}.h" >> $GITHUB_ENV
echo "HEADER_ASSET=${{ env.PACKAGE_NAME }}.h" >> $GITHUB_ENV
else
echo "cbindgen not available, skipping header generation"
fi
- name: Generate SHA256
shell: bash
run: |
# Verify library exists again just before SHA256 generation
if [ ! -f "$FULL_LIB_PATH" ]; then
echo "❌ ERROR: Library still not found at $FULL_LIB_PATH"
echo "Searching for any libraries:"
find target -type f -name "*.dll" -o -name "*.so" -o -name "*.dylib" | sort
exit 1
fi
echo "Generating SHA256 for $FULL_LIB_PATH"
if [[ "${{ runner.os }}" == "Windows" ]]; then
sha256sum "$FULL_LIB_PATH" > "$FULL_LIB_PATH.sha256"
else
shasum -a 256 "$FULL_LIB_PATH" > "$FULL_LIB_PATH.sha256"
fi
echo "SHA256 file contents:"
cat "$FULL_LIB_PATH.sha256"
# Create ZIP with all files for the platform
- name: Create platform package
shell: bash
run: |
mkdir -p package
cp "$FULL_LIB_PATH" "package/$FULL_ASSET_NAME"
# Include import lib for Windows if it exists
if [ -n "${IMPORT_LIB:-}" ]; then
cp "$IMPORT_LIB" "package/${IMPORT_LIB_ASSET}"
fi
# Include header if it exists
if [ -n "${HEADER_FILE:-}" ]; then
cp "$HEADER_FILE" "package/${HEADER_ASSET}"
fi
# Create ZIP file
PLATFORM_ZIP="${PACKAGE_NAME}${{ matrix.asset_name }}-package.zip"
echo "PLATFORM_ZIP=$PLATFORM_ZIP" >> $GITHUB_ENV
cd package
if [[ "${{ runner.os }}" == "Windows" ]]; then
7z a -tzip "../$PLATFORM_ZIP" *
else
zip -r "../$PLATFORM_ZIP" *
fi
cd ..
# Upload the shared library file
- name: Upload Library
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.FULL_LIB_PATH }}
asset_name: ${{ env.FULL_ASSET_NAME }}
asset_content_type: application/octet-stream
continue-on-error: true
# Upload the platform package (ZIP)
- name: Upload Platform Package
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.PLATFORM_ZIP }}
asset_name: ${{ env.PLATFORM_ZIP }}
asset_content_type: application/zip
continue-on-error: true
# Upload header file if generated
- name: Upload Header File
if: env.HEADER_FILE != ''
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.HEADER_FILE }}
asset_name: ${{ env.HEADER_ASSET }}
asset_content_type: text/plain
continue-on-error: true
# Upload import library for Windows
- name: Upload Import Library
if: env.IMPORT_LIB != ''
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.IMPORT_LIB }}
asset_name: ${{ env.IMPORT_LIB_ASSET }}
asset_content_type: application/octet-stream
continue-on-error: true
# Upload SHA256
- name: Upload SHA256
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.FULL_LIB_PATH }}.sha256
asset_name: ${{ env.FULL_ASSET_NAME }}.sha256
asset_content_type: text/plain
continue-on-error: true
# Use cross for more complex cross-compilation targets
cross-builds:
needs: [check-version, create-release]
if: needs.check-version.outputs.should_release == 'true'
runs-on: ubuntu-latest
permissions:
contents: write
strategy:
fail-fast: false
matrix:
include:
# Static Linux build
- target: x86_64-unknown-linux-musl
asset_suffix: -linux-x86_64-static
lib_prefix: lib
lib_extension: .so
openssl_arch: amd64
# ARM64 Linux
- target: aarch64-unknown-linux-gnu
asset_suffix: -linux-arm64
lib_prefix: lib
lib_extension: .so
openssl_arch: arm64
# ARM64 static Linux
- target: aarch64-unknown-linux-musl
asset_suffix: -linux-arm64-static
lib_prefix: lib
lib_extension: .so
openssl_arch: arm64
# 32-bit Linux
- target: i686-unknown-linux-gnu
asset_suffix: -linux-i686
lib_prefix: lib
lib_extension: .so
openssl_arch: i386
# 32-bit static Linux
- target: i686-unknown-linux-musl
asset_suffix: -linux-i686-static
lib_prefix: lib
lib_extension: .so
openssl_arch: i386
# ARMv7 (32-bit ARM for Raspberry Pi)
- target: armv7-unknown-linux-gnueabihf
asset_suffix: -linux-armv7
lib_prefix: lib
lib_extension: .so
openssl_arch: armhf
# ARMv7 static
- target: armv7-unknown-linux-musleabihf
asset_suffix: -linux-armv7-static
lib_prefix: lib
lib_extension: .so
openssl_arch: armhf
# WebAssembly
- target: wasm32-unknown-unknown
asset_suffix: .wasm
lib_prefix: ""
lib_extension: .wasm
no_openssl: true
steps:
- uses: actions/checkout@v3
- name: Install Rust
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
target: ${{ matrix.target }}
override: true
- name: Install cross
run: |
cargo install cross --git https://github.com/cross-rs/cross
- name: Install cbindgen
run: |
cargo install cbindgen || true
- name: Set variables
run: |
PACKAGE_NAME="${{ needs.check-version.outputs.package_name }}"
LIB_NAME="${{ matrix.lib_prefix }}${PACKAGE_NAME}${{ matrix.lib_extension }}"
ASSET_NAME="${PACKAGE_NAME}${{ matrix.asset_suffix }}"
LIB_PATH="target/${{ matrix.target }}/release/${LIB_NAME}"
echo "PACKAGE_NAME=${PACKAGE_NAME}" >> $GITHUB_ENV
echo "LIB_NAME=${LIB_NAME}" >> $GITHUB_ENV
echo "ASSET_NAME=${ASSET_NAME}" >> $GITHUB_ENV
echo "LIB_PATH=${LIB_PATH}" >> $GITHUB_ENV
echo "Cross-build variables:"
echo "- Package: ${PACKAGE_NAME}"
echo "- Library name: ${LIB_NAME}"
echo "- Asset name: ${ASSET_NAME}"
echo "- Library path: ${LIB_PATH}"
# Generate C header if possible
- name: Generate C header
run: |
if command -v cbindgen &> /dev/null; then
echo "Generating C header file"
cbindgen --output "${{ env.PACKAGE_NAME }}.h"
echo "HEADER_FILE=${{ env.PACKAGE_NAME }}.h" >> $GITHUB_ENV
else
echo "cbindgen not available, skipping header generation"
fi
# Create Cross.toml with pre-build commands for OpenSSL
- name: Configure cross for OpenSSL
if: ${{ !matrix.no_openssl }}
run: |
cat > Cross.toml << EOF
[target.${{ matrix.target }}]
pre-build = [
"dpkg --add-architecture ${{ matrix.openssl_arch }}",
"apt-get update",
"apt-get install -y libssl-dev:${{ matrix.openssl_arch }}"
]
EOF
cat Cross.toml
# Configure Cargo.toml for library build
- name: Configure Cargo.toml for library build
run: |
# Backup original Cargo.toml
cp Cargo.toml Cargo.toml.bak
# Check if crate-type is already defined
if grep -q 'crate-type' Cargo.toml; then
echo "crate-type already defined in Cargo.toml"
else
# Add lib section with crate-type if it doesn't exist
if grep -q '^\[lib\]' Cargo.toml; then
# [lib] section exists, add crate-type to it
sed -i.tmp '/^\[lib\]/a crate-type = ["cdylib"]' Cargo.toml
else
# Add [lib] section with crate-type
echo -e "\n[lib]\ncrate-type = [\"cdylib\"]" >> Cargo.toml
fi
fi
# Show the changes
echo "Modified Cargo.toml:"
cat Cargo.toml
# Special build for WebAssembly
- name: Build WebAssembly
if: matrix.target == 'wasm32-unknown-unknown'
run: |
rustup target add wasm32-unknown-unknown
cargo build --release --target wasm32-unknown-unknown
# Build using cross for non-WASM targets
- name: Build with cross
if: matrix.target != 'wasm32-unknown-unknown'
run: |
cross build --release --target ${{ matrix.target }}
# Create ZIP with library and header
- name: Create platform package
run: |
mkdir -p package
# Verify library exists
if [ -f "${{ env.LIB_PATH }}" ]; then
cp "${{ env.LIB_PATH }}" "package/${{ env.ASSET_NAME }}"
else
echo "Library not found at ${{ env.LIB_PATH }}"
find target -name "*${{ env.PACKAGE_NAME }}*" | sort
exit 1
fi
# Include header if it exists
if [ -n "${HEADER_FILE:-}" ]; then
cp "$HEADER_FILE" "package/${{ env.PACKAGE_NAME }}.h"
fi
# Create ZIP file
PLATFORM_ZIP="${{ env.ASSET_NAME }}-package.zip"
echo "PLATFORM_ZIP=$PLATFORM_ZIP" >> $GITHUB_ENV
cd package
zip -r "../$PLATFORM_ZIP" *
cd ..
- name: Generate SHA256
run: |
if [ -f "${{ env.LIB_PATH }}" ]; then
sha256sum "${{ env.LIB_PATH }}" > "${{ env.LIB_PATH }}.sha256"
else
echo "Library not found at ${{ env.LIB_PATH }}"
find target -name "*${{ env.PACKAGE_NAME }}*" | sort
exit 1
fi
# Upload the shared library
- name: Upload Library
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.LIB_PATH }}
asset_name: ${{ env.ASSET_NAME }}
asset_content_type: application/octet-stream
# Upload the platform package
- name: Upload Platform Package
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.PLATFORM_ZIP }}
asset_name: ${{ env.PLATFORM_ZIP }}
asset_content_type: application/zip
# Upload the header file if it exists
- name: Upload Header File
if: env.HEADER_FILE != ''
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.HEADER_FILE }}
asset_name: ${{ env.PACKAGE_NAME }}.h
asset_content_type: text/plain
# Upload SHA256
- name: Upload SHA256
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ${{ env.LIB_PATH }}.sha256
asset_name: ${{ env.ASSET_NAME }}.sha256
asset_content_type: text/plain