# Maintainer (arch): Christian Hesse <mail@eworm.de>
# Maintainer (arch): Ronald van Haren <ronald.archlinux.org>
# Contributor: Tobias Powalowski <tpowa@archlinux.org>
# Contributor: Keshav Amburay <(the ddoott ridikulus ddoott rat) (aatt) (gemmaeiil) (ddoott) (ccoomm)>
# Contributor: André Silva <emulatorman@hyperbola.info>
# Contributor: Márcio Silva <coadde@hyperbola.info>
# Contributor: Omar Vega Ramos <ovruni@gnu.org.pe>
# Maintainer: Luke T. Shumaker <lukeshu@parabola.nu>

# parabola changes and rationale:
# - Branded for Parabola, not Arch
# - Support more arches
# - Add more platforms:
#   + Arch starts with:
#      * --with-platform=pc (x86 BIOS)
#      * --with-platform=efi (UEFI, x86 and ARM; if
#                             _IA32_EFI_IN_ARCH_X86=1 then the x86_64
#                             package contains both 32bit and 64bit
#                             builds)
#      * --with-platform=emu (if _GRUB_EMU_BUILD=1, user-mode, x86 and ARM)
#   + Parabola additions, since
#         "grub: add armv7h support (U-Boot and UEFI)"
#         (2015-09-26, Márcio Alexandre Silva Delgado <coadde@parabola.nu>)
#      * --with-platform=uboot (ARM)
#      * --with-platform=emu (enabled _GRUB_EMU_BUILD=1, fixed dependencies)
#   + Parabola additions, since
#         "grub: rm unused grub-extras in U-Boot, fix msg  on U-Boot build; add IEEE1275 (OpenFirmware) and Libreboot support"
#         (2015-09-26, Márcio Alexandre Silva Delgado <coadde@parabola.nu>)
#      * --with-platform=ieee1275 (OpenFirmware, x86-only)
#      * --with-platform=coreboot (Libreboot, x86-only)
#   + Parabola additions, since
#         "grub: add QEMU, XEN and Multiboot support"
#         (2015-09-27, Márcio Alexandre Silva Delgado <coadde@parabola.nu>)
#      * --with-platform=xen (if _XEN=1, x86-only; if
#                             _IA32_XEN_IN_ARCH_X86=1 then the x86_64
#                             package contains both 32bit and 64bit
#                             builds)
#      * --with-platform=qemu (a separate -kernel file for Qemu, x86-only)
#      * --with-platform=multiboot (x86-only)


## "1" to enable Xen support, "0" to disable
_XEN="0"

## "1" to enable IA32-EFI build in Arch x86_64, "0" to disable
_IA32_EFI_IN_ARCH_X64="1"

## "1" to enable IA32-XEN build in Arch x86_64, "0" to disable
_IA32_XEN_IN_ARCH_X64="1"

## "1" to enable EMU build, "0" to disable
_GRUB_EMU_BUILD="1"

[[ "${CARCH}" == 'armv7h' ]] && _EFI_ARCH='arm'
[[ "${CARCH}" == 'x86_64' ]] && _EFI_ARCH='x86_64'
[[ "${CARCH}" == 'i686' ]] && _EFI_ARCH='i386'

[[ "${CARCH}" == 'x86_64' ]] && _XEN_ARCH='x86_64'
[[ "${CARCH}" == 'i686' ]] && _XEN_ARCH='i386'

[[ "${CARCH}" == 'armv7h' ]] && _EMU_ARCH='arm'
[[ "${CARCH}" == 'x86_64' ]] && _EMU_ARCH='x86_64'
[[ "${CARCH}" == 'i686' ]] && _EMU_ARCH='i386'

pkgbase='grub'
pkgname=('grub')
if [[ $CARCH == armv7h ]]; then
	pkgname+=(
		'grub-am335x_bone'
		'grub-udoo'
		'grub-omap3_beagle'
		'grub-omap3_beagle_xm'
		'grub-omap3_beagle_xm_ab'
	)
