#!/usr/local/bin/cbsd
#v11.1.16
CBSDMODULE="sys"
MYARG=""
MYOPTARG="arch basename destdir qemu 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 'cbsd buildworld'.

${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}qemu${N0_COLOR}              - '0' - copy (default) or '1' - do not copy the 
                     qemu emulator into base /bin;
 ${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
  cbsd install-pkg-world --help

"

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

if [ -n "${qemu}" ]; then
	oqemu="${qemu}"
else
	qemu=1
fi

. ${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}/$( ${miscdir}/cbsd_md5 ${MAKEOBJDIRPREFIX} ).lock
#LOCKFILE=${ftmpdir}/$( ${miscdir}/cbsd_md5 ${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

# map amd64 -> x86_64 for DFLY
if [ "${platform}" = "DragonFly" ]; then
	case "${arch}" in
		amd64)
			build_arch="x86_64"
			build_target_arch="x86_64"
			;;
	esac
else
	build_arch="${arch}"
	build_target_arch="${target_arch}"
fi

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

# fix for  (14-CURRENT only?)
# ./sl_SI.ISO8859-2/LC_MESSAGES: broken symbolic link to ../sr_RS.ISO8859-2/LC_MESSAGES
#./nn_NO.ISO8859-15/LC_MESSAGES: broken symbolic link to ../nn_NO.ISO8859-15/LC_MESSAGES
#./nn_NO.ISO8859-1/LC_MESSAGES: broken symbolic link to ../nn_NO.ISO8859-15/LC_MESSAGES
set +o errexit
${ECHO} "${N1_COLOR}${CBSD_APP}: find for broken symlinks ${N2_COLOR}${BASE_DIR}/share/locale/${N0_COLOR}"
${FIND_CMD} "${BASE_DIR}/usr/share/locale/" -mindepth 1 -type l -print | while read _l; do
	${FILE_CMD} -s ${_l} | ${GREP_CMD} -q "broken symbolic link" > /dev/null 2>&1
	_ret=$?
	if [ ${_ret} -eq 0 ]; then
		${ECHO} "${W1_COLOR}${CBSD_APP}: purge broken symlink: ${N2_COLOR}${_l}${N0_COLOR}"
		${RM_CMD} -f ${_l}
	fi
done
set -o errexit

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

set +o errexit

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

[ ! -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
