#!/bin/bash

#  buildrom-withgrub script: this generically builds the ROM images.
#  The ROM images built by this script will use the GRUB payload.
#
#	Copyright (C) 2014 Francis Rowe <info@gluglug.org.uk>
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program 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 for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
#

# DO NOT RUN THIS DIRECTLY!
# Use "build"

if (( $# != 1 )); then
	echo "Usage: ./buildrom-withgrub boardname"
	echo "Example: ./buildrom-withgrub x60"
	echo "You need to specify exactly 1 argument"
	exit
fi

# Build the ROM images:
# ----------------------------------------------------------------------------------------------------------------------

cd coreboot
rm -rf .config

# cbfstool will be used quite heavily here.
[[ -f cbfstool ]] || mv util/cbfstool/cbfstool .

# prepare libreboot configuration and build it
# it is assumed that these configs use coreboot text-mode
# instead of coreboot framebuffer, by default
cp ../resources/libreboot/config/$1/config .config
# coreboot.rom will appear under ./coreboot/build
make
# move it out (we'll be cleaning the build)
mv build/coreboot.rom libreboot_txtmode.rom
# clean the build
make clean

# Now prepare ROM images that use coreboot vesa framebuffer instead of text mode.
mv .config config_txtmode
# create .config for vesa framebuffer (instead of text mode)
sed 's/# CONFIG_FRAMEBUFFER_KEEP_VESA_MODE is not set/CONFIG_FRAMEBUFFER_KEEP_VESA_MODE=y/' < config_txtmode > .config
# build new ROM
make
mv build/coreboot.rom libreboot_vesafb.rom
# clean coreboot (again)
make clean

# copies no longer needed
rm -rf .config config_txtmode

# Insert files/configurations and perform operations that are common on all images
# ---------------------------------------------------------------------------------------------------------------

for rom in libreboot_vesafb.rom libreboot_txtmode.rom
do
	# Add SeaBIOS and SeaVGABIOS
	./cbfstool $rom add -f ../seabios/out/vgabios.bin -n vgaroms/vgabios.bin -t raw
	./cbfstool $rom add -f ../seabios/out/bios.bin.elf -n bios.bin.elf -t raw
done

# Insert files/configurations and perform operations that are common on libreboot_vesafb.rom (coreboot framebuffer configuration)
# ---------------------------------------------------------------------------------------------------------------

# Add background image and font
./cbfstool libreboot_vesafb.rom add -f ../resources/grub/background/background.jpg -n background.jpg -t raw
# ./cbfstool libreboot_vesafb.rom add -f ../resources/grub/background/gnulove.jpg -n gnulove.jpg -t raw
./cbfstool libreboot_vesafb.rom add -f ../resources/grub/font/dejavusansmono.pf2 -n dejavusansmono.pf2 -t raw

# Insert files/configurations and perform operations that are common on libreboot_txtmode.rom (coreboot text mode)
# ---------------------------------------------------------------------------------------------------------------

# Add memtest86+
./cbfstool libreboot_txtmode.rom add -f ../memtest86+-5.01/memtest -n memtest -t raw

# Add GRUB Invaders
./cbfstool libreboot_txtmode.rom add -f ../grubinvaders/invaders -n invaders -t raw
./cbfstool libreboot_txtmode.rom add -f ../grubinvaders/invaders.exec -n invaders.exec -t raw

# Generate the GRUB configurations and add them to each ROM image as grub.cfg and grubtest.cfg
# ---------------------------------------------------------------------------------------------------------------

for keymap in $(ls ../resources/utilities/grub-assemble/keymap/original)
do
	for romtype in txtmode vesafb
	do
		# copy the images based on the keymap
		cp libreboot_"$romtype".rom libreboot_"$keymap"_"$romtype".rom

		# generate the correct grub config
		touch grub_"$keymap"_"$romtype".cfg
		# generate contents:
		cat ../resources/grub/config/extra/common.cfg >> grub_"$keymap"_"$romtype".cfg
		cat ../resources/grub/config/extra/"$romtype".cfg >> grub_"$keymap"_"$romtype".cfg
		echo "keymap $keymap" >> grub_"$keymap"_"$romtype".cfg
		cat ../resources/grub/config/menuentries/common.cfg >> grub_"$keymap"_"$romtype".cfg
		cat ../resources/grub/config/menuentries/"$romtype".cfg >> grub_"$keymap"_"$romtype".cfg

		# Insert grub config into the image
		./cbfstool libreboot_"$keymap"_"$romtype".rom add -f grub_"$keymap"_"$romtype".cfg -n grub.cfg -t raw

		# grubtest.cfg should be able to switch back to grub.cfg
		sed 's/grubtest.cfg/grub.cfg/' < grub_"$keymap"_"$romtype".cfg > grub_"$keymap"_"$romtype"_test.cfg

		# Insert grub test config into the image (for the user to test modifications to before modifying the main one)
		./cbfstool libreboot_"$keymap"_"$romtype".rom add -f grub_"$keymap"_"$romtype"_test.cfg -n grubtest.cfg -t raw
	done
done

# we don't need the generic rom images anymore
rm -rf libreboot_txtmode.rom
rm -rf libreboot_vesafb.rom

# we don't need the grub configs anymore
rm -rf grub*cfg

# Now we clean up and prepare the bin directory containing all the images
# ----------------------------------------------------------------------------------------------------------------------------

# prepare directory for new ROM images
rm -rf $1
mkdir $1
# move the ROM's into the newly created directory
mv libreboot*rom $1

# delete the old ROM's from ../bin
rm -rf ../bin/$1
# now put the new ROM's in ./bin
mv $1 ../bin

# cbfstool no longer needed here, so put it back
mv cbfstool util/cbfstool/

# go back to main source directory
cd ../

