maketars revision 1.59
1#!/bin/sh
2#
3# $NetBSD: maketars,v 1.59 2006/01/04 15:03:39 apb Exp $
4#
5# Make release tar files for some or all lists.  Usage:
6# maketars [-b] [-x] [-i installdir] [-a arch] [-m machine] [-s setsdir]
7#	[-M metalog] [-N etcdir] [-d destdir] [-t tardir] [setname ...]
8#
9# The default sets are "base comp etc games man misc text"
10# The X sets are "xbase xcomp xetc xfont xserver"
11#
12# If '-i installdir' is given, copy the given sets to installdir
13# (using pax -rw ...) instead of creating tar files.
14# In this case, remove "etc" and "xetc" from the list of default sets.
15#
16
17prog="${0##*/}"
18rundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/"
19. "${rundir}/sets.subr"
20
21# set defaults
22lists="${nlists}"
23tars="${RELEASEDIR}"
24dest="${DESTDIR}"
25metalog=
26installdir=
27etcdir=
28setfilesonly=false
29
30usage()
31{
32	cat 1>&2 <<USAGE
33Usage: ${prog} [-b] [-x] [-i idir] [-a arch] [-m machine] [-s setsdir] [-S]
34	    [-M metalog] [-N etcdir] [-d dest] [-t targetdir] [setname ...]
35	-b		Make both netbsd and x11 lists
36	-x		Only make x11 lists
37		[Default: make netbsd lists]
38	-i idir		Install sets to idir instead of creating tar files
39	-a arch		Set arch (e.g, m68k, mipseb, mipsel, powerpc) [${MACHINE_ARCH}]
40	-m machine	Set machine (e.g, amiga, i386, macppc) [${MACHINE}]
41	-s setsdir	Directory to find sets [${setsdir}]
42	-S		Exit after creating set files ${dest}/etc/mtree/set.*
43	-M metalog	metalog file
44	-N etcdir	etc dir for metalog use [${dest}/etc]
45	-d dest		\${DESTDIR}	[${dest}]
46	-t targetdir	\${RELEASEDIR}	[${tars}]
47	[setname ...]	Sets to build 	[${lists}]
48USAGE
49	exit 1
50}
51
52# handle args
53while getopts bxi:a:m:s:SM:N:d:t: ch; do
54	case ${ch} in
55	b)
56		lists="${nlists} ${xlists}"
57		;;
58	x)
59		lists="${xlists}"
60		;;
61	i)
62		installdir="${OPTARG}"
63		;;
64	a)
65		MACHINE_ARCH="${OPTARG}"
66		MACHINE_CPU="$(arch_to_cpu "${OPTARG}")"
67		;;
68	m)
69		MACHINE="${OPTARG}"
70		;;
71	s)
72		setsdir="${OPTARG}"
73		;;
74	S)
75		setfilesonly=true
76		;;
77	M)
78		metalog="${OPTARG}"
79		;;
80	N)
81		etcdir="${OPTARG}"
82		;;
83	d)
84		dest="${OPTARG}"
85		;;
86	t)
87		tars="${OPTARG}"
88		;;
89	*)
90		usage
91		;;
92	esac
93done
94shift $((${OPTIND} - 1))
95if [ -n "${installdir}" ]; then	# if -i, remove etc & xetc from the default list
96	lists="$(echo ${lists} | ${SED} -e 's/ etc / /;s/ xetc / /')"
97fi
98if [ -n "$*" ]; then
99	lists="$*"
100fi
101
102if [ -z "${tars}" -a -z "${installdir}" ]; then
103	echo 1>&2 \${RELEASEDIR} must be set, or -i must be used
104	exit 1
105fi
106
107if [ -z "${dest}" ]; then
108	echo 1>&2 \${DESTDIR} must be set
109	exit 1
110fi
111: ${etcdir:="${dest}/etc"}
112
113SDIR="$(${MKTEMP} -d "/tmp/${prog}.XXXXXX")"
114
115setlistdir="${dest}/etc/mtree"
116
117cleanup()
118{
119	es=$?
120	/bin/rm -rf "${SDIR}"
121	exit ${es}
122}
123trap cleanup 0 2 3 13		# EXIT INT QUIT PIPE
124
125#
126# build the setfiles
127#
128
129for setname in ${lists}; do
130	${HOST_SH} "${setsdir}/makeflist" -a "${MACHINE_ARCH}" -m "${MACHINE}" \
131	    -s "${setsdir}" "${setname}" > "${SDIR}/flist.${setname}"
132	if [ -n "${metalog}" ]; then
133		${setfilesonly} && echo "Creating ${setlistdir}/set.${setname}"
134		${AWK} -f "${rundir}/getdirs.awk" "${SDIR}/flist.${setname}" \
135		    | ${SORT} -u > "${SDIR}/flist.${setname}.full"
136		(
137			echo "/set uname=root gname=wheel"
138			${AWK} -f "${rundir}/join.awk" \
139				"${SDIR}/flist.${setname}.full" "${metalog}"
140			echo "./etc/mtree/set.${setname} type=file mode=0444"
141		) > "${setlistdir}/set.${setname}"
142		# We deliberately do not add set.${setname} to ${metalog},
143		# because we depend on it as an input.
144	elif ! cmp -s "${SDIR}/flist.${setname}" \
145			"${setlistdir}/set.${setname}" >/dev/null 2>&1; then
146		rm -f "${setlistdir}/set.${setname}"
147		cp "${SDIR}/flist.${setname}" "${setlistdir}/set.${setname}"
148	fi
149done
150if ${setfilesonly}; then		# exit after creating the set lists
151	exit 0
152fi
153
154#
155# now build the tarfiles
156#
157
158GZIP=-9			# for pax -z
159export GZIP
160es=0
161for setname in ${lists}; do
162	out="${setname}.tgz"
163	if [ -n "${installdir}" ]; then
164		echo "Copying set ${setname}"
165		( cd "${dest}" ; \
166		    ${PAX} -O -rwpe -d -N"${etcdir}" ${metalog:+-M} \
167			"${installdir}" < "${setlistdir}/set.${setname}" )
168	else
169		if [ -n "${metalog}" -a "${tars}/${out}" -nt "${metalog}" ]
170		then
171			echo "${out} is up to date"
172			continue
173		fi
174		echo "Creating ${out}"
175		rm -f "${tars}/${out}"
176		( cd "${dest}" ; \
177		    ${PAX} -O -w -d -z -N"${etcdir}" ${metalog:+-M} \
178			< "${setlistdir}/set.${setname}" ) \
179			> "${tars}/${out}.tmp" &&
180		mv "${tars}/${out}.tmp" "${tars}/${out}"
181	fi
182	es=$((${es} + $?))
183done
184if [ ${es} -gt 255 ] ; then
185	es=255
186fi
187exit ${es}
188