#!/bin/bash

#
#  helper script: generate the release archives
#
#	Copyright (C) 2014, 2015 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/>.
#

# This script assumes that the current working directory when running
# it is the root directory of the libreboot git repository clone.

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

printf "Generating the release archives\n"

arch="unknown"
if [ $(uname -i) = "i686" ] || [ $(uname -m) = "i686" ]
	then
		arch="i686"
		echo "Running on i686. ok."
		sleep 2
elif [ $(uname -i) = "x86_64" ] || [ $(uname -m) = "x86_64" ]
	then
		arch="x86_64"
		echo "Running on x86_64. ok."
		sleep 2
else
	echo "This script must be run on an i686 or x86_64 host. x86_64 is recommended."
	exit 1
fi

# ### Version information for this release
# ----------------------------------------------------------------------------------------------------------------------------

# create file showing the commit ID from git for this archive.
cat .git/refs/heads/master > commitid

# ### Delete old archives before continuing
# ----------------------------------------------------------------------------------------------------------------------------

printf "Deleting the old release archives\n"
rm -f libreboot_*.tar.xz
rm -f tobuild.tar.xz
rm -rf release/
rm -rf tobuild/
rm -rf libreboot_bin
rm -rf libreboot_src
rm -rf libreboot_doc

# Get manifest which will be used to copy everything
find -maxdepth 1 > releasefilelist

printf "\n\n"

# ### Prepare libreboot_src archive ready for release
# ----------------------------------------------------------------------------------------------------------------------------

printf "Copying libreboot sources to libreboot_src/\n"
mkdir libreboot_src

for resource in $(cat releasefilelist)
do
	if [ "$resource" != "." ] && [ "$resource" != "./docs" ]; then
		cp -r $resource libreboot_src
	fi
done

cd libreboot_src/

# clean everything
./build clean all

# back to main checkout directory
cd ../

printf "\n\n"

# ### Create the release/ directory where the archives will go
# ----------------------------------------------------------------------------------------------------------------------------

# create directory for the release
mkdir release/
mkdir release/rom/

# ### Prepare libreboot_docs archive ready for release
# ----------------------------------------------------------------------------------------------------------------------------

printf "Creating libreboot_docs.tar.xz\n"

cd release/

mkdir libreboot_docs/

cp -r ../docs/ libreboot_docs/
cat ../commitid > libreboot_docs/commitid

# create lzma compressed docs archive
tar -c libreboot_docs | xz -9e >libreboot_docs.tar.xz

# the directory is no longer needed
rm -rf libreboot_docs/

cd ../

printf "\n\n"

# ### Further work in libreboot_src: delete *.git and *.svn
# ### To save space since they are not useful in the release archives
# ### Changes to these projects should be submitted upstream
# ----------------------------------------------------------------------------------------------------------------------------

echo "Deleting .git* and .svn* in the modules of libreboot_src/\n"

cd libreboot_src/

# These instructions will also work even if .git or .svn are already deleted
# because "rm -rf" won't complain if they are missing. It is still useful on
# the release archives (non-git), for example if the user re-downloads these programmes.

# remove .git for libreboot project itself
rm -rf .git*

# remove .git for bucts
cd bucts/
rm -rf .git*
cd ../

# coreboot:
# the instructions for coreboot remain in the download script
# they need to stay there, because otherwise "git diff"
# will show the blobs that were deleted (which means,
# that libreboot would be distributing blobs)

# Flashrom:
cd flashrom/
rm -rf .svn
cd ../

# GRUB:
cd grub/
rm -rf .git
rm -f .gitignore
cd ../

printf "\n\n"

cd ../

# ### Prepare ROM archives ready for release
# ----------------------------------------------------------------------------------------------------------------------------

printf "Generating ROM image archives for...\n"

cd bin/
for board in $(ls)
do
	printf "...$board"
	
	# show the libreboot commit ID in the archive
	cat ../commitid > "$board"/commitid
	
	# create lzma compressed src archive
	tar -c "$board" | xz -9e >../libreboot_"$board".tar.xz
	
	# delete. no longer needed
	rm -f "$board"/commitid
	
	# move the ROM images to the release/ directory
	mv ../libreboot_"$board".tar.xz ../release/rom/
	
	printf " OK\n"
done
cd ../

printf "\n\n"

# ### Prepare libreboot_util archive ready for release
# ----------------------------------------------------------------------------------------------------------------------------

printf "Generating libreboot_util.tar.xz\n"

mkdir libreboot_util

