#!/usr/local/bin/cbsd
#v10.0.3
CBSDMODULE="build"
MYARG=""
MYOPTARG="ver arch target_arch maxjobs clean name stable basename stable destdir"
MYDESC="Build kernel from sources"
ADDHELP="10.0 for FreeBSD 10.0-R or ver=. for current.\n\
stable=1 for RELENG_X\n\
destdir= for alternative install path in root dir\n"

. ${subrdir}/nc.subr
. ${cbsdinit}

over="${ver}"
oarch="${arch}"

. ${subrdir}/build.subr
readconf buildworld.conf
. ${system}
. ${subrdir}/universe.subr
. ${subrdir}/emulator.subr

destdir_arg="${destdir}"
unset destdir # this variable used in init_kerneldir

init_distcc
init_notify
init_target_arch
init_srcdir
init_supported_arch
init_basedir

LOCKFILE=${ftmpdir}/$( ${MD5_CMD} -qs ${MAKEOBJDIRPREFIX} ).lock

init_kerneldir

kernel_conf="${platform}-kernel-${name}-${arch}-${ver}"

if [ -f "${etcdir}/${kernel_conf}" ]; then
	kernel_conf_path="${etcdir}/${kernel_conf}"
else
	kernel_conf_path="${etcdir}/defaults/${kernel_conf}"
fi

[ ! -f "${kernel_conf_path}" ] && err 1 "${N1_COLOR}No such config ${kernel_conf_path} in: ${N2_COLOR}${etcdir}${N0_COLOR}"

${CP_CMD} ${kernel_conf_path} ${SRC_DIR}/sys/${arch}/conf/${name}.CBSD
#makelock $LOCKFILE "${RM_CMD} -f ${SRC_DIR}/sys/${arch}/conf/${name}.CBSD"

## preparing chroot
TMPDST="${basejaildir}/tempbase.$$"
${MKDIR_CMD} -p ${TMPDST}

makelock $LOCKFILE "${RM_CMD} -f ${SRC_DIR}/sys/${arch}/conf/${name}.CBSD && ${UMOUNT_CMD} -f ${TMPDST}${MAKEOBJDIRPREFIX} && ${UMOUNT_CMD} -f ${TMPDST}/dev && ${UMOUNT_CMD} -f ${TMPDST}/${SRC_DIR} && ${CHFLAGS_CMD} -R noschg ${TMPDST} && ${RM_CMD} -rf ${TMPDST}"

register_kernel arch=${arch} ver=${ver} source="installkernel"

baserw=1
populate_cdir ${BASE_DIR} ${TMPDST}
${CP_CMD} ${kernel_conf_path} ${SRC_DIR}/sys/${arch}/conf/${name}.CBSD

baseelf=$( ${miscdir}/elf_tables --ver ${TMPDST}/bin/sh 2>/dev/null )

[ -z "${baseelf}" ] && baseelf="0"
register_kernel arch=${arch} ver=${ver} source="installkernel"		# again: update elf

# place for rewrite to mountbase from system.subr
${MKDIR_CMD} -p ${TMPDST}/${SRC_DIR}
${MOUNT_NULL_CMD} -o ro ${SRC_DIR} ${TMPDST}/${SRC_DIR}
${MKDIR_CMD} -p ${MAKEOBJDIRPREFIX} ${TMPDST}${MAKEOBJDIRPREFIX}
${MKDIR_CMD} -p ${TMPDST}${etcdir}
[ -f "${__MAKE_CONF}" ] && ${CP_CMD} ${__MAKE_CONF} ${TMPDST}${etcdir}
[ -f "${SRCCONF}" ] && ${CP_CMD} ${SRCCONF} ${TMPDST}${etcdir}
${MOUNT_NULL_CMD} ${MAKEOBJDIRPREFIX} ${TMPDST}${MAKEOBJDIRPREFIX}
${MOUNT_CMD} -t devfs devfs ${TMPDST}/dev
#

# chroot not for cross-arch install
#${CHROOT_CMD} ${TMPDST} ${MAKE_CMD} -C ${SRC_DIR} installkernel KERNCONF=${name}.CBSD ${NOCLEANUP} TARGET=${arch} TARGET_ARCH="${target_arch}"
[ -n "${destdir_arg}" ] && KERNEL_DIR="${destdir_arg}"

[ -z "${KERNEL_DIR}" ] && err 1 "${N1_COLOR}{CBSD_APP}: empty KERNEL_DIR variable${N0_COLOR}"
[ -d "${KERNEL_DIR}/boot/kernel" ] && ${RM_CMD} -rf ${KERNEL_DIR}/boot/kernel

${MAKE_CMD} -C ${SRC_DIR} installkernel KERNCONF=${name}.CBSD ${NOCLEANUP} TARGET=${arch} TARGET_ARCH="${target_arch}" DESTDIR=${KERNEL_DIR}
register_kernel arch=${arch} ver=${ver} source="installkernel"

exit 0
