Sun, 03 Apr 2011 13:34:55 +0200
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 ##
2 ## gcc.spec -- OpenPKG RPM Package Specification
3 ## Copyright (c) 2000-2010 OpenPKG Foundation e.V. <http://openpkg.net/>
4 ##
5 ## Permission to use, copy, modify, and distribute this software for
6 ## any purpose with or without fee is hereby granted, provided that
7 ## the above copyright notice and this permission notice appear in all
8 ## copies.
9 ##
10 ## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
11 ## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
12 ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
13 ## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
14 ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
15 ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
16 ## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
17 ## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
18 ## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
19 ## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
20 ## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
21 ## SUCH DAMAGE.
22 ##
24 # package version
25 %define V_full 4.6.0
26 %define V_comp %nil
28 # package information
29 Name: gcc
30 Summary: GNU Compiler Collection
31 URL: http://gcc.gnu.org/
32 Vendor: Free Software Foundation
33 Packager: OpenPKG Foundation e.V.
34 Distribution: OpenPKG Community
35 Class: CORE
36 Group: Compiler
37 License: GPL
38 Version: %{V_full}
39 Release: 20110331
41 # package options
42 %option with_binutils yes
43 %option with_cxx yes
44 %option with_objc no
45 %option with_java no
46 %option with_fortran no
47 %option with_optimize yes
48 %option with_profile no
49 %option with_threads yes
50 %option with_multilib no
52 # fix intermodule dependencies implicitly
53 %if "%{with_java}" == "yes"
54 %define with_cxx yes
55 %define with_threads yes
56 %endif
58 # list of sources
59 Source0: ftp://gcc.gnu.org/pub/gcc/releases/gcc-%{V_full}/gcc-core-%{V_full}.tar.bz2
60 Source1: ftp://gcc.gnu.org/pub/gcc/releases/gcc-%{V_full}/gcc-g++-%{V_full}.tar.bz2
61 Source2: ftp://gcc.gnu.org/pub/gcc/releases/gcc-%{V_full}/gcc-objc-%{V_full}.tar.bz2
62 Source3: ftp://gcc.gnu.org/pub/gcc/releases/gcc-%{V_full}/gcc-java-%{V_full}.tar.bz2
63 Source4: ftp://gcc.gnu.org/pub/gcc/releases/gcc-%{V_full}/gcc-fortran-%{V_full}.tar.bz2
64 Patch0: gcc.patch
66 # build information
67 Prefix: %{l_prefix}
68 BuildRoot: %{l_buildroot}
69 BuildPreReq: OpenPKG, openpkg >= 20060823, make
70 PreReq: OpenPKG, openpkg >= 20060823
71 BuildPreReq: mpc, mpfr, gmp
72 PreReq: mpc, mpfr, gmp
73 %if "%{with_binutils}" == "yes"
74 BuildPreReq: binutils >= 2.14
75 PreReq: binutils >= 2.14
76 %endif
77 %if "%{with_cxx}" == "yes"
78 BuildPreReq: libiconv
79 PreReq: libiconv
80 %endif
81 %if "%{with_java}" == "yes"
82 BuildPreReq: zlib, infozip
83 PreReq: zlib
84 %endif
85 AutoReq: no
86 AutoReqProv: no
88 %description
89 The GNU Compiler Collection (GCC) provides standard conforming and
90 highly portable compilers for the ISO C, ISO C++, Objective-C,
91 Fortran and Java languages.
93 %track
94 prog gcc = {
95 version = %{V_full}
96 url = ftp://gcc.gnu.org/pub/gcc/releases/
97 regex = gcc-(4\.\d+\.\d+)
98 url = ftp://gcc.gnu.org/pub/gcc/releases/gcc-__NEWVER__/
99 regex = gcc-core-(\d+\.\d+\.\d+)\.tar\.bz2
100 }
102 %prep
103 %setup -q
104 %if "%{with_cxx}" == "yes"
105 %setup -q -T -D -b 1
106 %endif
107 %if "%{with_objc}" == "yes"
108 %setup -q -T -D -b 2
109 %endif
110 %if "%{with_java}" == "yes"
111 %setup -q -T -D -b 3
112 %endif
113 %if "%{with_fortran}" == "yes"
114 %setup -q -T -D -b 4
115 %endif
116 %patch -p0
117 %{l_shtool} subst \
118 -e 's;\(instname="\$dir/\$name"\)i;\1;' \
119 ltmain.sh
120 %{l_shtool} subst -v -s \
121 -e 's;\(gmplibs="-lmpc\) \(-lmpfr -lgmp\);\1 -lm \2;' \
122 configure
123 %{l_shtool} subst -v -s \
124 -e 's;\(LDEXP_LIB=\)"$LIBS";\1"$LDFLAGS";' \
125 -e 's;PREFIX_INCLUDE_DIR;PREFIX_INCLUDE_DIR_DISABLED;g' \
126 gcc/configure
127 %{l_shtool} subst \
128 -e 's;[ \t]*-W[a-zA-Z0-9_\-][a-zA-Z0-9_\-]*,*;;g' \
129 lto-plugin/Makefile.in
130 %{l_shtool} subst \
131 -e 's;-rpath *[^ \t][^ \t]*;;g' \
132 -e 's;--tag=disable-static;--tag=disable-shared;g' \
133 -e 's;\.\./libiberty/libiberty\.a;-L../libiberty -liberty;g' \
134 -e 's;\.\./libiberty/pic/libiberty\.a;-L../libiberty/pic -liberty;g' \
135 lto-plugin/Makefile.in
136 %if "%{with_cxx}" == "yes"
137 %{l_shtool} subst \
138 -e 's;\(pythondir *= *\$(datadir)\)/gcc-\$(gcc_version);\1/gcc;' \
139 libstdc++-v3/python/Makefile.in
140 %endif
141 %if "%{with_java}" == "yes"
142 %{l_shtool} subst \
143 -e 's;\(default_python_dir\) *=.*;\1=/share/gcc/python/libjava;' \
144 libjava/configure
145 %{l_shtool} subst \
146 -e 's;JAR *= *@JAR@;JAR = $(here)/scripts/jar;' \
147 libjava/Makefile.in
148 %endif
149 if [ ".%{V_comp}" != . ]; then
150 %{l_shtool} subst -v -s \
151 -e 's;(libdir)/gcc/;(libdir)/gcc%{V_comp}/;' \
152 -e 's;(libexecdir)/gcc/;(libexecdir)/gcc%{V_comp}/;' \
153 `find . -name Makefile.in -type f -print`
154 fi
155 %{l_shtool} subst \
156 -e 's;^\(do-compare\) *\(=.*\);#\1-shouldnt-be-defined-here \2;' \
157 config/*.mk
158 case "%{l_platform -t}" in
159 amd64-linux* )
160 %{l_shtool} subst \
161 -e 's/GLIBCXX_IS_NATIVE=false/GLIBCXX_IS_NATIVE=true/g' \
162 -e 's/test x.gcc_no_link = xyes/false/g' \
163 libstdc++-v3/configure
164 ;;
165 esac
166 %{l_shtool} subst \
167 -e 's;<iconv\.h>;"%{l_prefix}/include/iconv.h";' \
168 libstdc++-v3/include/ext/codecvt_specializations.h
169 %{l_shtool} subst \
170 -e 's;.*with_arch_32=\${with_arch_32:-pentium4}.*;;' \
171 -e 's;with_arch_32=\${with_arch_32:-pentiumpro};arch_without_sse2=yes;' \
172 gcc/config.gcc
174 %build
175 # create build subdirectory
176 %{l_shtool} mkdir -p objbld
177 cd objbld
179 # locate ld(1) and as(1) accordingly
180 %if "%{with_binutils}" == "yes"
181 # allow OpenPKG binutils
182 LD=%{l_tool_locate ld ld}
183 AS=%{l_tool_locate as as}
184 %else
185 # ignore OpenPKG binutils
186 LD=`PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/ccs/bin:/opt/bin:/opt/sbin:/usr/local/bin:/usr/local/sbin which ld`
187 AS=`PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/ccs/bin:/opt/bin:/opt/sbin:/usr/local/bin:/usr/local/sbin which as`
188 %endif
189 l_with_gnu_ld_as=""
190 echo $LD | grep '^/' >/dev/null && l_with_gnu_ld_as="--with-ld=$LD"
191 echo $AS | grep '^/' >/dev/null && l_with_gnu_ld_as="${l_with_gnu_ld_as} --with-as=$AS"
192 $LD --version </dev/null 2>/dev/null | grep "^GNU ld" >/dev/null && l_with_gnu_ld_as="${l_with_gnu_ld_as} --with-gnu-ld" || l_with_gnu_ld_as="${l_with_gnu_ld_as} --without-gnu-ld"
193 $AS --version </dev/null 2>/dev/null | grep "^GNU assembler" >/dev/null && l_with_gnu_ld_as="${l_with_gnu_ld_as} --with-gnu-as" || l_with_gnu_ld_as="${l_with_gnu_ld_as} --without-gnu-as"
195 # determine threads use
196 %if "%{with_threads}" == "yes"
197 l_enable_threads="posix"
198 %else
199 l_enable_threads="single"
200 %endif
202 # determine language use
203 l_enable_languages="c"
204 %if "%{with_cxx}" == "yes"
205 l_enable_languages="${l_enable_languages},c++"
206 %endif
207 %if "%{with_objc}" == "yes"
208 l_enable_languages="${l_enable_languages},objc"
209 %endif
210 %if "%{with_java}" == "yes"
211 l_enable_languages="${l_enable_languages},java"
212 %endif
213 %if "%{with_fortran}" == "yes"
214 l_enable_languages="${l_enable_languages},f95"
215 %endif
217 # disable GNU iconv use
218 ( echo "am_cv_func_iconv=no"
219 echo "am_cv_lib_iconv=no"
220 ) >config.cache
221 # platforms failing 'compare' make target (see prep as well)
222 case "%{l_platform -t}" in
223 *i?86-sunos* ) echo "gcc_cv_prog_cmp_skip=true" >>config.cache ;;
224 *amd64-linux* ) echo "gcc_cv_prog_cmp_skip=true" >>config.cache ;;
225 esac
227 # configure the package
228 LD="$LD" \
229 AS="$AS" \
230 CC="%{l_cc}" \
231 CFLAGS="%{l_cflags}" \
232 %if "%{with_cxx}" == "yes"
233 CPPFLAGS="%{l_cppflags}" \
234 LDFLAGS="%{l_ldflags}" \
235 %endif
236 CONFIG_SHELL="%{l_bash}" \
237 GREP="%{l_bash}" \
238 ../configure \
239 --with-bugurl="http://openpkg.org/" \
240 --with-pkgversion="%{l_openpkg_release -F "OpenPKG-%%t"}" \
241 --cache-file=./config.cache \
242 --srcdir=`pwd`/.. \
243 --prefix=%{l_prefix} \
244 --exec-prefix=%{l_prefix} \
245 --mandir=%{l_prefix}/man \
246 --infodir=%{l_prefix}/info \
247 --includedir=%{l_prefix}/include/gcc%{V_comp} \
248 --with-gxx-include-dir=%{l_prefix}/include/g++%{V_comp} \
249 --enable-languages="${l_enable_languages}" \
250 --enable-threads="${l_enable_threads}" \
251 --disable-maintainer-mode \
252 --disable-shared \
253 --disable-nls \
254 %if "%{with_java}" == "yes"
255 --with-system-zlib \
256 %endif
257 %if "%{with_multilib}" == "yes"
258 --enable-multilib \
259 %else
260 --disable-multilib \
261 %endif
262 %if "%{with_cxx}" == "yes"
263 --with-libiconv-prefix=%{l_prefix} \
264 %endif
265 --with-gmp=%{l_prefix} \
266 --with-mpfr=%{l_prefix} \
267 --with-mpc=%{l_prefix} \
268 ${l_with_gnu_ld_as}
270 # determine build flags
271 l_ccisgcc=no
272 if [ ".`(%{l_cc} -v; %{l_cc} --version) </dev/null 2>&1 | grep -i 'gcc'`" != . ]; then
273 l_ccisgcc=yes
274 fi
275 l_cflags=""
276 l_cxxflags=""
277 l_boot_cflags=""
278 l_libcflags="-g"
279 l_libcxxflags="-g"
280 # at least GNU as from GNU binutils supports -pipe always
281 "$AS" --version </dev/null 2>/dev/null | grep "^GNU assembler" >/dev/null && {
282 l_boot_cflags="$l_boot_cflags -pipe"
283 l_libcxxflags="$l_libcxxflags -pipe"
284 }
285 %if "%{with_optimize}" == "yes"
286 # GCC authors are not keeping up with optimized portability expectations
287 ( echo "As GCC advances its optimization logic becomes increasingly complex (and"
288 echo "buggy?) Since at least GCC 4.5, problems have been reported using arguments"
289 echo "-O, -mtune, or -march implicitly or explicitly during different bootstrap"
290 echo "stages as well as stage comparison and even the final installation."
291 echo ""
292 echo "Pay attention when building on one computer and installing on another as"
293 echo "problems may be platform specific. If in doubt, disable optimization."
294 ) | %{l_rpmtool} msg -b -t warn
295 if [ ".$l_ccisgcc" != .yes ]; then
296 # CPU native detection only works with GCC (see driver-i386.c)
297 ( echo "Platform specific optimization is enabled, but detection of appropriate"
298 echo "native architecture is only possible when bootstrapping GCC using a pre-"
299 echo "installed GCC. The current build is using a different compiler, so such"
300 echo "optimization is generically built while deferring native architecture"
301 echo "detection to the final GCC binary."
302 echo ""
303 echo "To achieve native architecture detection while bootstrapping please"
304 echo "install GCC first and then build GCC a second time."
305 ) | %{l_rpmtool} msg -b -t notice
306 fi
307 # tuning without specifying '-march' is portable and in theory
308 # allows the resulting GCC binaries to execute on other hosts!
309 case "%{l_platform -t}" in
310 *sun4[uv]-* ) l_boot_cflags="$l_boot_cflags -mtune=v9" ;;
311 *sun*-* ) l_boot_cflags="$l_boot_cflags -mtune=v8" ;;
312 *i?86-* | *amd64-* | *ia64-* ) l_boot_cflags="$l_boot_cflags -mtune=native" ;;
313 * ) l_boot_cflags="$l_boot_cflags -mtune=generic" ;;
314 esac
315 l_cflags="$l_cflags -O"
316 l_boot_cflags="$l_boot_cflags -O3 -fomit-frame-pointer"
317 l_libcxxflags="$l_libcxxflags -O3 -fno-implicit-templates"
318 %else
319 # don't optimize at all to avoid problems
320 l_boot_cflags="$l_boot_cflags -O0"
321 l_libcxxflags="$l_libcxxflags -O0"
322 %endif
323 %if "%{with_profile}" == "yes"
324 # generate profile feedback
325 maketarget="profiledbootstrap"
326 loc_makeflags="%{l_mflags}"
328 # warn about exceptional build duration for profile feedback
329 ( echo "Building profile feedback on some hosts can take many days to complete!"
330 echo "Now continuing to build a profiled bootstrap with parallel make logic"
331 echo "disabled according to profiling requirements..."
332 ) | %{l_rpmtool} msg -b -t warn
334 # warn about profiled bootstrap requirement of 64-bit arithmetic
335 if [ ".$l_ccisgcc" != .yes ]; then
336 ( echo "A preinstalled GCC was not detected although one is recommended for"
337 echo "building a profiled bootstrap. Buildtime or runtime errors can occur if"
338 echo "the compiler used to build profile feedback doesn't support 64-bit math."
339 echo ""
340 echo "If in doubt, stop now and start the build again with profiling disabled."
341 ) | %{l_rpmtool} msg -b -t warn
342 fi
343 %else
344 # build in three stages
345 maketarget="bootstrap"
346 loc_makeflags="%{l_mflags -O}"
347 %endif
348 case "%{l_platform -t}" in
349 *64-* ) l_cflags="$l_cflags -fPIC"; l_cxxflags="$l_cxxflags -fPIC" ;;
350 esac
351 %if "%{with_cxx}" == "yes"
352 l_cflags="$l_cflags %{l_cppflags}"
353 l_cxxflags="$l_cxxflags %{l_cppflags}"
354 l_libcflags="$l_libcflags %{l_cppflags}"
355 l_libcxxflags="$l_libcxxflags %{l_cppflags}"
356 %endif
358 # build the package
359 MAKE="%{l_make} ${loc_makeflags}" \
360 %{l_make} ${loc_makeflags} \
361 GREP="grep" \
362 MAKE="%{l_make} ${loc_makeflags}" \
363 BOOT_CFLAGS="${l_boot_cflags}" \
364 CFLAGS="${l_cflags}" \
365 CXXFLAGS="${l_cxxflags}" \
366 %if "%{with_cxx}" == "yes"
367 CPPFLAGS="%{l_cppflags}" \
368 LDFLAGS="%{l_ldflags}" \
369 BOOT_LDFLAGS="%{l_ldflags}" \
370 %endif
371 LIBCFLAGS="${l_libcflags}" \
372 LIBCXXFLAGS="${l_libcxxflags}" \
373 $maketarget
375 %install
376 rm -rf $RPM_BUILD_ROOT
378 # fetch GNU platform triple
379 triple=`./config.guess`
381 # perform standard installation procedure
382 ( cd objbld
383 %{l_make} %{l_mflags} install DESTDIR=$RPM_BUILD_ROOT
384 ) || exit $?
386 # cleanup installation tree
387 mv $RPM_BUILD_ROOT%{l_prefix}/lib/{lib*.a,*.spec} \
388 $RPM_BUILD_ROOT%{l_prefix}/lib/gcc%{V_comp}/${triple}/[0-9]*/ \
389 >/dev/null 2>&1 || true
390 mv $RPM_BUILD_ROOT%{l_prefix}/lib64/{lib*.a,*.spec} \
391 $RPM_BUILD_ROOT%{l_prefix}/lib/gcc%{V_comp}/${triple}/[0-9]*/ \
392 >/dev/null 2>&1 || true
393 dirs=""
394 for multilib in `$RPM_BUILD_ROOT%{l_prefix}/bin/gcc --print-multi-lib`; do
395 subdir=`echo "$multilib" | sed -e 's/;.*$//'`
396 [ ".$subdir" = .. ] && continue
397 mv $RPM_BUILD_ROOT%{l_prefix}/lib/$subdir/lib*.a \
398 $RPM_BUILD_ROOT%{l_prefix}/lib/gcc%{V_comp}/${triple}/[0-9]*/$subdir/ \
399 >/dev/null 2>&1 || true
400 mv $RPM_BUILD_ROOT%{l_prefix}/lib64/$subdir/lib*.a \
401 $RPM_BUILD_ROOT%{l_prefix}/lib/gcc%{V_comp}/${triple}/[0-9]*/$subdir/ \
402 >/dev/null 2>&1 || true
403 dirs="$dirs $subdir"
404 done
405 for subdir in $dirs; do
406 rm -rf $RPM_BUILD_ROOT%{l_prefix}/lib/$subdir >/dev/null 2>&1 || true
407 done
408 mv $RPM_BUILD_ROOT%{l_prefix}/${triple}/include/* \
409 $RPM_BUILD_ROOT%{l_prefix}/lib/gcc%{V_comp}/${triple}/[0-9]*/include/ \
410 >/dev/null 2>&1 || true
412 # correct hardcoded paths
413 %{l_shtool} subst \
414 -e "s;\(dependency_libs\) *=.*;\1='-L%{l_prefix}/lib\ -L%{l_prefix}/lib/gcc%{V_comp}/${triple}/%{V_full}\ -liberty';" \
415 $RPM_BUILD_ROOT%{l_prefix}/libexec/gcc%{V_comp}/${triple}/[0-9]*/liblto_plugin.la
417 # strip installation tree
418 rm -rf $RPM_BUILD_ROOT%{l_prefix}/${triple}
419 rm -f $RPM_BUILD_ROOT%{l_prefix}/info/dir
420 rm -rf $RPM_BUILD_ROOT%{l_prefix}/man/man7 >/dev/null 2>&1 || true
421 rm -f $RPM_BUILD_ROOT%{l_prefix}/lib/*.la >/dev/null 2>&1 || true
422 rm -rf $RPM_BUILD_ROOT%{l_prefix}/lib64 >/dev/null 2>&1 || true
423 rm -f $RPM_BUILD_ROOT%{l_prefix}/bin/*-gcc* >/dev/null 2>&1 || true
424 %if "%{with_cxx}" == "yes"
425 rm -f $RPM_BUILD_ROOT%{l_prefix}/bin/*-c++ >/dev/null 2>&1 || true
426 rm -f $RPM_BUILD_ROOT%{l_prefix}/bin/*-g++ >/dev/null 2>&1 || true
427 %endif
428 strip $RPM_BUILD_ROOT%{l_prefix}/bin/* >/dev/null 2>&1 || true
429 for prog in cc1 cc1plus collect2 cpp; do
430 strip $RPM_BUILD_ROOT%{l_prefix}/lib/gcc%{V_comp}/${triple}/[0-9]*/${prog} \
431 >/dev/null 2>&1 || true
432 done
434 # bump up installation tree
435 ln $RPM_BUILD_ROOT%{l_prefix}/bin/gcc \
436 $RPM_BUILD_ROOT%{l_prefix}/bin/cc
437 ln $RPM_BUILD_ROOT%{l_prefix}/man/man1/gcc.1 \
438 $RPM_BUILD_ROOT%{l_prefix}/man/man1/cc.1
439 %if "%{with_cxx}" == "yes"
440 ln $RPM_BUILD_ROOT%{l_prefix}/man/man1/g++.1 \
441 $RPM_BUILD_ROOT%{l_prefix}/man/man1/c++.1
442 %endif
444 # determine installation file list
445 %{l_rpmtool} files -v -ofiles -r$RPM_BUILD_ROOT %{l_files_std}
447 %files -f files
449 %clean
450 rm -rf $RPM_BUILD_ROOT