# TODO: incorporate some learnings from https://www.infinyon.com/blog/2021/04/github-actions-best-practices/, esp `sccache` stuff name: CI on: push: pull_request: env: NAME: modbus-mqtt CARGO_TERM_COLOR: always PKG_CONFIG_ALLOW_CROSS: 1 jobs: tests: runs-on: ubuntu-latest steps: - uses: actions/checkout@master - uses: actions-rs/toolchain@v1 id: rust-toolchain with: toolchain: stable profile: default override: true - name: Install Dependencies run: | export DEBIAN_FRONTEND=noninteractive sudo apt-get clean && sudo apt-get update sudo apt-get install -y pkg-config libudev-dev - name: Cargo cache uses: actions/cache@v2 with: path: | ~/.cargo/git ~/.cargo/registry ./target key: ${{ runner.os }}-cargo-${{ steps.rust-toolchain.outputs.rustc_hash }}-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.os }}-cargo-${{ steps.rust-toolchain.outputs.rustc_hash }}- ${{ runner.os }}-cargo - name: Run tests uses: actions-rs/cargo@v1 with: command: test args: --verbose checks: runs-on: ubuntu-latest steps: - uses: actions/checkout@master - uses: actions-rs/toolchain@v1 id: rust-toolchain with: toolchain: stable profile: default override: true - name: Install Dependencies run: | export DEBIAN_FRONTEND=noninteractive sudo apt-get clean && sudo apt-get update sudo apt-get install -y pkg-config libudev-dev - name: Cargo cache uses: actions/cache@v2 with: path: | ~/.cargo/git ~/.cargo/registry ./target key: ${{ runner.os }}-cargo-${{ steps.rust-toolchain.outputs.rustc_hash }}-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.os }}-cargo-${{ steps.rust-toolchain.outputs.rustc_hash }}- ${{ runner.os }}-cargo - name: Check rustfmt uses: actions-rs/cargo@v1 with: command: fmt args: --all -- --check - name: Check clippy warnings uses: actions-rs/cargo@v1 with: command: clippy args: -- -D clippy::all build: name: Build ${{matrix.TARGET}} needs: - tests strategy: fail-fast: false matrix: include: - TARGET: x86_64-unknown-linux-gnu OS: ubuntu-latest DEPS: libudev-dev - TARGET: x86_64-unknown-linux-musl OS: ubuntu-latest - TARGET: aarch64-unknown-linux-gnu OS: ubuntu-latest DEPS: libudev-dev:arm64 - TARGET: aarch64-unknown-linux-musl OS: ubuntu-latest - TARGET: armv7-unknown-linux-gnueabihf OS: ubuntu-latest DEPS: libudev-dev:armhf - TARGET: armv7-unknown-linux-musleabihf OS: ubuntu-latest - TARGET: arm-unknown-linux-gnueabihf OS: ubuntu-latest DEPS: libudev-dev:armhf - TARGET: arm-unknown-linux-musleabihf OS: ubuntu-latest - TARGET: x86_64-apple-darwin OS: macos-latest - TARGET: aarch64-apple-darwin OS: macos-latest - TARGET: x86_64-pc-windows-msvc OS: windows-latest runs-on: ${{ matrix.OS }} steps: - uses: actions/checkout@v2 - name: Cargo cache uses: actions/cache@v2 with: path: | ~/.cargo/git ~/.cargo/registry ./target key: ${{ runner.os }}-cargo-${{matrix.TARGET}}-${{ steps.rust-toolchain.outputs.rustc_hash }}-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ runner.os }}-cargo-${{matrix.TARGET}}-${{ steps.rust-toolchain.outputs.rustc_hash }} ${{ runner.os }}-cargo-${{matrix.TARGET}}- ${{ runner.os }}-cargo-${{ steps.rust-toolchain.outputs.rustc_hash }}-${{ hashFiles('**/Cargo.lock') }} ${{ runner.os }}-cargo-${{ steps.rust-toolchain.outputs.rustc_hash }}- ${{ runner.os }}-cargo - name: Setup cross linux toolchain if: contains(matrix.TARGET, '-linux-') && !startsWith(matrix.TARGET, 'x86_64-') run: | case "${{ matrix.TARGET }}" in i686-*) SYSTEM_ARCH=i386 ;; arm*) SYSTEM_ARCH=armhf ;; aarch64*) SYSTEM_ARCH=arm64 ;; esac GCC_TARGET=$(printf "${{ matrix.TARGET }}" | sed 's/-unknown-/-/' | sed 's/arm[^-]*/arm/g' | sed 's/musl/gnu/g') ENV_TARGET=$(printf "${{ matrix.TARGET }}" | tr '-' '_') ENV_TARGET_UC=$(printf "${ENV_TARGET}" | tr '[[:lower:]]' '[[:upper:]]') sudo rm -f /etc/apt/sources.list.d/*.list case "${{ matrix.TARGET }}" in arm* | aarch64*) sudo tee /etc/apt/sources.list << EOF deb [arch=i386,amd64] http://archive.ubuntu.com/ubuntu/ focal main universe deb [arch=i386,amd64] http://archive.ubuntu.com/ubuntu/ focal-updates main universe deb [arch=i386,amd64] http://security.ubuntu.com/ubuntu/ focal-security main universe deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports/ focal main universe deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports/ focal-updates main universe deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports/ focal-security main universe EOF ;; esac sudo dpkg --add-architecture ${SYSTEM_ARCH} dpkg --print-foreign-architectures sudo apt-get update -qqy sudo apt-get --fix-broken install sudo apt-get install -qqy --fix-broken -o Debug::pkgProblemResolver=yes crossbuild-essential-${SYSTEM_ARCH} pkg-config-${GCC_TARGET} echo "SYSTEM_ARCH=${SYSTEM_ARCH}" >> $GITHUB_ENV echo "CARGO_TARGET_${ENV_TARGET_UC}_LINKER=${GCC_TARGET}-gcc" >> $GITHUB_ENV echo "PKG_CONFIG_ALLOW_CROSS=1" >> $GITHUB_ENV echo "PKG_CONFIG_${ENV_TARGET}=${GCC_TARGET}-pkg-config" >> $GITHUB_ENV echo "PKG_CONFIG=${GCC_TARGET}-pkg-config" >> $GITHUB_ENV echo "BINDGEN_EXTRA_CLANG_ARGS=\"-L/usr/lib/${GCC_TARGET} -L/lib/${GCC_TARGET}\"" >> $GITHUB_ENV - name: Install dependencies if: contains(matrix.TARGET, '-linux-') && matrix.DEPS run: | sudo apt-get update sudo apt-get install -qqy ${{ matrix.DEPS }} - name: Configure linker if: contains(matrix.TARGET, '-linux-') run: | # some additional configuration for cross-compilation on linux # TODO: can this be done with `RUSTFLAGS += -C linker=$(DEB_HOST_GNU_TYPE)-gcc`? cat >>~/.cargo/config <