#!/usr/local/bin/cbsd
#v10.0.3
CBSDMODULE="build"
MYARG=""
MYOPTARG="arch basename clean destdir maxjobs name stable stable target_arch ver"
MYDESC="Install kernel from sources in ~cbsd/basejail/ directory hier"
ADDHELP="

${H3_COLOR}Description${N0_COLOR}:

This script is usually used in conjunction with 'jail2iso' to obtain VM/memstick/ISO images.
The script uses a source tree from ~cbsd/src/ directory which can be 
obtained or updated through 'cbsd srcup' command.

Please note that this script does not manage and is not related to the 
system kernel/directory (/boot/kernel) in any way. 

The kernel files will be installed in ~cbsd/basejail/FreeBSD-kernel_XXX dir.

${H3_COLOR}Options${N0_COLOR}:

 ${N2_COLOR}arch=${N0_COLOR}        - <name>, build non-native architectures.
 ${N2_COLOR}destdir=${N0_COLOR}     - for alternative install path in root dir
 ${N2_COLOR}name=${N0_COLOR}        - Alternative kernel name (default: CBSD);
 ${N2_COLOR}ver=${N0_COLOR}         - source version, e.g.: ver=14.1 (14.1-RELEASE) or
                ver=14 (for 14-STABLE) or ver=. for HEAD/CURRENT;

${H3_COLOR}Examples${N0_COLOR}:

cbsd kernel name=GENERIC

${H3_COLOR}See also${N0_COLOR}:

 cbsd srcup --help
 cbsd buildkernel --help
 cbsd kernel --help
 cbsd kernels --help
 cbsd buildworld --help
 cbsd installworld --help
 cbsd bases --help

"

. ${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

# kernel name
[ -z "${name}" ] && name="GENERIC"

init_distcc
init_notify
init_target_arch
init_srcdir
init_supported_arch
init_basedir

LOCKFILE=${ftmpdir}/$( ${miscdir}/cbsd_md5 ${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" name="${name}"

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" name="${name}"

exit 0
