#!/usr/bin/env zsh

# # # # sol2
# The MIT License (MIT)
# 
# Copyright (c) 2013-2022 Rapptz, ThePhD, and contributors
# 
# Permission is hereby granted, free of charge, to any person obtaining a copy of
# this software and associated documentation files (the "Software"), to deal in
# the Software without restriction, including without limitation the rights to
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
# the Software, and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
# 
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
# 
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

top_level_dir="$(pwd)"

mkdir -p build-sol2
cd build-sol2

build_dir="$(pwd)"

echo "#\!/usr/bin/env zsh\n\n" > "sol2.compiler.vars"

# # Initial and necessary installations
apt-get update && apt-get -y install lsb-release ninja-build libreadline7 libreadline-dev lib32readline7 lib32readline-dev python3 wget curl libcurl4 cmake git

# # LLVM and GCC updates
# Grab LLVM or GCC 
# if we need it
# defining both is probably an expotentially terrible idea
if [ "${LLVM_VERSION}" ]
then
	# get and use LLVM
	version_nums=(${=LLVM_VERSION//./ })
	major=$version_nums[1]
	minor=$version_nums[2]
	revision=$version_nums[3]
	download_llvm=true
	image_version=$(lsb_release -rs)
	download_version=${image_version}
	apt_version=${major}.${minor}
	if [ ${major} -le 6 ];
	then
		download_llvm=true
		download_version=16.04
	elif [ ${major} -eq 4 ]
	then
		download_llvm=true
		download_version=16.04
	elif [ ${major} -eq 3 ]
	then
		download_llvm=false
		if [ ${minor} -lt 5 ]
		then
			download_llvm=true
			download_version=14.04
		elif [ ${minor} -lt 10 ]
		then
			download_llvm=true
			download_version=16.04
		fi
	fi
	if [ ${download_llvm} = true ]
	then
		export LLVM_ARCHIVE_PATH=${build_dir}/clang-llvm.tar.xz
		export CLANG_PREFIX=${build_dir}/clang-llvm-${LLVM_VERSION}
		export PATH=$CLANG_PREFIX/bin:$PATH
		export LD_LIBRARY_PATH=$CLANG_PREFIX/lib:$LD_LIBRARY_PATH
		echo "export LLVM_ARCHIVE_PATH=${build_dir}/clang+llvm.tar.xz\nexport CLANG_PREFIX=${build_dir}/clang-$LLVM_VERSION\nexport PATH=$CLANG_PREFIX/bin:$PATH\nexport LD_LIBRARY_PATH=$CLANG_PREFIX/lib:$LD_LIBRARY_PATH\n" >> "sol2.compiler.vars"
		
		apt-get -y install xz-utils clang
		#if [${major} -le 5]
		#then
		#	wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-${LLVM_VERSION}-x86_64-linux-gnu-ubuntu-${download_version}.tar.xz -O ${LLVM_ARCHIVE_PATH}
		#	http://releases.llvm.org/$LLVM_VERSION/clang+llvm-$LLVM_VERSION-x86_64-linux-gnu-ubuntu-${download_version}.tar.xz
		#else
		#	wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-${LLVM_VERSION}-x86_64-linux-gnu-ubuntu-${download_version}.tar.xz -O ${LLVM_ARCHIVE_PATH}
		#fi
		wget http://llvm.org/releases/$LLVM_VERSION/clang+llvm-${LLVM_VERSION}-x86_64-linux-gnu-ubuntu-${download_version}.tar.xz -O ${LLVM_ARCHIVE_PATH}
		mkdir -p "${CLANG_PREFIX}"
		tar xf "${LLVM_ARCHIVE_PATH}" -C "${CLANG_PREFIX}" --strip-components 1
		if [ -f "${CLANG_PREFIX}/bin/clang" ]
		then
			export CC="${CLANG_PREFIX}/bin/clang"
		else
			export CC="${CLANG_PREFIX}/bin/clang-${major}"
		fi
		if [ -f "${CLANG_PREFIX}/bin/clang++-${major}" ]
		then
			export CXX="${CLANG_PREFIX}/bin/clang++-${major}"
		else
			export CXX="${CLANG_PREFIX}/bin/clang++"
		fi
	else
		apt-get -y install clang-${apt_version}
		export CC=clang-${apt_version}
		export CXX=clang++-${apt_version}
	fi
elif [ "${GCC_VERSION}" ]
then
	# get and use GCC version that we desire
	# python-software-properties is no longer needed in 18.04, it 
	# comes with software-properties-common
	apt-get -y install software-properties-common
	add-apt-repository -y ppa:ubuntu-toolchain-r/test
	apt-get -y update
	apt-get -y dist-upgrade
	apt-get -y install gcc-${GCC_VERSION} g++-${GCC_VERSION} gcc-${GCC_VERSION}-multilib g++-${GCC_VERSION}-multilib
	#update-alternatives --remove-all gcc
	#update-alternatives --remove-all g++
	update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${GCC_VERSION} 60 --slave /usr/bin/g++ g++ /usr/bin/g++-${GCC_VERSION}
	update-alternatives --config gcc
	export CC=gcc-${GCC_VERSION}
	export CXX=g++-${GCC_VERSION}
else
	apt-get -y install build-essential gcc-multilib g++-multilib
	export CC=cc
	export CXX=c++
fi

apt-get -y autoremove
apt-get -y clean
apt-get -y autoclean

# show the tool and compiler versions we're using
echo "=== Compiler and tool variables ==="
ninja --version
cmake --version
${CC} --version
${CXX} --version

echo "export CC=$CC\nexport CXX=$CXX\n" >> "sol2.compiler.vars"

cd "${top_level_dir}"