#
# Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.  Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

name: 'Build (cross-compile)'

on:
  workflow_call:
    inputs:
      gcc-major-version:
        required: true
        type: string
      extra-conf-options:
        required: false
        type: string
      configure-arguments:
        required: false
        type: string
      make-arguments:
        required: false
        type: string
      dry-run:
        required: false
        type: boolean
        default: false

jobs:
  build-cross-compile:
    name: build
    runs-on: ubuntu-22.04

    strategy:
      fail-fast: false
      matrix:
        target-cpu:
          - aarch64
          # - arm
          # - s390x
          # - ppc64le
          # - riscv64
        include:
          - target-cpu: aarch64
            gnu-arch: aarch64
            debian-arch: arm64
            debian-repository: https://httpredir.debian.org/debian/
            debian-version: trixie
            tolerate-sysroot-errors: false
          # - target-cpu: arm
          #   gnu-arch: arm
          #   debian-arch: armhf
          #   debian-repository: https://httpredir.debian.org/debian/
          #   debian-version: trixie
          #   tolerate-sysroot-errors: false
          #   gnu-abi: eabihf
          # - target-cpu: s390x
          #   gnu-arch: s390x
          #   debian-arch: s390x
          #   debian-repository: https://httpredir.debian.org/debian/
          #   debian-version: trixie
          #   tolerate-sysroot-errors: false
          # - target-cpu: ppc64le
          #   gnu-arch: powerpc64le
          #   debian-arch: ppc64el
          #   debian-repository: https://httpredir.debian.org/debian/
          #   debian-version: trixie
          #   tolerate-sysroot-errors: false
          # - target-cpu: riscv64
          #   gnu-arch: riscv64
          #   debian-arch: riscv64
          #   debian-repository: https://httpredir.debian.org/debian/
          #   debian-version: trixie
          #   tolerate-sysroot-errors: false

    steps:
      - name: 'Checkout the JDK source'
        uses: actions/checkout@v4

      - name: 'Get the BootJDK'
        id: bootjdk
        uses: ./.github/actions/get-bootjdk
        with:
          platform: linux-x64

      - name: 'Get GTest'
        id: gtest
        uses: ./.github/actions/get-gtest

        # Upgrading apt to solve libc6 installation bugs, see JDK-8260460.
      - name: 'Install toolchain and dependencies'
        run: |
          # Install dependencies using apt-get
          sudo apt-get update
          sudo apt-get install --only-upgrade apt
          sudo apt-get install \
              gcc-${{ inputs.gcc-major-version }} \
              g++-${{ inputs.gcc-major-version }} \
              gcc-${{ inputs.gcc-major-version }}-${{ matrix.gnu-arch }}-linux-gnu${{ matrix.gnu-abi}} \
              g++-${{ inputs.gcc-major-version }}-${{ matrix.gnu-arch }}-linux-gnu${{ matrix.gnu-abi}} \
              libxrandr-dev libxtst-dev libcups2-dev libasound2-dev
          sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${{ inputs.gcc-major-version }} 100 --slave /usr/bin/g++ g++ /usr/bin/g++-${{ inputs.gcc-major-version }}

      - name: 'Check cache for sysroot'
        id: get-cached-sysroot
        uses: actions/cache@v4
        with:
          path: sysroot
          key: sysroot-${{ matrix.debian-arch }}-${{ hashFiles('./.github/workflows/build-cross-compile.yml') }}

      - name: 'Install sysroot dependencies'
        run: sudo apt-get install debootstrap qemu-user-static
        if: steps.get-cached-sysroot.outputs.cache-hit != 'true'

      - name: 'Create sysroot'
        id: create-sysroot
        run: >
          sudo debootstrap
          --no-merged-usr
          --arch=${{ matrix.debian-arch }}
          --verbose
          --include=fakeroot,symlinks,build-essential,libx11-dev,libxext-dev,libxrender-dev,libxrandr-dev,libxtst-dev,libxt-dev,libcups2-dev,libfontconfig1-dev,libasound2-dev,libfreetype-dev,libpng-dev
          --resolve-deps
          --variant=minbase
          ${{ matrix.debian-version }}
          sysroot
          ${{ matrix.debian-repository }}
        continue-on-error: ${{ matrix.tolerate-sysroot-errors }}
        if: steps.get-cached-sysroot.outputs.cache-hit != 'true'

      - name: 'Prepare sysroot'
        run: |
          # Prepare sysroot and remove unused files to minimize cache
          sudo chroot sysroot symlinks -cr .
          sudo chown ${USER} -R sysroot
          rm -rf sysroot/{dev,proc,run,sys,var}
          rm -rf sysroot/usr/{sbin,bin,share}
          rm -rf sysroot/usr/lib/{apt,gcc,udev,systemd}
          rm -rf sysroot/usr/libexec/gcc
          # /{bin,sbin,lib}/ are not symbolic links to /usr/{bin,sbin,lib}/ when debootstrap with --no-merged-usr
          rm -rf sysroot/{sbin,bin}
          rm -rf sysroot/lib/{udev,systemd}
        if: steps.create-sysroot.outcome == 'success' && steps.get-cached-sysroot.outputs.cache-hit != 'true'

      - name: 'Remove broken sysroot'
        run: |
          sudo rm -rf sysroot/
        if: steps.create-sysroot.outcome != 'success' && steps.get-cached-sysroot.outputs.cache-hit != 'true'

      - name: 'Configure'
        run: >
          bash configure
          --with-conf-name=linux-${{ matrix.target-cpu }}
          --with-version-opt=${GITHUB_ACTOR}-${GITHUB_SHA}
          --with-boot-jdk=${{ steps.bootjdk.outputs.path }}
          --with-gtest=${{ steps.gtest.outputs.path }}
          --with-zlib=system
          --enable-debug
          --disable-precompiled-headers
          --openjdk-target=${{ matrix.gnu-arch }}-linux-gnu${{ matrix.gnu-abi}}
          --with-sysroot=sysroot
          --with-jmod-compress=zip-1
          CC=${{ matrix.gnu-arch }}-linux-gnu${{ matrix.gnu-abi}}-gcc-${{ inputs.gcc-major-version }}
          CXX=${{ matrix.gnu-arch }}-linux-gnu${{ matrix.gnu-abi}}-g++-${{ inputs.gcc-major-version }}
          ${{ inputs.extra-conf-options }} ${{ inputs.configure-arguments }} || (
          echo "Dumping config.log:" &&
          cat config.log &&
          exit 1)
        if: steps.create-sysroot.outcome == 'success' || steps.get-cached-sysroot.outputs.cache-hit == 'true'

      - name: 'Build'
        id: build
        uses: ./.github/actions/do-build
        with:
          make-target: 'hotspot ${{ inputs.make-arguments }}'
          platform: linux-${{ matrix.target-cpu }}
        if: ((steps.create-sysroot.outcome == 'success' || steps.get-cached-sysroot.outputs.cache-hit == 'true') && inputs.dry-run == false)
