# vim:filetype=spec
# Modules always contain just 32-bit code
%global _libdir %{_exec_prefix}/lib
%global _binaries_in_noarch_packages_terminate_build 0
#%%undefine _missing_build_ids_terminate_build
%{expand:%%{!?buildsubdir:%%global buildsubdir grub-%{tarversion}}}
%{expand:%%{!?_licensedir:%%global license %%%%doc}}

%global _configure ../configure

%if %{?_with_ccache: 1}%{?!_with_ccache: 0}
%global cc_equals CC=/usr/%{_lib}/ccache/gcc
%else
%global cc_equals %{nil}
%endif

%global cflags_sed						\\\
	sed							\\\
		-e 's/-O. //g'					\\\
		-e 's/-g /-g3 /g'				\\\
		-e 's/-fplugin=annobin //g'			\\\
		-e 's,-specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 ,,g' \\\
		-e 's/-fstack-protector[[:alpha:]-]\\+//g'	\\\
		-e 's/-Wp,-D_FORTIFY_SOURCE=[[:digit:]]\\+//g'	\\\
		-e 's/--param=ssp-buffer-size=4//g'		\\\
		-e 's/-mregparm=3/-mregparm=4/g'		\\\
		-e 's/-fexceptions//g'				\\\
		-e 's/-fasynchronous-unwind-tables//g'		\\\
		-e 's/^/ -fno-strict-aliasing /'		\\\
		%{nil}

%global host_cflags %{expand:%%(echo %{optflags} | %{cflags_sed})}
%global target_cflags %{expand:%%(echo %{optflags} | %{cflags_sed})}

%global legacy_target_cflags					\\\
	%{expand:%%(echo %{target_cflags} | 			\\\
	%{cflags_sed}						\\\
		-e 's/-m64//g'					\\\
		-e 's/-mcpu=power[[:alnum:]]\\+/-mcpu=power6/g'	\\\
	)}
%global legacy_host_cflags					\\\
	%{expand:%%(echo %{host_cflags} | 			\\\
	%{cflags_sed}						\\\
		-e 's/-m64//g'					\\\
		-e 's/-mcpu=power[[:alnum:]]\\+/-mcpu=power6/g'	\\\
	)}

%global efi_host_cflags %{expand:%%(echo %{host_cflags})}
%global efi_target_cflags %{expand:%%(echo %{target_cflags})}

%global with_efi_arch 0
%global with_alt_efi_arch 0
%global with_legacy_arch 0
%global grubefiarch %{nil}
%global grublegacyarch %{nil}

# sparc is always compiled 64 bit
%ifarch %{sparc}
%global target_cpu_name sparc64
%global _target_platform %{target_cpu_name}-%{_vendor}-%{_target_os}%{?_gnu}
%global legacy_target_cpu_name %{_arch}
%global legacy_package_arch ieee1275
%global platform ieee1275
%endif
# ppc is always compiled 64 bit
%ifarch ppc ppc64 ppc64le
%global target_cpu_name %{_arch}
%global legacy_target_cpu_name powerpc
%global legacy_package_arch %{_arch}
%global legacy_grub_dir powerpc-ieee1275
%global _target_platform %{target_cpu_name}-%{_vendor}-%{_target_os}%{?_gnu}
%global platform ieee1275
%endif


%global efi_only aarch64 %{arm}
%global efi_arch x86_64 %{ix86} ia64 %{efi_only}
%ifarch %{efi_arch}
%global with_efi_arch 1
%else
%global with_efi_arch 0
%endif
%ifarch %{efi_only}
%global with_efi_only 1
%else
%global with_efi_only 0
%endif
%{!?with_efi_arch:%global without_efi_arch 0}
%{?with_efi_arch:%global without_efi_arch 1}
%{!?with_efi_only:%global without_efi_only 0}
%{?with_efi_only:%global without_efi_only 1}

### fixme
%ifarch aarch64 %{arm}
%global efi_modules " "
%else
%global efi_modules " backtrace chain usb usbserial_common usbserial_pl2303 usbserial_ftdi usbserial_usbdebug "
%endif

%ifarch aarch64 %{arm}
%global legacy_provides -l
%endif

%ifarch %{ix86}
%global efiarch ia32
%global target_cpu_name i386
%global grub_target_name i386-efi
%global package_arch efi-ia32

%global legacy_target_cpu_name i386
%global legacy_package_arch pc
%global platform pc
%endif

%ifarch x86_64
%global efiarch x64
%global target_cpu_name %{_arch}
%global grub_target_name %{_arch}-efi
%global package_arch efi-x64

%global legacy_target_cpu_name i386
%global legacy_package_arch pc
%global platform pc

%global alt_efi_arch ia32
%global alt_target_cpu_name i386
%global alt_grub_target_name i386-efi
%global alt_platform efi
%global alt_package_arch efi-ia32

%global alt_efi_host_cflags %{expand:%%(echo %{efi_host_cflags})}
%global alt_efi_target_cflags					\\\
	%{expand:%%(echo %{target_cflags} |			\\\
	%{cflags_sed}						\\\
		-e 's/-m64//g'					\\\
	)}
%endif

%ifarch aarch64
%global efiarch aa64
%global target_cpu_name aarch64
%global grub_target_name arm64-efi
%global package_arch efi-aa64
%endif

%ifarch %{arm}
%global efiarch arm
%global target_cpu_name arm
%global grub_target_name arm-efi
%global package_arch efi-arm
%global efi_target_cflags						\\\
	%{expand:%%(echo %{optflags} |					\\\
	%{cflags_sed}							\\\
		-e 's/-march=armv7-a[[:alnum:]+-]*/&+nofp/g'		\\\
		-e 's/-mfpu=[[:alnum:]-]\\+//g'				\\\
		-e 's/-mfloat-abi=[[:alpha:]]\\+/-mfloat-abi=soft/g'	\\\
	)}
%endif

%global _target_platform %{target_cpu_name}-%{_vendor}-%{_target_os}%{?_gnu}
%global _alt_target_platform %{alt_target_cpu_name}-%{_vendor}-%{_target_os}%{?_gnu}

%ifarch %{efi_arch}
%global with_efi_arch 1
%global grubefiname grub%{efiarch}.efi
%global grubeficdname gcd%{efiarch}.efi
%global grubefiarch %{target_cpu_name}-efi
%ifarch %{ix86}
%global with_efi_modules 0
%global without_efi_modules 1
%else
%global with_efi_modules 1
%global without_efi_modules 0
%endif
%endif

%if 0%{?alt_efi_arch:1}
%global with_alt_efi_arch 1
%global grubaltefiname grub%{alt_efi_arch}.efi
%global grubalteficdname gcd%{alt_efi_arch}.efi
%global grubaltefiarch %{alt_target_cpu_name}-efi
%endif

%ifnarch %{efi_only}
%global with_legacy_arch 1
%global grublegacyarch %{legacy_target_cpu_name}-%{platform}
%global moduledir %{legacy_target_cpu_name}-%{platform}
%endif

%global evr %{epoch}:%{version}-%{release}

%ifarch x86_64
%global with_efi_common 1
%global with_legacy_modules 1
%global with_legacy_common 0
%else
%global with_efi_common 0
%global with_legacy_common 1
%global with_legacy_modules 1
%endif

%define define_legacy_variant()						\
%{expand:%%package %%{1}}						\
Summary:	Bootloader with support for Linux, Multiboot, and more	\
Group:		System Environment/Base					\
Provides:	%{name} = %{evr}					\
Obsoletes:	%{name} < %{evr}					\
Requires:	%{name}-common = %{evr}					\
Requires:	%{name}-tools-minimal = %{evr}				\
Requires:	%{name}-%{1}-modules = %{evr}				\
Requires:	gettext which file					\
Requires:	%{name}-tools-extra = %{evr}				\
Requires:	%{name}-tools = %{evr}					\
Requires(pre):	dracut							\
Requires(post): dracut							\
%{expand:%%description %%{1}}						\
%{desc}									\
This subpackage provides support for %%{1} systems.			\
									\
%{expand:%%{?!buildsubdir:%%define buildsubdir grub-%%{1}-%{tarversion}}}\
%{expand:%%if 0%%{with_legacy_modules}					\
%%package %%{1}-modules							\
Summary:	Modules used to build custom grub images		\
Group:		System Environment/Base					\
BuildArch:	noarch							\
Requires:	%%{name}-common = %%{evr}				\
%%description %%{1}-modules						\
%%{desc}								\
This subpackage provides support for rebuilding your own grub.efi.	\
%%endif									\
}									\
									\
%{expand:%%{?!buildsubdir:%%define buildsubdir grub-%%{1}-%{tarversion}}}\
%{expand:%%package %%{1}-tools}						\
Summary:	Support tools for GRUB.					\
Group:		System Environment/Base					\
Requires:	gettext os-prober which file system-logos		\
Requires:	%{name}-common = %{evr}					\
Requires:	%{name}-tools-minimal = %{evr}				\
Requires:	os-prober >= 1.58-11					\
Requires:	gettext which file					\
									\
%{expand:%%description %%{1}-tools}					\
%{desc}									\
This subpackage provides tools for support of %%{1} platforms.		\
%{nil}

%define define_efi_variant(o)						\
%{expand:%%package %{1}}						\
Summary:	GRUB for EFI systems.					\
Group:		System Environment/Base					\
Requires:	efi-filesystem						\
Requires:	%{name}-common = %{evr}					\
Requires:	%{name}-tools-minimal >= %{evr}				\
Requires:	%{name}-tools-extra = %{evr}				\
Requires:	%{name}-tools = %{evr}					\
Provides:	%{name}-efi = %{evr}					\
%{?legacy_provides:Provides:	%{name} = %{evr}}			\
%{-o:Obsoletes:	%{name}-efi < %{evr}}					\
									\
%{expand:%%description %{1}}						\
%{desc}									\
This subpackage provides support for %{1} systems.			\
									\
%{expand:%%{?!buildsubdir:%%define buildsubdir grub-%{1}-%{tarversion}}}\
%{expand:%if 0%{?with_efi_modules}					\
%{expand:%%package %{1}-modules}					\
Summary:	Modules used to build custom grub.efi images		\
Group:		System Environment/Base					\
BuildArch:	noarch							\
Requires:	%{name}-common = %{evr}					\
Provides:	%{name}-efi-modules = %{evr}				\
Obsoletes:	%{name}-efi-modules < %{evr}				\
%{expand:%%description %{1}-modules}					\
%{desc}									\
This subpackage provides support for rebuilding your own grub.efi.	\
%endif}									\
									\
%{expand:%%package %{1}-cdboot}						\
Summary:	Files used to boot removeable media with EFI		\
Group:		System Environment/Base					\
Requires:	%{name}-common = %{evr}					\
Provides:	%{name}-efi-cdboot = %{evr}				\
%{expand:%%description %{1}-cdboot}					\
%{desc}									\
This subpackage provides optional components of grub used with removeable media on %{1} systems.\
%{nil}

%global do_common_setup()					\
%setup -q -n grub-%{tarversion}					\
rm -fv docs/*.info						\
cp %{SOURCE6} .gitignore					\
cp %{SOURCE8} ./grub-core/tests/strtoull_test.c			\
git init							\
echo '![[:digit:]][[:digit:]]_*.in' > util/grub.d/.gitignore	\
echo '!*.[[:digit:]]' > util/.gitignore				\
echo '!config.h' > include/grub/emu/.gitignore			\
git config user.email "%{name}-owner@fedoraproject.org"		\
git config user.name "Fedora Ninjas"				\
git config gc.auto 0						\
rm -f configure							\
git add .							\
git commit -a -q -m "%{tarversion} baseline."			\
git apply --index --whitespace=nowarn %{SOURCE3}		\
git commit -a -q -m "%{tarversion} master."			\
git am --whitespace=nowarn %%{patches} </dev/null		\
autoreconf -vi							\
git add .							\
git commit -a -q -m "autoreconf"				\
autoconf							\
PYTHON=python3 ./autogen.sh					\
%{nil}

%define do_efi_configure()					\
%configure							\\\
	%{cc_equals}						\\\
	HOST_CFLAGS="%{3} -I$(pwd)"				\\\
	HOST_CPPFLAGS="${CPPFLAGS} -I$(pwd)"			\\\
	TARGET_CFLAGS="%{2} -I$(pwd)"				\\\
	TARGET_CPPFLAGS="${CPPFLAGS} -I$(pwd)"			\\\
	TARGET_LDFLAGS=-static					\\\
	--with-platform=efi					\\\
	--with-utils=host					\\\
	--target=%{1}						\\\
	--with-grubdir=%{name}					\\\
	--program-transform-name=s,grub,%{name},		\\\
	--disable-grub-mount					\\\
	--disable-werror || ( cat config.log ; exit 1 )		\
git add .							\
git commit -m "After efi configure"				\
%{nil}

%define do_efi_build_modules()					\
make %{?_smp_mflags} ascii.h widthspec.h			\
make %{?_smp_mflags} -C grub-core				\
%{nil}

%define do_efi_build_all()					\
make %{?_smp_mflags}						\
%{nil}

%define do_efi_link_utils()					\
for x in grub-mkimage ; do					\\\
	ln ../grub-%{1}-%{tarversion}/${x} ./ ;			\\\
done								\
%{nil}

%ifarch x86_64 aarch64 %{arm}
%define mkimage()						\
%{4}./grub-mkimage -O %{1} -o %{2}.orig				\\\
	-p /EFI/%{efi_vendor} -d grub-core ${GRUB_MODULES}	\
%{4}./grub-mkimage -O %{1} -o %{3}.orig				\\\
	-p /EFI/BOOT -d grub-core ${GRUB_MODULES}		\
%{expand:%%{pesign -s -i %%{2}.orig -o %%{2} -a %%{5} -c %%{6} -n %%{7}}}	\
%{expand:%%{pesign -s -i %%{3}.orig -o %%{3} -a %%{5} -c %%{6} -n %%{7}}}	\
%{nil}
%else
%define mkimage()						\
%{4}./grub-mkimage -O %{1} -o %{2}				\\\
	-p /EFI/%{efi_vendor} -d grub-core ${GRUB_MODULES}	\
%{4}./grub-mkimage -O %{1} -o %{3}				\\\
	-p /EFI/BOOT -d grub-core ${GRUB_MODULES}		\
%{nil}
%endif

%define do_efi_build_images()					\
GRUB_MODULES="	all_video boot blscfg btrfs			\\\
		cat configfile					\\\
		echo efi_netfs efifwsetup efinet ext2		\\\
		fat font gfxmenu gfxterm gzio			\\\
		halt hfsplus http increment iso9660 jpeg	\\\
		loadenv loopback linux lvm lsefi lsefimmap	\\\
		mdraid09 mdraid1x minicmd net			\\\
		normal part_apple part_msdos part_gpt		\\\
		password_pbkdf2 png reboot			\\\
		search search_fs_uuid search_fs_file		\\\
		search_label serial sleep syslinuxcfg test tftp	\\\
		version video xfs"				\
GRUB_MODULES+=%{efi_modules}					\
%{expand:%%{mkimage %{1} %{2} %{3} %{4}}}			\
%{nil}

%define do_primary_efi_build()					\
cd grub-%{1}-%{tarversion}					\
%{expand:%%do_efi_configure %%{4} %%{5} %%{6}}			\
%do_efi_build_all						\
%{expand:%%do_efi_build_images %{grub_target_name} %{2} %{3} ./ } \
cd ..								\
%{nil}

%define do_alt_efi_build()					\
cd grub-%{1}-%{tarversion}					\
%{expand:%%do_efi_configure %%{4} %%{5} %%{6}}			\
%do_efi_build_modules						\
%{expand:%%do_efi_link_utils %{grubefiarch}}			\
%{expand:%%do_efi_build_images %{alt_grub_target_name} %{2} %{3} ../grub-%{grubefiarch}-%{tarversion}/ } \
cd ..								\
%{nil}

%define do_legacy_build()					\
cd grub-%{1}-%{tarversion}					\
%configure							\\\
	%{cc_equals}						\\\
	HOST_CFLAGS="%{legacy_host_cflags} -I$(pwd)"		\\\
	TARGET_CFLAGS="%{legacy_target_cflags} -I$(pwd)"	\\\
	TARGET_LDFLAGS=-static					\\\
	--with-platform=%{platform}				\\\
	--with-utils=host					\\\
	--target=%{_target_platform}				\\\
	--with-grubdir=%{name}					\\\
	--program-transform-name=s,grub,%{name},		\\\
	--disable-grub-mount					\\\
	--disable-werror || ( cat config.log ; exit 1 )		\
git add .							\
git commit -m "After legacy configure"					\
make %{?_smp_mflags}						\
cd ..								\
%{nil}

%define do_alt_efi_install()					\
cd grub-%{1}-%{tarversion}					\
install -d -m 755 $RPM_BUILD_ROOT/usr/lib/grub/%{grubaltefiarch}/ \
find . '(' -iname gdb_grub					\\\
	-o -iname kernel.exec					\\\
	-o -iname kernel.img					\\\
	-o -iname config.h					\\\
	-o -iname gmodule.pl					\\\
	-o -iname modinfo.sh					\\\
	-o -iname '*.lst'					\\\
	-o -iname '*.mod'					\\\
	')'							\\\
	-exec cp {} $RPM_BUILD_ROOT/usr/lib/grub/%{grubaltefiarch}/ \\\; \
find $RPM_BUILD_ROOT -type f -iname "*.mod*" -exec chmod a-x {} '\;'	\
install -m 700 %{2} $RPM_BUILD_ROOT%{efi_esp_dir}/%{2}	\
install -m 700 %{3} $RPM_BUILD_ROOT%{efi_esp_dir}/%{3} \
cd ..								\
%{nil}

%define do_efi_install()					\
cd grub-%{1}-%{tarversion}					\
make DESTDIR=$RPM_BUILD_ROOT install				\
if [ -f $RPM_BUILD_ROOT%{_infodir}/grub.info ]; then		\
	rm -f $RPM_BUILD_ROOT%{_infodir}/grub.info		\
fi								\
if [ -f $RPM_BUILD_ROOT%{_infodir}/grub-dev.info ]; then	\
	rm -f $RPM_BUILD_ROOT%{_infodir}/grub-dev.info		\
fi								\
find $RPM_BUILD_ROOT -iname "*.module" -exec chmod a-x {} '\;'	\
touch $RPM_BUILD_ROOT%{efi_esp_dir}/grub.cfg			\
ln -sf ..%{efi_esp_dir}/grub.cfg				\\\
	$RPM_BUILD_ROOT%{_sysconfdir}/%{name}-efi.cfg		\
install -m 700 %{2} $RPM_BUILD_ROOT%{efi_esp_dir}/%{2}		\
install -m 700 %{3} $RPM_BUILD_ROOT%{efi_esp_dir}/%{3}		\
install -D -m 700 unicode.pf2					\\\
	$RPM_BUILD_ROOT%{efi_esp_dir}/fonts/unicode.pf2		\
${RPM_BUILD_ROOT}/%{_bindir}/%{name}-editenv			\\\
	${RPM_BUILD_ROOT}%{efi_esp_dir}/grubenv create		\
ln -sf ../efi/EFI/%{efi_vendor}/grubenv				\\\
	$RPM_BUILD_ROOT/boot/grub2/grubenv			\
cd ..								\
%{nil}

%define do_legacy_install()					\
cd grub-%{1}-%{tarversion}					\
make DESTDIR=$RPM_BUILD_ROOT install				\
if [ -f $RPM_BUILD_ROOT%{_infodir}/grub.info ]; then		\
	rm -f $RPM_BUILD_ROOT%{_infodir}/grub.info		\
fi								\
if [ -f $RPM_BUILD_ROOT%{_infodir}/grub-dev.info ]; then	\
	rm -f $RPM_BUILD_ROOT%{_infodir}/grub-dev.info		\
fi								\
ln -s ../boot/%{name}/grub.cfg					\\\
	${RPM_BUILD_ROOT}%{_sysconfdir}/grub2.cfg		\
if [ -f $RPM_BUILD_ROOT/%{_libdir}/grub/%{1}/grub2.chrp ]; then \
	mv $RPM_BUILD_ROOT/%{_libdir}/grub/%{1}/grub2.chrp	\\\
	   $RPM_BUILD_ROOT/%{_libdir}/grub/%{1}/grub.chrp	\
fi								\
if [ %{3} -eq 0 ]; then						\
	${RPM_BUILD_ROOT}/%{_bindir}/%{name}-editenv		\\\
		${RPM_BUILD_ROOT}/boot/%{name}/grubenv create	\
fi								\
cd ..								\
%{nil}

%define do_common_install()					\
install -d -m 0755 						\\\
	$RPM_BUILD_ROOT%{_datarootdir}/locale/en\@quot		\\\
	$RPM_BUILD_ROOT%{_datarootdir}/locale/en		\\\
	$RPM_BUILD_ROOT%{_infodir}/				\
cp -a $RPM_BUILD_ROOT%{_datarootdir}/locale/en\@quot		\\\
	$RPM_BUILD_ROOT%{_datarootdir}/locale/en		\
cp docs/grub.info $RPM_BUILD_ROOT%{_infodir}/%{name}.info	\
cp docs/grub-dev.info						\\\
	$RPM_BUILD_ROOT%{_infodir}/%{name}-dev.info		\
install -d -m 0700 ${RPM_BUILD_ROOT}%{efi_esp_dir}/		\
install -d -m 0700 ${RPM_BUILD_ROOT}/boot/grub2/		\
install -d -m 0700 ${RPM_BUILD_ROOT}/boot/loader/entries	\
install -d -m 0700 ${RPM_BUILD_ROOT}/boot/%{name}/themes/system	\
install -d -m 0700 ${RPM_BUILD_ROOT}%{_sysconfdir}/default	\
install -d -m 0700 ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig	\
touch ${RPM_BUILD_ROOT}%{_sysconfdir}/default/grub		\
ln -sf ../default/grub						\\\
	${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig/grub		\
touch ${RPM_BUILD_ROOT}/boot/%{name}/grub.cfg			\
%{nil}

%define define_legacy_variant_files()				\
%{expand:%%files %{1}}						\
%defattr(-,root,root,-)						\
%config(noreplace) %{_sysconfdir}/%{name}.cfg			\
%ghost %config(noreplace) /boot/%{name}/grub.cfg		\
%dir %attr(0700,root,root)/boot/loader/entries			\
								\
%{expand:%if 0%{?with_legacy_modules}				\
%{expand:%%files %{1}-modules}					\
%defattr(-,root,root)						\
%dir %{_libdir}/grub/%{2}/					\
%{_libdir}/grub/%{2}/*						\
%exclude %{_libdir}/grub/%{2}/*.module				\
%exclude %{_libdir}/grub/%{2}/{boot,boot_hybrid,cdboot,diskboot,lzma_decompress,pxeboot}.image \
%exclude %{_libdir}/grub/%{2}/*.o				\
%else								\
%%exclude %%{_libdir}/grub/%%{grublegacyarch}/*			\
%endif}								\
%{nil}

%define define_efi_variant_files()				\
%{expand:%%files %{1}}						\
%defattr(0700,root,root,-)					\
%config(noreplace) %{_sysconfdir}/%{name}-efi.cfg		\
%attr(0700,root,root)%{efi_esp_dir}/%{2}			\
%dir %attr(0700,root,root)%{efi_esp_dir}/fonts			\
%dir %attr(0700,root,root)/boot/loader/entries			\
%ghost %config(noreplace) %attr(0700,root,root)%{efi_esp_dir}/grub.cfg	\
/boot/grub2/grubenv						\
%ghost %config(noreplace) %attr(0700,root,root)%{efi_esp_dir}/grubenv	\
%{expand:%if 0%{?without_efi_modules}				\
%exclude %{_libdir}/grub/%{6}					\
%exclude %{_libdir}/grub/%{6}/*					\
%endif}								\
								\
%{expand:%if 0%{?with_efi_modules}				\
%{expand:%%files %{1}-modules}					\
%defattr(-,root,root,-)						\
%dir %{_libdir}/grub/%{6}/					\
%{_libdir}/grub/%{6}/*						\
%exclude %{_libdir}/grub/%{6}/*.module				\
%endif}								\
								\
%{expand:%%files %{1}-cdboot}					\
%defattr(0700,root,root,-)					\
%attr(0700,root,root)%{efi_esp_dir}/%{3}			\
%attr(0700,root,root)%{efi_esp_dir}/fonts			\
%{nil}
