#! /usr/bin/env bash

# This script is meant to be kept small and simple
# If you think about adding features, it's probably a bad idea

set -e # exit if a command fails
set -o pipefail # Will return the exit status of make if it fails

project_source_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"

build_dir="${project_source_dir}/build${SUBDIR:+/${SUBDIR}}"
install_dir="${project_source_dir}/install${SUBDIR:+/${SUBDIR}}"

install_target='install/strip'
build_type='Release'

case "$(uname -s)" in
	# Stripping is known to make non-PIE Linux netradiant binary unusable.
	# Maybe that's related to the way we patch rpath?
	#
	# Building NetRadiant as non-PIE is required because of
	# a mistake in the mimetype-library that prevents users
	# to run the application from file managers on Linux.
	#
	# See: https://gitlab.freedesktop.org/xdg/shared-mime-info/-/issues/11
	#
	# After installation it's possible to strip manually all binaries except
	# the netradiant one.
	'Linux')
		install_target='install'
		;;
	# Stripping is known to make FreeBSD binaries unusable.
	# Maybe that's related to the way we patch rpath?
	'FreeBSD')
		install_target='install'
		;;
esac

_job_count=4

_nproc () {
	if command -v 'nproc' >/dev/null
	then
		nproc
	else
		case "$(uname -s)" in
			'Linux')
				egrep "^processor" /proc/cpuinfo | wc -l
				;;
			'FreeBSD')
				sysctl -n hw.ncpu
				;;
			'Darwin')
				sysctl -n hw.logicalcpu \
				|| sysctl -n hw.ncpu
				;;
			'MSYS_NT-'*|'CYGWIN_NT-'*|'MINGW'*'_NT-'*)
				if command -v 'wmic' >/dev/null
				then
					wmic cpu get NumberOfLogicalProcessors/Format:List \
						| grep -m1 '=' | cut -f2 -d'='
				else
					echo "${NUMBER_OF_PROCESSORS:-${_job_count}}"
				fi
				;;
			*)
				echo "${_job_count}"
				;;
		esac
	fi
}

job_count="$(_nproc)" 2>/dev/null
job_count="${job_count:-${_job_count}}"

declare -a cmake_user_opts
while [ ! -z "${1}" ]
do
	case "${1}" in
	'-j'*)
		job_count="${1:2}"
		shift
		;;
	'--debug')
		install_target='install'
		build_type='Debug'
		shift
		;;
	*)
	cmake_user_opts[${#cmake_user_opts[@]}]="${1}"
	shift
		;;
	esac
done

declare -a fetch_submodules_cmd
for submodule_file in 'libs/crunch/inc/crn_decomp.h'
do
	if ! [ -f "${project_source_dir}/${submodule_file}" ]
	then
		fetch_submodules_cmd=(git -C "${project_source_dir}" submodule update --init --recursive)
	fi
done

case "$(uname -s)" in
	'Darwin')
		cmake_user_opts[${#cmake_user_opts[@]}]='-DBUILTIN_GTKGLEXT=ON -DBUILTIN_GTKTHEME_MOJAVE=ON'
		;;
esac

task_enter_build_dir () {
	sync
	mkdir -pv "${build_dir}"
	cd "${build_dir}"
}

task_fetch_submodules () {
	sync
	"${fetch_submodules_cmd[@]}"
}

task_configure () {
	sync
	cmake \
		-G'Unix Makefiles' \
		-D'CMAKE_INSTALL_PREFIX'="${install_dir}" \
		-D'CMAKE_BUILD_TYPE'="${build_type}" \
		"${cmake_user_opts[@]}" \
		"${project_source_dir}"
}

task_build_builtins () {
	sync
	make -j"${job_count}" builtins
}

task_discover_builtins () {
	sync
	cmake "${project_source_dir}"
}

task_build () {
	sync
	make -j"${job_count}"
}

task_install () {
	sync
	make "${install_target}"
}

set -x

task_enter_build_dir

task_fetch_submodules

task_configure

task_build_builtins

task_discover_builtins

task_build

task_install
