#!/usr/local/bin/cbsd
#v11.1.16
CBSDMODULE="sys"
MYARG=""
MYOPTARG="arch basename destdir register_basename stable target_arch ver"
MYDESC="Install base from obj files after buildworld (basejail)"
ADDHELP="\

${H3_COLOR}Description${N0_COLOR}:

Install FreeBSD base files to ~cbsd/basejail/ directory after 'cbsdbuildworld'.

${H3_COLOR}Options${N0_COLOR}:

 ${N2_COLOR}arch=${N0_COLOR}              - <name>, use non-native architectures.
 ${N2_COLOR}basename=${N0_COLOR}          - Prefix for directory name, can be used for jail as alternative base.
 ${N2_COLOR}destdir${N0_COLOR}            - <path> - alternative DESTDIR= path instead of ~cbsd/basejail/.
 ${N2_COLOR}register_basename=${N0_COLOR} - <name> register with alternative/custom basename.
 ${N2_COLOR}stable=${N0_COLOR}            - 1 for RELENG_X.
 ${N2_COLOR}target_arch=${N0_COLOR}       - <name>, build non-native target arch.
 ${N2_COLOR}ver=${N0_COLOR}               - set version: '13.0', '13.1';
                      when version without minor version: e.g:
                     '13' or '12' - you will receive RELENG (stable=1), not release.

${H3_COLOR}Examples${N0_COLOR}:

 # cbsd installworld
 # cbsd installworld destdir=/tmp/testbase

${H3_COLOR}See also${N0_COLOR}:

  cbsd buildworld --help
  cbsd bases --help
  cbsd world --help

"

. ${subrdir}/nc.subr
readconf buildworld.conf
register_basename=

. ${cbsdinit}

. ${subrdir}/universe.subr

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

# By default ver=current version
. ${subrdir}/build.subr

init_distcc
init_notify
init_target_arch
init_srcdir
init_supported_arch

if [ -n "${register_basename}" ]; then
	init_basedir -b ${register_basename}
else
	init_basedir
fi

#TARGET_ARCH="${target_arch}"

[ ! -d "${BASE_DIR}" ] && ${MKDIR_CMD} -p ${BASE_DIR}
#LOCKFILE=${ftmpdir}/$( ${MD5_CMD} -qs ${MAKEOBJDIRPREFIX} ).lock
#LOCKFILE=${ftmpdir}/$( ${MD5_CMD} -qs ${MAKEOBJDIRPREFIX} ).lock
makelock ${BASE_DIR_LOCKFILE} "cleanup_bases"

# make base lock
echo $$ > ${BASE_DIR_LOCKFILE}

#  work-around for:
# rm -rf /tmp/install.PazxMxWt
# make[2]: "/usr/jails/src/src_11/src/share/mk/bsd.compiler.mk" line 37: Unable to determine compiler type for cc.  Consider setting COMPILER_TYPE.
# *** Error code 1
[ "$arch" = "arm" ] && export COMPILER_TYPE="clang"

if [ -n "${register_basename}" ]; then
	_basename_args="basename=\"${register_basename}\""
else
	_basename_args=
fi

register_base arch=${arch} ver=${ver} source="installworld" auto_baseupdate=0 ${_basename_args}

if [ -x "${BASE_DIR}/bin/sh" ]; then
	baseelf=$( ${miscdir}/elf_tables --ver ${BASE_DIR}/bin/sh 2>/dev/null )
	[ -z "${baseelf}" ] && baseelf="0"
	register_base arch=${arch} ver=${ver} source="installworld" auto_baseupdate=0 ${_basename_args}	# again: update elf
	base_status_is_maintenance_soft
else
	base_status_is_maintenance_hard
fi

[ ! -r ${SRC_DIR} ] && err 1 "${N1_COLOR}No such Makefile in: ${N2_COLOR}${SRC_DIR}${N0_COLOR}"

[ ! -r ${SRC_DIR}/etc/sendmail/freebsd.cf ] && ${MAKE_CMD} -C ${SRC_DIR}/etc/sendmail >/dev/null 2>&1 ||true

set -o errexit
cbsdlogger NOTICE ${CBSD_APP}: installdworld started: ${MAKE_CMD} -C ${SRC_DIR} installworld DESTDIR=${BASE_DIR} TARGET=${arch} TARGET_ARCH=${target_arch}
${MAKE_CMD} -C ${SRC_DIR} installworld DESTDIR=${BASE_DIR} TARGET=${arch} TARGET_ARCH=${target_arch}
cbsdlogger NOTICE ${CBSD_APP}: installdworld ended: ${MAKE_CMD} -C ${SRC_DIR} installworld DESTDIR=${BASE_DIR} TARGET=${arch} TARGET_ARCH=${target_arch}

if [ "${platform}" = "DragonFly" ]; then
	cbsdlogger NOTICE ${CBSD_APP}: distribution started: ${MAKE_CMD} -C ${SRC_DIR}/etc distribution DESTDIR=${BASE_DIR} TARGET=${arch} TARGET_ARCH=${target_arch}
	${MAKE_CMD} -C ${SRC_DIR}/etc distribution DESTDIR=${BASE_DIR} TARGET=${arch} TARGET_ARCH=${target_arch}
	cbsdlogger NOTICE ${CBSD_APP}: distribution ended: ${MAKE_CMD} -C ${SRC_DIR}/etc distribution DESTDIR=${BASE_DIR} TARGET=${arch} TARGET_ARCH=${target_arch}
else
	cbsdlogger NOTICE ${CBSD_APP}: distribution started: ${MAKE_CMD} -C ${SRC_DIR} distribution DESTDIR=${BASE_DIR} TARGET=${arch} TARGET_ARCH=${target_arch}
	${MAKE_CMD} -C ${SRC_DIR} distribution DESTDIR=${BASE_DIR} TARGET=${arch} TARGET_ARCH=${target_arch}
	cbsdlogger NOTICE ${CBSD_APP}: distribution ended: ${MAKE_CMD} -C ${SRC_DIR} distribution DESTDIR=${BASE_DIR} TARGET=${arch} TARGET_ARCH=${target_arch}
fi

set +o errexit

[ $? -ne 0 ] && err 1 "${N1_COLOR}Installworld error${N0_COLOR}"
preparebase dst=${BASE_DIR} emulator=${emulator}

[ ! -f ${BASE_DIR}/bin/sh ] && err 1 "${N1_COLOR}No such /bin/sh in ${BASE_DIR}. Try to rebuild world${N0_COLOR}"

#idx platform name arch ver stable elf date
baseelf=
baseelf=$( ${miscdir}/elf_tables --ver ${BASE_DIR}/bin/sh 2>/dev/null )

[ -z "${baseelf}" ] && baseelf="0"
register_base arch=${arch} ver=${ver} target_arch="${target_arch}" source="installworld" auto_baseupdate=0 ${_basename_args}

${RM_CMD} -f ${BASE_DIR_LOCKFILE}

exit 0