# --------------
# BUC.TS related
# --------------
# X60/T60: BUC.TS utility is needed to flash libreboot while Lenovo BIOS is running
# Include it statically compiled
cp -r bucts bucts_
# make it statically compile
./build module bucts static
mkdir libreboot_util/bucts/
mkdir libreboot_util/bucts/"$arch"/
mv bucts/bucts libreboot_util/bucts/"$arch"/
rm -rf bucts/
mv bucts_/ bucts/

# ----------------
# Flashrom related
# ----------------
# Flashrom is used to install libreboot on supported targets
# Include it statically compiled
cp -r flashrom flashrom_
# make it statically compile
./build module flashrom static
mkdir libreboot_util/flashrom
cd flashrom/
mkdir ../libreboot_util/flashrom/"$arch"
mv flashrom ../libreboot_util/flashrom/"$arch"
mv flashrom_lenovobios_sst ../libreboot_util/flashrom/"$arch"
mv flashrom_lenovobios_macronix ../libreboot_util/flashrom/"$arch"
cd ../
rm -rf flashrom
mv flashrom_ flashrom

# ----------------
# cbfstool related
# ----------------
# build cbfstool, compiled (statically linked) and include the binary
cd coreboot/util/
cp -r cbfstool cbfstool_
cd cbfstool/
make clean
make SHARED=0 CC='gcc -static'
mkdir ../../../libreboot_util/cbfstool

mkdir ../../../libreboot_util/cbfstool/"$arch"
mv cbfstool ../../../libreboot_util/cbfstool/"$arch"/

if [ "$arch" = "x86_64" ]
	then
		# Now build 32-bit binaries
		make clean
		make SHARED=0 CC='gcc -static -m32'
		mkdir ../../../libreboot_util/cbfstool/i686
		mv cbfstool ../../../libreboot_util/cbfstool/i686/
fi

# cross-compile for ARM
make clean
make SHARED=0 CC='arm-linux-gnueabi-gcc -static'
mkdir ../../../libreboot_util/cbfstool/armv7l
mv cbfstool ../../../libreboot_util/cbfstool/armv7l/

cd ../
rm -rf cbfstool
mv cbfstool_ cbfstool
cd ../../

# ----------------
# ich9deblob related
# ----------------
# build ich9deblob, compiled (statically linked) and include the binary
cd resources/utilities/
cp -r ich9deblob ich9deblob_
cd ich9deblob/
make clean
make SHARED=0 CC='gcc -static'
mkdir ../../../libreboot_util/ich9deblob

mkdir ../../../libreboot_util/ich9deblob/"$arch"
mv ich9deblob ../../../libreboot_util/ich9deblob/"$arch"/
mv ich9gen ../../../libreboot_util/ich9deblob/"$arch"/

if [ "$arch" = "x86_64" ]
	then
		# Now build 32-bit binaries
		make clean
		make SHARED=0 CC='gcc -static -m32'
		mkdir ../../../libreboot_util/ich9deblob/i686
		mv ich9deblob ../../../libreboot_util/ich9deblob/i686/
		mv ich9gen ../../../libreboot_util/ich9deblob/i686/
fi

# cross-compile for ARM
make clean
make SHARED=0 CC='arm-linux-gnueabi-gcc -static'
mkdir ../../../libreboot_util/ich9deblob/armv7l
mv ich9deblob ../../../libreboot_util/ich9deblob/armv7l/
mv ich9gen ../../../libreboot_util/ich9deblob/armv7l/

cd ../
rm -rf ich9deblob
mv ich9deblob_ ich9deblob
cd ../../

# -----------------
# nvramtool related
# -----------------
# build nvramtool, compiled (statically linked) and include the binary
cd coreboot/util/
cp -r nvramtool nvramtool_
cd nvramtool/
make clean
make SHARED=0 CC='gcc -static'
mkdir ../../../libreboot_util/nvramtool

mkdir ../../../libreboot_util/nvramtool/"$arch"
mv nvramtool ../../../libreboot_util/nvramtool/"$arch"/

if [ "$arch" = "x86_64" ]
	then
		# Now build 32-bit binaries
		make clean
		make SHARED=0 CC='gcc -static -m32'
		mkdir ../../../libreboot_util/nvramtool/i686
		mv nvramtool ../../../libreboot_util/nvramtool/i686/
fi

cd ../
rm -rf nvramtool
mv nvramtool_ nvramtool
cd ../../

# -----------------
# cbmem related
# -----------------
# build cbmem, compiled (statically linked) and include the binary
cd coreboot/util/
cp -r cbmem cbmem_
cd cbmem/
make clean
make SHARED=0 CC='gcc -static'
mkdir ../../../libreboot_util/cbmem

mkdir ../../../libreboot_util/cbmem/"$arch"
mv cbmem ../../../libreboot_util/cbmem/"$arch"/

