1#!/bin/sh 2# 3# $NetBSD: maketars,v 1.84 2015/05/27 15:18:29 martin 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] [-F setlistsdir] [-d destdir] 8# [-t tardir] [-U] [setname ...] 9# 10# The default sets are "base comp debug etc games man misc tests text" 11# The X sets are "xbase xcomp xdebug xetc xfont xserver" 12# The extsrc sets are "extbase extcomp extetc" 13# 14# If '-i installdir' is given, copy the given sets to installdir 15# (using pax -rw ...) instead of creating tar files. 16# In this case, remove "etc", "xetc", and "extetc" from the list of default sets. 17# 18 19prog="${0##*/}" 20rundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/" 21. "${rundir}/sets.subr" 22 23# set defaults 24lists= 25tars="${RELEASEDIR}" 26dest="${DESTDIR}" 27metalog= 28installdir= 29etcdir= 30setlistdir= 31setfilesonly=false 32quiet=false 33skipkeys=time,md5,sha1,sha384,sha512,rmd160,cksum 34preserve="-pe" 35 36usage() 37{ 38 cat 1>&2 <<USAGE 39Usage: ${prog} [-L base,x,ext] [-b] [-x] [-y] [-i idir] [-a arch] [-m machine] 40 [-s setsdir] [-S] [-M metalog] [-N etcdir] [-F setlistdir] 41 [-d dest] [-t targetdir] [setname ...] 42 -L base,x,ext Make specified lists 43 -b Make both netbsd and x11 lists 44 -x Only make x11 lists 45 [Default: make netbsd lists] 46 -y Only make extsrc lists 47 [Default: make netbsd lists] 48 -i idir Install sets to idir instead of creating tar files 49 -a arch Set arch (e.g, m68k, mipseb, mipsel, powerpc) [${MACHINE_ARCH}] 50 -m machine Set machine (e.g, amiga, i386, macppc) [${MACHINE}] 51 -q Quiet operation 52 -s setsdir Directory to find sets [${setsdir}] 53 -F setlistdir output directory for generated set lists [${dest}/etc/mtree/] 54 -S Exit after creating set files ${dest}/etc/mtree/set.* 55 -M metalog metalog file 56 -N etcdir etc dir for metalog use [${dest}/etc] 57 -U do not preserve file permissions (with -i ..) 58 -d dest \${DESTDIR} [${dest}] 59 -t targetdir \${RELEASEDIR} [${tars}] 60 [setname ...] Sets to build [${lists}] 61USAGE 62 exit 1 63} 64 65msg() 66{ 67 $quiet || echo $* 68} 69 70# handle args 71while getopts L:bxyi:a:m:qs:F:SM:N:Ud:t: ch; do 72 case ${ch} in 73 L) 74 save_IFS="${IFS}" 75 IFS=, 76 for _list in ${OPTARG}; do 77 case $_list in 78 base) lists="${lists} ${nlists}" ;; 79 x) lists="${lists} ${xlists}" ;; 80 ext) lists="${lists} ${extlists}" ;; 81 esac 82 done 83 IFS="${save_IFS}" 84 ;; 85 # backward compat 86 b) 87 lists="${nlists} ${xlists}" 88 ;; 89 x) 90 lists="${xlists}" 91 ;; 92 y) 93 lists="${extlists}" 94 ;; 95 i) 96 installdir="${OPTARG}" 97 ;; 98 a) 99 MACHINE_ARCH="${OPTARG}" 100 MACHINE_CPU="$(arch_to_cpu "${OPTARG}")" 101 ;; 102 m) 103 MACHINE="${OPTARG}" 104 ;; 105 q) 106 quiet=true 107 ;; 108 s) 109 setsdir="${OPTARG}" 110 ;; 111 F) 112 setlistdir="${OPTARG}" 113 ;; 114 S) 115 setfilesonly=true 116 ;; 117 M) 118 metalog="${OPTARG}" 119 ;; 120 N) 121 etcdir="${OPTARG}" 122 ;; 123 U) 124 preserve= 125 ;; 126 d) 127 dest="${OPTARG}" 128 ;; 129 t) 130 tars="${OPTARG}" 131 ;; 132 *) 133 usage 134 ;; 135 esac 136done 137shift $((${OPTIND} - 1)) 138if [ -n "${installdir}" ]; then # if -i, remove etc + xetc + extetc from the default list 139 lists="$(echo ${lists} | ${SED} -e 's/ etc / /;s/ xetc / /;s/ extetc / /')" 140fi 141if [ -n "$*" ]; then 142 lists="$*" 143fi 144 145if [ -z "${tars}" -a -z "${installdir}" ]; then 146 echo >&2 "${prog}: \${RELEASEDIR} must be set, or -i must be used" 147 exit 1 148fi 149 150if [ -z "${dest}" ]; then 151 echo >&2 "${prog}: \${DESTDIR} must be set" 152 exit 1 153fi 154: ${etcdir:="${dest}/etc"} 155 156SDIR="$(${MKTEMP} -d "/tmp/${prog}.XXXXXX")" 157TMPFILES= 158 159: ${setlistdir:="${dest}/etc/mtree"} 160 161cleanup() 162{ 163 es=$? 164 /bin/rm -rf "${SDIR}" ${TMPFILES} 165 trap - 0 166 exit ${es} 167} 168trap cleanup 0 2 3 13 # EXIT INT QUIT PIPE 169 170# 171# build the setfiles 172# 173 174for setname in ${lists}; do 175 ${HOST_SH} "${setsdir}/makeflist" -a "${MACHINE_ARCH}" -m "${MACHINE}" \ 176 -s "${setsdir}" "${setname}" > "${SDIR}/flist.${setname}" \ 177 || exit 1 178 if [ ! -s "${SDIR}/flist.${setname}" ]; then 179 echo >&2 "makeflist output is empty for ${setname}" 180 exit 1 181 fi 182 ${setfilesonly} && msg "Creating ${setlistdir}/set.${setname}" 183 if [ -n "${metalog}" ]; then 184 ${AWK} -f "${rundir}/getdirs.awk" "${SDIR}/flist.${setname}" \ 185 > "${SDIR}/flist.${setname}.full" \ 186 || exit 1 187 ( 188 echo "/set uname=root gname=operator" 189 ${AWK} -f "${rundir}/join.awk" \ 190 "${SDIR}/flist.${setname}.full" "${metalog}" 191 echo "./etc/mtree/set.${setname} type=file mode=0444" 192 ) | ${MTREE} -CS -k all -R "${skipkeys}" -N "${etcdir}" \ 193 > "${setlistdir}/set.${setname}" \ 194 || exit 1 195 # We deliberately do not add set.${setname} to ${metalog}, 196 # because we depend on it as an input. 197 else 198 ${MTREE} -c -p "${dest}" -k all -R "${skipkeys}" \ 199 -O "${SDIR}/flist.${setname}" | ${MTREE} -C -k all > \ 200 "${setlistdir}/set.${setname}" 201 fi 202done 203if ${setfilesonly}; then # exit after creating the set lists 204 exit 0 205fi 206 207runpax() { 208 local s="$1" 209 shift 210 (cd "${dest}" && 211 ${PAX} -dOw -N"${etcdir}" -M "$@" < "${setlistdir}/set.${s}") 212} 213 214# 215# now build the tarfiles 216# 217 218GZIP=-9n # for pax -z 219export GZIP 220es=0 221 222for setname in ${lists:-${nlists}}; do 223 out="${setname}.tgz" 224 if [ -n "${installdir}" ]; then 225 msg "Copying set ${setname}" 226 runpax "${setname}" -r ${preserve} "${installdir}" 227 else 228 if [ -n "${metalog}" -a "${tars}/${out}" -nt "${metalog}" ] 229 then 230 msg "${out} is up to date" 231 continue 232 fi 233 msg "Creating ${out}" 234 rm -f "${tars}/${out}" 235 TMPFILES="${TMPFILES} ${tars}/${out}.tmp" 236 runpax "${setname}" -z --use-compress-program \ 237 ${COMPRESS_PROGRAM} > "${tars}/${out}.tmp" && 238 mv "${tars}/${out}.tmp" "${tars}/${out}" 239 fi 240 es=$((${es} + $?)) 241done 242if [ ${es} -gt 255 ]; then 243 es=255 244fi 245exit ${es} 246