xref: /netbsd-src/distrib/sets/maketars (revision da5f4674a3fc214be3572d358b66af40ab9401e7)
1#!/bin/sh
2#
3# $NetBSD: maketars,v 1.42 2003/08/22 19:08:47 dsl 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#
11# If '-i installdir' is given, copy the given sets to installdir
12# (using pax -rw ...) instead of creating tar files.
13# In this case, remove "etc" from the list of default sets.
14#
15
16prog=`basename $0`
17
18# set defaults
19: ${PAX=pax}
20: ${MTREE=mtree}
21make="${MAKE:-make} -j 1 -f `dirname $0`/Makefile"
22
23machine=`${make} print_machine`
24machine_arch=`${make} print_machine_arch`
25setd=`pwd`
26nlists="base comp etc games man misc text"
27xlists="xbase xcomp xcontrib xfont xserver xmisc"
28lists=$nlists
29tars=$RELEASEDIR
30dest=$DESTDIR
31metalog=
32installdir=
33etcdir=
34
35# handle args
36while : ; do
37	case $1 in
38	-b*)
39		lists="$xlists $nlists"
40		;;
41	-x*)
42		lists=$xlists
43		;;
44	-i*)
45		installdir=$2; shift
46		;;
47	-a*)
48		machine_arch=$2; shift
49		;;
50	-M*)
51		metalog=$2; shift
52		;;
53	-m*)
54		machine=$2; shift
55		;;
56	-N*)
57		etcdir=$2; shift
58		;;
59	-s*)
60		setd=$2; shift
61		;;
62	-d*)
63		dest=$2; shift
64		;;
65	-t*)
66		tars=$2; shift
67		;;
68	-*)
69		cat 1>&2 <<USAGE
70Usage: ${prog} [-b] [-x] [-i idir] [-a arch] [-m machine] [-s setsdir]
71	    [-M metalog] [-N etcdir] [-d dest] [-t targetdir] [setname ...]
72	-b		make netbsd + x11 lists
73	-x		only make x11 lists
74	-i idir		install sets to idir instead of creating tar files
75	-a arch		set arch (e.g, m68k, mipseb, mipsel, powerpc) [$machine_arch]
76	-m machine	set machine (e.g, amiga, i386, macppc) [$machine]
77	-s setsdir	directory to find sets [$setd]
78	-M metalog	metalog file
79	-N etcdir	etc dir for metalog use [$dest/etc]
80	-d dest		\$DESTDIR	[$dest]
81	-t targetdir	\$RELEASEDIR	[$tars]
82	[setname ...]	sets to build 	[$lists]
83USAGE
84		exit 1
85		;;
86	*)
87		break
88		;;
89	esac
90	shift
91done
92if [ -n "$installdir" ]; then		# if -i, remove etc from default list
93	lists=$(echo $lists | sed -e 's/ etc / /')
94fi
95if [ -n "$*" ]; then
96	lists="$*"
97fi
98
99if [ -z "$tars" -a -z "$installdir" ]; then
100	echo \$RELEASEDIR must be set, or -i must be used
101	exit 1
102fi
103
104if [ -z "$dest" ]; then
105	echo \$DESTDIR must be set
106	exit 1
107fi
108: ${etcdir:=${dest}/etc}
109
110# Make sure we don't loop forever if mkdir will always fail.
111
112if [ ! -d /tmp ]; then
113	echo /tmp is not a directory
114	exit 1
115fi
116
117if [ ! -w /tmp ]; then
118	echo /tmp is not writable
119	exit 1
120fi
121
122SDIR_BASE=/tmp/maketar.$$
123SDIR_SERIAL=0
124
125while true; do
126	SDIR=${SDIR_BASE}.${SDIR_SERIAL}
127	mkdir -m 0700 ${SDIR} && break
128	SDIR_SERIAL=$((${SDIR_SERIAL} + 1))
129done
130
131es=0
132cleanup()
133{
134	/bin/rm -rf $SDIR
135	if [ $es -gt 255 ] ; then
136		es=255
137	fi
138	exit $es
139}
140trap cleanup 0 2 3 13		# EXIT INT QUIT PIPE
141
142if [ -n "$metalog" ]; then
143	echo "Parsing $metalog"
144	(
145		cat ${etcdir}/mtree/NetBSD.dist
146		echo "/unset all"
147		cat $metalog
148	) | ${MTREE} -C -k all -N ${etcdir} > $SDIR/metalog
149	rv=$?
150	if [ $rv -ne 0 ]; then
151		echo "${prog}: mtree failed, exiting"
152		exit $rv
153	fi
154fi
155
156GZIP=-9			# for pax -z
157export GZIP
158
159for setname in $lists; do
160	out=$setname.tgz
161	if [ -n "$installdir" ]; then
162		echo "Copying set $setname"
163	else
164		[ -n "$metalog" -a $tars/$out -nt "$metalog" ] && {
165			echo "$out is up to date"
166			continue
167		}
168		echo "Creating $out"
169	fi
170	sh $setd/makeflist -a $machine_arch -m $machine -s $setd $setname \
171	    > $SDIR/flist.$setname
172	if [ -n "$metalog" ]; then
173		awk -f getdirs.awk $SDIR/flist.$setname | sort -u \
174		    > $SDIR/flist.$setname.full
175		(
176			echo "/set uname=root gname=wheel"
177			awk -f join.awk $SDIR/flist.$setname.full $SDIR/metalog
178		) > $SDIR/plist.$setname
179	else
180		mv $SDIR/flist.$setname $SDIR/plist.$setname
181	fi
182
183	if [ -n "$installdir" ]; then
184		( cd $dest ; \
185		    ${PAX} -O -rwpe -d -N${etcdir} ${metalog:+-M} \
186		    $installdir < ${SDIR}/plist.$setname )
187	else
188		( cd $dest ; \
189		    ${PAX} -O -w -d -z -N${etcdir} ${metalog:+-M} \
190		    < ${SDIR}/plist.$setname ) > ${tars}/$out
191	fi
192	es=$(($es + $?))
193done
194if [ $es -gt 255 ] ; then
195	es=255
196fi
197exit $es
198