if [ "$arch" = "x86_64" ]
	then
		# Now build 32-bit binaries
		make clean
		make SHARED=0 CC='gcc -static -m32'
		mkdir ../../../libreboot_util/cbmem/i686
		mv cbmem ../../../libreboot_util/cbmem/i686/
fi
cd ../
rm -rf cbmem
mv cbmem_ cbmem
cd ../../

# -------------
# Miscellaneous
# -------------
# include X60 cmos.layout file
mkdir libreboot_util/cmoslayouts/
cp coreboot/src/mainboard/apple/macbook21/cmos.layout libreboot_util/cmoslayouts/macbook21cmos.layout
cp coreboot/src/mainboard/lenovo/x60/cmos.layout libreboot_util/cmoslayouts/x60cmos.layout
cp coreboot/src/mainboard/lenovo/t60/cmos.layout libreboot_util/cmoslayouts/t60cmos.layout
cp coreboot/src/mainboard/lenovo/x200/cmos.layout libreboot_util/cmoslayouts/x200cmos.layout

# Flashing script
cp flash libreboot_util/

# for changing the GRUB background
cp resources/scripts/misc/grub-background libreboot_util/

printf "\n\n"

# ### Create the release tarballs
# ----------------------------------------------------------------------------------------------------------------------------

# Also delete the manifest
rm -f libreboot_src/releasefilelist
rm -f libreboot_util/releasefilelist
rm -f releasefilelist

# Delete the deblob scripts from libreboot_src
# Since _src doesn't distribute the download scripts,
# and already comes with a deblobbed coreboot, the
# deblobbing scripts aren't needed at all
rm -rf libreboot_src/resources/utilities/coreboot-libre/

# We don't want to encourage development
# to happen on the release archives. 
# Development goes in git. These scripts are
# not needed in libreboot_src, because
# the files that they download are already included
rm -rf libreboot_src/resources/scripts/helpers/build/release
rm -f libreboot_src/download
rm -rf libreboot_src/resources/scripts/helpers/download/

# ich9deblob: there are certain files in there
# that the user most likely does not want to share
rm -f libreboot_src/resources/utilities/ich9deblob/deblobbed_descriptor.bin
rm -f libreboot_src/resources/utilities/ich9deblob/factory.rom
rm -f libreboot_src/resources/utilities/ich9deblob/libreboot.rom
rm -f libreboot_src/resources/utilities/ich9deblob/mkdescriptor.c
rm -f libreboot_src/resources/utilities/ich9deblob/mkdescriptor.h
rm -f libreboot_src/resources/utilities/ich9deblob/mkgbe.c
rm -f libreboot_src/resources/utilities/ich9deblob/mkgbe.h
rm -f libreboot_src/resources/utilities/ich9deblob/ich9fdgbe_4m.bin
rm -f libreboot_src/resources/utilities/ich9deblob/ich9fdgbe_8m.bin
rm -f libreboot_src/mkgbe.c
rm -f libreboot_src/mkgbe.h
rm -f libreboot_src/ich9fdgbe_8m.bin
rm -f libreboot_src/ich9fdgbe_4m.bin

# delete the "tobuild"
rm -rf libreboot_src/tobuild/
rm -f libreboot_src/tobuild.tar.xz

# mention the commit ID (libreboot, git) in the release archives
cat commitid > libreboot_src/commitid
cat commitid > libreboot_util/commitid

# create lzma compressed src archive
printf "Compressing libreboot_src/ into libreboot_src.tar.xz\n"
tar -c libreboot_src | xz -9e >libreboot_src.tar.xz

printf "Compressing libreboot_util/ into libreboot_util.tar.xz\n"
# create lzma compressed util archive
tar -c libreboot_util | xz -9e >libreboot_util.tar.xz

# Move the archives to the release directory
mv libreboot_src.tar.xz release/
mv libreboot_util.tar.xz release/

# Create a symlink to the commitid file, in release/
cat commitid > release/commitid

printf "\n\n"

# ### Delete the uncompressed release directories
# ----------------------------------------------------------------------------------------------------------------------------

# The uncompressed archives are no longer needed
rm -rf libreboot_src
rm -rf libreboot_util

# For those utilities that have to be built on the target
./build external source

# Move the archive to the release directory
mv tobuild.tar.xz release/

printf "Tar archives are stored in release/.\n"
printf "NOTE: don't forget to add ARM binaries for flashrom.\n"
printf "NOTE: don't forget to add i386 binaries for flashrom/bucts.\n"
printf "The archive tobuild.tar.xz has been created with everything needed to build these utilities.\n"

printf "\n\n"

# ------------------- DONE ----------------------