diff options
Diffstat (limited to '.github')
| -rw-r--r-- | .github/workflows/ci.yml | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0f97787..1f281ba 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,6 +13,251 @@ env: RUST_BACKTRACE: "1" jobs: + cargo_tests: + name: ${{ matrix.target.name }} ${{ matrix.channel }} + runs-on: ${{ matrix.target.os }} + strategy: + fail-fast: false + matrix: + target: [ + { "os": "ubuntu-latest", "toolchain": "x86_64-unknown-linux-gnu", "name": "Linux GNU" }, + { "os": "macOS-latest", "toolchain": "x86_64-apple-darwin", "name": "macOS" }, + { "os": "windows-latest", "toolchain": "x86_64-pc-windows-msvc", "name": "Windows MSVC" }, + { "os": "windows-latest", "toolchain": "x86_64-pc-windows-gnu", "name": "Windows GNU" } + ] + channel: [ + "stable", + "beta", + "nightly", + # The current MSRV. This crate doesn't have an official MSRV policy, + # but in practice we'll probably do what libc does: + # https://github.com/rust-lang/libs-team/issues/72. + # This test target is here so that we notice if we accidentally bump + # the MSRV, but it's not a promise that we won't bump it. + "1.60.0", + ] + + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + toolchain: ${{ format('{0}-{1}', matrix.channel, matrix.target.toolchain) }} + profile: minimal + override: true + # Print the compiler version, for debugging. + - name: print compiler version + run: cargo run --quiet + working-directory: ./tools/compiler_version + # Print out instruction set support, for debugging. + - name: print instruction set support + run: cargo run --quiet + working-directory: ./tools/instruction_set_support + # Default tests plus Rayon and RustCrypto trait implementations. + - run: cargo test --features=rayon,traits-preview + # Same but with only one thread in the Rayon pool. This can find deadlocks. + - name: "again with RAYON_NUM_THREADS=1" + run: cargo test --features=rayon,traits-preview + env: + RAYON_NUM_THREADS: 1 + # no_std tests. + - run: cargo test --no-default-features + + # A matrix of different test settings: + # - debug vs release + # - assembly vs Rust+C intrinsics vs pure Rust intrinsics + # - different levels of SIMD support + # + # Full SIMD support. + - run: cargo test --features= + - run: cargo test --features=prefer_intrinsics + - run: cargo test --features=pure + - run: cargo test --features= --release + - run: cargo test --features=prefer_intrinsics --release + - run: cargo test --features=pure --release + # No AVX-512. + - run: cargo test --features=no_avx512 + - run: cargo test --features=no_avx512,prefer_intrinsics + - run: cargo test --features=no_avx512,pure + - run: cargo test --features=no_avx512 --release + - run: cargo test --features=no_avx512,prefer_intrinsics --release + - run: cargo test --features=no_avx512,pure --release + # No AVX2. + - run: cargo test --features=no_avx512,no_avx2 + - run: cargo test --features=no_avx512,no_avx2,prefer_intrinsics + - run: cargo test --features=no_avx512,no_avx2,pure + - run: cargo test --features=no_avx512,no_avx2 --release + - run: cargo test --features=no_avx512,no_avx2,prefer_intrinsics --release + - run: cargo test --features=no_avx512,no_avx2,pure --release + # No SSE4.1 + - run: cargo test --features=no_avx512,no_avx2,no_sse41 + - run: cargo test --features=no_avx512,no_avx2,no_sse41,prefer_intrinsics + - run: cargo test --features=no_avx512,no_avx2,no_sse41,pure + - run: cargo test --features=no_avx512,no_avx2,no_sse41 --release + - run: cargo test --features=no_avx512,no_avx2,no_sse41,prefer_intrinsics --release + - run: cargo test --features=no_avx512,no_avx2,no_sse41,pure --release + # No SSE2 + - run: cargo test --features=no_avx512,no_avx2,no_sse41,no_sse2 + - run: cargo test --features=no_avx512,no_avx2,no_sse41,no_sse2,prefer_intrinsics + - run: cargo test --features=no_avx512,no_avx2,no_sse41,no_sse2,pure + - run: cargo test --features=no_avx512,no_avx2,no_sse41,no_sse2 --release + - run: cargo test --features=no_avx512,no_avx2,no_sse41,no_sse2,prefer_intrinsics --release + - run: cargo test --features=no_avx512,no_avx2,no_sse41,no_sse2,pure --release + + # Test benchmarks. RUSTC_BOOTSTRAP=1 lets this run on non-nightly toolchains. + - run: cargo test --benches --features=rayon + env: + RUSTC_BOOTSTRAP: 1 + # Test vectors. + - name: test vectors + run: cargo test + working-directory: ./test_vectors + - name: test vectors intrinsics + run: cargo test --features=prefer_intrinsics + working-directory: ./test_vectors + - name: test vectors pure + run: cargo test --features=pure + working-directory: ./test_vectors + # Test b3sum. + - name: test b3sum + run: cargo test + working-directory: ./b3sum + - name: test b3sum --no-default-features + run: cargo test --no-default-features + working-directory: ./b3sum + # Test C code. + - name: cargo test C bindings assembly + run: cargo test + working-directory: ./c/blake3_c_rust_bindings + - name: cargo test C bindings intrinsics + run: cargo test --features=prefer_intrinsics + working-directory: ./c/blake3_c_rust_bindings + # Reference impl doc test. + - name: reference impl doc test + run: cargo test + working-directory: ./reference_impl + + cross_tests: + name: cross ${{ matrix.arch }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + arch: + - i586-unknown-linux-musl + - i686-unknown-linux-musl + - armv7-unknown-linux-gnueabihf + - aarch64-unknown-linux-gnu + - mips-unknown-linux-gnu + + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + - run: cargo install cross + # Test the portable implementation on everything. + - run: cross test --target ${{ matrix.arch }} + # Test building for ancient i386 processors without guaranteed SSE2 support. + - run: cross rustc --target ${{ matrix.arch }} -- -C target-cpu=i386 + if: startsWith(matrix.arch, 'i586-') || startsWith(matrix.arch, 'i686-') + # Test the NEON implementation on ARM targets. + - run: cross test --target ${{ matrix.arch }} --features=neon + if: startsWith(matrix.arch, 'armv7-') || startsWith(matrix.arch, 'aarch64-') + # NEON is enabled by default on aarch64, disabling it through the no_neon feature. + - run: cross test --target ${{ matrix.arch }} --features=no_neon + if: startsWith(matrix.arch, 'aarch64-') + # Test vectors. Note that this uses a hacky script due to path dependency limitations. + - run: ./test_vectors/cross_test.sh --target ${{ matrix.arch }} + # C code. Same issue with the hacky script. + - run: ./c/blake3_c_rust_bindings/cross_test.sh --target ${{ matrix.arch }} + - run: ./c/blake3_c_rust_bindings/cross_test.sh --target ${{ matrix.arch }} --features=neon + if: startsWith(matrix.arch, 'armv7-') || startsWith(matrix.arch, 'aarch64-') + + # Currently only on x86. + c_tests: + name: C Makefile tests + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + # Test the intrinsics-based implementations. + - run: make -f Makefile.testing test + working-directory: ./c + - run: make -f Makefile.testing clean && rm blake3_sse2.c + working-directory: ./c + - run: BLAKE3_NO_SSE2=1 make -f Makefile.testing test + working-directory: ./c + - run: make -f Makefile.testing clean && rm blake3_sse41.c + working-directory: ./c + - run: BLAKE3_NO_SSE2=1 BLAKE3_NO_SSE41=1 make -f Makefile.testing test + working-directory: ./c + - run: make -f Makefile.testing clean && rm blake3_avx2.c + working-directory: ./c + - run: BLAKE3_NO_SSE2=1 BLAKE3_NO_SSE41=1 BLAKE3_NO_AVX2=1 make -f Makefile.testing test + working-directory: ./c + - run: make -f Makefile.testing clean && rm blake3_avx512.c + working-directory: ./c + - run: BLAKE3_NO_SSE2=1 BLAKE3_NO_SSE41=1 BLAKE3_NO_AVX2=1 BLAKE3_NO_AVX512=1 make -f Makefile.testing test + working-directory: ./c + # Test the assembly implementations. + - run: make -f Makefile.testing test_asm + working-directory: ./c + - run: make -f Makefile.testing clean && rm blake3_sse2_x86-64_unix.S + working-directory: ./c + - run: BLAKE3_NO_SSE2=1 make -f Makefile.testing test_asm + working-directory: ./c + - run: make -f Makefile.testing clean && rm blake3_sse41_x86-64_unix.S + working-directory: ./c + - run: BLAKE3_NO_SSE2=1 BLAKE3_NO_SSE41=1 make -f Makefile.testing test_asm + working-directory: ./c + - run: make -f Makefile.testing clean && rm blake3_avx2_x86-64_unix.S + working-directory: ./c + - run: BLAKE3_NO_SSE2=1 BLAKE3_NO_SSE41=1 BLAKE3_NO_AVX2=1 make -f Makefile.testing test_asm + working-directory: ./c + - run: make -f Makefile.testing clean && rm blake3_avx512_x86-64_unix.S + working-directory: ./c + - run: BLAKE3_NO_SSE2=1 BLAKE3_NO_SSE41=1 BLAKE3_NO_AVX2=1 BLAKE3_NO_AVX512=1 make -f Makefile.testing test_asm + working-directory: ./c + # Restore the files we deleted above. + - run: git checkout . + # Build the example. + - run: make -f Makefile.testing example + working-directory: ./c + + # Note that this jobs builds AArch64 binaries from an x86_64 host. + build_apple_silicon: + name: build for Apple Silicon + runs-on: macOS-latest + strategy: + fail-fast: false + steps: + - uses: actions/checkout@v3 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + target: aarch64-apple-darwin + override: true + - name: build blake3 + run: cargo build --target aarch64-apple-darwin + - name: build b3sum + run: cargo build --target aarch64-apple-darwin + working-directory: ./b3sum + + build_tinycc: + name: build with the Tiny C Compiler + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: install TCC + run: sudo apt-get install -y tcc + - name: compile + run: > + tcc -shared -O3 -o libblake3.so \ + -DBLAKE3_NO_SSE2 -DBLAKE3_NO_SSE41 -DBLAKE3_NO_AVX2 -DBLAKE3_NO_AVX512 \ + blake3.c blake3_dispatch.c blake3_portable.c + working-directory: ./c + # See https://github.com/BLAKE3-team/BLAKE3/issues/271 for why we test this. # Note that this isn't guaranteed to execute on an AVX-512-supporting server, # but hopefully at least some of the time it will. |
