openpkg/openpkg.sh

changeset 13
cb59d6afeb61
child 428
f880f219c566
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/openpkg/openpkg.sh	Tue Jan 06 23:40:39 2009 +0100
     1.3 @@ -0,0 +1,299 @@
     1.4 +#!@l_prefix@/lib/openpkg/bash
     1.5 +##
     1.6 +##  openpkg -- OpenPKG Tool Chain
     1.7 +##  Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/>
     1.8 +##  Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/>
     1.9 +##
    1.10 +##  Permission to use, copy, modify, and distribute this software for
    1.11 +##  any purpose with or without fee is hereby granted, provided that
    1.12 +##  the above copyright notice and this permission notice appear in all
    1.13 +##  copies.
    1.14 +##
    1.15 +##  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
    1.16 +##  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    1.17 +##  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
    1.18 +##  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
    1.19 +##  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    1.20 +##  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    1.21 +##  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
    1.22 +##  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    1.23 +##  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    1.24 +##  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
    1.25 +##  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    1.26 +##  SUCH DAMAGE.
    1.27 +##
    1.28 +##  openpkg.sh: Execution Frontend (Language: Bourne-Shell)
    1.29 +##
    1.30 +
    1.31 +##
    1.32 +##  command line parsing
    1.33 +##
    1.34 +
    1.35 +#   command line options defaults
    1.36 +opt_prefix=""
    1.37 +opt_tools=""
    1.38 +opt_version=no
    1.39 +opt_help=no
    1.40 +
    1.41 +#   process command line options by iterating over arguments
    1.42 +for opt
    1.43 +do
    1.44 +    case "${opt}" in
    1.45 +        -*=*) arg=`echo "${opt}" | sed 's/^[-_a-zA-Z0-9]*=//'` ;;
    1.46 +           *) arg='' ;;
    1.47 +    esac
    1.48 +    case "${opt}" in
    1.49 +        -v|--version ) opt_version=yes;     shift ;;
    1.50 +        -h|--help    ) opt_help=yes;        shift ;;
    1.51 +        --prefix=*   ) opt_prefix="${arg}"; shift ;;
    1.52 +        --tools=*    ) opt_tools="${arg}";  shift ;;
    1.53 +        -* ) echo "openpkg:ERROR: Invalid command-line option \"${opt}\"." 1>&2
    1.54 +             echo "openpkg:ERROR: Run \"${0} --help\" for list of valid options" 1>&2; exit 1 ;;
    1.55 +        *  ) break ;;
    1.56 +    esac
    1.57 +done
    1.58 +
    1.59 +##
    1.60 +##  determine OpenPKG locations
    1.61 +##
    1.62 +
    1.63 +#   determine path to OpenPKG instance
    1.64 +openpkg_prefix="@l_prefix@"
    1.65 +if [ ".${OPENPKG_PREFIX}" != . ]; then
    1.66 +    openpkg_prefix="${OPENPKG_PREFIX}"
    1.67 +fi
    1.68 +if [ ".${opt_prefix}" != . ]; then
    1.69 +    openpkg_prefix="${opt_prefix}"
    1.70 +fi
    1.71 +if [ -x "${openpkg_prefix}/bin/openpkg" -a -x "${openpkg_prefix}/libexec/openpkg/rpm" ]; then
    1.72 +    #   OpenPKG 2.0 and higher
    1.73 +    true
    1.74 +elif [ -f "${openpkg_prefix}/bin/rpm" -a -x "${openpkg_prefix}/lib/openpkg/rpm" ]; then
    1.75 +    #   OpenPKG 1.x
    1.76 +    echo "openpkg:ERROR: OpenPKG 1.x instance found under \"${openpkg_prefix}\" (not supported)" 1>&2
    1.77 +    exit 1
    1.78 +else
    1.79 +    echo "openpkg:ERROR: no OpenPKG instance found under \"${openpkg_prefix}\"" 1>&2
    1.80 +    exit 1
    1.81 +fi
    1.82 +
    1.83 +#   allow convenient all-in-one specification of OpenPKG Tool Chain locations
    1.84 +#   (assuming the filesystem layout of an uninstalled OpenPKG Tool Chain)
    1.85 +openpkg_tools="${OPENPKG_TOOLS}"
    1.86 +openpkg_tools_cmdpath="${OPENPKG_TOOLS_CMDPATH}"
    1.87 +openpkg_tools_apipath="${OPENPKG_TOOLS_APIPATH}"
    1.88 +if [ ".${opt_tool}" != . ]; then
    1.89 +    openpkg_tools="${opt_tools}"
    1.90 +fi
    1.91 +if [ ".${openpkg_tools}" != . -a ".${openpkg_tools_cmdpath}" = . ]; then
    1.92 +    openpkg_tools_cmdpath="${openpkg_tools}/cmd:@"
    1.93 +fi
    1.94 +if [ ".${openpkg_tools}" != . -a ".${openpkg_tools_apipath}" = . ]; then
    1.95 +    openpkg_tools_apipath="${openpkg_tools}/api:@"
    1.96 +fi
    1.97 +
    1.98 +#   determine path to OpenPKG Tool Chain commands
    1.99 +cmdpath="${openpkg_prefix}/libexec/openpkg"
   1.100 +if [ -d "${openpkg_prefix}/libexec/openpkg-tools" ]; then
   1.101 +    #   openpkg-tools package overrides
   1.102 +    cmdpath="${openpkg_prefix}/libexec/openpkg-tools:${cmdpath}"
   1.103 +fi
   1.104 +if [ -d "${openpkg_prefix}/libexec/openpkg-audit" ]; then
   1.105 +    #   openpkg-audit package overrides
   1.106 +    cmdpath="${openpkg_prefix}/libexec/openpkg-audit:${cmdpath}"
   1.107 +fi
   1.108 +if [ ".${openpkg_tools_cmdpath}" != . ]; then
   1.109 +    #   user supplied path overrides
   1.110 +    cmdpath=`echo "${openpkg_tools_cmdpath}" | sed -e "s;@;${cmdpath};"`
   1.111 +fi
   1.112 +openpkg_tools_cmdpath=`echo "${cmdpath}" | sed -e 's/::/:/g' -e 's/^://' -e 's/:$//'`
   1.113 +
   1.114 +#   determine path to OpenPKG Tool Chain API
   1.115 +apipath=""
   1.116 +if [ -d "${openpkg_prefix}/lib/openpkg-tools" ]; then
   1.117 +    #   openpkg-tools package overrides
   1.118 +    apipath="${openpkg_prefix}/lib/openpkg-tools:${apipath}"
   1.119 +fi
   1.120 +if [ ".${openpkg_tools_apipath}" != . ]; then
   1.121 +    #   user supplied path overrides
   1.122 +    apipath=`echo "${openpkg_tools_apipath}" | sed -e "s;@;${apipath};"`
   1.123 +fi
   1.124 +openpkg_tools_apipath=`echo "${apipath}" | sed -e 's/::/:/g' -e 's/^://' -e 's/:$//'`
   1.125 +
   1.126 +##
   1.127 +##  execute stand-alone option commands in advance
   1.128 +##
   1.129 +
   1.130 +#   implement stand-alone "--help" option
   1.131 +if [ ".${opt_help}" = .yes ]; then
   1.132 +    release=`${openpkg_prefix}/libexec/openpkg/rpm --eval '%{l_openpkg_release}'`
   1.133 +    echo ""
   1.134 +    echo "This is ${release} <http://www.openpkg.org/>"
   1.135 +    echo "Cross-Platform Unix Software Packaging Facility"
   1.136 +    echo ""
   1.137 +    echo "Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/>"
   1.138 +    echo "Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/>"
   1.139 +    echo ""
   1.140 +    echo "The command \"${openpkg_prefix}/bin/openpkg\" is the official command-line"
   1.141 +    echo "execution frontend of the OpenPKG tool chain. Its usage is:"
   1.142 +    echo ""
   1.143 +    echo "  \$ ${openpkg_prefix}/bin/openpkg [<option> ...] \\"
   1.144 +    echo "     <command> [<command-option> ...] [<command-argument> ...]"
   1.145 +    echo ""
   1.146 +    echo "where <option> is one of the following global options:"
   1.147 +    echo "  -p, --prefix    sets the OpenPKG instance prefix   (also: \${OPENPKG_PREFIX})"
   1.148 +    echo "  -t, --tools     sets the OpenPKG tool chain prefix (also: \${OPENPKG_TOOLS})"
   1.149 +    echo "  -v, --version   display OpenPKG version/release"
   1.150 +    echo "  -h, --help      display this usage help message"
   1.151 +    echo ""
   1.152 +    echo "where <command> is one of the following commands:"
   1.153 +    echo "  rpm             (provided by bootstrap package)"
   1.154 +    echo "  rpmbuild        (provided by bootstrap package)"
   1.155 +    echo "  rpm2cpio        (provided by bootstrap package)"
   1.156 +    echo "  rpm-config      (provided by bootstrap package)"
   1.157 +    echo "  uuid            (provided by bootstrap package)"
   1.158 +    echo "  rc              (provided by bootstrap package)"
   1.159 +    echo "  lsync           (provided by bootstrap package)"
   1.160 +    echo "  man             (provided by bootstrap package)"
   1.161 +    #   install command intentionally left out in above display!
   1.162 +
   1.163 +    #   dynamically figure out add-on commands
   1.164 +    for cmd in rpm rpmbuild rpm2cpio rpm-config uuid rc lsync man install; do
   1.165 +        id=`echo "${cmd}" | sed -e 's/-/_/g'`
   1.166 +        eval "__cmd_seen_${id}=yes"
   1.167 +    done
   1.168 +    OIFS="${IFS}"; IFS=":"
   1.169 +    for dir in ${openpkg_tools_cmdpath}; do
   1.170 +        IFS="${OIFS}"
   1.171 +        if [ ! -d ${dir} ]; then
   1.172 +            continue
   1.173 +        fi
   1.174 +        for cmd in `cd ${dir} 2>/dev/null && echo *`; do
   1.175 +            name=`echo "${cmd}" | sed -e 's/\.sh$//' -e 's/\.pl$//' \
   1.176 +                 -e 's/^/X/' -e 's/^X\([a-z][a-zA-Z0-9_-]*\)$/\1/' -e 's/^X.*$//'`
   1.177 +            if [ ".${name}" != . ]; then
   1.178 +                if [ -f ${dir}/${cmd} ]; then
   1.179 +                    id=`echo "${name}" | sed -e 's/-/_/g'`
   1.180 +                    eval "seen=\$__cmd_seen_${id}"
   1.181 +                    if [ ".${seen}" != .yes ]; then
   1.182 +                        echo "${name}" | awk '{ printf("  %-15s (provided by add-on package)\n", $0); }'
   1.183 +                        eval "__cmd_seen_${id}=yes"
   1.184 +                    fi
   1.185 +                fi
   1.186 +            fi
   1.187 +        done
   1.188 +    done
   1.189 +    IFS="${OIFS}"
   1.190 +    echo ""
   1.191 +    echo "where <command-option> and <command-argument> are <command> specific"
   1.192 +    echo "options and arguments. Run \"${openpkg_prefix}/bin/openpkg <command> --help\""
   1.193 +    echo "and \"${openpkg_prefix}/bin/openpkg man <command>\" for more details."
   1.194 +    echo ""
   1.195 +    exit 0
   1.196 +fi
   1.197 +
   1.198 +#   implement stand-alone "--version" option
   1.199 +if [ ".${opt_version}" = .yes ]; then
   1.200 +    release=`${openpkg_prefix}/libexec/openpkg/rpm --eval '%{l_openpkg_release}'`
   1.201 +    version=`${openpkg_prefix}/libexec/openpkg/rpm -q --qf '%{version}' openpkg`
   1.202 +    echo "${release} (${version})"
   1.203 +    exit 0
   1.204 +fi
   1.205 +
   1.206 +##
   1.207 +##  determine command details and execute command appropriately
   1.208 +##
   1.209 +
   1.210 +#   command line sanity check
   1.211 +if [ ${#} -eq 0 ]; then
   1.212 +    echo "openpkg:ERROR: Invalid command-line arguments." 1>&2
   1.213 +    echo "openpkg:ERROR: Run \"${openpkg_prefix}/bin/openpkg --help\" for list of valid arguments." 1>&2
   1.214 +    exit 1
   1.215 +fi
   1.216 +
   1.217 +#   search command by iterating over all command directories
   1.218 +cmd="${1}"
   1.219 +shift
   1.220 +cmd_path=""
   1.221 +cmd_shell=""
   1.222 +cmd_stack="${OPENPKG_TOOLS_CMDSTACK}"
   1.223 +OIFS="${IFS}"; IFS=":"
   1.224 +for dir in ${openpkg_tools_cmdpath}; do
   1.225 +    IFS="${OIFS}"
   1.226 +
   1.227 +    #   skip (currently) not existing directory
   1.228 +    if [ ! -d ${dir} ]; then
   1.229 +        continue
   1.230 +    fi
   1.231 +
   1.232 +    #   check for various command implementations
   1.233 +    if [ -x ${dir}/${cmd} ]; then
   1.234 +        #   found executable stand-alone binary
   1.235 +        cmd_path="${dir}/${cmd}"
   1.236 +        cmd_shell=""
   1.237 +    elif [ -f ${dir}/${cmd}.sh ]; then
   1.238 +        #   found non-executable Bourne-Shell script
   1.239 +        cmd_path="${dir}/${cmd}.sh"
   1.240 +        cmd_shell="${openpkg_prefix}/lib/openpkg/bash"
   1.241 +    elif [ -f ${dir}/${cmd}.pl ]; then
   1.242 +        #   found non-executable Perl script
   1.243 +        cmd_path="${dir}/${cmd}.pl"
   1.244 +        if [ -x ${openpkg_prefix}/bin/perl ]; then
   1.245 +            cmd_shell="${openpkg_prefix}/bin/perl"
   1.246 +        else
   1.247 +            cmd_shell=`${openpkg_prefix}/lib/openpkg/shtool path -p "$PATH:$openpkg_prefix/lib/openpkg" -m perl 2>&1`
   1.248 +            if [ ".${cmd_shell}" = . ]; then
   1.249 +                echo "openpkg:ERROR: No Perl interpreter found in \${PATH}" 1>&2
   1.250 +                exit 1
   1.251 +            fi
   1.252 +        fi
   1.253 +        #   provide Perl module include path(s) to API
   1.254 +        OIFS="${IFS}"; IFS=":"
   1.255 +        for dir2 in ${openpkg_tools_apipath}; do
   1.256 +            IFS="${OIFS}"
   1.257 +            if [ ! -d ${dir2} ]; then
   1.258 +                continue
   1.259 +            fi
   1.260 +            cmd_shell="${cmd_shell} -I${dir2}"
   1.261 +        done
   1.262 +        IFS="${OIFS}"
   1.263 +    else
   1.264 +        #   command not found, continue searching
   1.265 +        continue
   1.266 +    fi
   1.267 +
   1.268 +    #   check whether to use this found command or to continue searching
   1.269 +    #   for next command implementation in sequence (in order to support
   1.270 +    #   flexible nested command wrapping)
   1.271 +    cmd_last=`echo "${cmd_stack}" | sed -e 's;:.*$;;'`
   1.272 +    if [ ".${cmd_last}" = ".${cmd}" ]; then
   1.273 +        #   we were last command on stack, so pop us from call
   1.274 +        #   stack and continue searching for next implementation
   1.275 +        cmd_stack=`echo "${cmd_stack}" | sed -e 's;^[^:][^:]*:*;;'`
   1.276 +        continue
   1.277 +    else
   1.278 +        #   last command on stack was different, so stop
   1.279 +        #   searching because we found the implementation
   1.280 +        break
   1.281 +    fi
   1.282 +done
   1.283 +IFS="${OIFS}"
   1.284 +
   1.285 +#   sanity check search result
   1.286 +if [ ".${cmd_path}" = . ]; then
   1.287 +    echo "openpkg:ERROR: No such command \"${cmd}\" found in command path" 1>&2
   1.288 +    echo "openpkg:ERROR: (${openpkg_tools_cmdpath})." 1>&2
   1.289 +    echo "openpkg:ERROR: Set \${OPENPKG_TOOLS_CMDPATH} appropriately." 1>&2
   1.290 +    echo "openpkg:ERROR: Run \"${openpkg_prefix}/bin/openpkg --help\" for list of valid commands." 1>&2
   1.291 +    exit 1
   1.292 +fi
   1.293 +
   1.294 +#   export essential run-time information to command
   1.295 +export OPENPKG_PREFIX="$openpkg_prefix"
   1.296 +export OPENPKG_TOOLS_CMDPROG="${0}"
   1.297 +export OPENPKG_TOOLS_CMDNAME="${cmd}"
   1.298 +export OPENPKG_TOOLS_CMDSTACK=`echo "${OPENPKG_TOOLS_CMDSTACK}" | sed -e 's;^\(.\);:\1;' -e "s;^;${cmd};"`
   1.299 +
   1.300 +#   execute command
   1.301 +eval "exec ${cmd_shell} ${cmd_path} \${1+\"\$@\"}"
   1.302 +

mercurial