# U-Boot: sunXi
# Maintainer: Isaac David <isacdaavid@at@isacdaavid@dot@info>
# Contributor: André Silva <emulatorman@hyperbola.info>
# Contributor: Timothy Redaelli <timothy.redaelli@gmail.com>
# Contributor: Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>

# To add a new board (that uses an Allwinner System On a Chip) you need:
# - The package name. Example: uboot4extlinux-a20-olinuxino_micro
# - The u-boot configuration. Example: A20-OLinuXino_MICRO_defconfig
# - The name of the board(s). Example: A20 OLinuXino Micro
#   A single package / u-boot configuration sometimes support multiple
#   boards and the configuration name doesn't always have the boards names
#   in it. Example: uboot4extlinux-am335x_bone supports various BeagleBones,
#   the AM335x GP EVM and the EVM SK all in one u-boot binary and package.
# - If relevant, the packages it replaces, if there are older u-boot packages
#   also supporting that board. Example:uboot-a20-olinuxino-micro
#
# Ideally we'd like to enable people to only add these 4 variables in this
# package to add a new board. These 4 variables could go in something like
# a CVS file that is parsed, but that would require to be able to dynamically
# define packages, but even if eval package_{$_pkgname}() { [...] } works,
# it doesn't make that package function visible to makepkg.
#
# Because of that, contributors wanting to add new boards will have to search
# for example of the information mentioned above and add it in the PKGBUILD
# for their boards.
#
# After adding a new board in this PKGBUILD, to get the board officially
# supported by Parabola.you also need to create a page for it in the
# Parabola wiki for that board and update the ARM installation guide to
# point to it when relevant. Examples of that are available for other
# boards in the ARM installation guide.

pkgbase=uboot4extlinux-sunxi
pkgname=("${pkgbase}"
         'uboot4extlinux-a10-olinuxino-lime'
         'uboot4extlinux-a10s-olinuxino-m'
         'uboot4extlinux-a13-olinuxino'
         'uboot4extlinux-a13-olinuxinom'
         'uboot4extlinux-a20-olinuxino-lime'
         'uboot4extlinux-a20-olinuxino-lime2'
         'uboot4extlinux-a20-olinuxino-lime2-emmc'
         'uboot4extlinux-a20-olinuxino_micro'
         'uboot4extlinux-bananapi'
         'uboot4extlinux-bananapro'
         'uboot4extlinux-chip'
         'uboot4extlinux-cubieboard'
         'uboot4extlinux-cubieboard2'
         'uboot4extlinux-cubietruck'
         'uboot4extlinux-linksprite_pcduino'
         'uboot4extlinux-linksprite_pcduino3'
         'uboot4extlinux-linksprite_pcduino3_nano'
         'uboot4extlinux-orangepi_2'
         'uboot4extlinux-orangepi_one'
         'uboot4extlinux-orangepi_pc'
         'uboot4extlinux-orangepi_plus')

pkgver=2021.07
pkgrel=2
arch=('armv7h' 'i686' 'x86_64')
url="http://git.denx.de/u-boot.git/"
license=('GPL')
makedepends=('bc' 'dtc' 'python' 'python-setuptools' 'python2' 'swig')
makedepends_i686+=('arm-none-eabi-gcc')
makedepends_ppc64le+=('arm-none-eabi-gcc')
makedepends_x86_64+=('arm-none-eabi-gcc')
source=("ftp://ftp.denx.de/pub/u-boot/u-boot-${pkgver}.tar.bz2"
        'extlinux.conf'
        "${pkgbase}.hook.in"
        'install-uboot4extlinux.sh.in'
        "generate-${pkgbase}-install-text.sh")
sha256sums=('312b7eeae44581d1362c3a3f02c28d806647756c82ba8c72241c7cdbe68ba77e'
            'SKIP'
            'SKIP'
            'SKIP'
            'SKIP')

_defconfigs=('A10-OLinuXino-Lime_defconfig'
             'A10s-OLinuXino-M_defconfig'
             'A13-OLinuXino_defconfig'
             'A13-OLinuXinoM_defconfig'
             'A20-OLinuXino-Lime_defconfig'
             'A20-OLinuXino-Lime2_defconfig'
             'A20-OLinuXino-Lime2-eMMC_defconfig'
             'A20-OLinuXino_MICRO_defconfig'
             'Bananapi_defconfig'
             'Bananapro_defconfig'
             'CHIP_defconfig'
             'Cubieboard_defconfig'
             'Cubieboard2_defconfig'
             'Cubietruck_defconfig'
             'Linksprite_pcDuino_defconfig'
             'Linksprite_pcDuino3_defconfig'
             'Linksprite_pcDuino3_Nano_defconfig'
             'orangepi_2_defconfig'
             'orangepi_one_defconfig'
             'orangepi_pc_defconfig'
             'orangepi_plus_defconfig')