fi
pkgdesc='GNU GRand Unified Bootloader (2)'
pkgdesc+=', (Parabola rebranded)'
epoch=2
_tag='03e6ea18f6f834f177cad017279bedbb0a3de594' # git rev-parse grub-${_pkgver}
_pkgver=2.12
_unifont_ver='15.1.04'
pkgver=${_pkgver/-/}
pkgrel=1
pkgrel+=.parabola3
url='https://www.gnu.org/software/grub/'
arch=('x86_64')
arch+=('i686')
arch+=('armv7h')
license=('GPL-3.0-or-later')
backup=('etc/default/grub'
        'etc/grub.d/40_custom')
install="${pkgname}.install"
options=('!makeflags')

conflicts=('grub-common' 'grub-bios' 'grub-emu' "grub-efi-${_EFI_ARCH}" 'grub-legacy')
conflicts+=('grub-parabola')
replaces=('grub-common' 'grub-bios' 'grub-emu' "grub-efi-${_EFI_ARCH}")
replaces+=('grub-parabola')
provides=('grub-common' 'grub-bios' 'grub-emu' "grub-efi-${_EFI_ARCH}")
if [[ "${CARCH}" = 'armv7h' ]]; then
	conflicts=('grub-common' 'grub-emu' "grub-efi-${_EFI_ARCH}")
	replaces=('grub-common' 'grub-emu' "grub-efi-${_EFI_ARCH}")
	provides=('grub-common' 'grub-emu' "grub-efi-${_EFI_ARCH}")
fi

makedepends=('git' 'rsync' 'xz' 'freetype2' 'ttf-dejavu' 'python' 'autogen'
             'texinfo' 'help2man' 'gettext' 'device-mapper' 'fuse3')
depends=('sh' 'xz' 'gettext' 'device-mapper')
optdepends=('freetype2: For grub-mkfont usage'
            'fuse3: For grub-mount usage'
            #'dosfstools: For grub-mkrescue FAT FS and EFI support'                            # drop 'and EFI' from the device-specific arm-uboot packages
            'lzop: For grub-mkrescue LZO support'
            #'efibootmgr: For grub-install EFI support'                                        # drop from the device-specific arm-uboot packages
            #'libisoburn: Provides xorriso for generating grub rescue iso using grub-mkrescue' # drop from the device-specific arm-uboot packages
            'os-prober: To detect other OSes when generating grub.cfg in BIOS systems'
            'mtools: For grub-mkrescue FAT FS support')

if [[ "${CARCH}" = 'x86_64' ]] && [[ "${_XEN}" = '1' ]]; then
	makedepends+=('xen')
fi

if [[ "${_GRUB_EMU_BUILD}" == "1" ]]; then
    makedepends+=('sdl')
    #optdepends+=('sdl: For grub-emu SDL support')    # drop from the device-specific arm-uboot packages
fi

validpgpkeys=('E53D497F3FA42AD8C9B4D1E835A93B74E82E4209'  # Vladimir 'phcoder' Serbinenko <phcoder@gmail.com>
              'BE5C23209ACDDACEB20DB0A28C8189F1988C2166'  # Daniel Kiper <dkiper@net-space.pl>
              '95D2E9AB8740D8046387FD151A09227B1F435A33') # Paul Hardy <unifoundry@unifoundry.com>

# For grub-linguas-*.tar
_linguas_ver=20231125 # Get this date from the output of `rsync translationproject.org::tp/latest/grub`
validpgpkeys+=('99195DD3BB6FE10A2F36ED8445698744D4FFBFC9')  # Luke Shumaker

source=("git+https://git.savannah.gnu.org/git/grub.git#tag=${_tag}?signed"
        'git+https://git.savannah.gnu.org/git/gnulib.git'
        "https://ftp.gnu.org/gnu/unifont/unifont-${_unifont_ver}/unifont-${_unifont_ver}.bdf.gz"{,.sig}
        "https://repo.parabola.nu/other/grub/grub-linguas-${_linguas_ver}.tar.xz"{,.sig}
        '0001-00_header-add-GRUB_COLOR_-variables.patch'
        '0002-10_linux-20_linux_xen-detect-parabola-initramfs.patch'
        '0003-support-dropins-for-default-configuration.patch'
        '0004-10_linux-20_linux_xen-rebrand-free-distros.patch'
        'grub.default'
        'sbat.csv')
