Tue, 29 Mar 2011 20:04:34 +0200
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 #!/bin/sh
2 ##
3 ## OpenPKG Source Bootstrap Package (self-extracting shell script)
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 ##
26 # configuration
27 l_me="$0"
28 o_help=no
29 o_version=no
30 o_tar=no
31 l_prefix='/openpkg'
32 l_dir='@l_dir@'
33 l_release="@l_release@"
34 l_version="@l_version@"
36 # establish standard environment
37 PATH="$PATH:/bin:/sbin:/usr/bin:/usr/sbin"
38 LC_CTYPE=C
39 export LC_CTYPE
40 umask 022
42 # pre-parse command line options
43 for opt
44 do
45 case $opt in
46 -*=*) arg=`echo "$opt" | sed 's/^[-_a-zA-Z0-9]*=//'` ;;
47 *) arg='' ;;
48 esac
49 case $opt in
50 -h | --help ) o_help=yes ;;
51 -v | --version ) o_version=yes ;;
52 -t | --tar ) o_tar=yes ;;
53 --prefix=* ) l_prefix=$arg ;;
54 esac
55 done
56 if [ ".$o_help" = .yes ]; then
57 echo "Usage: sh $l_me" 2>&1
58 echo " [--prefix=<prefix>] [--tag=<str>]" 2>&1
59 echo " [--user=<usr>] [--group=<grp>]" 2>&1
60 echo " [--{s,m,r,n}usr=<usr>] [--{s,m,r,n}grp=<grp>]" 2>&1
61 echo " [--{s,m,r,n}uid=<uid>] [--{s,m,r,n}gid=<gid>]" 2>&1
62 echo " [--use_tar=<tar>] [--use_make=<make>] [--use_cc=<cc>]" 2>&1
63 echo " [--use_ar=<ar>] [--use_ld=<ld>] [--use_as=<as>] [--use_strip=<strip>]" 2>&1
64 echo " [-t|--tar] [-h|--help] [-v|--version]" 2>&1
65 exit 1
66 fi
68 # make sure all essential unpacking tools are available
69 # (the build tools are checked later from within openpkg.spec)
70 for tool in /bin/sh mkdir cat tar rm chown chgrp sed dd; do
71 found=no
72 case $tool in
73 /* )
74 if [ -f $tool ]; then
75 found=yes
76 fi
77 ;;
78 * )
79 for p in `IFS=:; echo $PATH`; do
80 if [ -f "$p/$tool" ]; then
81 found=yes
82 break
83 fi
84 done
85 ;;
86 esac
87 if [ ".$found" = .no ]; then
88 echo "$l_me:ERROR: unable to find bootstrap tool \"$tool\"" 1>&2
89 exit 1
90 fi
91 done
93 # optionally extract the embedded tarball only
94 if [ ".$o_tar" = .yes ]; then
95 dd if=$l_me bs=8192 skip=8 2>/dev/null
96 exit 0
97 fi
99 # display version and copyright header
100 echo "OpenPKG ${l_release} Source Bootstrap Package, version ${l_version}"
101 if [ ".$o_version" = .yes ]; then
102 exit 0
103 fi
104 echo "Building for prefix ${l_prefix} on current platform"
106 # determine current user/group
107 cusr=`(id -un) 2>/dev/null ||\
108 (id | sed -e 's;^[^(]*(\([^)]*\)).*;\1;') 2>/dev/null ||\
109 (whoami) 2>/dev/null ||\
110 (who am i | cut "-d " -f1) 2>/dev/null ||\
111 echo $LOGNAME`
112 cgid=`(id -g $cusr) 2>/dev/null ||\
113 ((getent passwd "${cusr}"; grep "^${cusr}:" /etc/passwd; ypmatch "${cusr}" passwd; nismatch "${cusr}" passwd; nidump passwd . | grep "^${cusr}:") 2>/dev/null |\
114 sed -e 'q' | awk -F: '{ print $4; }')`
115 cgrp=`(id -gn $cusr) 2>/dev/null ||\
116 ((getent group; cat /etc/group; ypcat group; niscat group; nidump group .) 2>/dev/null | grep "^[^:]*:[^:]*:${cgid}:" |\
117 sed -e 'q' | awk -F: '{ print $1; }')`
118 if [ ".$cgrp" = . ]; then
119 cgrp="$cusr"
120 fi
122 # extract the source distribution files
123 echo "++ extracting OpenPKG source distribution"
124 rm -rf $l_dir >/dev/null 2>&1
125 mkdir $l_dir || exit 1
126 dd if=$l_me bs=8192 skip=8 2>/dev/null | (cd $l_dir; tar xf - 2>/dev/null)
127 if [ ".$cusr" = .root ]; then
128 ( cd $l_dir || exit 1
129 chown -R -h $cusr . >/dev/null 2>&1 || true
130 chgrp -R -h $cgrp . >/dev/null 2>&1 || true
131 ) || exit 1
132 fi
133 if [ ! -f $l_dir/openpkg.boot ]; then
134 echo "$l_me:ERROR: failed to unpack into directory \"$l_dir\"" 1>&2
135 exit 1
136 fi
138 # perform bootstrap procedure
139 echo "++ building OpenPKG binary distribution"
140 ( cd $l_dir || exit 1
141 ./openpkg.boot ${1+"$@"} || exit 1
142 ) || exit 1
144 # cleanup
145 rm -rf $l_dir >/dev/null 2>&1
147 # die explicitly just before the shell would discover
148 # that we carry mega-bytes of data with us...
149 exit 0
151 # the distribution tarball is appended in raw format directly to the
152 # end of this script, just leaded by padding whitespaces which make
153 # sure that the tarball data starts at the pre-defined offset of 64KB.
154 # This allows us to unpack the tarball by just skipping the leading
155 # 64KB (= 8192*8, see above).