diff --git a/.cirrus.yml b/.cirrus.yml deleted file mode 100644 index f354998230..0000000000 --- a/.cirrus.yml +++ /dev/null @@ -1,66 +0,0 @@ -cargo_cache: - folder: $CARGO_HOME/registry - fingerprint_script: cat Cargo.lock || echo "" - -env: - # Build by default; don't just check - BUILD: build - CLIPPYFLAGS: -D warnings -A unknown-lints - RUSTFLAGS: -D warnings - RUSTDOCFLAGS: -D warnings - TOOL: cargo - MSRV: 1.69.0 - ZFLAGS: - -# Tests that don't require executing the build binaries -build: &BUILD - build_script: - - . $HOME/.cargo/env || true - - $TOOL -Vv - - rustc -Vv - - $TOOL $BUILD $ZFLAGS --target $TARGET --all-targets --all-features - - $TOOL doc $ZFLAGS --no-deps --target $TARGET --all-features - - $TOOL clippy $ZFLAGS --target $TARGET --all-targets --all-features -- $CLIPPYFLAGS - - if [ -z "$NOHACK" ]; then mkdir -p $HOME/.cargo/bin; export PATH=$HOME/.cargo/bin:$PATH; fi - - if [ -z "$NOHACK" ]; then curl -LsSf https://github.com/taiki-e/cargo-hack/releases/latest/download/cargo-hack-${HOST:-$TARGET}.tar.gz | tar xzf - -C ~/.cargo/bin; fi - - if [ -z "$NOHACK" ]; then $TOOL hack $ZFLAGS check --target $TARGET --each-feature; fi - -# Tests that do require executing the binaries -test: &TEST - << : *BUILD - test_script: - - . $HOME/.cargo/env || true - - $TOOL test --target $TARGET - -# Test FreeBSD in a full VM. Test the i686 target too, in the -# same VM. The binary will be built in 32-bit mode, but will execute on a -# 64-bit kernel and in a 64-bit environment. Our tests don't execute any of -# the system's binaries, so the environment shouldn't matter. -task: - env: - TARGET: x86_64-unknown-freebsd - matrix: - - name: FreeBSD 14 amd64 & i686 - freebsd_instance: - image: freebsd-14-4-release-amd64-ufs - cpu: 1 - # Enable tests that would fail on FreeBSD 12 - RUSTFLAGS: --cfg fbsd14 -D warnings - RUSTDOCFLAGS: --cfg fbsd14 - setup_script: - - kldload mqueuefs - - fetch https://sh.rustup.rs -o rustup.sh - - sh rustup.sh -y --profile=minimal --default-toolchain stable - - . $HOME/.cargo/env - - rustup target add i686-unknown-freebsd - - rustup component add clippy - << : *TEST - i386_test_script: - - . $HOME/.cargo/env - - cargo build --target i686-unknown-freebsd --all-features - - cargo doc --no-deps --target i686-unknown-freebsd --all-features - - cargo test --target i686-unknown-freebsd - i386_feature_script: - - . $HOME/.cargo/env - - if [ -z "$NOHACK" ]; then cargo hack check --each-feature --target i686-unknown-freebsd; fi - before_cache_script: rm -rf $CARGO_HOME/registry/index diff --git a/.github/actions/build/action.yml b/.github/actions/build/action.yml index c44b8e10f7..81e99b8f7b 100644 --- a/.github/actions/build/action.yml +++ b/.github/actions/build/action.yml @@ -21,6 +21,11 @@ inputs: required: false default: -D warnings + SHELL: + description: 'Command shell to use' + required: false + default: bash + TARGETS: description: 'Build all targets or only default?' required: false @@ -54,36 +59,39 @@ runs: using: "composite" steps: - name: set up Rust env - shell: bash + shell: ${{ inputs.SHELL }} run: | echo "RUSTFLAGS=${{ inputs.RUSTFLAGS }}" >> $GITHUB_ENV echo "RUSTDOCFLAGS=${{ inputs.RUSTDOCFLAGS }}" >> $GITHUB_ENV - name: debug info - shell: bash + shell: ${{ inputs.SHELL }} run: | ${{ inputs.TOOL }} -Vv rustc -Vv - name: build - shell: bash - run: ${{ inputs.TOOL }} ${{ inputs.BUILD }} ${{ inputs.ZFLAGS }} --target ${{ inputs.TARGET }} ${{ inputs.TARGETS }} --all-features + shell: ${{ inputs.SHELL }} + run: | + ${{ inputs.TOOL }} ${{ inputs.BUILD }} ${{ inputs.ZFLAGS }} --target ${{ inputs.TARGET }} ${{ inputs.TARGETS }} --all-features - name: doc if: inputs.NODOC == 'false' - shell: bash - run: ${{ inputs.TOOL }} doc ${{ inputs.ZFLAGS }} --no-deps --target ${{ inputs.TARGET }} --all-features + shell: ${{ inputs.SHELL }} + run: | + ${{ inputs.TOOL }} doc ${{ inputs.ZFLAGS }} --no-deps --target ${{ inputs.TARGET }} --all-features - name: clippy if: inputs.NOCLIPPY == 'false' - shell: bash - run: ${{ inputs.TOOL}} clippy ${{ inputs.ZFLAGS }} --target ${{ inputs.TARGET }} --all-targets --all-features -- ${{ inputs.CLIPPYFLAGS }} + shell: ${{ inputs.SHELL }} + run: | + ${{ inputs.TOOL}} clippy ${{ inputs.ZFLAGS }} --target ${{ inputs.TARGET }} --all-targets --all-features -- ${{ inputs.CLIPPYFLAGS }} - name: Set up cargo-hack if: inputs.NOHACK == 'false' uses: taiki-e/install-action@cargo-hack - name: run cargo hack - shell: bash + shell: ${{ inputs.SHELL }} if: inputs.NOHACK == 'false' run: ${{ inputs.TOOL }} hack ${{ inputs.ZFLAGS }} check --target ${{ inputs.TARGET }} --each-feature diff --git a/.github/actions/test/action.yml b/.github/actions/test/action.yml index df6a18bed5..d6883fcbcc 100644 --- a/.github/actions/test/action.yml +++ b/.github/actions/test/action.yml @@ -5,6 +5,11 @@ inputs: TARGET: required: true + SHELL: + description: 'Command shell to use' + required: false + default: bash + SUDO: description: 'Set it to an empty string to run the tests as the current user, leave it with the default value to test with "sudo"' required: false @@ -27,7 +32,7 @@ runs: using: "composite" steps: - name: set up Rust env - shell: bash + shell: ${{ inputs.SHELL }} run: | echo "RUSTFLAGS=${{ inputs.RUSTFLAGS }}" >> $GITHUB_ENV echo "RUSTDOCFLAGS=${{ inputs.RUSTDOCFLAGS }}" >> $GITHUB_ENV @@ -35,5 +40,6 @@ runs: echo "RUST_BACKTRACE=1" >> $GITHUB_ENV - name: test - shell: bash - run: ${{ inputs.SUDO }} $(which ${{ inputs.TOOL }}) test --target ${{ inputs.TARGET }} + shell: ${{ inputs.SHELL }} + run: | + ${{ inputs.SUDO }} $(which ${{ inputs.TOOL }}) test --target ${{ inputs.TARGET }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f1c9259ee2..61066c0c7c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,449 +9,185 @@ on: merge_group: types: [checks_requested] -permissions: - contents: read - -env: - MSRV: 1.69.0 - RUSTFLAGS: -Dwarnings - jobs: - macos: - runs-on: macos-26-intel - env: - TARGET: x86_64-apple-darwin - steps: - - name: checkout - uses: actions/checkout@v4 - - - name: setup Rust - uses: dtolnay/rust-toolchain@master - with: - toolchain: stable - components: clippy - - - name: build - uses: ./.github/actions/build - with: - TARGET: '${{ env.TARGET }}' - - - name: test - uses: ./.github/actions/test - with: - TARGET: '${{ env.TARGET }}' - - - name: before_cache_script - run: sudo rm -rf $CARGO_HOME/registry/index - - macos-aarch64: - runs-on: macos-latest - env: - TARGET: aarch64-apple-darwin - steps: - - name: checkout - uses: actions/checkout@v4 - - - name: setup Rust - uses: dtolnay/rust-toolchain@master - with: - toolchain: stable - components: clippy - - - name: build - uses: ./.github/actions/build - with: - TARGET: "${{ env.TARGET }}" - - - name: test - uses: ./.github/actions/test - with: - TARGET: "${{ env.TARGET }}" - - - name: before_cache_script - run: sudo rm -rf $CARGO_HOME/registry/index - - # Use cross for QEMU-based testing - # cross needs to execute Docker, GitHub Action already has it installed - cross: - runs-on: ubuntu-24.04 - needs: [rustfmt, minver, macos, x86_64_linux_native_builds] - strategy: - fail-fast: false - matrix: - target: [ - arm-unknown-linux-gnueabi, - armv7-unknown-linux-gnueabihf, - i686-unknown-linux-gnu, - i686-unknown-linux-musl, - - # Disable MIPS CIs, see https://github.com/nix-rust/nix/issues/2593 - # for detailed info. - # - # mips-unknown-linux-gnu, - # mips64-unknown-linux-gnuabi64, - # mips64el-unknown-linux-gnuabi64, - # mipsel-unknown-linux-gnu, - - powerpc64le-unknown-linux-gnu, - loongarch64-unknown-linux-gnu, - ] - - steps: - - name: checkout - uses: actions/checkout@v4 - - - name: setup Rust - uses: dtolnay/rust-toolchain@master - with: - toolchain: stable - components: clippy - - # cross relies on docker or podman, GitHub Acton already has it installed. - - name: Set up cross - uses: taiki-e/install-action@v2 - with: - tool: cross@0.2.5 - - - name: build - uses: ./.github/actions/build - with: - TARGET: '${{ matrix.target }}' - TOOL: cross - RUSTFLAGS: --cfg qemu -D warnings - - - name: test - uses: ./.github/actions/test - with: - TARGET: '${{ matrix.target }}' - SUDO: "" - TOOL: cross - RUSTFLAGS: --cfg qemu -D warnings - RUSTDOCFLAGS: --cfg qemu - - - name: before_cache_script - run: rm -rf $CARGO_HOME/registry/index - - - - # Tasks for x86_64 Linux native builds - x86_64_linux_native_builds: - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - target: [ - x86_64-unknown-linux-gnu, - x86_64-unknown-linux-musl, - ] - - steps: - - name: checkout - uses: actions/checkout@v4 - - - name: setup Rust - uses: dtolnay/rust-toolchain@master - with: - toolchain: stable - components: clippy - - - name: install targets - run: rustup target add ${{ matrix.target }} - - - name: build - uses: ./.github/actions/build - with: - TARGET: '${{ matrix.TARGET }}' - - - name: test - uses: ./.github/actions/test - with: - TARGET: '${{ matrix.TARGET }}' - - - name: before_cache_script - run: sudo rm -rf $CARGO_HOME/registry/index; - - # Tasks for aarch64 Linux native builds - aarch64_linux_native_builds: - runs-on: ubuntu-24.04-arm - strategy: - fail-fast: false - matrix: - target: [ - aarch64-unknown-linux-gnu, - aarch64-unknown-linux-musl, - ] - - steps: - - name: checkout - uses: actions/checkout@v4 - - - name: setup Rust - uses: dtolnay/rust-toolchain@master - with: - toolchain: stable - components: clippy - - - name: install targets - run: rustup target add ${{ matrix.target }} - - - name: build - uses: ./.github/actions/build - with: - TARGET: '${{ matrix.TARGET }}' - - - name: test - uses: ./.github/actions/test - with: - TARGET: '${{ matrix.TARGET }}' - - - name: before_cache_script - run: sudo rm -rf $CARGO_HOME/registry/index; - - - # Tasks for cross-compiling, but no testing - cross_compiling: - runs-on: ubuntu-latest - needs: [rustfmt, minver, macos, x86_64_linux_native_builds] - env: - BUILD: check - strategy: - fail-fast: false - matrix: - include: - # Cross claims to support Android, but when it tries to run Nix's tests it - # reports undefined symbol references. - - target: aarch64-linux-android - - target: arm-linux-androideabi - - target: armv7-linux-androideabi - - target: i686-linux-android - - target: x86_64-linux-android - - target: arm-unknown-linux-musleabi - - target: x86_64-unknown-fuchsia - - target: x86_64-unknown-illumos - # Cross claims to support running tests on iOS, but it actually doesn't. - # https://github.com/rust-embedded/cross/issues/535 - - target: aarch64-apple-ios - # cargo hack tries to invoke the iphonesimulator SDK for iOS - NOHACK: true - # Cross claims to support Linux powerpc64, but it really doesn't. - # https://github.com/rust-embedded/cross/issues/441 - - target: powerpc64-unknown-linux-gnu - - target: s390x-unknown-linux-gnu - - target: x86_64-unknown-linux-gnux32 - - target: x86_64-unknown-netbsd - - target: aarch64-unknown-linux-ohos - - target: armv7-unknown-linux-ohos - - target: x86_64-unknown-linux-ohos - - steps: - - name: checkout - uses: actions/checkout@v4 - - - name: setup Rust - uses: dtolnay/rust-toolchain@master - with: - toolchain: stable - components: clippy - - - name: install targets - run: rustup target add ${{ matrix.target }} - - - name: build - uses: ./.github/actions/build - with: - TARGET: '${{ matrix.target }}' - BUILD: '${{ env.BUILD }}' - NOHACK: '${{ matrix.NOHACK }}' - - - name: before_cache_script - run: rm -rf $CARGO_HOME/registry/index - - # Check that Nix will build on the MSRV, on a variety of operating systems. - # But don't check the tests. Those are not required to build on MSRV. - msrv: + vmactions: runs-on: ubuntu-latest - needs: [rustfmt, minver, macos, x86_64_linux_native_builds] - env: - BUILD: check - NOCLIPPY: true - NODOC: true - NOHACK: true - TARGETS: "" strategy: fail-fast: false matrix: include: - - target: aarch64-linux-android - - target: x86_64-unknown-linux-gnu - - target: x86_64-unknown-linux-musl - - target: aarch64-apple-darwin - - target: x86_64-unknown-freebsd - - target: x86_64-unknown-netbsd + - os: freebsd + version: "14.4" + arch: x86_64 + + # Disable FreeBSD/aarch64 because it's too slow + #- os: freebsd + #version: "15.0" + #arch: aarch64 + + # Disable Haiku because Nix doesn't have a Haiku maintainer who can + # fix the tests for us. + #- os: haiku + #version: "r1beta5" + #arch: x86_64 + + # Disable NetBSD because Nix doesn't have a NetBSD maintainer who + # can fix the tests for us. + #- os: netbsd + #version: "10.1" + #arch: x86_64 + + # Disable OmniOS because Nix doesn't have a OmniOS maintainer who + # can fix the tests for us. + #- os: omnios + #version: "r151056" + #arch: x86_64 + + # Disable OpenBSD because Nix doesn't have a OpenBSD maintainer who + # can fix the tests for us. + #- os: openbsd + #version: "7.8" + #arch: x86_64 steps: - - name: checkout - uses: actions/checkout@v4 - - - name: setup Rust - uses: dtolnay/rust-toolchain@master - with: - toolchain: $MSRV + - uses: actions/checkout@v6 - - name: install targets - run: rustup target add ${{ matrix.target }} - - - name: build - uses: ./.github/actions/build + - name: Start VM + if: matrix.os == 'freebsd' + uses: vmactions/freebsd-vm@v1 with: - TARGET: '${{ matrix.target }}' - TARGETS: '${{ env.TARGETS }}' - BUILD: '${{ env.BUILD }}' - NOCLIPPY: '${{ env.NOCLIPPY }}' - NODOC: '${{ env.NODOC }}' - NOHACK: '${{ env.NOHACK }}' - - - name: before_cache_script - run: rm -rf $CARGO_HOME/registry/index - - - redox: - runs-on: ubuntu-latest - needs: [rustfmt, minver, macos, x86_64_linux_native_builds] - env: - TARGET: x86_64-unknown-redox - CLIPPYFLAGS: -D warnings - BUILD: check - steps: - - name: checkout - uses: actions/checkout@v4 - - - name: setup Rust - # Redox's MSRV policy is unclear. Until they define it, use nightly. - uses: dtolnay/rust-toolchain@nightly - with: - components: clippy - - - name: install targets - run: rustup target add ${{ env.TARGET }} - - - name: build - uses: ./.github/actions/build + release: ${{ matrix.version }} + arch: ${{ matrix.arch }} + usesh: true + custom-shell-name: vmsh + - name: Start VM + if: matrix.os == 'haiku' + uses: vmactions/haiku-vm@v1 with: - TARGET: '${{ env.TARGET }}' - BUILD: '${{ env.BUILD }}' - CLIPPYFLAGS: '${{ env.CLIPPYFLAGS }}' - - - name: before_cache_script - run: rm -rf $CARGO_HOME/registry/index - - - - # Rust Tier 3 targets can't use Rustup - tier3: - runs-on: ubuntu-latest - env: - BUILD: check - ZFLAGS: -Zbuild-std - CLIPPYFLAGS: -D warnings - strategy: - fail-fast: false - matrix: - include: - - target: x86_64-unknown-dragonfly - - target: x86_64-unknown-openbsd - - target: x86_64-unknown-haiku - # Temporarily disable armv7-unknown-linux-uclibceabihf - # https://github.com/rust-lang/rust/issues/154679 - # - target: armv7-unknown-linux-uclibceabihf - # Disable Hurd due to - # 1. https://github.com/rust-lang/libc/issues/4421 - # 2. https://github.com/nix-rust/nix/pull/2635#issuecomment-2842062528 - # - # We can bring it back when 1 gets fixed and it is applied to the std lib - # - target: i686-unknown-hurd-gnu - steps: - - name: checkout - uses: actions/checkout@v4 - - - name: setup Rust - uses: dtolnay/rust-toolchain@nightly - with: - components: clippy - - - name: install src - run: rustup component add rust-src - - - name: build - uses: ./.github/actions/build + release: ${{ matrix.version }} + arch: ${{ matrix.arch }} + usesh: true + custom-shell-name: vmsh + - name: Start VM + if: matrix.os == 'netbsd' + uses: vmactions/netbsd-vm@v1 with: - TARGET: '${{ matrix.target }}' - BUILD: '${{ env.BUILD }}' - ZFLAGS: '${{ env.ZFLAGS }}' - CLIPPYFLAGS: '${{ env.CLIPPYFLAGS }}' - - - name: before_cache_script - run: rm -rf $CARGO_HOME/registry/index - - solaris: - name: solaris (x86_64-pc-solaris) - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: build and test - uses: vmactions/solaris-vm@v1 + release: ${{ matrix.version }} + arch: ${{ matrix.arch }} + usesh: true + custom-shell-name: vmsh + - name: Start VM + if: matrix.os == 'omnios' + uses: vmactions/omnios-vm@v1 with: - release: "11.4-gcc" + release: ${{ matrix.version }} + arch: ${{ matrix.arch }} usesh: true - mem: 4096 - copyback: false - prepare: | - source <(curl -s https://raw.githubusercontent.com/psumbera/solaris-rust/refs/heads/main/sh.rust-web-install) - echo "~~~~ rustc --version ~~~~" - rustc --version - echo "~~~~ Solaris-version ~~~~" - uname -a - run: | - export PATH=$HOME/.rust_solaris/bin:$PATH - cargo build --target x86_64-pc-solaris --all-targets --all-features && sudo env PATH=$PATH cargo test - - # Test that we can build with the lowest version of all dependencies. - # "cargo test" doesn't work because some of our dev-dependencies, like - # rand, can't build with their own minimal dependencies. - minver: - runs-on: ubuntu-latest - env: - TARGET: x86_64-unknown-linux-gnu - steps: - - name: checkout - uses: actions/checkout@v4 - - - name: setup Rust - uses: dtolnay/rust-toolchain@nightly - - - name: setup - run: cargo update -Zdirect-minimal-versions - - - name: check - run: cargo check - - - name: before_cache_script - run: rm -rf $CARGO_HOME/registry/index - - # Tasks that checks if the code is formatted right using `cargo fmt` tool - rustfmt: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Rust - uses: dtolnay/rust-toolchain@stable + custom-shell-name: vmsh + - name: Start VM + if: matrix.os == 'openbsd' + uses: vmactions/openbsd-vm@v1 with: - components: rustfmt - - - name: Check format - run: cargo fmt --all -- --check **/*.rs - - - name: before_cache_script - run: rm -rf $CARGO_HOME/registry/index - + release: ${{ matrix.version }} + arch: ${{ matrix.arch }} + usesh: true + custom-shell-name: vmsh + + - name: Install dependencies + if: matrix.arch == 'x86_64' && matrix.os == 'freebsd' + shell: vmsh {0} + run: | + pkg install -y curl + kldload mqueuefs + echo "PermitUserEnvironment yes" >> /etc/ssh/sshd_config + service sshd reload + fetch https://sh.rustup.rs -o rustup.sh + sh rustup.sh -y --profile=minimal --default-toolchain stable + mkdir -p $HOME/.ssh + echo "PATH=$HOME/.cargo/bin:$PATH" > $HOME/.ssh/environment + . $HOME/.cargo/env + rustc -vV + rustup component add clippy + - name: Install dependencies + if: matrix.arch == 'aarch64' && matrix.os == 'freebsd' + shell: vmsh {0} + run: | + pkg install -y rust + kldload mqueuefs + rustc -vV + - name: Install dependencies + if: matrix.os == 'haiku' + shell: vmsh {0} + run: | + pkgman install -y rust_bin + rustc -vV + - name: Install dependencies + if: matrix.os == 'netbsd' + shell: vmsh {0} + run: | + pkg_add curl + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + - name: Install dependencies + if: matrix.os == 'omnios' + shell: vmsh {0} + run: | + pkg install developer/build-essential + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + - name: Install dependencies + if: matrix.os == 'openbsd' + shell: vmsh {0} + run: | + pkg_add rust + rustc -vV + + - name: Build + shell: vmsh {0} + run: | + cat $HOME/.ssh/environment + echo PATH is $PATH + rustc -vV + #if [ -f $HOME/.cargo/env ]; then . $HOME/.cargo/env; fi + cargo build --all-targets --all-features + - name: Test + shell: vmsh {0} + run: | + #if [ -f $HOME/.cargo/env ]; then . $HOME/.cargo/env; fi + cargo test --all-targets --all-features + - name: Clippy + shell: vmsh {0} + run: | + #if [ -f $HOME/.cargo/env ]; then . $HOME/.cargo/env; fi + cargo clippy --all-targets --all-features -- -D warnings -A unknown-lints + - name: Doc + shell: vmsh {0} + run: | + #if [ -f $HOME/.cargo/env ]; then . $HOME/.cargo/env; fi + cargo doc --no-deps --all-features + + - name: Hack + if: matrix.arch == 'x86_64' && matrix.os == 'freebsd' + shell: vmsh {0} + run: | + #if [ -f $HOME/.cargo/env ]; then . $HOME/.cargo/env; fi + mkdir -p $HOME/.cargo/bin; export PATH=$HOME/.cargo/bin:$PATH + curl -LsSf https://github.com/taiki-e/cargo-hack/releases/latest/download/cargo-hack-x86_64-unknown-freebsd.tar.gz | tar xzf - -C ~/.cargo/bin + cargo hack check --each-feature + + - name: i686 Build + if: matrix.arch == 'aarch64' && matrix.os == 'freebsd' + shell: vmsh {0} + run: | + #if [ -f $HOME/.cargo/env ]; then . $HOME/.cargo/env; fi + rustup target add i686-unknown-freebsd + cargo build --target i686-unknown-freebsd --all-features --all-targets + - name: i686 Test + if: matrix.arch == 'aarch64' && matrix.os == 'freebsd' + shell: vmsh {0} + run: | + #if [ -f $HOME/.cargo/env ]; then . $HOME/.cargo/env; fi + cargo test --all-targets --all-features --target i686-unknown-freebsd + - name: i686 Doc + if: matrix.arch == 'aarch64' && matrix.os == 'freebsd' + shell: vmsh {0} + run: | + #if [ -f $HOME/.cargo/env ]; then . $HOME/.cargo/env; fi + cargo doc --no-deps --all-features --target i686-unknown-freebsd