source_armv7h=(
        '1000-am335x_bone--10_linux-20_linux_xen-detect-devicetree-file.patch'
        '1000-omap3_beagle--10_linux-20_linux_xen-detect-devicetree-file.patch'
        '1000-omap3_beagle_xm--10_linux-20_linux_xen-detect-devicetree-file.patch'
        '1000-omap3_beagle_xm_ab--10_linux-20_linux_xen-detect-devicetree-file.patch'
        '1000-udoo--10_linux-20_linux_xen-detect-devicetree-file.patch')

sha256sums=('SKIP'
            'SKIP'
            '88e00954b10528407e62e97ce6eaa88c847ebfd9a464cafde6bf55c7e4eeed54'
            'SKIP'
            '0d6cde9ef6e24a5c4f22cc731f64345e2e4cdc363dc00cef20e162a7946faaaa'
            'SKIP'
            'c25a09792ad97ca93ff385f1821b8c071b28d0ee86c1c4af9365cc00dc5b2b12'
            '1dd3df0838f9aa737beb0298b855bc93b07d8f3926460ccb8b8f30f5fece3abf'
            'a096658d0f48a8b8d0d526d679c2106d0a5bf2a5afb6f2ca7e37f1f2ac33fd85'
            '281a5225d68be7c230ff2d8175d920bf507439f3fc42cbe866fc31530a1465d3'
            'c7c38d62c1238671a09094ceb71befc3fe3873f18343ef0a6f3089d9576dbd43'
            '50cab883c2412bb583c0521ed34e75aa080ccfc50826ab9d02a4db250ae5c05e')
sha256sums_armv7h=('0f2e9abaf872e1e18dfe0cd1da42bdc4f49d3956f97a01c39b82c0e3016c1a32'
                   'c0d84384db273d9fd6ea2aab2a9d8ba36402daf8daf591dcba329cfa02253c87'
                   'ef105dcc067c673e543d4d5384aa7bf6b93e9eca96fec4323ab69a91ec079f56'
                   'f5fb1673536d56a88b3d1aaec75501e4d0acca081ac658d1059ec276f9e062c6'
                   'd8911a513166d2db337b9449542e0ad0e91b114f92dc4b876d88d77d23829a1d')

_backports=(
)

_reverts=(
)

_configure_options=(
	PACKAGE_VERSION="${epoch}:${pkgver}-${pkgrel}"
	FREETYPE="pkg-config freetype2"
	BUILD_FREETYPE="pkg-config freetype2"
	--enable-nls
	--enable-device-mapper
	--enable-cache-stats
	--enable-grub-mkfont
	--enable-grub-mount
	--prefix="/usr"
	--bindir="/usr/bin"
	--sbindir="/usr/bin"
	--mandir="/usr/share/man"
	--infodir="/usr/share/info"
	--datarootdir="/usr/share"
	--sysconfdir="/etc"
	--program-prefix=""
	--with-bootdir="/boot"
	--with-grubdir="grub"
	--disable-silent-rules
	--disable-werror
)

mksource=("${source[0]}")
mksha256sums=('SKIP')
mksource() {
	cd "$srcdir/grub"
	./linguas.sh # rsync from translationproject.org::tp/latest/grub
	git ls-files -z | xargs -0 git rm -f --
	rm -rf .git
	export SOURCE_DATE_EPOCH="$(stat --format='%Y' po/*.po|sort|tail -n1)"
}

