openpkg/rc.func

Tue, 29 Mar 2011 20:04:34 +0200

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 29 Mar 2011 20:04:34 +0200
changeset 334
4a34d7a82eab
child 427
71503088f51b
permissions
-rw-r--r--

Rework package yet again, correcting and introducing new buildconf logic:
Conditionally disable bootstrap stage comparison correctly, correct
english grammar, better find system as(1) and ld(1), indotruce detailed
optimization option messages, more completely guess cpu types, allow
profiled bootstrapping without a preinstalled GCC because many other
compilers have long since implemented 64-bit arithmetic, instruct make
to build sequentially (not in sparallel) when building a profiled
bootstrap as GCC online documents recommend, and generally improve
comment blocks.

The single most important correction in this changeset relates to the
GCC changed optimization policy since at least GCC 4.5, in which -march
is always passed and not always correctly guessed. In the case of this
package, allowing GCC to guess the architecture leads to wild build
errors at various subcomponents (zlib, libgcc, libiberty...) and
bootstrap stages. It seems quite platform specific, and the safest
approach to correcting this seems to be explicitly always specifying the
-march argument when bootstrapping GCC. Because the best choice 'native'
is not available when bootstrapping using a foreign (non GCC) compiler,
a guess is made according to rpmmacros l_platform in that case.

