maketars revision 1.59
11.2Sgwr#!/bin/sh
21.2Sgwr#
31.59Sapb# $NetBSD: maketars,v 1.59 2006/01/04 15:03:39 apb Exp $
41.2Sgwr#
51.2Sgwr# Make release tar files for some or all lists.  Usage:
61.34Slukem# maketars [-b] [-x] [-i installdir] [-a arch] [-m machine] [-s setsdir]
71.34Slukem#	[-M metalog] [-N etcdir] [-d destdir] [-t tardir] [setname ...]
81.35Slukem#
91.35Slukem# The default sets are "base comp etc games man misc text"
101.50Slukem# The X sets are "xbase xcomp xetc xfont xserver"
111.35Slukem#
121.35Slukem# If '-i installdir' is given, copy the given sets to installdir
131.35Slukem# (using pax -rw ...) instead of creating tar files.
141.49Slukem# In this case, remove "etc" and "xetc" from the list of default sets.
151.2Sgwr#
161.2Sgwr
171.58Sapbprog="${0##*/}"
181.56Sapbrundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/"
191.56Sapb. "${rundir}/sets.subr"
201.41Slukem
211.2Sgwr# set defaults
221.58Sapblists="${nlists}"
231.58Sapbtars="${RELEASEDIR}"
241.58Sapbdest="${DESTDIR}"
251.18Slukemmetalog=
261.28Slukeminstalldir=
271.30Slukemetcdir=
281.50Slukemsetfilesonly=false
291.2Sgwr
301.47Slukemusage()
311.47Slukem{
321.47Slukem	cat 1>&2 <<USAGE
331.50SlukemUsage: ${prog} [-b] [-x] [-i idir] [-a arch] [-m machine] [-s setsdir] [-S]
341.36Slukem	    [-M metalog] [-N etcdir] [-d dest] [-t targetdir] [setname ...]
351.50Slukem	-b		Make both netbsd and x11 lists
361.50Slukem	-x		Only make x11 lists
371.50Slukem		[Default: make netbsd lists]
381.50Slukem	-i idir		Install sets to idir instead of creating tar files
391.58Sapb	-a arch		Set arch (e.g, m68k, mipseb, mipsel, powerpc) [${MACHINE_ARCH}]
401.58Sapb	-m machine	Set machine (e.g, amiga, i386, macppc) [${MACHINE}]
411.58Sapb	-s setsdir	Directory to find sets [${setsdir}]
421.58Sapb	-S		Exit after creating set files ${dest}/etc/mtree/set.*
431.18Slukem	-M metalog	metalog file
441.58Sapb	-N etcdir	etc dir for metalog use [${dest}/etc]
451.58Sapb	-d dest		\${DESTDIR}	[${dest}]
461.58Sapb	-t targetdir	\${RELEASEDIR}	[${tars}]
471.58Sapb	[setname ...]	Sets to build 	[${lists}]
481.9SlukemUSAGE
491.47Slukem	exit 1
501.47Slukem}
511.47Slukem
521.47Slukem# handle args
531.50Slukemwhile getopts bxi:a:m:s:SM:N:d:t: ch; do
541.47Slukem	case ${ch} in
551.47Slukem	b)
561.58Sapb		lists="${nlists} ${xlists}"
571.47Slukem		;;
581.47Slukem	x)
591.58Sapb		lists="${xlists}"
601.47Slukem		;;
611.47Slukem	i)
621.58Sapb		installdir="${OPTARG}"
631.47Slukem		;;
641.47Slukem	a)
651.58Sapb		MACHINE_ARCH="${OPTARG}"
661.58Sapb		MACHINE_CPU="$(arch_to_cpu "${OPTARG}")"
671.47Slukem		;;
681.47Slukem	m)
691.58Sapb		MACHINE="${OPTARG}"
701.47Slukem		;;
711.47Slukem	s)
721.58Sapb		setsdir="${OPTARG}"
731.47Slukem		;;
741.50Slukem	S)
751.50Slukem		setfilesonly=true
761.50Slukem		;;
771.47Slukem	M)
781.58Sapb		metalog="${OPTARG}"
791.47Slukem		;;
801.47Slukem	N)
811.58Sapb		etcdir="${OPTARG}"
821.47Slukem		;;
831.47Slukem	d)
841.58Sapb		dest="${OPTARG}"
851.47Slukem		;;
861.47Slukem	t)
871.58Sapb		tars="${OPTARG}"
881.9Slukem		;;
891.9Slukem	*)
901.47Slukem		usage
911.9Slukem		;;
921.2Sgwr	esac
931.2Sgwrdone
941.47Slukemshift $((${OPTIND} - 1))
951.58Sapbif [ -n "${installdir}" ]; then	# if -i, remove etc & xetc from the default list
961.58Sapb	lists="$(echo ${lists} | ${SED} -e 's/ etc / /;s/ xetc / /')"
971.28Slukemfi
981.10Srossif [ -n "$*" ]; then
991.10Sross	lists="$*"
1001.9Slukemfi
1011.1Scgd
1021.58Sapbif [ -z "${tars}" -a -z "${installdir}" ]; then
1031.58Sapb	echo 1>&2 \${RELEASEDIR} must be set, or -i must be used
1041.1Scgd	exit 1
1051.9Slukemfi
1061.1Scgd
1071.58Sapbif [ -z "${dest}" ]; then
1081.58Sapb	echo 1>&2 \${DESTDIR} must be set
1091.1Scgd	exit 1
1101.9Slukemfi
1111.58Sapb: ${etcdir:="${dest}/etc"}
1121.1Scgd
1131.58SapbSDIR="$(${MKTEMP} -d "/tmp/${prog}.XXXXXX")"
1141.20Sbjh21
1151.58Sapbsetlistdir="${dest}/etc/mtree"
1161.50Slukem
1171.38Serhcleanup()
1181.38Serh{
1191.44Sdsl	es=$?
1201.58Sapb	/bin/rm -rf "${SDIR}"
1211.58Sapb	exit ${es}
1221.38Serh}
1231.38Serhtrap cleanup 0 2 3 13		# EXIT INT QUIT PIPE
1241.18Slukem
1251.50Slukem#
1261.50Slukem# build the setfiles
1271.50Slukem#
1281.50Slukem
1291.58Sapbfor setname in ${lists}; do
1301.58Sapb	${HOST_SH} "${setsdir}/makeflist" -a "${MACHINE_ARCH}" -m "${MACHINE}" \
1311.58Sapb	    -s "${setsdir}" "${setname}" > "${SDIR}/flist.${setname}"
1321.58Sapb	if [ -n "${metalog}" ]; then
1331.58Sapb		${setfilesonly} && echo "Creating ${setlistdir}/set.${setname}"
1341.58Sapb		${AWK} -f "${rundir}/getdirs.awk" "${SDIR}/flist.${setname}" \
1351.58Sapb		    | ${SORT} -u > "${SDIR}/flist.${setname}.full"
1361.23Slukem		(
1371.23Slukem			echo "/set uname=root gname=wheel"
1381.58Sapb			${AWK} -f "${rundir}/join.awk" \
1391.59Sapb				"${SDIR}/flist.${setname}.full" "${metalog}"
1401.50Slukem			echo "./etc/mtree/set.${setname} type=file mode=0444"
1411.58Sapb		) > "${setlistdir}/set.${setname}"
1421.59Sapb		# We deliberately do not add set.${setname} to ${metalog},
1431.59Sapb		# because we depend on it as an input.
1441.58Sapb	elif ! cmp -s "${SDIR}/flist.${setname}" \
1451.58Sapb			"${setlistdir}/set.${setname}" >/dev/null 2>&1; then
1461.58Sapb		rm -f "${setlistdir}/set.${setname}"
1471.58Sapb		cp "${SDIR}/flist.${setname}" "${setlistdir}/set.${setname}"
1481.18Slukem	fi
1491.50Slukemdone
1501.58Sapbif ${setfilesonly}; then		# exit after creating the set lists
1511.50Slukem	exit 0
1521.50Slukemfi
1531.18Slukem
1541.50Slukem#
1551.50Slukem# now build the tarfiles
1561.50Slukem#
1571.50Slukem
1581.50SlukemGZIP=-9			# for pax -z
1591.50Slukemexport GZIP
1601.50Slukemes=0
1611.58Sapbfor setname in ${lists}; do
1621.58Sapb	out="${setname}.tgz"
1631.58Sapb	if [ -n "${installdir}" ]; then
1641.58Sapb		echo "Copying set ${setname}"
1651.58Sapb		( cd "${dest}" ; \
1661.58Sapb		    ${PAX} -O -rwpe -d -N"${etcdir}" ${metalog:+-M} \
1671.58Sapb			"${installdir}" < "${setlistdir}/set.${setname}" )
1681.28Slukem	else
1691.58Sapb		if [ -n "${metalog}" -a "${tars}/${out}" -nt "${metalog}" ]
1701.58Sapb		then
1711.58Sapb			echo "${out} is up to date"
1721.50Slukem			continue
1731.50Slukem		fi
1741.58Sapb		echo "Creating ${out}"
1751.58Sapb		rm -f "${tars}/${out}"
1761.58Sapb		( cd "${dest}" ; \
1771.58Sapb		    ${PAX} -O -w -d -z -N"${etcdir}" ${metalog:+-M} \
1781.58Sapb			< "${setlistdir}/set.${setname}" ) \
1791.58Sapb			> "${tars}/${out}.tmp" &&
1801.58Sapb		mv "${tars}/${out}.tmp" "${tars}/${out}"
1811.28Slukem	fi
1821.58Sapb	es=$((${es} + $?))
1831.2Sgwrdone
1841.58Sapbif [ ${es} -gt 255 ] ; then
1851.38Serh	es=255
1861.38Serhfi
1871.58Sapbexit ${es}
188