# Do not build as root. Ever.
if [[ "${EUID}" -eq 0 ]]; then
  echo "Building as the root user is NOT supported. Use a regular user account for the build." 1>&2
  exit 1
fi

# Spaces in paths are verboten
if [[ ${PWD} =~ [[:space:]] ]]; then
  echo "Building in a folder that includes spaces is NOT supported. Use a folder without spaces." 1>&2
  exit 1
fi

# set default language for buildsystem
export LC_ALL=C

# set default independent variables
ROOT="${PWD}"
DISTRO_DIR="${ROOT}/distributions"
PROJECT_DIR="${ROOT}/projects"

# determines DISTRO, if not forced by user
DISTRO="${DISTRO:-LibreELEC}"

# determines PROJECT, if not forced by user
PROJECT="${PROJECT:-Generic}"

# determines TARGET_ARCH, if not forced by user
ARCH="${ARCH:-x86_64}"
TARGET_ARCH="${ARCH}"

# include helper functions
. config/functions

# read DISTRO version information
. "${DISTRO_DIR}/${DISTRO}/version" || die "\nERROR: No distro version present\n"

# read DISTRO options if available
if [ -f "${DISTRO_DIR}/${DISTRO}/options" ]; then
  . "${DISTRO_DIR}/${DISTRO}/options"
fi

# read PROJECT options if available
if [ -f "${PROJECT_DIR}/${PROJECT}/options" ]; then
  . "${PROJECT_DIR}/${PROJECT}/options"
fi

# read DEVICE options if available
if [ -f "${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/options" ]; then
  . "${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/options"
fi

# projects can set KERNEL_NAME (kernel.img)
KERNEL_NAME="${KERNEL_NAME:-KERNEL}"

LINUX_DEPENDS="${PROJECT_DIR}/${PROJECT}/linux ${PROJECT_DIR}/${PROJECT}/patches/linux ${PROJECT_DIR}/${PROJECT}/packages/linux ${ROOT}/packages/linux"
[ -n "${DEVICE}" ] && LINUX_DEPENDS+=" ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/linux ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/patches/linux ${PROJECT_DIR}/${PROJECT}/devices/${DEVICE}/packages/linux"
[ "${TARGET_ARCH}" = "x86_64" ] && LINUX_DEPENDS+=" ${ROOT}/packages/linux-firmware/intel-ucode ${ROOT}/packages/linux-firmware/kernel-firmware"

# Need to point to your actual cc
# If you have ccache installed, take care that LOCAL_CC does not point to it
[ -z "${LOCAL_CC}" ] && export LOCAL_CC="$(command -v gcc)"

if [ -z "${LOCAL_CC}" ]; then
  die "***** Please install gcc *****" "127"
fi

# Need to point to your actual g++
# If you have ccache installed, take care that LOCAL_CXX does not point to it
[ -z "${LOCAL_CXX}" ] && export LOCAL_CXX="$(command -v g++)"

# verbose compilation mode (yes/no)
VERBOSE="${VERBOSE:-yes}"

# Concurrency make level (-j option)
#  Try values between 1 and number of processor cores present.
#  default: use all cores
[ -z "${CONCURRENCY_MAKE_LEVEL}" ] && export CONCURRENCY_MAKE_LEVEL=$(nproc)

# cache size for ccache
# Set the maximum size of the files stored in the cache. You can specify a
# value in gigabytes, megabytes or kilobytes by appending a G, M or K to the
# value. The default is gigabytes. The actual value stored is rounded down to
# the nearest multiple of 16 kilobytes.  Keep in mind this per project .ccache
# directory.
CCACHE_CACHE_SIZE="10G"

# read options from $HOME if available
if [ -f "${HOME}/.libreelec/options" ]; then
  . "${HOME}/.libreelec/options"
fi

# overwrite OEM_SUPPORT via commandline
if [ "${OEM}" = "yes" -o "${OEM}" = "no" ]; then
  OEM_SUPPORT="${OEM}"
fi

check_config

. config/graphic
. config/path $1

## package processing

# If the package caches are unset, then populate them
init_package_cache

# set package metadata
source_package "${1}"