It is questionable as to whether these recent optimization changes
on the part of GCC or this package are compatible with each other,
or if either are complete or correct at all. At least applying these
corrections allows this package to build again in most cases test.

     1 ##
     2 ##  @l_prefix@/etc/rc.func -- Run-Command Helper Functions
     3 ##  Copyright (c) 2000-2007 OpenPKG Foundation e.V. <http://openpkg.net/>
     4 ##  Copyright (c) 2000-2007 Ralf S. Engelschall <http://engelschall.com/>
     5 ##
     6 ##  Permission to use, copy, modify, and distribute this software for
     7 ##  any purpose with or without fee is hereby granted, provided that
     8 ##  the above copyright notice and this permission notice appear in all
     9 ##  copies.
    10 ##
    11 ##  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
    12 ##  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
    13 ##  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
    14 ##  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
    15 ##  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    16 ##  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    17 ##  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
    18 ##  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    19 ##  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    20 ##  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
    21 ##  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    22 ##  SUCH DAMAGE.
    23 ##
    25 ##
    26 ##  NOTICE: This script is a collection of reusable shell functions
    27 ##  running under GNU Bash during the execution of OpenPKG run-command
    28 ##  sections.
    29 ##
    31 #
    32 #   rcMsg (display message)
    33 #
    34 #   Usage:       rcMsg [-e] [-w] <message>
    35 #   Example:     rcMsg -e "invalid command line"
    36 #   Description: display a regular/warning/error message.
    37 #
    38 rcMsg () {
    39     local prefix="rc:"
    40     while [ $# -gt 0 ]; do
    41         case $1 in
    42             -e ) prefix="${prefix}ERROR:";   shift ;;
    43             -w ) prefix="${prefix}WARNING:"; shift ;;
    44             *  ) break ;;
    45         esac
    46     done
    47     echo "${prefix} $*"
    48     return 0
    49 }
    51 #
    52 #   rcPath (manipulate colon-separated PATH-style variable)
    53 #
    54 #   Usage:       rcPath [-a] [-r] [-p] [-e] <var> <dir> [<dir> ...]
    55 #   Example:     rcPath -a -e PATH /bin /sbin /usr/bin /usr/sbin /usr/ccs/bin
    56 #   Description: removes (-r) or adds (-a) by appending or prepending
    57 #                (-p) one or more directories <dir> (optionally have
    58 #                to be existing if -e is given) to a colon-separated
    59 #                PATH-style variable <var>. In case a directory already
    60 #                exists, it is first removed.
    61 #
    62 rcPath () {
    63     local mode=""
    64     local prepend=0
    65     local exists=0
    66     while [ $# -gt 0 ]; do
    67         case $1 in
    68             -a ) mode="add";    shift ;;
    69             -r ) mode="remove"; shift ;;
    70             -p ) prepend=1;     shift ;;
    71             -e ) exists=1;      shift ;;
    72             *  ) break                ;;
    73         esac
    74     done
    75     local var="$1"
    76     shift
    77     if [ ".${mode}" = .add ]; then
    78         local edit_del=""
    79         local edit_add=""
    80         local dir
    81         for dir in "$@"; do
    82             if [ ".${exists}" = .1 ] && [ ! -d "${dir}" ]; then
    83                 continue
    84             fi
    85             edit_del="${edit_del} -e 's;^${dir}\$;;' -e 's;^${dir}:;;'"
    86             edit_del="${edit_del} -e 's;:${dir}:;:;' -e 's;:${dir}\$;;'"
    87             if [ ".${prepend}" = .0 ]; then
    88                 edit_add="${edit_add} -e 's;\$;:${dir};'"
    89             else
    90                 edit_add="-e 's;^;${dir}:;' ${edit_add}"
    91             fi
    92         done
    93         if [ ".${edit_del}${edit_add}" != . ]; then
    94             eval "${var}=\`echo \"\$${var}\" | sed ${edit_del} ${edit_add}\`"
    95         fi
    96         return 0
    97     elif [ ".${mode}" = .remove ]; then
    98         local edit=""
    99         local dir
   100         for dir in "$@"; do
   101             edit="${edit} -e 's;^${dir}\$;;' -e 's;^${dir}:;;'"
   102             edit="${edit} -e 's;:${dir}:;:;' -e 's;:${dir}\$;;'"
   103         done
   104         eval "${var}=\`echo \"\$${var}\" | sed ${edit}\`"
   105         return 0
   106     else
   107         rcMsg -e "rcPath: neither add (-a) nor remove (-r) operation specified"
   108         return 1
   109     fi
   110 }
   112 #
   113 #   rcTmp (temporary file handling)
   114 #
   115 #   Usage:       rcTmp [-i] [-f [-n <name>]] [-k]
   116 #   Example:     rcTmp -i; tmpfile=`rcTmp -f -n tmp`; ...; rcTmp -k
   117 #   Description: ???
   118 #
   119 rcTmp () {
   120     local mode=""
   121     local name=""
   122     while [ $# -gt 0 ]; do
   123         case $1 in
   124             -i ) mode="init"; shift        ;;
   125             -f ) mode="file"; shift        ;;
   126             -k ) mode="kill"; shift        ;;
   127             -n ) name="$2";   shift; shift ;;
   128             *  ) break                     ;;
   129         esac
   130     done
   131     if [ ".${mode}" = .init ]; then
   132         if [ ".${RC_TMPDIR}" = . ]; then
   133             local i=0
   134             while [ ${i} -lt 10 ]; do
   135                RC_TMPDIR="@l_prefix@/RPM/TMP/rc-`date '+%Y%m%d%H%M%S'`-$$"
   136                (umask 022; mkdir ${RC_TMPDIR} >/dev/null 2>&1) && break
   137                i=$((${i} + 1))
   138                sleep 1
   139             done
   140             if [ ${i} -eq 10 ]; then
   141                 rcMsg -e "rcTmp: unable to establish secure temporary directory" 1>&2
   142                 return 1
   143             fi
   144             declare -r RC_TMPDIR
   145         fi
   146         return 0
   147     elif [ ".${mode}" = .file ]; then
   148         echo "${RC_TMPDIR}/${name:-tmp}"
   149         return 0
   150     elif [ ".${mode}" = .kill ]; then
   151         if [ ".${RC_TMPDIR}" = . ]; then
   152             rcMsg -e "rcTmp: no secure temporary directory known"
   153             return 1
   154         else
   155             rm -rf ${RC_TMPDIR}
   156             return 0
   157         fi
   158     else
   159         rcMsg -e "rcTmp: neither init (-i), file (-f) nor kill (-k) operation specified"
   160         return 1
   161     fi
   162 }
   164 #
   165 #   rcService (check for service status enable/active/usable)
   166 #
   167 #   Usage:       rcService <pkg> <service> <val>
   168 #   Example:     if rcService openssh enable yes; then ...
   169 #   Description: check <service> of package <pkg> against value <val>.
   170 #                <service> has to be one of "enable", "active" or "usable".
   171 #                <val> has to be either "no", "yes", or "unknown".
   172 #
   173 rcService () {
   174     local pkg="`echo ${1} | sed -e 's;-;_;g'`"
   175     local var="${pkg}_${2}"
   176     local chk="${3}"
   177     eval "local val=\$${var}"
   178     if [ ".${val}" = . ]; then
   179         eval `@l_prefix@/bin/openpkg rc 2>/dev/null --silent ${1} status || true`
   180         eval "local val=\$${var}"
   181     fi
   182     if [ ".${val}" = ".${chk}" ]; then
   183         return 0
   184     else
   185         return 1
   186     fi
   187 }
   189 #
   190 #   rcVarIsYes (check variable for positive value)
   191 #
   192 #   Usage:       rcVarIsYes <var>
   193 #   Example:     if rcVarIsYes foo; then ...
   194 #   Description: check whether a variable <var> contains a positive
   195 #                value, i.e., the values "yes", "true", "on" or "1" in
   196 #                arbitrary lower or upper case.
   197 #
   198 rcVarIsYes () {
   199     local var="${1}"
   200     eval "local val=\"\$${var}\""
   201     case "${val}" in
   202         [Yy][Ee][Ss] | [Tt][Rr][Uu][Ee] | [Oo][Nn] | 1 )
   203             return 0
   204             ;;
   205         * )
   206             return 1
   207             ;;
   208     esac
   209 }

mercurial