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