xref: /netbsd-src/distrib/sets/maketars (revision ce666bb8ce77792a3948ca697c2fdad578a542a7)
1#!/bin/sh
2#
3# $NetBSD: maketars,v 1.55 2005/10/21 02:41:14 jmc 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##*/}
18
19# set defaults
20: ${HOST_SH:=sh}
21: ${MKTEMP:=mktemp}
22: ${MTREE:=/usr/sbin/mtree}
23: ${PAX:=pax}
24
25rundir=${0%/*}
26. ${rundir}/sets.subr
27lists=$nlists
28
29tars=$RELEASEDIR
30dest=$DESTDIR
31metalog=
32installdir=
33etcdir=
34setfilesonly=false
35
36usage()
37{
38	cat 1>&2 <<USAGE
39Usage: ${prog} [-b] [-x] [-i idir] [-a arch] [-m machine] [-s setsdir] [-S]
40	    [-M metalog] [-N etcdir] [-d dest] [-t targetdir] [setname ...]
41	-b		Make both netbsd and x11 lists
42	-x		Only make x11 lists
43		[Default: make netbsd lists]
44	-i idir		Install sets to idir instead of creating tar files
45	-a arch		Set arch (e.g, m68k, mipseb, mipsel, powerpc) [$MACHINE_ARCH]
46	-m machine	Set machine (e.g, amiga, i386, macppc) [$MACHINE]
47	-s setsdir	Directory to find sets [$setsdir]
48	-S		Exit after creating set files $dest/etc/mtree/set.*
49	-M metalog	metalog file
50	-N etcdir	etc dir for metalog use [$dest/etc]
51	-d dest		\$DESTDIR	[$dest]
52	-t targetdir	\$RELEASEDIR	[$tars]
53	[setname ...]	Sets to build 	[$lists]
54USAGE
55	exit 1
56}
57
58# handle args
59while getopts bxi:a:m:s:SM:N:d:t: ch; do
60	case ${ch} in
61	b)
62		lists="$nlists $xlists"
63		;;
64	x)
65		lists="$xlists"
66		;;
67	i)
68		installdir=${OPTARG}
69		;;
70	a)
71		MACHINE_ARCH=${OPTARG}
72		MACHINE_CPU=$(arch_to_cpu ${OPTARG})
73		;;
74	m)
75		MACHINE=${OPTARG}
76		;;
77	s)
78		setsdir=${OPTARG}
79		;;
80	S)
81		setfilesonly=true
82		;;
83	M)
84		metalog=${OPTARG}
85		;;
86	N)
87		etcdir=${OPTARG}
88		;;
89	d)
90		dest=${OPTARG}
91		;;
92	t)
93		tars=${OPTARG}
94		;;
95	*)
96		usage
97		;;
98	esac
99done
100shift $((${OPTIND} - 1))
101if [ -n "$installdir" ]; then	# if -i, remove etc & xetc from the default list
102	lists=$(echo $lists | sed -e 's/ etc / /;s/ xetc / /')
103fi
104if [ -n "$*" ]; then
105	lists="$*"
106fi
107
108if [ -z "$tars" -a -z "$installdir" ]; then
109	echo 1>&2 \$RELEASEDIR must be set, or -i must be used
110	exit 1
111fi
112
113if [ -z "$dest" ]; then
114	echo 1>&2 \$DESTDIR must be set
115	exit 1
116fi
117: ${etcdir:=${dest}/etc}
118
119SDIR=$(${MKTEMP} -d /tmp/${prog}.XXXXXX)
120
121setlistdir=${dest}/etc/mtree
122
123cleanup()
124{
125	es=$?
126	/bin/rm -rf $SDIR
127	exit $es
128}
129trap cleanup 0 2 3 13		# EXIT INT QUIT PIPE
130
131#
132# build the setfiles
133#
134
135if [ -n "$metalog" ]; then
136	(
137		cat ${etcdir}/mtree/NetBSD.dist
138		echo "/unset all"
139		cat $metalog 2>/dev/null
140	) | ${MTREE} -C -k all -N ${etcdir} > $SDIR/metalog
141	rv=$?
142	if [ $rv -ne 0 ]; then
143		echo 1>&2 "${prog}: mtree parse of ${metalog} failed"
144		exit $rv
145	fi
146fi
147for setname in $lists; do
148	${HOST_SH} $setsdir/makeflist -a $MACHINE_ARCH -m $MACHINE \
149	    -s $setsdir $setname > $SDIR/flist.$setname
150	if [ -n "$metalog" ]; then
151		$setfilesonly && echo "Creating ${setlistdir}/set.${setname}"
152		awk -f $rundir/getdirs.awk $SDIR/flist.$setname \
153		    | sort -u > $SDIR/flist.$setname.full
154		(
155			echo "/set uname=root gname=wheel"
156			awk -f $rundir/join.awk $SDIR/flist.$setname.full $SDIR/metalog
157			echo "./etc/mtree/set.${setname} type=file mode=0444"
158		) > ${setlistdir}/set.${setname}
159	elif ! cmp -s ${SDIR}/flist.${setname} \
160			${setlistdir}/set.${setname} >/dev/null 2>&1; then
161		rm -f ${setlistdir}/set.${setname}
162		cp ${SDIR}/flist.${setname} ${setlistdir}/set.${setname}
163	fi
164done
165if $setfilesonly; then		# exit after creating the set lists
166	exit 0
167fi
168
169#
170# now build the tarfiles
171#
172
173GZIP=-9			# for pax -z
174export GZIP
175es=0
176for setname in $lists; do
177	out=$setname.tgz
178	if [ -n "$installdir" ]; then
179		echo "Copying set $setname"
180		( cd $dest ; \
181		    ${PAX} -O -rwpe -d -N${etcdir} ${metalog:+-M} \
182			${installdir} < ${setlistdir}/set.${setname} )
183	else
184		if [ -n "$metalog" -a $tars/$out -nt "$metalog" ]; then
185			echo "$out is up to date"
186			continue
187		fi
188		echo "Creating $out"
189		rm -f ${tars}/$out
190		( cd $dest ; \
191		    ${PAX} -O -w -d -z -N${etcdir} ${metalog:+-M} \
192			< ${setlistdir}/set.${setname} ) > ${tars}/$out.tmp &&
193		mv ${tars}/$out.tmp ${tars}/$out
194	fi
195	es=$(($es + $?))
196done
197if [ $es -gt 255 ] ; then
198	es=255
199fi
200exit $es
201