jobs: # skip-master skip-pr skip-stable

  # This is ci/actions-templates/linux-builds-template.yaml
  # Do not edit this file in .github/workflows
  build-linux-pr: # job-name skip-master skip-stable
  build-linux-master: # job-name skip-pr skip-stable
  build-linux-stable: # job-name skip-master skip-pr
    runs-on: ${{ matrix.os || 'ubuntu-latest' }}
    if: ${{ contains('["pull_request", "merge_group"]', github.event_name) }} # skip-master skip-stable
    if: ${{ (github.event_name == 'push' && github.ref_name == 'master') }} # skip-pr skip-stable
    if: ${{ github.event_name == 'push' && github.ref_name == 'stable' || github.event_name == 'schedule' }} # skip-pr skip-master
    permissions:
      id-token: write
      contents: read
    strategy:
      fail-fast: false
      matrix:
        mode:
          - dev
          - release
        target:
          - x86_64-unknown-linux-gnu
          - armv7-unknown-linux-gnueabihf
          - aarch64-linux-android
          - aarch64-unknown-linux-gnu
          - aarch64-unknown-linux-musl     # skip-pr skip-master
          - powerpc64-unknown-linux-gnu    # skip-pr
          - x86_64-unknown-linux-musl      # skip-pr
          - i686-unknown-linux-gnu         # skip-pr skip-master
          - arm-unknown-linux-gnueabi      # skip-pr skip-master
          - arm-unknown-linux-gnueabihf    # skip-pr skip-master
          - x86_64-unknown-freebsd         # skip-pr skip-master
          - x86_64-unknown-netbsd          # skip-pr skip-master
          - x86_64-unknown-illumos         # skip-pr skip-master
          - powerpc-unknown-linux-gnu      # skip-pr skip-master
          - powerpc64le-unknown-linux-gnu  # skip-pr skip-master
          - s390x-unknown-linux-gnu        # skip-pr skip-master
          - arm-linux-androideabi          # skip-pr skip-master
          - armv7-linux-androideabi        # skip-pr skip-master
          - x86_64-linux-android           # skip-pr skip-master
          - riscv64gc-unknown-linux-gnu    # skip-pr skip-master
          - loongarch64-unknown-linux-gnu  # skip-pr skip-master
          - loongarch64-unknown-linux-musl # skip-pr skip-master
        include:
          - target: x86_64-unknown-linux-gnu
            run_tests: YES
            #snap_arch: amd64
          - target: i686-unknown-linux-gnu # skip-pr skip-master
            #snap_arch: i386  # skip-pr skip-master
            # We add an ARM-based host to the following target.
            # We need to do that because rust's CI uses ARM-based runners
            # to generate their Dockerfiles.
          - target: aarch64-unknown-linux-gnu
            os: ubuntu-24.04-arm
            run_tests: YES
          - target: armv7-unknown-linux-gnueabihf
            #snap_arch: armhf
          - target: powerpc64le-unknown-linux-gnu # skip-pr skip-master
            #snap_arch: ppc64el # skip-pr skip-master
          - target: s390x-unknown-linux-gnu # skip-pr skip-master
            #snap_arch: s390x # skip-pr skip-master
    steps:
      - name: Clone repo
        uses: actions/checkout@v4
        with:
          # v2 defaults to a shallow checkout, but we need at least to the previous tag
          fetch-depth: 0
      - name: Acquire tags for the repo
        run: |
          git fetch --no-tags --prune --depth=1 origin +refs/tags/*:refs/tags/*
      - name: Display the current git status
        run: |
          git status
          git describe
      - name: Prep cargo dirs
        run: |
          mkdir -p ~/.cargo/{registry,git}
      - name: Set environment variables appropriately for the build
        run: |
          echo "$HOME/.cargo/bin" >> $GITHUB_PATH
          echo "TARGET=${{ matrix.target }}" >> $GITHUB_ENV
      - name: Skip tests
        if: matrix.run_tests == '' || matrix.mode == 'release'
        run: |
          echo "SKIP_TESTS=yes" >> $GITHUB_ENV
      - name: Cache cargo registry and git trees
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Get rustc commit hash
        id: cargo-target-cache
        run: |
          echo "{rust_hash}={$(rustc -Vv | grep commit-hash | awk '{print $2}')}" >> $GITHUB_OUTPUT
        shell: bash
      - name: Cache cargo build
        uses: actions/cache@v4
        with:
          path: target
          key: ${{ github.base_ref }}-${{ github.head_ref }}-${{ matrix.target }}-${{ matrix.mode }}-cargo-target-dir-${{ steps.cargo-target-cache.outputs.rust_hash }}-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: ${{ github.base_ref }}-${{ matrix.target }}-${{ matrix.mode }}-cargo-target-dir-${{ steps.cargo-target-cache.outputs.rust_hash }}-${{ hashFiles('**/Cargo.lock') }}
      - name: Install Rustup using ./rustup-init.sh
        run: |
          sh ./rustup-init.sh --default-toolchain=none --profile=minimal -y
      - name: Ensure Stable is up to date
        run: |
          if rustc +stable -vV >/dev/null 2>/dev/null; then
            rustup toolchain uninstall stable
          fi
          rustup toolchain install --profile=minimal stable
      - name: Ensure we have our goal target installed
        run: |
          rustup target install "$TARGET"
      - name: Determine which docker we need to run in
        run: |
          case "$TARGET" in
            *-linux-android*) DOCKER=android   ;; # Android uses a local docker image
            *)                DOCKER="$TARGET" ;;
          esac
          echo "DOCKER=$DOCKER" >> $GITHUB_ENV
      - name: Fetch the base docker images from rust-lang/rust
        run: bash ci/fetch-rust-docker.bash "${TARGET}"
      - name: Maybe build a docker from there
        run: |
          if [ -f "ci/docker/$DOCKER/Dockerfile" ]; then
            docker build -t "$DOCKER" -f "ci/docker/${DOCKER}/Dockerfile" .
          fi
      - name: Run the build within the docker image
        env:
          BUILD_PROFILE: ${{ matrix.mode }}
        run: |
          mkdir -p "${PWD}/target"
          chown -R "$(id -u)":"$(id -g)" "${PWD}/target"
          docker run \
            --entrypoint sh \
            --env BUILD_PROFILE="${BUILD_PROFILE}" \
            --env CARGO_HOME=/cargo \
            --env CARGO_TARGET_DIR=/checkout/target \
            --env LIBZ_SYS_STATIC=1 \
            --env SKIP_TESTS="${SKIP_TESTS}" \
            --env TARGET="${TARGET}" \
            --env INSTALL_BINDGEN=1 \
            --init \
            --rm \
            --tty \
            --user "$(id -u)":"$(id -g)" \
            --volume "$(rustc --print sysroot)":/rustc-sysroot:ro \
            --volume "${HOME}/.cargo:/cargo" \
            --volume "${PWD}":/checkout:ro \
            --volume "${PWD}"/target:/checkout/target \
            --workdir /checkout \
            "${DOCKER}" \
            -c 'PATH="${PATH}":/rustc-sysroot/bin bash ci/run.bash'
      - name: Upload the built artifact
        uses: actions/upload-artifact@v4
        if: matrix.mode == 'release'
        with:
          name: rustup-init-${{ matrix.target }}
          path: |
            target/${{ matrix.target }}/release/rustup-init
          retention-days: 7
      - name: Ensure that awscli is installed
        if: github.event_name == 'push' && matrix.mode == 'release' && (github.ref == 'refs/heads/stable' || github.ref == 'refs/heads/master')
        run: |
          which aws
          aws --version
      - name: Prepare the dist
        if: github.event_name == 'push' && matrix.mode == 'release' && (github.ref == 'refs/heads/stable' || github.ref == 'refs/heads/master')
        run: |
          bash ci/prepare-deploy.bash
      - name: Deploy build to dev-static dist tree for release team
        if: github.event_name == 'push' && github.ref == 'refs/heads/stable' && matrix.mode == 'release'
        run: |
          aws s3 cp --recursive deploy/ s3://dev-static-rust-lang-org/rustup/
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: us-west-1
      - name: Configure AWS credentials
        if: github.event_name == 'push' && github.ref == 'refs/heads/master' && matrix.mode == 'release'
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: arn:aws:iam::890664054962:role/ci--rust-lang--rustup
          aws-region: us-east-1
      - name: Deploy build to rustup-builds bucket for release team
        if: github.event_name == 'push' && github.ref == 'refs/heads/master' && matrix.mode == 'release'
        run: |
          aws --debug s3 cp --recursive deploy/ s3://rustup-builds/${{ github.sha }}
        env:
          AWS_DEFAULT_REGION: us-east-1
      - name: Clear the cargo caches
        run: |
          cargo install cargo-cache --no-default-features --features ci-autoclean
          cargo-cache
