1 1.1 jwise #!/bin/sh 2 1.1 jwise # 3 1.1 jwise # Print out the files in some or all lists. 4 1.19 apb # Usage: makeplist [options] setname pkgname 5 1.19 apb # options: 6 1.19 apb # -a arch set arch (e.g, m68k, mips, powerpc) 7 1.19 apb # -m machine set machine (e.g, amiga, i386, macppc) 8 1.19 apb # -s setsdir directory to find sets 9 1.19 apb # -p prefix prefix for package creation 10 1.19 apb # -I realprefix prefix for eventual installation 11 1.19 apb # setname pkgname set and package to build plist for 12 1.1 jwise # 13 1.1 jwise 14 1.18 apb rundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/" 15 1.18 apb . "${rundir}/sets.subr" 16 1.1 jwise prefix=/ 17 1.19 apb realprefix=/ 18 1.19 apb got_realprefix=false 19 1.1 jwise 20 1.19 apb usage() { 21 1.12 lukem cat 1>&2 <<USAGE 22 1.19 apb Usage: $0 [options] setname pkgname" 23 1.19 apb options:" 24 1.18 apb -a arch set arch (e.g, m68k, mips, powerpc) [${MACHINE_ARCH}] 25 1.18 apb -m machine set machine (e.g, amiga, i386, macppc) [${MACHINE}] 26 1.18 apb -s setsdir directory to find sets [${setsdir}] 27 1.18 apb -p prefix prefix for created plist [${prefix}] 28 1.19 apb -I realprefix prefix for eventual installation [${realprefix}] 29 1.12 lukem setname pkgname set and package to build plist for 30 1.12 lukem USAGE 31 1.12 lukem exit 1 32 1.1 jwise } 33 1.1 jwise 34 1.23 christos umask 022 35 1.1 jwise # handle args 36 1.19 apb while getopts a:I:m:p:s: ch; do 37 1.12 lukem case ${ch} in 38 1.12 lukem a) 39 1.18 apb MACHINE_ARCH="${OPTARG}" 40 1.18 apb MACHINE_CPU="$(arch_to_cpu "${OPTARG}")" 41 1.1 jwise ;; 42 1.19 apb I) 43 1.19 apb realprefix=${OPTARG} 44 1.19 apb got_realprefix=true 45 1.19 apb ;; 46 1.12 lukem m) 47 1.18 apb MACHINE="${OPTARG}" 48 1.1 jwise ;; 49 1.12 lukem p) 50 1.18 apb prefix="${OPTARG}" 51 1.1 jwise ;; 52 1.12 lukem s) 53 1.18 apb setsdir="${OPTARG}" 54 1.1 jwise ;; 55 1.12 lukem *) 56 1.1 jwise usage 57 1.1 jwise ;; 58 1.1 jwise esac 59 1.1 jwise done 60 1.12 lukem shift $((${OPTIND} - 1)) 61 1.12 lukem if [ $# -ne 2 ]; then 62 1.1 jwise usage 63 1.1 jwise fi 64 1.12 lukem setname="$1" 65 1.18 apb pkgname="$2" 66 1.7 agc 67 1.19 apb if ! ${got_realprefix}; then 68 1.19 apb realprefix="${prefix}" 69 1.19 apb fi 70 1.19 apb 71 1.18 apb filename="/tmp/makeplist.$$" 72 1.18 apb ffilename="/tmp/makeplist.files.$$" 73 1.18 apb dfilename="/tmp/makeplist.dirs.$$" 74 1.7 agc 75 1.18 apb list_set_files "${setname}" | \ 76 1.18 apb ${ENV_CMD} PLISTPKG="${pkgname}" ${AWK} ' 77 1.12 lukem $2 == ENVIRON["PLISTPKG"] { 78 1.12 lukem sub("^\\./", "", $1); 79 1.12 lukem print $1 80 1.18 apb }' | ${SORT} -u > "${filename}" 81 1.8 dyoung 82 1.16 dyoung SELECTDIRS="-prune -type d" 83 1.16 dyoung SELECTNONDIRS="! -type d -print -o ( -type d -prune )" 84 1.8 dyoung 85 1.19 apb # 86 1.19 apb # XXX: The "lists" do not differentiate between directories and files. 87 1.19 apb # But we need to differentiate between them, so we do so by checking 88 1.19 apb # what's actually present in the file system. Files or directories that 89 1.19 apb # are listed in the "lists" but that do not exist in the file system end 90 1.19 apb # up not appearing in our output, and this subverts a large part of the 91 1.19 apb # purpose of the "lists". 92 1.19 apb # 93 1.19 apb # XXX: Given that we have to figure out what is or is not a directory 94 1.19 apb # without assistance from the "lists", it would be much more efficient 95 1.19 apb # to consult the metalog instead of the file system. 96 1.19 apb # 97 1.19 apb 98 1.20 apb ( 99 1.18 apb cd "${prefix}" 100 1.20 apb 101 1.8 dyoung # 102 1.16 dyoung # Match the directories. Use find(1) to avoid repeat calls to 103 1.16 dyoung # 'test -d'. 104 1.16 dyoung # 105 1.16 dyoung # This is a little clever. I cannot use 'xargs find', because 106 1.16 dyoung # find wants for the option arguments to follow the path arguments. 107 1.18 apb # So I use 'xargs echo ${SELECTDIRS}' to make a maximum-length proto-command 108 1.16 dyoung # line. I use 'read' to peel the options off the front of the 109 1.18 apb # command-line, and 'find ${args} ${SELECTDIRS}' to put them at the end. 110 1.8 dyoung # 111 1.18 apb xargs echo ${SELECTDIRS} < "${filename}" | \ 112 1.16 dyoung while read ignore ignore ignore args; do 113 1.18 apb [ -z "${args}" ] && break 114 1.18 apb ${FIND} ${args} ${SELECTDIRS} 115 1.21 uki done | ${AWK} '{ print "@pkgdir " $1; }' > "${dfilename}" 116 1.8 dyoung 117 1.8 dyoung # 118 1.16 dyoung # Match the non-directories. Use find(1) to avoid repeat calls to 119 1.16 dyoung # 'test ! -d'. See 'Match the directories' for an explanation of the 120 1.16 dyoung # cleverness. 121 1.8 dyoung # 122 1.18 apb xargs echo ${SELECTNONDIRS} < "${filename}" | \ 123 1.16 dyoung while read ignore ignore ignore ignore ignore ignore ignore ignore ignore \ 124 1.16 dyoung ignore args; do 125 1.18 apb [ -z "${args}" ] && break 126 1.18 apb ${FIND} ${args} ${SELECTNONDIRS} 127 1.18 apb done > "${ffilename}" 128 1.8 dyoung 129 1.20 apb ) 130 1.7 agc 131 1.19 apb echo "@cwd ${realprefix}" 132 1.18 apb if [ -s "${ffilename}" ]; then 133 1.18 apb cat "${ffilename}" 134 1.1 jwise fi 135 1.18 apb if [ -s "${dfilename}" ]; then 136 1.18 apb ${SORT} -r "${dfilename}" 137 1.7 agc fi 138 1.7 agc 139 1.18 apb rm -f "${filename}" "${ffilename}" "${dfilename}" 140 1.7 agc 141 1.7 agc exit 0 142