prepare() {
	cd "${srcdir}/grub/"

	echo "Apply backports..."
	local _c
	for _c in "${_backports[@]}"; do
		git log --oneline -1 "${_c}"
		git cherry-pick -n "${_c}"
	done

	echo "Apply reverts..."
	local _c
	for _c in "${_reverts[@]}"; do
		git log --oneline -1 "${_c}"
		git revert -n "${_c}"
	done

	echo "Patch to enable GRUB_COLOR_* variables in grub-mkconfig..."
	## Based on http://lists.gnu.org/archive/html/grub-devel/2012-02/msg00021.html
	patch -Np1 -i "${srcdir}/0001-00_header-add-GRUB_COLOR_-variables.patch"

	echo "Patch to detect of Parabola GNU/Linux-libre initramfs images by grub-mkconfig..."
	patch -Np1 -i "${srcdir}/0002-10_linux-20_linux_xen-detect-parabola-initramfs.patch"

	echo "Patch to support dropins for default configuration..."
	patch -Np1 -i "${srcdir}/0003-support-dropins-for-default-configuration.patch"

	echo "Fix DejaVuSans.ttf location so that grub-mkfont can create *.pf2 files for starfield theme..."
	sed 's|/usr/share/fonts/dejavu|/usr/share/fonts/dejavu /usr/share/fonts/TTF|g' -i "configure.ac"

	echo "Rebranding for some free distros..."
	patch -Np1 -i "${srcdir}/0004-10_linux-20_linux_xen-rebrand-free-distros.patch"

	echo "Fix mkinitcpio 'rw' FS#36275..."
	sed 's| ro | rw |g' -i "util/grub.d/10_linux.in"

	# linguas.sh rsync's from translationproject.org; this will
	# fail with libremakepkg because networking is turned off.
	# Instead, we do this in mksource().
	#echo "Pull in latest language files..."
	#./linguas.sh

	echo "Avoid problem with unifont during compile of grub..."
	# http://savannah.gnu.org/bugs/?40330 and https://bugs.archlinux.org/task/37847
	gzip -cd "${srcdir}/unifont-${_unifont_ver}.bdf.gz" > "unifont.bdf"

	echo "Run bootstrap..."
	./bootstrap \
		--gnulib-srcdir="${srcdir}/gnulib/" \
		--no-git

	echo "Make translations reproducible..."
	sed -i '1i /^PO-Revision-Date:/ d' po/*.sed
}

# Usage: _build_grub DIRSUFFIX 'Human Description' CPU-PLATFORM CONFIG_OPTIONS...
_build_grub() {
	local bld_name="$1"
	local bld_desc="$2"
	local bld_cpu="${3%-*}"
	local bld_plat="${3#*-}"
	local bld_configure_options=("${@:4}")

	echo "Build grub ${bld_desc} stuff..."

	echo "Copy the source for building the ${bld_desc} part..."
	cp -r "${srcdir}/grub/" "${srcdir}/grub-${bld_name}/"
	cd "${srcdir}/grub-${bld_name}/"

	echo "Unset all compiler FLAGS for ${bld_desc} build..."
	unset CFLAGS
	unset CPPFLAGS
	unset CXXFLAGS
	unset LDFLAGS
	unset MAKEFLAGS

	echo "Run ./configure for ${bld_desc} build..."
	./configure \
		--with-platform="${bld_plat}" \
		--target="${bld_cpu}" \
		"${bld_configure_options[@]}"

	echo "Make info pages reproducible..."
	touch -d "@${SOURCE_DATE_EPOCH}" $(find -name '*.texi')

	echo "Run make for ${bld_desc} build..."
	make
}

_build_grub-bios() {
	echo "Set ARCH dependent variables for bios build..."
	local _EFIEMU
	if [[ "${CARCH}" == 'x86_64' ]]; then
		_EFIEMU="--enable-efiemu"
	else
		_EFIEMU="--disable-efiemu"
	fi

	_build_grub 'bios' 'bios' \
		'i386-pc' \
		"${_EFIEMU}" \
		--enable-boot-time \
		"${_configure_options[@]}"
}

_build_grub-efi() {
	_build_grub "efi-${_EFI_ARCH}" "${_EFI_ARCH} efi" \
		"${_EFI_ARCH}-efi" \
		--disable-efiemu \
		--enable-boot-time \
		"${_configure_options[@]}"
}

_build_grub-emu() {
	_build_grub 'emu' 'emu' \
		"${_EMU_ARCH}-emu" \
		--enable-grub-emu-usb=no \
		--enable-grub-emu-sdl=no \
		--disable-grub-emu-pci \
		"${_configure_options[@]}"
}

_build_grub-xen() {
	_build_grub "xen-${_XEN_ARCH}" "${_XEN_ARCH} XEN" \
		"${_XEN_ARCH}-xen" \
		--disable-efiemu \
		--enable-boot-time \
		"${_configure_options[@]}"
}

_build_grub-qemu() {
	_build_grub 'qemu' 'QEMU' \
		'i386-qemu' \
		--disable-efiemu \
		--enable-boot-time \
		"${_configure_options[@]}"
}

_build_grub-ieee1275() {
	_build_grub 'ieee1275' 'IEEE1275 (OpenFirmware)' \
		'i386-ieee1275' \
		--disable-efiemu \
		--enable-boot-time \
		"${_configure_options[@]}"
}

_build_grub-libreboot() {
	_build_grub 'libreboot' 'Libreboot' \
		'i386-coreboot' \
		--disable-efiemu \
		--enable-boot-time \
		"${_configure_options[@]}"
}

_build_grub-multiboot() {
	_build_grub 'multiboot' 'Multiboot' \
		'i386-multiboot' \
		--disable-efiemu \
		--enable-boot-time \
		"${_configure_options[@]}"
}

_build_grub-uboot() {
	_build_grub 'uboot' 'U-Boot' \
		'arm-uboot' \
		--disable-efiemu \
		--enable-boot-time \
		"${_configure_options[@]}"
}

build() {
	cd "${srcdir}/grub/"

	# All-CPU platforms ####################################################

	_build_grub-efi
	if [[ "${CARCH}" == "x86_64" ]] && [[ "${_IA32_EFI_IN_ARCH_X64}" == "1" ]]; then
		_EFI_ARCH="i386" _build_grub-efi
	fi

	if [[ "${_GRUB_EMU_BUILD}" == "1" ]]; then
		_build_grub-emu
	fi

	# CPU-specific platforms ###############################################

	case "$CARCH" in
	x86_64|i686)
		_build_grub-bios
		_build_grub-qemu
		_build_grub-ieee1275
		_build_grub-libreboot
		_build_grub-multiboot
		if [[ "${_XEN}" = '1' ]]; then
			_build_grub-xen
			if [[ "${CARCH}" = 'x86_64' ]] && [[ "${_IA32_XEN_IN_ARCH_X64}" = '1' ]]; then
				_XEN_ARCH='i386' _build_grub-xen
			fi
		fi
		;;
	armv7h)
		_build_grub-uboot
		;;
	esac
}

# Usage: _package_grub DIRSUFFIX 'Human Description' CPU-PLATFORM
_package_grub() {
	local bld_name="$1"
	local bld_desc="$2"
	local bld_cpuplat="$3"

	echo "Package grub ${bld_desc} stuff..."

	cd "${srcdir}/grub-${bld_name}/"

	echo "Run make install for ${bld_desc} build..."
	make DESTDIR="${pkgdir}/" bashcompletiondir="/usr/share/bash-completion/completions" install

	echo "Remove gdb debugging related files for ${bld_desc} build..."
	rm -f "${pkgdir}/usr/lib/grub/${bld_cpuplat}"/*.module || true
	rm -f "${pkgdir}/usr/lib/grub/${bld_cpuplat}"/*.image || true
	rm -f "${pkgdir}/usr/lib/grub/${bld_cpuplat}"/{kernel.exec,gdb_grub,gmodule.pl} || true
}

_package_grub-bios() {
	_package_grub 'bios' 'bios' \
		'i386-pc'
}

_package_grub-efi() {
	_package_grub "efi-${_EFI_ARCH}" "${_EFI_ARCH} efi" \
		"${_EFI_ARCH}-efi"

	sed -e "s/%PKGVER%/${epoch}:${pkgver}-${pkgrel}/" -e "s/%CARCH%/${CARCH}/" < "${srcdir}/sbat.csv" > "${pkgdir}/usr/share/grub/sbat.csv"
}

_package_grub-emu() {
	_package_grub 'emu' 'emu' \
		"${_EMU_ARCH}-emu"
}

_package_grub-xen() {
	_package_grub "xen-${_XEN_ARCH}" "${_XEN_ARCH} XEN" \
		"${_XEN_ARCH}-xen"
}

_package_grub-qemu() {
	_package_grub 'qemu' 'QEMU' \
		'i386-qemu'
}

_package_grub-ieee1275() {
	_package_grub 'ieee1275' 'IEEE1275 (OpenFirmware)' \
		'i386-ieee1275'
}

_package_grub-libreboot() {
	_package_grub 'libreboot' 'Libreboot' \
		'i386-coreboot'
}

_package_grub-multiboot() {
	_package_grub 'multiboot' 'Multiboot' \
		'i386-multiboot'
}

_package_grub-uboot() {
	_package_grub 'uboot' 'U-Boot' \
		'arm-uboot'
}

package_grub() {
	optdepends+=('dosfstools: For grub-mkrescue FAT FS and EFI support'
	             'efibootmgr: For grub-install EFI support'
	             'libisoburn: Provides xorriso for generating grub rescue iso using grub-mkrescue')

	if [[ "${_GRUB_EMU_BUILD}" = '1' ]]; then
		optdepends+=('sdl: For grub-emu SDL support')
	fi

	cd "${srcdir}/grub/"

	# All-CPU platforms ####################################################

	_package_grub-efi
	if [[ "${CARCH}" == "x86_64" ]] && [[ "${_IA32_EFI_IN_ARCH_X64}" == "1" ]]; then
		_EFI_ARCH="i386" _package_grub-efi
	fi

	if [[ "${_GRUB_EMU_BUILD}" == "1" ]]; then
		_package_grub-emu
	fi

	# CPU-specific platforms ###############################################

	case "$CARCH" in
	x86_64|i686)
		_package_grub-bios
		_package_grub-qemu
		_package_grub-ieee1275
		_package_grub-libreboot
		_package_grub-multiboot
		if [[ "${_XEN}" = '1' ]]; then
			_package_grub-xen
			if [[ "${CARCH}" = 'x86_64' ]] && [[ "${_IA32_XEN_IN_ARCH_X64}" = '1' ]]; then
				_XEN_ARCH='i386' _package_grub-xen
			fi
		fi
		;;
	armv7h)
		_package_grub-uboot
		;;
	esac

	# Common ###############################################################

	echo "Install /etc/default/grub (used by grub-mkconfig)..."
	install -D -m0644 "${srcdir}/grub.default" "${pkgdir}/etc/default/grub"
}

_package_grub-uboot-dev() {
	local devname=$1
	local devdesc=$2

	pkgdesc="GNU GRand Unified Bootloader (2) for $devdesc ($devname), (Parabola rebranded)"
	optdepends+=('dosfstools: For grub-mkrescue FAT FS')

	echo "Copy the source for packaging the U-Boot ($devname) part..."
	cp -a "${srcdir}/grub-uboot/" "${srcdir}/grub-uboot_$devname/"
	cd "${srcdir}/grub-uboot_$devname/"

	echo "Patch to detect $devname device tree blob file (dtb)..."
	patch -Np1 -i "${srcdir}/1000-${pkgname#grub-}--10_linux-20_linux_xen-detect-devicetree-file.patch"

	_package_grub "uboot_$devname" "$devdesc" 'arm-uboot'

	echo 'Install /etc/default/grub (used by grub-mkconfig)...'
	install -D -m0644 "${srcdir}/grub.default" "${pkgdir}/etc/default/grub"
}

package_grub-am335x_bone() {
	_package_grub-uboot-dev 'am335x-bone' 'BeagleBone and BeagleBone Black'
}

package_grub-omap3_beagle() {
	provides+=('grub-beagleboard')
	_package_grub-uboot-dev "${pkgname#grub-}" 'BeagleBoard'
}

package_grub-omap3_beagle_xm() {
	provides+=('grub-beagleboard')
	_package_grub-uboot-dev "${pkgname#grub-}" 'BeagleBoard-xM'
}

package_grub-omap3_beagle_xm_ab() {
	provides+=('grub-beagleboard')
	_package_grub-uboot-dev "${pkgname#grub-}" 'BeagleBoard-xM rev A/B'
}

package_grub-udoo() {
	_package_grub-uboot-dev "${pkgname#grub-}" 'UDOO'
}
