#!/bin/sh # # Print out the files in some or all lists. # Usage: makeplist [options] setname pkgname # options: # -a arch set arch (e.g, m68k, mips, powerpc) # -m machine set machine (e.g, amiga, i386, macppc) # -s setsdir directory to find sets # -p prefix prefix for package creation # -I realprefix prefix for eventual installation # setname pkgname set and package to build plist for # rundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/" . "${rundir}/sets.subr" prefix=/ realprefix=/ got_realprefix=false usage() { cat 1>&2 <<USAGE Usage: $0 [options] setname pkgname" options:" -a arch set arch (e.g, m68k, mips, powerpc) [${MACHINE_ARCH}] -m machine set machine (e.g, amiga, i386, macppc) [${MACHINE}] -s setsdir directory to find sets [${setsdir}] -p prefix prefix for created plist [${prefix}] -I realprefix prefix for eventual installation [${realprefix}] setname pkgname set and package to build plist for USAGE exit 1 } # handle args while getopts a:I:m:p:s: ch; do case ${ch} in a) MACHINE_ARCH="${OPTARG}" MACHINE_CPU="$(arch_to_cpu "${OPTARG}")" ;; I) realprefix=${OPTARG} got_realprefix=true ;; m) MACHINE="${OPTARG}" ;; p) prefix="${OPTARG}" ;; s) setsdir="${OPTARG}" ;; *) usage ;; esac done shift $((${OPTIND} - 1)) if [ $# -ne 2 ]; then usage fi setname="$1" pkgname="$2" if ! ${got_realprefix}; then realprefix="${prefix}" fi filename="/tmp/makeplist.$$" ffilename="/tmp/makeplist.files.$$" dfilename="/tmp/makeplist.dirs.$$" list_set_files "${setname}" | \ ${ENV_CMD} PLISTPKG="${pkgname}" ${AWK} ' $2 == ENVIRON["PLISTPKG"] { sub("^\\./", "", $1); print $1 }' | ${SORT} -u > "${filename}" SELECTDIRS="-prune -type d" SELECTNONDIRS="! -type d -print -o ( -type d -prune )" # # XXX: The "lists" do not differentiate between directories and files. # But we need to differentiate between them, so we do so by checking # what's actually present in the file system. Files or directories that # are listed in the "lists" but that do not exist in the file system end # up not appearing in our output, and this subverts a large part of the # purpose of the "lists". # # XXX: Given that we have to figure out what is or is not a directory # without assistance from the "lists", it would be much more efficient # to consult the metalog instead of the file system. # ( cd "${prefix}" # # Match the directories. Use find(1) to avoid repeat calls to # 'test -d'. # # This is a little clever. I cannot use 'xargs find', because # find wants for the option arguments to follow the path arguments. # So I use 'xargs echo ${SELECTDIRS}' to make a maximum-length proto-command # line. I use 'read' to peel the options off the front of the # command-line, and 'find ${args} ${SELECTDIRS}' to put them at the end. # xargs echo ${SELECTDIRS} < "${filename}" | \ while read ignore ignore ignore args; do [ -z "${args}" ] && break ${FIND} ${args} ${SELECTDIRS} done | ${AWK} '{ print "@pkgdir " $1; }' > "${dfilename}" # # Match the non-directories. Use find(1) to avoid repeat calls to # 'test ! -d'. See 'Match the directories' for an explanation of the # cleverness. # xargs echo ${SELECTNONDIRS} < "${filename}" | \ while read ignore ignore ignore ignore ignore ignore ignore ignore ignore \ ignore args; do [ -z "${args}" ] && break ${FIND} ${args} ${SELECTNONDIRS} done > "${ffilename}" ) echo "@cwd ${realprefix}" if [ -s "${ffilename}" ]; then cat "${ffilename}" fi if [ -s "${dfilename}" ]; then ${SORT} -r "${dfilename}" fi rm -f "${filename}" "${ffilename}" "${dfilename}" exit 0