openpkg/openpkg.sh

Sun, 03 Apr 2011 13:34:55 +0200

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sun, 03 Apr 2011 13:34:55 +0200
changeset 337
f71e028eb3e2
child 428
f880f219c566
permissions
-rw-r--r--

Correct and improve several packaging aspects including...
Correct datadir path for python modules, correct jar(1) path for
building libgcj classes, strip libexecdir path of version numbers,
improve name of oblbld build path, clean whitespace from as(1) and
ld(1) GNU detection, remove seemingly discarded '--with-local-prefix'
configure argument, and correct hardcoded lto plugin libtool archive
dependency information.

Most importantly, correct IA32 architecture detection logic in
config.gcc to correctly emit SSE2 instructions conditionally, leading
to the removal of all '-march' bootstrap options and replacement with
unconditional (for IA32/AMD64) '-mtune=native' options. Comments and
buildtime warnings are corrected appropriately. In theory these changes
cause a more portable, orthoganal, and optimal bootstrap to be built.

     1 #!@l_prefix@/lib/openpkg/bash
     2 ##
     3 ##  openpkg -- OpenPKG Tool Chain
     4 ##  Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/>
     5 ##  Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/>
     6 ##
     7 ##  Permission to use, copy, modify, and distribute this software for
     8 ##  any purpose with or without fee is hereby granted, provided that
     9 ##  the above copyright notice and this permission notice appear in all
    10 ##  copies.
    11 ##
    12 ##  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
    13 ##  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    14 ##  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
    15 ##  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
    16 ##  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    17 ##  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    18 ##  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
    19 ##  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    20 ##  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    21 ##  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
    22 ##  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    23 ##  SUCH DAMAGE.
    24 ##
    25 ##  openpkg.sh: Execution Frontend (Language: Bourne-Shell)
    26 ##
    28 ##
    29 ##  command line parsing
    30 ##
    32 #   command line options defaults
    33 opt_prefix=""
    34 opt_tools=""
    35 opt_version=no
    36 opt_help=no
    38 #   process command line options by iterating over arguments
    39 for opt
    40 do
    41     case "${opt}" in
    42         -*=*) arg=`echo "${opt}" | sed 's/^[-_a-zA-Z0-9]*=//'` ;;
    43            *) arg='' ;;
    44     esac
    45     case "${opt}" in
    46         -v|--version ) opt_version=yes;     shift ;;
    47         -h|--help    ) opt_help=yes;        shift ;;
    48         --prefix=*   ) opt_prefix="${arg}"; shift ;;
    49         --tools=*    ) opt_tools="${arg}";  shift ;;
    50         -* ) echo "openpkg:ERROR: Invalid command-line option \"${opt}\"." 1>&2
    51              echo "openpkg:ERROR: Run \"${0} --help\" for list of valid options" 1>&2; exit 1 ;;
    52         *  ) break ;;
    53     esac
    54 done
    56 ##
    57 ##  determine OpenPKG locations
    58 ##
    60 #   determine path to OpenPKG instance
    61 openpkg_prefix="@l_prefix@"
    62 if [ ".${OPENPKG_PREFIX}" != . ]; then
    63     openpkg_prefix="${OPENPKG_PREFIX}"
    64 fi
    65 if [ ".${opt_prefix}" != . ]; then
    66     openpkg_prefix="${opt_prefix}"
    67 fi
    68 if [ -x "${openpkg_prefix}/bin/openpkg" -a -x "${openpkg_prefix}/libexec/openpkg/rpm" ]; then
    69     #   OpenPKG 2.0 and higher
    70     true
    71 elif [ -f "${openpkg_prefix}/bin/rpm" -a -x "${openpkg_prefix}/lib/openpkg/rpm" ]; then
    72     #   OpenPKG 1.x
    73     echo "openpkg:ERROR: OpenPKG 1.x instance found under \"${openpkg_prefix}\" (not supported)" 1>&2
    74     exit 1
    75 else
    76     echo "openpkg:ERROR: no OpenPKG instance found under \"${openpkg_prefix}\"" 1>&2
    77     exit 1
    78 fi
    80 #   allow convenient all-in-one specification of OpenPKG Tool Chain locations
    81 #   (assuming the filesystem layout of an uninstalled OpenPKG Tool Chain)
    82 openpkg_tools="${OPENPKG_TOOLS}"
    83 openpkg_tools_cmdpath="${OPENPKG_TOOLS_CMDPATH}"
    84 openpkg_tools_apipath="${OPENPKG_TOOLS_APIPATH}"
    85 if [ ".${opt_tool}" != . ]; then
    86     openpkg_tools="${opt_tools}"
    87 fi
    88 if [ ".${openpkg_tools}" != . -a ".${openpkg_tools_cmdpath}" = . ]; then
    89     openpkg_tools_cmdpath="${openpkg_tools}/cmd:@"
    90 fi
    91 if [ ".${openpkg_tools}" != . -a ".${openpkg_tools_apipath}" = . ]; then
    92     openpkg_tools_apipath="${openpkg_tools}/api:@"
    93 fi
    95 #   determine path to OpenPKG Tool Chain commands
    96 cmdpath="${openpkg_prefix}/libexec/openpkg"
    97 if [ -d "${openpkg_prefix}/libexec/openpkg-tools" ]; then
    98     #   openpkg-tools package overrides
    99     cmdpath="${openpkg_prefix}/libexec/openpkg-tools:${cmdpath}"
   100 fi
   101 if [ -d "${openpkg_prefix}/libexec/openpkg-audit" ]; then
   102     #   openpkg-audit package overrides
   103     cmdpath="${openpkg_prefix}/libexec/openpkg-audit:${cmdpath}"
   104 fi
   105 if [ ".${openpkg_tools_cmdpath}" != . ]; then
   106     #   user supplied path overrides
   107     cmdpath=`echo "${openpkg_tools_cmdpath}" | sed -e "s;@;${cmdpath};"`
   108 fi
   109 openpkg_tools_cmdpath=`echo "${cmdpath}" | sed -e 's/::/:/g' -e 's/^://' -e 's/:$//'`
   111 #   determine path to OpenPKG Tool Chain API
   112 apipath=""
   113 if [ -d "${openpkg_prefix}/lib/openpkg-tools" ]; then
   114     #   openpkg-tools package overrides
   115     apipath="${openpkg_prefix}/lib/openpkg-tools:${apipath}"
   116 fi
   117 if [ ".${openpkg_tools_apipath}" != . ]; then
   118     #   user supplied path overrides
   119     apipath=`echo "${openpkg_tools_apipath}" | sed -e "s;@;${apipath};"`
   120 fi
   121 openpkg_tools_apipath=`echo "${apipath}" | sed -e 's/::/:/g' -e 's/^://' -e 's/:$//'`
   123 ##
   124 ##  execute stand-alone option commands in advance
   125 ##
   127 #   implement stand-alone "--help" option
   128 if [ ".${opt_help}" = .yes ]; then
   129     release=`${openpkg_prefix}/libexec/openpkg/rpm --eval '%{l_openpkg_release}'`
   130     echo ""
   131     echo "This is ${release} <http://www.openpkg.org/>"
   132     echo "Cross-Platform Unix Software Packaging Facility"
   133     echo ""
   134     echo "Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/>"
   135     echo "Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/>"
   136     echo ""
   137     echo "The command \"${openpkg_prefix}/bin/openpkg\" is the official command-line"
   138     echo "execution frontend of the OpenPKG tool chain. Its usage is:"
   139     echo ""
   140     echo "  \$ ${openpkg_prefix}/bin/openpkg [<option> ...] \\"
   141     echo "     <command> [<command-option> ...] [<command-argument> ...]"
   142     echo ""
   143     echo "where <option> is one of the following global options:"
   144     echo "  -p, --prefix    sets the OpenPKG instance prefix   (also: \${OPENPKG_PREFIX})"
   145     echo "  -t, --tools     sets the OpenPKG tool chain prefix (also: \${OPENPKG_TOOLS})"
   146     echo "  -v, --version   display OpenPKG version/release"
   147     echo "  -h, --help      display this usage help message"
   148     echo ""
   149     echo "where <command> is one of the following commands:"
   150     echo "  rpm             (provided by bootstrap package)"
   151     echo "  rpmbuild        (provided by bootstrap package)"
   152     echo "  rpm2cpio        (provided by bootstrap package)"
   153     echo "  rpm-config      (provided by bootstrap package)"
   154     echo "  uuid            (provided by bootstrap package)"
   155     echo "  rc              (provided by bootstrap package)"
   156     echo "  lsync           (provided by bootstrap package)"
   157     echo "  man             (provided by bootstrap package)"
   158     #   install command intentionally left out in above display!
   160     #   dynamically figure out add-on commands
   161     for cmd in rpm rpmbuild rpm2cpio rpm-config uuid rc lsync man install; do
   162         id=`echo "${cmd}" | sed -e 's/-/_/g'`
   163         eval "__cmd_seen_${id}=yes"
   164     done
   165     OIFS="${IFS}"; IFS=":"
   166     for dir in ${openpkg_tools_cmdpath}; do
   167         IFS="${OIFS}"
   168         if [ ! -d ${dir} ]; then
   169             continue
   170         fi
   171         for cmd in `cd ${dir} 2>/dev/null && echo *`; do
   172             name=`echo "${cmd}" | sed -e 's/\.sh$//' -e 's/\.pl$//' \
   173                  -e 's/^/X/' -e 's/^X\([a-z][a-zA-Z0-9_-]*\)$/\1/' -e 's/^X.*$//'`
   174             if [ ".${name}" != . ]; then
   175                 if [ -f ${dir}/${cmd} ]; then
   176                     id=`echo "${name}" | sed -e 's/-/_/g'`
   177                     eval "seen=\$__cmd_seen_${id}"
   178                     if [ ".${seen}" != .yes ]; then
   179                         echo "${name}" | awk '{ printf("  %-15s (provided by add-on package)\n", $0); }'
   180                         eval "__cmd_seen_${id}=yes"
   181                     fi
   182                 fi
   183             fi
   184         done
   185     done
   186     IFS="${OIFS}"
   187     echo ""
   188     echo "where <command-option> and <command-argument> are <command> specific"
   189     echo "options and arguments. Run \"${openpkg_prefix}/bin/openpkg <command> --help\""
   190     echo "and \"${openpkg_prefix}/bin/openpkg man <command>\" for more details."
   191     echo ""
   192     exit 0
   193 fi
   195 #   implement stand-alone "--version" option
   196 if [ ".${opt_version}" = .yes ]; then
   197     release=`${openpkg_prefix}/libexec/openpkg/rpm --eval '%{l_openpkg_release}'`
   198     version=`${openpkg_prefix}/libexec/openpkg/rpm -q --qf '%{version}' openpkg`
   199     echo "${release} (${version})"
   200     exit 0
   201 fi
   203 ##
   204 ##  determine command details and execute command appropriately
   205 ##
   207 #   command line sanity check
   208 if [ ${#} -eq 0 ]; then
   209     echo "openpkg:ERROR: Invalid command-line arguments." 1>&2
   210     echo "openpkg:ERROR: Run \"${openpkg_prefix}/bin/openpkg --help\" for list of valid arguments." 1>&2
   211     exit 1
   212 fi
   214 #   search command by iterating over all command directories
   215 cmd="${1}"
   216 shift
   217 cmd_path=""
   218 cmd_shell=""
   219 cmd_stack="${OPENPKG_TOOLS_CMDSTACK}"
   220 OIFS="${IFS}"; IFS=":"
   221 for dir in ${openpkg_tools_cmdpath}; do
   222     IFS="${OIFS}"
   224     #   skip (currently) not existing directory
   225     if [ ! -d ${dir} ]; then
   226         continue
   227     fi
   229     #   check for various command implementations
   230     if [ -x ${dir}/${cmd} ]; then
   231         #   found executable stand-alone binary
   232         cmd_path="${dir}/${cmd}"
   233         cmd_shell=""
   234     elif [ -f ${dir}/${cmd}.sh ]; then
   235         #   found non-executable Bourne-Shell script
   236         cmd_path="${dir}/${cmd}.sh"
   237         cmd_shell="${openpkg_prefix}/lib/openpkg/bash"
   238     elif [ -f ${dir}/${cmd}.pl ]; then
   239         #   found non-executable Perl script
   240         cmd_path="${dir}/${cmd}.pl"
   241         if [ -x ${openpkg_prefix}/bin/perl ]; then
   242             cmd_shell="${openpkg_prefix}/bin/perl"
   243         else
   244             cmd_shell=`${openpkg_prefix}/lib/openpkg/shtool path -p "$PATH:$openpkg_prefix/lib/openpkg" -m perl 2>&1`
   245             if [ ".${cmd_shell}" = . ]; then
   246                 echo "openpkg:ERROR: No Perl interpreter found in \${PATH}" 1>&2
   247                 exit 1
   248             fi
   249         fi
   250         #   provide Perl module include path(s) to API
   251         OIFS="${IFS}"; IFS=":"
   252         for dir2 in ${openpkg_tools_apipath}; do
   253             IFS="${OIFS}"
   254             if [ ! -d ${dir2} ]; then
   255                 continue
   256             fi
   257             cmd_shell="${cmd_shell} -I${dir2}"
   258         done
   259         IFS="${OIFS}"
   260     else
   261         #   command not found, continue searching
   262         continue
   263     fi
   265     #   check whether to use this found command or to continue searching
   266     #   for next command implementation in sequence (in order to support
   267     #   flexible nested command wrapping)
   268     cmd_last=`echo "${cmd_stack}" | sed -e 's;:.*$;;'`
   269     if [ ".${cmd_last}" = ".${cmd}" ]; then
   270         #   we were last command on stack, so pop us from call
   271         #   stack and continue searching for next implementation
   272         cmd_stack=`echo "${cmd_stack}" | sed -e 's;^[^:][^:]*:*;;'`
   273         continue
   274     else
   275         #   last command on stack was different, so stop
   276         #   searching because we found the implementation
   277         break
   278     fi
   279 done
   280 IFS="${OIFS}"
   282 #   sanity check search result
   283 if [ ".${cmd_path}" = . ]; then
   284     echo "openpkg:ERROR: No such command \"${cmd}\" found in command path" 1>&2
   285     echo "openpkg:ERROR: (${openpkg_tools_cmdpath})." 1>&2
   286     echo "openpkg:ERROR: Set \${OPENPKG_TOOLS_CMDPATH} appropriately." 1>&2
   287     echo "openpkg:ERROR: Run \"${openpkg_prefix}/bin/openpkg --help\" for list of valid commands." 1>&2
   288     exit 1
   289 fi
   291 #   export essential run-time information to command
   292 export OPENPKG_PREFIX="$openpkg_prefix"
   293 export OPENPKG_TOOLS_CMDPROG="${0}"
   294 export OPENPKG_TOOLS_CMDNAME="${cmd}"
   295 export OPENPKG_TOOLS_CMDSTACK=`echo "${OPENPKG_TOOLS_CMDSTACK}" | sed -e 's;^\(.\);:\1;' -e "s;^;${cmd};"`
   297 #   execute command
   298 eval "exec ${cmd_shell} ${cmd_path} \${1+\"\$@\"}"

mercurial