#!/bin/bash
##
## Copyright(C) 2018 Stefano Moioli <smxdev4@gmail.com>
## This file is part of Reko Decompiler
##
export PATH="$HOME/prefix/bin:$PATH"
export CC=$HOME/prefix/bin/gcc
export CXX=$HOME/prefix/bin/g++

APT_CACHE_DIR="$HOME/apt_cache"
REKO_PREFIX="$HOME/prefix"

CAPSTONE_VERSION=3.0.4
CAPSTONE_EXT="tar.gz"
CAPSTONE_URL="https://github.com/aquynh/capstone/archive/${CAPSTONE_VERSION}.${CAPSTONE_EXT}"

export PKG_CONFIG_PATH="${REKO_PREFIX}/usr/lib/pkgconfig:${PKG_CONFIG_PATH}"

function before_install(){
	set -x
	# Initialize cache if needed
	[ ! -d ${APT_CACHE_DIR}/cache ] && mkdir -p ${APT_CACHE_DIR}/cache
  	[ ! -d ${APT_CACHE_DIR}/lib ] && mkdir -p ${APT_CACHE_DIR}/lib

	# Initialize prefix
	mkdir -p ${REKO_PREFIX}/{bin,tmp}

	# Restore APT state from cache
	echo "Restoring APT Cache..."
	sudo cp -Rv ${APT_CACHE_DIR}/cache/. /var/cache/apt/
	sudo cp -Rv ${APT_CACHE_DIR}/lib/. /var/lib/apt/
	sudo chown -R root:root /var/lib/apt
	sudo chown -R root:root /var/cache/apt

	# Check for new versions of packages
	echo "Checking for package updates..."
	sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
	sudo apt-get update -qq
	sudo apt-get install -y gcc-7-multilib g++-7-multilib
	sudo apt-get autoclean

	# Re-create APT cache from the current state
	echo "Rebuilding APT Cache..."
	rm -Rf ${APT_CACHE_DIR}
	mkdir -p ${APT_CACHE_DIR}
	sudo cp -Rv /var/lib/apt/. ${APT_CACHE_DIR}/lib/
	sudo cp -Rv /var/cache/apt/. ${APT_CACHE_DIR}/cache/
	sudo chown -R travis:travis ${APT_CACHE_DIR}

	# Prepare custom build prefix
	echo "Setting up build environment..."
	ln -s /usr/bin/gcc-7 ${REKO_PREFIX}/bin/gcc
	ln -s /usr/bin/g++-7 ${REKO_PREFIX}/bin/g++

	# Download and build capstone
	echo "Building capstone..."
	pushd ${REKO_PREFIX}/tmp
		wget ${CAPSTONE_URL}
		tar -xf "${CAPSTONE_VERSION}.${CAPSTONE_EXT}"
		cd capstone-${CAPSTONE_VERSION}

		# Install capstone to custom prefix
		echo "Installing capstone..."
		DESTDIR=${REKO_PREFIX} make install -j $(grep processor /proc/cpuinfo | wc -l)
	popd
	set +x
}