Update Cargo.lock #14
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |