#
# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
#
.KEEP_STATE:
include ../Makefile.master
include ../Makefile.buildnum
ROOT_BOOT_GRUB = $(ROOT)/boot/grub
ROOT_SRC_DIR = $(ROOT)/usr/src/grub/grub2
SRC_GRUB2 = $(SRC)/grub/grub2
DIST_ARCHIVE=grub-1.99.tar.gz
GMAKE = /usr/gnu/bin/make
GRUB_VERSION = 1.99
all := TARGET = all
install := TARGET = install
install := INSTARG = DESTDIR=$(ROOT)
clean := TARGET = clean
clobber := TARGET = clean
ROOT_GRUB2_BIOSDIR = $(ROOT)/usr/lib/grub2/bios
ROOT_GRUB2_BIOS_SHARE = $(ROOT_GRUB2_BIOSDIR)/share
ROOT_GRUB2_BIOS_SHARE_GRUB = $(ROOT_GRUB2_BIOS_SHARE)/grub
ROOT_GRUB2_BIOS_SHARE_GRUB_THEMES = $(ROOT_GRUB2_BIOS_SHARE_GRUB)/themes
ROOT_GRUB2_BIOS_SHARE_GRUB_THEMES_SOLARIS = $(ROOT_GRUB2_BIOS_SHARE_GRUB_THEMES)/solaris
ROOT_GRUB2_BIOS_MAN = $(ROOT_GRUB2_BIOS_SHARE)/man
ROOT_GRUB2_BIOS_DEFDIR = $(ROOT_GRUB2_BIOSDIR)/etc/default
ROOT_GRUB2_BIOS_LIBGRUB = $(ROOT_GRUB2_BIOSDIR)/lib/grub
ROOT_GRUB2_BIOS_LIBGRUB_PLAT = $(ROOT_GRUB2_BIOS_LIBGRUB)/i386-pc
ROOT_GRUB2_UEFI64DIR = $(ROOT)/usr/lib/grub2/uefi64
ROOT_GRUB2_UEFI64_SHARE = $(ROOT_GRUB2_UEFI64DIR)/share
ROOT_GRUB2_UEFI64_MAN = $(ROOT_GRUB2_UEFI64_SHARE)/man
ROOT_GRUB2_UEFI64_DEFDIR = $(ROOT_GRUB2_UEFI64DIR)/etc/default
ROOT_GRUB2_UEFI64_LIBGRUB = $(ROOT_GRUB2_UEFI64DIR)/lib/grub
ROOT_GRUB2_UEFI64_LIBGRUB_PLAT = $(ROOT_GRUB2_UEFI64_LIBGRUB)/x86_64-efi
MOD_INTF_H = $(SRC_GRUB2)/include/grub/util/modvers.h
XVER_H = $(SRC_GRUB2)/include/grub/xversion.h
VERSION_DIRS = $(ROOT_GRUB2_UEFI64_LIBGRUB_PLAT) $(ROOT_GRUB2_BIOS_LIBGRUB_PLAT)
VERSION_FILES = $(VERSION_DIRS:%=%/version.lst)
GRUBPKGVERS_BRANCH_MAIN = $(RELEASE_MAJOR).$(RELEASE_MINOR).0.$(TRUNKID).$(UPDATENUM).$(SRUNUM).$(PLATNUM).$(BUILDID).$(NIGHTLYID):`date -u "+%Y%m%dT%H%M%SZ"`
GRUBPKGVERS_BRANCH_MAIN_NOTIME = $(RELEASE_MAJOR).$(RELEASE_MINOR).0.$(TRUNKID).$(UPDATENUM).$(SRUNUM).$(PLATNUM).$(BUILDID).$(NIGHTLYID)
GRUB2_SOLARIS_VERSION_CMD = echo $(GRUB_VERSION),$(GRUBPKGVERS_BRANCH_MAIN)
GRUB2_SOLARIS_VERSION_CMD_NOTIME = echo $(GRUB_VERSION),$(GRUBPKGVERS_BRANCH_MAIN_NOTIME)
GRUB2_SOLARIS_VERSION = $(GRUB2_SOLARIS_VERSION_CMD:sh)
GRUB2_SOLARIS_VERSION_NOTIME = $(GRUB2_SOLARIS_VERSION_CMD_NOTIME:sh)
GRUB_NET_CONFIGFILE=grub_cfg_net
GRUB2_SUBDIRS = grub2/build-bios grub2/build-uefi64
THEME_FILES = bmenu_c.png bmenu_e.png bmenu_n.png bmenu_ne.png \
bmenu_nw.png bmenu_s.png bmenu_se.png bmenu_sw.png \
bmenu_w.png liber18.pf2 oracle.jpg sbar_c.png sbar_n.png \
sbar_s.png sel_c.png terbox_c.png terbox_e.png terbox_n.png \
terbox_ne.png terbox_nw.png terbox_s.png terbox_se.png \
terbox_sw.png terbox_w.png theme.txt univers16.pf2 univers20.pf2
THEME_TARGETS = $(THEME_FILES:%=$(ROOT_GRUB2_BIOS_SHARE_GRUB_THEMES_SOLARIS)/%)
INST_TARGETS = $(ROOT_GRUB2_BIOS_DEFDIR)/grub \
$(ROOT_GRUB2_UEFI64_DEFDIR)/grub \
$(ROOT_SRC_DIR)/COPYING \
$(ROOT_SRC_DIR)/AUTHORS \
$(ROOT_SRC_DIR)/$(DIST_ARCHIVE) \
$(ROOT_BOOT_GRUB)/splash.jpg \
$(ROOT_BOOT_GRUB)/$(GRUB_NET_CONFIGFILE) \
$(ROOT_BOOT_GRUB)/default_video_modes.txt \
$(THEME_TARGETS)
NET_IMAGES = $(ROOT_BOOT_GRUB)/pxegrub2 $(ROOT_BOOT_GRUB)/grub2netx64.efi
# The grub-mkimage binary from the bios subdirectory works for all platforms.
GRUB2_MKIMAGE=$(ROOT_GRUB2_BIOSDIR)/bin/grub-mkimage
COMMON_NETIMAGE_MODULES = terminal gfxterm bitmap_scale bitmap font regexp \
video extcmd crypto normal sleep tr multiboot2 part_msdos part_gpt \
zfs gzio echo test zfsinfo minicmd keystatus chain boot mmap serial \
relocator reboot ls hashsum help gcry_crc cat configfile video_fb \
read acpi videoinfo lsmmap terminfo iso9660 fat fshelp iorw lspci \
setpci memrw iorw date datetime time
BIOS_NETIMAGE_MODULES=$(COMMON_NETIMAGE_MODULES) multiboot vbe lsapm vga_text
UEFI64_NETIMAGE_MODULES=$(COMMON_NETIMAGE_MODULES) efi_gop
# Order DOES matter with the LOADMODS variables. GRUB2 will load these modules in order
# Remember NOT to include modules here that are already in the memdisk image. The only
# modules that should be here are modules that are needed to find the grub.cfg and to
# read from the prefix (stored in the memdisk).
COMMON_NETIMAGE_LOADMODS=tftp memdisk tar
BIOS_NETIMAGE_LOADMODS=pxe biosdisk $(COMMON_NETIMAGE_LOADMODS)
UEFI64_NETIMAGE_LOADMODS=efinet $(COMMON_NETIMAGE_LOADMODS)
$(ROOT_SRC_DIR)/$(DIST_ARCHIVE) := FILEMODE=0644
grub2/build-bios/$(DIST_ARCHIVE) := TARGET=dist
all clean: grub2
clobber: clean
$(RM) grub2/build-bios/$(DIST_ARCHIVE) $(NET_IMAGES)
install: grub2 $(VERSION_FILES) $(INST_TARGETS) $(NET_IMAGES)
$(RM) $(ROOT_GRUB2_BIOS_LIBGRUB)/x86_64-efi; \
$(LN) -s ../../../uefi64/lib/grub/x86_64-efi $(ROOT_GRUB2_BIOS_LIBGRUB)
$(RM) $(ROOT_GRUB2_UEFI64_LIBGRUB)/i386-pc; \
$(LN) -s ../../../bios/lib/grub/i386-pc $(ROOT_GRUB2_UEFI64_LIBGRUB)
$(RM) -r $(ROOT_GRUB2_BIOS_MAN) $(ROOT_GRUB2_UEFI64_MAN) \
$(ROOT_GRUB2_BIOS_SHARE)/grub/*.h \
$(ROOT_GRUB2_UEFI64_SHARE)/grub/*.h
%/version.lst: FRC
@$(RM) $@; \
$(ECHO) "solaris_grub_version: $(GRUB2_SOLARIS_VERSION)" > $@; \
$(GREP) '^#define[ ]*GRUB_MODULE_INTERFACE_VERSION' $(MOD_INTF_H) | \
awk '{print "module_interface_version: " $$3}' >> $@; \
$(CHMOD) $(FILEMODE) $@
instver: FRC
@$(ECHO) '#ifndef _GRUB_XVERSION_H' > $(XVER_H).tmp; \
$(ECHO) '#define _GRUB_XVERSION_H' >> $(XVER_H).tmp; \
$(ECHO) '#define GRUB_EXTENDED_VERSION '\""$(GRUB2_SOLARIS_VERSION_NOTIME)"\" >> $(XVER_H).tmp; \
$(ECHO) '#endif' >> $(XVER_H).tmp; \
if test ! -f $(XVER_H) || ! /usr/bin/diff $(XVER_H) $(XVER_H).tmp; then \
mv $(XVER_H).tmp $(XVER_H); \
else \
rm -f $(XVER_H).tmp; \
fi
setuplinks: FRC
@$(MKDIR) -p $(SRC_GRUB2)/build-bios/include/grub; \
$(MKDIR) -p $(SRC_GRUB2)/build-uefi64/include/grub; \
cd $(SRC_GRUB2)/build-bios/include/grub; \
if ! test -L cpu; then \
$(LN) -s ../../../include/grub/i386 cpu; \
fi; \
if ! test -L machine; then \
$(LN) -s ../../../include/grub/i386/pc machine; \
fi
@cd $(SRC_GRUB2)/build-uefi64/include/grub; \
if ! test -L cpu; then \
$(LN) -s ../../../include/grub/x86_64 cpu; \
fi; \
if ! test -L machine; then \
$(LN) -s ../../../include/grub/x86_64/efi machine; \
fi
$(GRUB2_SUBDIRS): FRC
unset DOMAIN; \
cd $@; pwd; \
MAKE=$(GMAKE) PATH=/usr/gnu/bin:"$(PATH)" VERSION=$(GRUB_VERSION) \
$(GMAKE) -j $(DMAKE_MAX_JOBS) $(TARGET) $(INSTARG);
grub2: instver setuplinks $(GRUB2_SUBDIRS)
$(ROOT_GRUB2_BIOS_DEFDIR)/%: etc_default_%
$(INS.rename)
$(ROOT_GRUB2_UEFI64_DEFDIR)/%: etc_default_%
$(INS.rename)
#
# The source build is done only in the build-bios subdirectory.
#
grub2/build-bios/$(DIST_ARCHIVE): grub2/build-bios
$(ROOT_BOOT_GRUB)/pxegrub2: FRC
tempdir=$$(mktemp -d /tmp/memdisk.XXXXXXXXX); \
platform=i386-pc; \
prefixdir="$${tempdir}/$$platform"; \
srcdir=$(ROOT_GRUB2_BIOS_LIBGRUB_PLAT); \
$(MKDIR) -p "$$prefixdir"; \
$(CP) $(GRUB_NET_CONFIGFILE) "$${prefixdir}/grub.cfg"; \
$(CP) "$${srcdir}/"*.lst "$${prefixdir}"; \
for mod in $(BIOS_NETIMAGE_MODULES); do \
$(CP) "$${srcdir}/$${mod}.mod" "$$prefixdir"; \
done; \
(cd "$$tempdir"; $(TAR) cf memdisk.img *); \
$(GRUB2_MKIMAGE) -O i386-pc-pxe -d "$$srcdir" -o $@ -m "$${tempdir}/memdisk.img" -p '(memdisk)/'"$$platform" $(BIOS_NETIMAGE_LOADMODS); \
$(RM) -r "$$tempdir"
$(CHMOD) $(FILEMODE) $@
$(ROOT_BOOT_GRUB)/grub2netx64.efi: FRC
tempdir=$$(mktemp -d /tmp/memdisk.XXXXXXXXX); \
platform=x86_64-efi; \
prefixdir="$${tempdir}/$$platform"; \
srcdir=$(ROOT_GRUB2_UEFI64_LIBGRUB_PLAT); \
$(MKDIR) -p "$$prefixdir"; \
$(CP) $(GRUB_NET_CONFIGFILE) "$${prefixdir}/grub.cfg"; \
$(CP) "$${srcdir}/"*.lst "$${prefixdir}"; \
for mod in $(UEFI64_NETIMAGE_MODULES); do \
$(CP) "$${srcdir}/$${mod}.mod" "$$prefixdir"; \
done; \
(cd "$$tempdir"; $(TAR) cf memdisk.img *); \
$(GRUB2_MKIMAGE) -O x86_64-efi -d "$$srcdir" -o $@ -m "$${tempdir}/memdisk.img" -p '(memdisk)/'"$$platform" $(UEFI64_NETIMAGE_LOADMODS); \
$(RM) -r "$$tempdir"
$(CHMOD) $(FILEMODE) $@
$(ROOT_SRC_DIR)/%: grub2/build-bios/%
$(INS.file)
$(ROOT_SRC_DIR)/%: grub2/%
$(INS.file)
$(ROOT_BOOT_GRUB)/%: %
$(INS.file)
$(ROOT_GRUB2_BIOS_SHARE_GRUB)/%: %
$(INS.file)
FRC: