Skip to content

Building for aarch64 on x64 macos #575

Building for aarch64 on x64 macos

Building for aarch64 on x64 macos #575

Workflow file for this run

name: CI
on:
push:
branches:
- main
tags:
- "*"
pull_request:
jobs:
# Check formatting and run clippy lints
linting:
strategy:
fail-fast: false
matrix:
rust:
- stable
- beta
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install Rust ${{ matrix.rust }}
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust }}
components: rustfmt, clippy
- name: Format
run: cargo fmt --all -- --check
- name: Clippy
run: cargo clippy -- -D warnings
# Build the workspace with the feature permutations not built by default
features:
strategy:
fail-fast: false
matrix:
feature-args:
- "--no-default-features"
- "--no-default-features --features serial"
- "--no-default-features --features tls"
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install Rust ${{ matrix.rust }}
uses: dtolnay/rust-toolchain@stable
- name: Build the workspace with the features
run: cargo build --release ${{ matrix.feature-args }}
# Run the unit tests on Windows and Linux
test:
strategy:
fail-fast: false
matrix:
os:
- ubuntu-latest
- windows-latest
rust:
- stable
- beta
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install Rust ${{ matrix.rust }}
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust }}
- name: Run Rust unit tests
run: cargo test
# Build API documentation packages
documentation:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Install doxygen 1.9.5
run: wget -q https://github.com/stepfunc/ci-files/raw/main/doxygen/doxygen-1.9.5.linux.bin.tar.gz -O- | sudo tar --strip-components=1 -C /usr -xz doxygen-1.9.5
- name: Build FFI and JNI
run: cargo build --release -p rodbus-ffi -p rodbus-ffi-java
- name: Build Rustdoc
run: cargo doc -p rodbus --no-deps
- name: C bindings
run: cargo run --bin rodbus-bindings -- --c --doxygen --no-tests
- name: .NET bindings
run: cargo run --bin rodbus-bindings -- --dotnet --doxygen --no-tests
- name: Java bindings
run: cargo run --bin rodbus-bindings -- --java
- name: Extract documentation
run: |
mkdir -p ~/doc
cp -a target/doc ~/doc/rust
cp -a ffi/bindings/c/generated/doc/c ~/doc/c
cp -a ffi/bindings/c/generated/doc/cpp ~/doc/cpp
cp -a ffi/bindings/dotnet/rodbus/doc ~/doc/dotnet
cp -a ffi/bindings/java/rodbus/target/apidocs ~/doc/java
rm ffi/bindings/c/generated/logo.png ffi/bindings/c/generated/doxygen-awesome.css
- name: Upload documentation
uses: actions/upload-artifact@v3
with:
name: doc
path: ~/doc
# Build bindings on Windows x64 [64-bit MSVC (Windows 7+) (x86_64-pc-windows-msvc)] and x86 [32-bit MSVC (Windows 7+) (i686-pc-windows-msvc)]
bindings-windows:
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
include:
- target: x86_64-pc-windows-msvc # 64-bit MSVC (Windows 7+)
test: true
- target: i686-pc-windows-msvc # 32-bit MSVC (Windows 7+)
test: false
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Create the FFI modules dir
run: mkdir ffi-modules\${{ matrix.target }}
- name: Build FFI
run: cargo build -p rodbus-ffi --release --target ${{ matrix.target }} --message-format json | Out-File -encoding "UTF8" .\ffi-modules\${{ matrix.target }}\build.ffi.log
- name: Build JNI
run: cargo build -p rodbus-ffi-java --release --target ${{ matrix.target }} --message-format json | Out-File -encoding "UTF8" .\ffi-modules\${{ matrix.target }}\build.jni.log
- name: Copy the FFI and JNI libs
shell: pwsh
run: |
Copy-Item -Path ./target/${{ matrix.target }}/release/rodbus_ffi.dll -Destination ffi-modules/${{ matrix.target }}
Copy-Item -Path ./target/${{ matrix.target }}/release/rodbus_ffi.dll.lib -Destination ffi-modules/${{ matrix.target }}
Copy-Item -Path ./target/${{ matrix.target }}/release/rodbus_ffi_java.dll -Destination ffi-modules/${{ matrix.target }}
- name: Upload compiled FFI modules
uses: actions/upload-artifact@v3
with:
name: ffi-modules
path: ffi-modules
- name: C Bindings Tests
if: ${{ matrix.test }}
run: cargo run --bin rodbus-bindings -- --c -r ${{ matrix.target }} -a ./target/${{ matrix.target }}/release
- name: Test .NET Bindings
if: ${{ matrix.test }}
run: cargo run --bin rodbus-bindings -- --dotnet -r ${{ matrix.target }} -a ./target/${{ matrix.target }}/release
- name: Test Java Bindings
if: ${{ matrix.test }}
run: cargo run --bin rodbus-bindings -- --java -r ${{ matrix.target }} -a ./target/${{ matrix.target }}/release
# Build bindings on MacOS [64-bit macOS (10.7+, Lion+) (x86_64-apple-darwin)]
bindings-macos:
runs-on: macos-latest
strategy:
fail-fast: false
matrix:
target:
- x86_64-apple-darwin # 64-bit macOS (10.7+, Lion+)
- aarch64-apple-darwin # ARM64 macOS (11.0+, Big Sur+)
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Create FFI modules dir
run: mkdir -p ffi-modules/${{ matrix.target }}
- name: Build FFI
run: cargo build --target ${{ matrix.target }} -p rodbus-ffi --release --message-format json > ffi-modules/${{ matrix.target }}/build.ffi.log
- name: Build JNI
run: cargo build --target ${{ matrix.target }} -p rodbus-ffi-java --release --message-format json > ffi-modules/${{ matrix.target }}/build.jni.log
- name: Copy the FFI and JNI libs
run: |
cp ./${{ matrix.target }}/release/librodbus_ffi.dylib ./ffi-modules/${{ matrix.target }}
cp ./${{ matrix.target }}/release/librodbus_ffi_java.dylib ./ffi-modules/${{ matrix.target }}
- name: Upload compiled FFI modules
uses: actions/upload-artifact@v3
with:
name: ffi-modules
path: ffi-modules
- name: Test .NET bindings
run: cargo run --bin rodbus-bindings -- --dotnet
- name: Test Java bindings
run: cargo run --bin rodbus-bindings -- --java
# Cross-compilation for various Linux architectures
ffi-cross:
env:
# By default, MUSL will not produce a cdylib with dynamic linkage to MUSL LIB C
CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_RUSTFLAGS: "-C target-feature=-crt-static"
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_RUSTFLAGS: "-C target-feature=-crt-static"
CARGO_TARGET_ARM_UNKNOWN_LINUX_MUSLEABIHF_RUSTFLAGS: "-C target-feature=-crt-static"
strategy:
fail-fast: false
matrix:
target:
- x86_64-unknown-linux-gnu # 64-bit Linux (kernel 2.6.32+, glibc 2.11+)
- x86_64-unknown-linux-musl # 64-bit Linux with MUSL
- arm-unknown-linux-gnueabihf # ARMv6 Linux, hardfloat (kernel 3.2, glibc 2.17)
- arm-unknown-linux-musleabihf # ARMv6 Linux with MUSL, hardfloat
- aarch64-unknown-linux-gnu # ARM64 Linux (kernel 4.2, glibc 2.17+)
- aarch64-unknown-linux-musl # ARM64 Linux with MUSL
- armv7-unknown-linux-gnueabihf # ARMv7 Linux, hardfloat (kernel 3.2, glibc 2.17)
- arm-unknown-linux-gnueabi # ARMv6 Linux (kernel 3.2, glibc 2.17)
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Install Rust Cross
run: cargo install cross
- name: Create ffi-modules dir
run: mkdir -p ffi-modules/${{ matrix.target }}
- name: Build FFI
run: cross build -p rodbus-ffi --release --target ${{ matrix.target }} --message-format json > ffi-modules/${{ matrix.target }}/build.ffi.log
- name: Build JNI
run: cross build -p rodbus-ffi-java --release --target ${{ matrix.target }} --message-format json > ffi-modules/${{ matrix.target }}/build.jni.log
- name: Copy the FFI and JNI libs
run: |
cp ./target/${{ matrix.target }}/release/librodbus_ffi.so ./ffi-modules/${{ matrix.target }}
cp ./target/${{ matrix.target }}/release/librodbus_ffi_java.so ./ffi-modules/${{ matrix.target }}
- name: Upload compiled FFI modules
uses: actions/upload-artifact@v3
with:
name: ffi-modules
path: ffi-modules
guide:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install dependencies
working-directory: guide
run: yarn install
- name: Build guide
working-directory: guide
run: |
yarn build
mkdir -p ~/doc/guide
mv build/* ~/doc/guide
- name: Upload guide
uses: actions/upload-artifact@v3
with:
name: doc
path: ~/doc
# Package all the generated bindings
packaging:
needs: [documentation, bindings-windows, bindings-macos, ffi-cross]
runs-on: ubuntu-latest
steps:
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Checkout BOM tools repo
uses: actions/checkout@v3
with:
repository: stepfunc/bom-tools
ref: 0.1.0
path: bom-tools
- name: Install BOM tools
working-directory: bom-tools
run: cargo install --path bom-tools
- name: Checkout
uses: actions/checkout@v3
- name: Download compiled FFI
uses: actions/download-artifact@v3
with:
name: ffi-modules
path: ffi-modules
- name: Create FFI third-party-licenses.txt
run: bom-tools gen-licenses-dir ./ffi-modules build.ffi.log ./dep_config.json > third-party-licenses.txt
- name: Package all bindings
run: cargo run --bin rodbus-bindings -- --package ./ffi-modules --options ./packaging.json -f third-party-licenses.txt
- name: Upload C/C++ bindings
uses: actions/upload-artifact@v3
with:
name: c-bindings
path: ffi/bindings/c/generated/*
- name: Upload .NET bindings
uses: actions/upload-artifact@v3
with:
name: dotnet-bindings
path: ffi/bindings/dotnet/nupkg/*
- name: Upload Java bindings
uses: actions/upload-artifact@v3
with:
name: java-bindings
path: ffi/bindings/java/rodbus/target/*.jar
- name: Upload Java pom.xml
uses: actions/upload-artifact@v3
with:
name: java-bindings
path: ffi/bindings/java/rodbus/pom.xml
release:
needs: [packaging, guide]
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/')
steps:
- name: Download all artifacts
uses: actions/download-artifact@v3
with:
path: artifacts
- name: Package C Bindings
run: |
mkdir release
cd artifacts/c-bindings
zip -r ../../release/rodbus-${GITHUB_REF##*/}.zip .
- name: Checkout stepfunc/docs
uses: actions/checkout@v3
with:
repository: stepfunc/docs
ssh-key: ${{ secrets.SFIO_DOCS_SSH_KEY }}
path: docs
- name: Upload docs
working-directory: docs
run: |
git config user.name github-actions
git config user.email github-actions@github.com
rm -rf ./rodbus/${GITHUB_REF##*/}
mkdir -p ./rodbus/${GITHUB_REF##*/}
cp -a ../artifacts/doc/* ./rodbus/${GITHUB_REF##*/}
git add -A
git commit -m "[rodbus] Release ${GITHUB_REF##*/}"
git push
- name: Import PGP key
uses: crazy-max/ghaction-import-gpg@v5
with:
gpg_private_key: ${{ secrets.SFIO_PGP_PRIVATE_KEY }}
passphrase: ${{ secrets.SFIO_PGP_PRIVATE_KEY_PASSPHRASE }}
- name: Login to OSSRH
uses: whelk-io/maven-settings-xml-action@v21
with:
servers: '[{ "id": "ossrh", "username": "${{ secrets.SFIO_OSSRH_USERNAME }}", "password": "${{ secrets.SFIO_OSSRH_PASSWORD }}" }]'
- name: Deploy Java
shell: bash
working-directory: artifacts/java-bindings
run: >
shopt -s extglob &&
mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2 -DrepositoryId=ossrh -DpomFile=pom.xml -Dfile=$(find rodbus-+([0-9]).+([0-9]).+([0-9])*(-rc+([0-9])).jar) &&
mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2 -DrepositoryId=ossrh -DpomFile=pom.xml -Dfile=$(find rodbus-+([0-9]).+([0-9]).+([0-9])*(-rc+([0-9]))-sources.jar) -Dclassifier=sources &&
mvn gpg:sign-and-deploy-file -Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2 -DrepositoryId=ossrh -DpomFile=pom.xml -Dfile=$(find rodbus-+([0-9]).+([0-9]).+([0-9])*(-rc+([0-9]))-javadoc.jar) -Dclassifier=javadoc
- name: Publish NuGet package
shell: bash
run: dotnet nuget push $(find artifacts/dotnet-bindings/rodbus*.nupkg) -s https://api.nuget.org/v3/index.json -k ${{ secrets.SFIO_NUGET_KEY }}
- name: Create GitHub release
uses: softprops/action-gh-release@v1
with:
draft: true
files: |
release/*.zip
artifacts/dotnet-bindings/rodbus*
artifacts/java-bindings/*.jar
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}