maketars revision 1.72
11.2Sgwr#!/bin/sh
21.2Sgwr#
31.72Scegger# $NetBSD: maketars,v 1.72 2009/12/05 15:56:25 cegger 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.62Sjmmv# The default sets are "base comp etc games man misc tests text"
101.50Slukem# The X sets are "xbase xcomp xetc xfont xserver"
111.70Suebayasi# The extsrc sets are "extbase extcomp extetc"
121.35Slukem#
131.35Slukem# If '-i installdir' is given, copy the given sets to installdir
141.35Slukem# (using pax -rw ...) instead of creating tar files.
151.70Suebayasi# In this case, remove "etc", "xetc", and "extetc" from the list of default sets.
161.2Sgwr#
171.2Sgwr
181.58Sapbprog="${0##*/}"
191.56Sapbrundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/"
201.56Sapb. "${rundir}/sets.subr"
211.41Slukem
221.2Sgwr# set defaults
231.72Sceggerlists=
241.58Sapbtars="${RELEASEDIR}"
251.58Sapbdest="${DESTDIR}"
261.18Slukemmetalog=
271.28Slukeminstalldir=
281.30Slukemetcdir=
291.50Slukemsetfilesonly=false
301.64Slukemquiet=false
311.2Sgwr
321.47Slukemusage()
331.47Slukem{
341.47Slukem	cat 1>&2 <<USAGE
351.70SuebayasiUsage: ${prog} [-L base,x,ext] [-b] [-x] [-y] [-i idir] [-a arch] [-m machine] [-s setsdir] [-S]
361.36Slukem	    [-M metalog] [-N etcdir] [-d dest] [-t targetdir] [setname ...]
371.70Suebayasi	-L base,x,ext	Make specified lists
381.50Slukem	-b		Make both netbsd and x11 lists
391.50Slukem	-x		Only make x11 lists
401.50Slukem		[Default: make netbsd lists]
411.70Suebayasi	-y		Only make extsrc lists
421.70Suebayasi		[Default: make netbsd lists]
431.50Slukem	-i idir		Install sets to idir instead of creating tar files
441.58Sapb	-a arch		Set arch (e.g, m68k, mipseb, mipsel, powerpc) [${MACHINE_ARCH}]
451.58Sapb	-m machine	Set machine (e.g, amiga, i386, macppc) [${MACHINE}]
461.64Slukem	-q		Quiet operation
471.58Sapb	-s setsdir	Directory to find sets [${setsdir}]
481.58Sapb	-S		Exit after creating set files ${dest}/etc/mtree/set.*
491.18Slukem	-M metalog	metalog file
501.58Sapb	-N etcdir	etc dir for metalog use [${dest}/etc]
511.58Sapb	-d dest		\${DESTDIR}	[${dest}]
521.58Sapb	-t targetdir	\${RELEASEDIR}	[${tars}]
531.58Sapb	[setname ...]	Sets to build 	[${lists}]
541.9SlukemUSAGE
551.47Slukem	exit 1
561.47Slukem}
571.47Slukem
581.64Slukemmsg()
591.64Slukem{
601.64Slukem	$quiet || echo $*
611.64Slukem}
621.64Slukem
631.47Slukem# handle args
641.70Suebayasiwhile getopts L:bxyi:a:m:qs:SM:N:d:t: ch; do
651.47Slukem	case ${ch} in
661.70Suebayasi	L)
671.72Scegger		save_IFS="${IFS}"
681.72Scegger		IFS=,
691.72Scegger		for _list in ${OPTARG}; do
701.72Scegger			case $_list in
711.72Scegger			base)	lists="${lists} ${nlists}" ;;
721.72Scegger			x)	lists="${lists} ${xlists}" ;;
731.72Scegger			ext)	lists="${lists} ${extlists}" ;;
741.72Scegger			esac
751.72Scegger		done
761.72Scegger		IFS="${save_IFS}"
771.70Suebayasi		;;
781.70Suebayasi	# backward compat
791.47Slukem	b)
801.58Sapb		lists="${nlists} ${xlists}"
811.47Slukem		;;
821.47Slukem	x)
831.58Sapb		lists="${xlists}"
841.47Slukem		;;
851.70Suebayasi	y)
861.70Suebayasi		lists="${extlists}"
871.70Suebayasi		;;
881.47Slukem	i)
891.58Sapb		installdir="${OPTARG}"
901.47Slukem		;;
911.47Slukem	a)
921.58Sapb		MACHINE_ARCH="${OPTARG}"
931.58Sapb		MACHINE_CPU="$(arch_to_cpu "${OPTARG}")"
941.47Slukem		;;
951.47Slukem	m)
961.58Sapb		MACHINE="${OPTARG}"
971.47Slukem		;;
981.64Slukem	q)
991.64Slukem		quiet=true
1001.64Slukem		;;
1011.47Slukem	s)
1021.58Sapb		setsdir="${OPTARG}"
1031.47Slukem		;;
1041.50Slukem	S)
1051.50Slukem		setfilesonly=true
1061.50Slukem		;;
1071.47Slukem	M)
1081.58Sapb		metalog="${OPTARG}"
1091.47Slukem		;;
1101.47Slukem	N)
1111.58Sapb		etcdir="${OPTARG}"
1121.47Slukem		;;
1131.47Slukem	d)
1141.58Sapb		dest="${OPTARG}"
1151.47Slukem		;;
1161.47Slukem	t)
1171.58Sapb		tars="${OPTARG}"
1181.9Slukem		;;
1191.9Slukem	*)
1201.47Slukem		usage
1211.9Slukem		;;
1221.2Sgwr	esac
1231.2Sgwrdone
1241.47Slukemshift $((${OPTIND} - 1))
1251.70Suebayasiif [ -n "${installdir}" ]; then	# if -i, remove etc + xetc + extetc from the default list
1261.70Suebayasi	lists="$(echo ${lists} | ${SED} -e 's/ etc / /;s/ xetc / /;s/ extetc / /')"
1271.28Slukemfi
1281.10Srossif [ -n "$*" ]; then
1291.10Sross	lists="$*"
1301.9Slukemfi
1311.1Scgd
1321.58Sapbif [ -z "${tars}" -a -z "${installdir}" ]; then
1331.60Sapb	echo >&2 "${prog}: \${RELEASEDIR} must be set, or -i must be used"
1341.1Scgd	exit 1
1351.9Slukemfi
1361.1Scgd
1371.58Sapbif [ -z "${dest}" ]; then
1381.60Sapb	echo >&2 "${prog}: \${DESTDIR} must be set"
1391.1Scgd	exit 1
1401.9Slukemfi
1411.58Sapb: ${etcdir:="${dest}/etc"}
1421.1Scgd
1431.58SapbSDIR="$(${MKTEMP} -d "/tmp/${prog}.XXXXXX")"
1441.63SlukemTMPFILES=
1451.20Sbjh21
1461.58Sapbsetlistdir="${dest}/etc/mtree"
1471.50Slukem
1481.38Serhcleanup()
1491.38Serh{
1501.44Sdsl	es=$?
1511.63Slukem	/bin/rm -rf "${SDIR}" ${TMPFILES}
1521.63Slukem	trap - 0
1531.58Sapb	exit ${es}
1541.38Serh}
1551.38Serhtrap cleanup 0 2 3 13		# EXIT INT QUIT PIPE
1561.18Slukem
1571.50Slukem#
1581.50Slukem# build the setfiles
1591.50Slukem#
1601.50Slukem
1611.58Sapbfor setname in ${lists}; do
1621.58Sapb	${HOST_SH} "${setsdir}/makeflist" -a "${MACHINE_ARCH}" -m "${MACHINE}" \
1631.69Sapb	    -s "${setsdir}" "${setname}" > "${SDIR}/flist.${setname}" \
1641.69Sapb	    || exit 1
1651.71Sapb	if ! [ -s "${SDIR}/flist.${setname}" ]; then
1661.71Sapb		echo >&2 "makeflist output is empty for ${setname}"
1671.71Sapb		exit 1
1681.71Sapb	fi
1691.58Sapb	if [ -n "${metalog}" ]; then
1701.64Slukem		${setfilesonly} && msg "Creating ${setlistdir}/set.${setname}"
1711.58Sapb		${AWK} -f "${rundir}/getdirs.awk" "${SDIR}/flist.${setname}" \
1721.69Sapb		    > "${SDIR}/flist.${setname}.full" \
1731.69Sapb		    || exit 1
1741.23Slukem		(
1751.23Slukem			echo "/set uname=root gname=wheel"
1761.58Sapb			${AWK} -f "${rundir}/join.awk" \
1771.68Sapb				"${SDIR}/flist.${setname}.full" "${metalog}"
1781.50Slukem			echo "./etc/mtree/set.${setname} type=file mode=0444"
1791.68Sapb		) | ${MTREE} -CS -k all -R time -N "${etcdir}" \
1801.69Sapb		    > "${setlistdir}/set.${setname}" \
1811.69Sapb		    || exit 1
1821.59Sapb		# We deliberately do not add set.${setname} to ${metalog},
1831.59Sapb		# because we depend on it as an input.
1841.58Sapb	elif ! cmp -s "${SDIR}/flist.${setname}" \
1851.58Sapb			"${setlistdir}/set.${setname}" >/dev/null 2>&1; then
1861.58Sapb		rm -f "${setlistdir}/set.${setname}"
1871.69Sapb		cp "${SDIR}/flist.${setname}" "${setlistdir}/set.${setname}" \
1881.69Sapb		    || exit 1
1891.18Slukem	fi
1901.50Slukemdone
1911.58Sapbif ${setfilesonly}; then		# exit after creating the set lists
1921.50Slukem	exit 0
1931.50Slukemfi
1941.18Slukem
1951.50Slukem#
1961.50Slukem# now build the tarfiles
1971.50Slukem#
1981.50Slukem
1991.67SperryGZIP=-9n		# for pax -z
2001.50Slukemexport GZIP
2011.50Slukemes=0
2021.72Sceggerfor setname in ${lists:-${nlists}}; do
2031.58Sapb	out="${setname}.tgz"
2041.58Sapb	if [ -n "${installdir}" ]; then
2051.64Slukem		msg "Copying set ${setname}"
2061.61Sapb		( cd "${dest}"; \
2071.58Sapb		    ${PAX} -O -rwpe -d -N"${etcdir}" ${metalog:+-M} \
2081.58Sapb			"${installdir}" < "${setlistdir}/set.${setname}" )
2091.28Slukem	else
2101.58Sapb		if [ -n "${metalog}" -a "${tars}/${out}" -nt "${metalog}" ]
2111.58Sapb		then
2121.64Slukem			msg "${out} is up to date"
2131.50Slukem			continue
2141.50Slukem		fi
2151.64Slukem		msg "Creating ${out}"
2161.58Sapb		rm -f "${tars}/${out}"
2171.63Slukem		TMPFILES="${TMPFILES} ${tars}/${out}.tmp"
2181.61Sapb		( cd "${dest}"; \
2191.58Sapb		    ${PAX} -O -w -d -z -N"${etcdir}" ${metalog:+-M} \
2201.58Sapb			< "${setlistdir}/set.${setname}" ) \
2211.58Sapb			> "${tars}/${out}.tmp" &&
2221.58Sapb		mv "${tars}/${out}.tmp" "${tars}/${out}"
2231.28Slukem	fi
2241.58Sapb	es=$((${es} + $?))
2251.2Sgwrdone
2261.61Sapbif [ ${es} -gt 255 ]; then
2271.38Serh	es=255
2281.38Serhfi
2291.58Sapbexit ${es}
230