# Offset at which to install u-boot
u_boot_with_spl_offset=8192

case "$CARCH" in
    armv7h)              ARCH=arm;;
    i686|ppc64le|x86_64) ARCH=arm;CROSS_COMPILE=arm-none-eabi-;;
esac

_nr_targets=0
for _defconfig in ${_defconfigs[@]}; do
    _nr_targets=$(expr ${_nr_targets} + 1)
done

_get_target_name()
{
    _defconfig="$1"

    echo ${_defconfig} | \
        sed 's/_defconfig$//' | \
        awk '{print tolower($0)}'
}

_get_target_destdir()
{
    _defconfig="$1"

    _target_name="$(_get_target_name ${_defconfig})"

    echo "build/uboot4extlinux-${_target_name}"
}

_build_uboot_target()
{
    _defconfig="$1"

    _destdir="$(_get_target_destdir ${_defconfig})"
    _target_name="$(_get_target_name ${_defconfig})"

    unset CFLAGS CXXFLAGS LDFLAGS

    make "ARCH=${ARCH}" distclean
    make "ARCH=${ARCH}" ${_defconfig}

    echo 'CONFIG_IDENT_STRING=" Parabola GNU/Linux-libre"' >> .config

    if [ "$CARCH" = "armv7h" ]; then
        make "ARCH=${ARCH}" EXTRAVERSION=-${pkgrel}
    else
        make "ARCH=${ARCH}" "CROSS_COMPILE=${CROSS_COMPILE}" \
             EXTRAVERSION=-${pkgrel}
    fi

    echo "==> Installing ${_target_name} to ${_destdir}"
    install -d ${_destdir}
    mv -f u-boot-sunxi-with-spl.bin "${_destdir}"

}

build()
{
  cd u-boot-${pkgver}

  _target_nr=0
  for _defconfig in ${_defconfigs[@]}; do
      _target_nr=$(expr ${_target_nr} + 1)
      _target_name="$(_get_target_name ${_defconfig})"

      echo "==> Building ${_target_name} " \
           "[${_target_nr} of ${_nr_targets} targets]"

      _build_uboot_target "${_defconfig}"
  done
}

_check_uboot_target()
{
    _defconfig="$1"

    _image="$(_get_target_destdir ${_defconfig})/u-boot-sunxi-with-spl.bin"
    _image_size="$(du --bytes --apparent-size ${_image} | awk '{print $1}')"
    _offset="${u_boot_with_spl_offset}"

    _image_end=$(expr ${_image_size} + ${_offset})

    # This test comes from install-uboot4extlinux.sh.in
    if [ ${_image_end} -gt $(expr 1024 \* 1024) ] ; then
        echo "Error: ${_image} is too big:"
        echo "       offset: ${_offset}"
        echo "       size:   ${_image_size}"
        echo "       By default, "\
             "partitioing tools makes the first partition start at 1MiB"
        echo "       Instaling ${_image} "\
             "would overwrite that first partition (if it's present)."

        false # Fail the test
    fi
}

check()
{
  cd u-boot-${pkgver}

  _target_nr=0
  for _defconfig in ${_defconfigs[@]}; do
      _target_nr=$(expr ${_target_nr} + 1)
      _target_name="$(_get_target_name ${_defconfig})"

      echo "==> Testing target ${_target_name} " \
           "[${_target_nr} of ${_nr_targets} targets]"
      _check_uboot_target "${_defconfig}"
  done

}

_make_uboot_package()
{
    _pkgname="$1"

    if [ -n "${pkgdir}" ] ; then
        cd "u-boot-${pkgver}"

        # Install the u-boot binary
        install -d "${pkgdir}/usr/lib/u-boot/${_pkgname}/"
        install -Dm644 "build/${_pkgname}/u-boot-sunxi-with-spl.bin" \
                "${pkgdir}/usr/lib/u-boot/${_pkgname}"

        # Install the u-boot installation script
        sed < "${srcdir}/install-uboot4extlinux.sh.in" > \
            "${pkgdir}/usr/lib/u-boot/${_pkgname}/install-uboot4extlinux.sh" \
              -e "s|@u_boot_with_spl[@]|/usr/lib/u-boot/${_pkgname}/u-boot-sunxi-with-spl.bin|g" \
              -e "s|@u_boot_with_spl_offset[@]|${u_boot_with_spl_offset}|g"

        chmod +x \
              "${pkgdir}/usr/lib/u-boot/${_pkgname}/install-uboot4extlinux.sh"

        # Install what is required for the pacman hook
        install -d "${pkgdir}/usr/share/libalpm/hooks/"
        sed < "${srcdir}/${pkgbase}.hook.in" > \
            "${pkgdir}/usr/share/libalpm/hooks/${_pkgname}.hook" \
            -e "s|@pkgname[@]|${_pkgname}|g"

        install -d "${pkgdir}/usr/share/doc/u-boot/${_pkgname}/"
        # If we install several uboot4extlinux, we need a way to clearly
        # separate each postinstall message. To do that we wrapped the
        # text in an ASCII art square, but doing that is complicated when
        # using sed as the package name as well as the installation script
        # path both have variable length.
        sh "${srcdir}/generate-${pkgbase}-install-text.sh" \
           "${_pkgname}" \
           "${pkgbase}" \
           "/usr/lib/u-boot/${_pkgname}/install-uboot4extlinux.sh" > \
           "${pkgdir}/usr/share/doc/u-boot/${_pkgname}/install-uboot4extlinux.txt"
    fi
}

