# This is a reusable workflow name: Build artifacts and run tests on: workflow_dispatch: inputs: matrix_all_combinations: description: "if matrix should have all combinations of targets and features" type: boolean required: true default: true artifact_upload_mode: description: "Control what artifacts to upload: 'none' for no uploads, 'with_default_features' to upload artifacts with default features (for releases), or 'all' for all feature combinations." type: choice options: - none - with_default_features - all required: true workflow_call: inputs: matrix_all_combinations: description: "if matrix should have all combinations of targets and features" type: boolean required: true artifact_upload_mode: description: "Control which artifacts to upload: 'none' for no uploads, 'with_default_features' to upload only artifacts with default features (use_zlib+use_zstd_thin+unrar+bzip3), or 'all' to upload all feature combinations." type: string required: true jobs: build-artifacts-and-run-tests: runs-on: ${{ matrix.os || 'ubuntu-latest' }} env: CARGO: cargo strategy: fail-fast: false matrix: feature-unrar: ${{ inputs.matrix_all_combinations && fromJSON('[true, false]') || fromJSON('[true]')}} feature-bzip3: ${{ inputs.matrix_all_combinations && fromJSON('[true, false]') || fromJSON('[true]')}} feature-use-zlib: ${{ inputs.matrix_all_combinations && fromJSON('[true, false]') || fromJSON('[false]')}} feature-use-zstd-thin: ${{ inputs.matrix_all_combinations && fromJSON('[true, false]') || fromJSON('[false]')}} target: # native - x86_64-unknown-linux-gnu - x86_64-pc-windows-gnu - x86_64-pc-windows-msvc - aarch64-pc-windows-msvc - x86_64-apple-darwin # cross - x86_64-unknown-linux-musl - aarch64-unknown-linux-gnu - aarch64-unknown-linux-musl - armv7-unknown-linux-gnueabihf - armv7-unknown-linux-musleabihf include: # runner overrides - target: x86_64-pc-windows-gnu os: windows-latest - target: x86_64-pc-windows-msvc os: windows-latest - target: aarch64-pc-windows-msvc os: windows-latest - target: x86_64-apple-darwin os: macos-latest # targets that use cross - target: x86_64-unknown-linux-musl use-cross: true - target: aarch64-unknown-linux-gnu use-cross: true - target: aarch64-unknown-linux-musl use-cross: true - target: armv7-unknown-linux-gnueabihf use-cross: true - target: armv7-unknown-linux-musleabihf use-cross: true # features (unless `matrix_all_combinations` is true, we only run these on linux-gnu) - feature-unrar: false target: x86_64-unknown-linux-gnu - feature-use-zlib: true target: x86_64-unknown-linux-gnu - feature-use-zstd-thin: true target: x86_64-unknown-linux-gnu - feature-bzip3: false target: x86_64-unknown-linux-gnu steps: - name: Checkout uses: actions/checkout@v4 - name: Install cross if: matrix.use-cross run: | pushd "$(mktemp -d)" wget https://github.com/cross-rs/cross/releases/download/v0.2.4/cross-x86_64-unknown-linux-musl.tar.gz tar xf cross-x86_64-unknown-linux-musl.tar.gz cp cross ~/.cargo/bin popd echo CARGO=cross >> $GITHUB_ENV - name: Concatenate features id: concat-features shell: bash run: | FEATURES=(allow_piped_choice) if [[ "${{ matrix.feature-unrar }}" == true ]]; then FEATURES+=(unrar); fi if [[ "${{ matrix.feature-use-zlib }}" == true ]]; then FEATURES+=(use_zlib); fi if [[ "${{ matrix.feature-use-zstd-thin }}" == true ]]; then FEATURES+=(use_zstd_thin); fi if [[ "${{ matrix.feature-bzip3 }}" == true ]]; then FEATURES+=(bzip3); fi # Output plus-separated list for artifact names IFS='+' echo "FEATURES_PLUS=${FEATURES[*]}" >> $GITHUB_OUTPUT # Output comma-separated list for cargo flags IFS=',' echo "FEATURES_COMMA=${FEATURES[*]}" >> $GITHUB_OUTPUT - name: Set up extra cargo flags env: FEATURES: ${{steps.concat-features.outputs.FEATURES_COMMA}} shell: bash run: | FLAGS="--no-default-features" if [[ -n "$FEATURES" ]]; then FLAGS+=" --features $FEATURES"; fi echo "EXTRA_CARGO_FLAGS=$FLAGS" >> $GITHUB_ENV - name: Install Rust run: | rustup toolchain install stable --profile minimal -t ${{ matrix.target }} - uses: Swatinem/rust-cache@v2 with: key: "${{ matrix.target }}-${{ matrix.feature-unrar }}-${{ matrix.feature-use-zlib }}-${{ matrix.feature-use-zstd-thin }}-${{ matrix.feature-bzip3 }}" - name: Test on stable # there's no way to run tests for ARM64 Windows for now if: matrix.target != 'aarch64-pc-windows-msvc' run: | ${{ env.CARGO }} +stable test --profile fast --target ${{ matrix.target }} $EXTRA_CARGO_FLAGS - name: Build release artifacts (binary and completions) if: ${{ inputs.artifact_upload_mode != 'none' }} run: | ${{ env.CARGO }} +stable build --release --target ${{ matrix.target }} $EXTRA_CARGO_FLAGS env: OUCH_ARTIFACTS_FOLDER: man-page-and-completions-artifacts - name: Upload release artifacts if: | ${{ inputs.artifact_upload_mode != 'none' && (inputs.artifact_upload_mode == 'all' || (matrix.feature-unrar && matrix.feature-use-zlib && matrix.feature-use-zstd-thin && matrix.feature-bzip3)) }} uses: actions/upload-artifact@v4 with: name: ouch-${{ matrix.target }}${{ steps.concat-features.outputs.FEATURES_PLUS != '' && format('-{0}', steps.concat-features.outputs.FEATURES_PLUS) || '' }} path: | target/${{ matrix.target }}/release/ouch target/${{ matrix.target }}/release/ouch.exe man-page-and-completions-artifacts/