_make_pkgdesc()
{
    board_name="$1"
    echo "U-Boot with Extlinux support for ${board_name}"
}

package_uboot4extlinux-sunxi()
{
    pkgdesc="Scripts for managing U-Boot installations for computers with Allwinner System On a Chip"

    depends=('uboot-tools')

    # Users are expected to use this as a base for /boot/extlinux/extlinux.conf
    install -d "${pkgdir}/usr/lib/u-boot/${pkgname}/"
    install -Dm644 \
            "${srcdir}/extlinux.conf" \
            "${pkgdir}/usr/lib/u-boot/${pkgname}/"
}

package_uboot4extlinux-a10-olinuxino-lime()
{
    pkgdesc=$(_make_pkgdesc "A10 OLinuXino Lime")

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}

package_uboot4extlinux-a10s-olinuxino-m()
{
    pkgdesc=$(_make_pkgdesc "A10s OLinuXino Micro")

    replaces=('uboot4extlinux-a10s-olinuxino-micro')

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}

package_uboot4extlinux-a13-olinuxino()
{
    pkgdesc=$(_make_pkgdesc "A13 OLinuXino")

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}

package_uboot4extlinux-a13-olinuxinom()
{
    pkgdesc=$(_make_pkgdesc "uboot4extlinux-a13-olinuxino-micro")

    replaces=('uboot4extlinux-a13-olinuxino-micro')

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}

package_uboot4extlinux-a20-olinuxino-lime()
{
    pkgdesc=$(_make_pkgdesc "A20 OLinuXino Lime")

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}

package_uboot4extlinux-a20-olinuxino-lime2()
{
    pkgdesc=$(_make_pkgdesc "A20 OLinuXino Lime2")

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}

package_uboot4extlinux-a20-olinuxino-lime2-emmc()
{
    pkgdesc=$(_make_pkgdesc "A20 OLinuXino Lime2 with eMMC")

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}

package_uboot4extlinux-a20-olinuxino_micro()
{
    pkgdesc=$(_make_pkgdesc "uboot-a20-olinuxino-micro")

    replaces=('uboot-a20-olinuxino-micro')

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}

package_uboot4extlinux-bananapi()
{
    pkgdesc=$(_make_pkgdesc "Banana Pi")

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}

package_uboot4extlinux-bananapro()
{
    pkgdesc=$(_make_pkgdesc "Banana Pro")

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}

package_uboot4extlinux-chip()
{
    pkgdesc=$(_make_pkgdesc "C.H.I.P")

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}

package_uboot4extlinux-cubieboard()
{
    pkgdesc=$(_make_pkgdesc "Cubieboard")

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}

package_uboot4extlinux-cubieboard2()
{
    pkgdesc=$(_make_pkgdesc "Cubieboard 2")

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}

package_uboot4extlinux-cubietruck()
{
    pkgdesc=$(_make_pkgdesc "Cubietruck")

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}

package_uboot4extlinux-linksprite_pcduino()
{
    pkgdesc=$(_make_pkgdesc "uboot4extlinux-pcduino")

    replaces=('uboot4extlinux-pcduino')

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}

package_uboot4extlinux-linksprite_pcduino3()
{
    pkgdesc=$(_make_pkgdesc "uboot4extlinux-pcduino3")

    replaces=('uboot4extlinux-pcduino3')

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}

package_uboot4extlinux-linksprite_pcduino3_nano()
{
    pkgdesc=$(_make_pkgdesc "uboot4extlinux-pcduino3-nano")

    replaces=('uboot4extlinux-pcduino3-nano')

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}

package_uboot4extlinux-orangepi_2()
{
    pkgdesc=$(_make_pkgdesc "Orange Pi 2")

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}

package_uboot4extlinux-orangepi_one()
{
    pkgdesc=$(_make_pkgdesc "Orange Pi One")

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}

package_uboot4extlinux-orangepi_pc()
{
    pkgdesc=$(_make_pkgdesc "Orange Pi PC")

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}

package_uboot4extlinux-orangepi_plus()
{
    pkgdesc=$(_make_pkgdesc "Orange Pi Plus")

    # util-linux is needed for blkid for install-uboot4extlinux.sh
    depends=("${pkgbase}" 'util-linux')

    _make_uboot_package "${pkgname}"
}
