/[gentoo-x86]/eclass/toolchain.eclass
Gentoo

Contents of /eclass/toolchain.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.552 - (show annotations) (download)
Mon Oct 1 05:03:17 2012 UTC (2 years ago) by vapier
Branch: MAIN
Changes since 1.551: +4 -2 lines
depend on virtual/pkgconfig for gcj/gtk deps #436724 by Diego Elio Pettenò

1 # Copyright 1999-2012 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
3 # $Header: /var/cvsroot/gentoo-x86/eclass/toolchain.eclass,v 1.551 2012/08/19 01:23:44 vapier Exp $
4 #
5 # Maintainer: Toolchain Ninjas <toolchain@gentoo.org>
6
7 #---->> eclass stuff <<----
8 HOMEPAGE="http://gcc.gnu.org/"
9 LICENSE="GPL-2 LGPL-2.1"
10 RESTRICT="strip" # cross-compilers need controlled stripping
11
12 inherit eutils versionator libtool toolchain-funcs flag-o-matic gnuconfig multilib fixheadtails pax-utils
13
14 if [[ ${PV} == *_pre9999* ]] ; then
15 EGIT_REPO_URI="git://gcc.gnu.org/git/gcc.git"
16 # naming style:
17 # gcc-4.7.1_pre9999 -> gcc-4_7-branch
18 # Note that the micro version is required or lots of stuff will break.
19 # To checkout master set gcc_LIVE_BRANCH="master" in the ebuild before
20 # inheriting this eclass.
21 EGIT_BRANCH="${PN}-${PV%.?_pre9999}-branch"
22 EGIT_BRANCH=${EGIT_BRANCH//./_}
23 inherit git-2
24 fi
25
26 EXPORT_FUNCTIONS pkg_setup src_unpack src_compile src_test src_install pkg_postinst pkg_postrm
27 DESCRIPTION="The GNU Compiler Collection"
28
29 FEATURES=${FEATURES/multilib-strict/}
30 #----<< eclass stuff >>----
31
32
33 #---->> globals <<----
34 export CTARGET=${CTARGET:-${CHOST}}
35 if [[ ${CTARGET} = ${CHOST} ]] ; then
36 if [[ ${CATEGORY/cross-} != ${CATEGORY} ]] ; then
37 export CTARGET=${CATEGORY/cross-}
38 fi
39 fi
40 : ${TARGET_ABI:=${ABI}}
41 : ${TARGET_MULTILIB_ABIS:=${MULTILIB_ABIS}}
42 : ${TARGET_DEFAULT_ABI:=${DEFAULT_ABI}}
43
44 is_crosscompile() {
45 [[ ${CHOST} != ${CTARGET} ]]
46 }
47
48 tc_version_is_at_least() { version_is_at_least "$1" "${2:-${GCC_RELEASE_VER}}" ; }
49
50 GCC_PV=${TOOLCHAIN_GCC_PV:-${PV}}
51 GCC_PVR=${GCC_PV}
52 [[ ${PR} != "r0" ]] && GCC_PVR=${GCC_PVR}-${PR}
53 GCC_RELEASE_VER=$(get_version_component_range 1-3 ${GCC_PV})
54 GCC_BRANCH_VER=$(get_version_component_range 1-2 ${GCC_PV})
55 GCCMAJOR=$(get_version_component_range 1 ${GCC_PV})
56 GCCMINOR=$(get_version_component_range 2 ${GCC_PV})
57 GCCMICRO=$(get_version_component_range 3 ${GCC_PV})
58 [[ ${BRANCH_UPDATE-notset} == "notset" ]] && BRANCH_UPDATE=$(get_version_component_range 4 ${GCC_PV})
59
60 # According to gcc/c-cppbuiltin.c, GCC_CONFIG_VER MUST match this regex.
61 # ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)?
62 GCC_CONFIG_VER=${GCC_CONFIG_VER:-$(replace_version_separator 3 '-' ${GCC_PV})}
63
64 # Pre-release support
65 if [[ ${GCC_PV} != ${GCC_PV/_pre/-} ]] ; then
66 PRERELEASE=${GCC_PV/_pre/-}
67 fi
68 # make _alpha and _beta ebuilds automatically use a snapshot
69 if [[ ${GCC_PV} == *_alpha* ]] ; then
70 SNAPSHOT=${GCC_BRANCH_VER}-${GCC_PV##*_alpha}
71 elif [[ ${GCC_PV} == *_beta* ]] ; then
72 SNAPSHOT=${GCC_BRANCH_VER}-${GCC_PV##*_beta}
73 elif [[ ${GCC_PV} == *_rc* ]] ; then
74 SNAPSHOT=${GCC_PV%_rc*}-RC-${GCC_PV##*_rc}
75 fi
76 export GCC_FILESDIR=${GCC_FILESDIR:-${FILESDIR}}
77
78 PREFIX=${TOOLCHAIN_PREFIX:-/usr}
79
80 if tc_version_is_at_least 3.4.0 ; then
81 LIBPATH=${TOOLCHAIN_LIBPATH:-${PREFIX}/lib/gcc/${CTARGET}/${GCC_CONFIG_VER}}
82 else
83 LIBPATH=${TOOLCHAIN_LIBPATH:-${PREFIX}/lib/gcc-lib/${CTARGET}/${GCC_CONFIG_VER}}
84 fi
85 INCLUDEPATH=${TOOLCHAIN_INCLUDEPATH:-${LIBPATH}/include}
86 if is_crosscompile ; then
87 BINPATH=${TOOLCHAIN_BINPATH:-${PREFIX}/${CHOST}/${CTARGET}/gcc-bin/${GCC_CONFIG_VER}}
88 else
89 BINPATH=${TOOLCHAIN_BINPATH:-${PREFIX}/${CTARGET}/gcc-bin/${GCC_CONFIG_VER}}
90 fi
91 DATAPATH=${TOOLCHAIN_DATAPATH:-${PREFIX}/share/gcc-data/${CTARGET}/${GCC_CONFIG_VER}}
92 # Dont install in /usr/include/g++-v3/, but in gcc internal directory.
93 # We will handle /usr/include/g++-v3/ with gcc-config ...
94 STDCXX_INCDIR=${TOOLCHAIN_STDCXX_INCDIR:-${LIBPATH}/include/g++-v${GCC_BRANCH_VER/\.*/}}
95
96 #----<< globals >>----
97
98
99 #---->> SLOT+IUSE logic <<----
100 IUSE="build multislot nls nptl test vanilla"
101
102 if [[ ${PN} != "kgcc64" && ${PN} != gcc-* ]] ; then
103 IUSE+=" altivec cxx fortran nocxx"
104 [[ -n ${PIE_VER} ]] && IUSE+=" nopie"
105 [[ -n ${HTB_VER} ]] && IUSE+=" boundschecking"
106 [[ -n ${D_VER} ]] && IUSE+=" d"
107 [[ -n ${SPECS_VER} ]] && IUSE+=" nossp"
108
109 if tc_version_is_at_least 3 ; then
110 IUSE+=" bootstrap doc gcj gtk hardened multilib objc"
111
112 tc_version_is_at_least "4.0" && IUSE+=" objc-gc mudflap"
113 tc_version_is_at_least "4.1" && IUSE+=" libssp objc++"
114 tc_version_is_at_least "4.2" && IUSE+=" openmp"
115 tc_version_is_at_least "4.3" && IUSE+=" fixed-point"
116 tc_version_is_at_least "4.4" && IUSE+=" graphite"
117 [[ ${GCC_BRANCH_VER} == 4.5 ]] && IUSE+=" lto"
118 tc_version_is_at_least "4.6" && IUSE+=" go"
119 fi
120 fi
121
122 # Support upgrade paths here or people get pissed
123 if use multislot ; then
124 SLOT="${GCC_CONFIG_VER}"
125 else
126 SLOT="${GCC_BRANCH_VER}"
127 fi
128 #----<< SLOT+IUSE logic >>----
129
130 #---->> DEPEND <<----
131
132 RDEPEND="sys-libs/zlib
133 !build? (
134 nls? ( sys-devel/gettext )
135 )"
136 if tc_version_is_at_least 3 ; then
137 RDEPEND+=" virtual/libiconv"
138 fi
139 if tc_version_is_at_least 4 ; then
140 GMP_MPFR_DEPS=">=dev-libs/gmp-4.3.2 >=dev-libs/mpfr-2.4.2"
141 if tc_version_is_at_least 4.3 ; then
142 RDEPEND+=" ${GMP_MPFR_DEPS}"
143 elif in_iuse fortran ; then
144 RDEPEND+=" fortran? ( ${GMP_MPFR_DEPS} )"
145 fi
146 if tc_version_is_at_least 4.5 ; then
147 RDEPEND+=" >=dev-libs/mpc-0.8.1"
148 fi
149 in_iuse lto && RDEPEND+=" lto? ( || ( >=dev-libs/elfutils-0.143 dev-libs/libelf ) )"
150 fi
151 if in_iuse graphite ; then
152 RDEPEND+="
153 graphite? (
154 >=dev-libs/cloog-ppl-0.15.10
155 >=dev-libs/ppl-0.11
156 )"
157 fi
158
159 DEPEND="${RDEPEND}
160 >=sys-apps/texinfo-4.8
161 >=sys-devel/bison-1.875
162 >=sys-devel/flex-2.5.4
163 test? (
164 >=dev-util/dejagnu-1.4.4
165 >=sys-devel/autogen-5.5.4
166 )"
167 if in_iuse gcj ; then
168 GCJ_GTK_DEPS="
169 x11-libs/libXt
170 x11-libs/libX11
171 x11-libs/libXtst
172 x11-proto/xproto
173 x11-proto/xextproto
174 =x11-libs/gtk+-2*
175 virtual/pkgconfig
176 "
177 tc_version_is_at_least 3.4 && GCJ_GTK_DEPS+=" x11-libs/pango"
178 GCJ_DEPS=">=media-libs/libart_lgpl-2.1"
179 tc_version_is_at_least 4.2 && GCJ_DEPS+=" app-arch/zip app-arch/unzip"
180 DEPEND+=" gcj? ( gtk? ( ${GCJ_GTK_DEPS} ) ${GCJ_DEPS} )"
181 fi
182
183 PDEPEND=">=sys-devel/gcc-config-1.5"
184
185 #----<< DEPEND >>----
186
187 #---->> S + SRC_URI essentials <<----
188
189 # Set the source directory depending on whether we're using
190 # a prerelease, snapshot, or release tarball.
191 S=$(
192 if [[ -n ${PRERELEASE} ]] ; then
193 echo ${WORKDIR}/gcc-${PRERELEASE}
194 elif [[ -n ${SNAPSHOT} ]] ; then
195 echo ${WORKDIR}/gcc-${SNAPSHOT}
196 else
197 echo ${WORKDIR}/gcc-${GCC_RELEASE_VER}
198 fi
199 )
200
201 # This function handles the basics of setting the SRC_URI for a gcc ebuild.
202 # To use, set SRC_URI with:
203 #
204 # SRC_URI="$(get_gcc_src_uri)"
205 #
206 # Other than the variables normally set by portage, this function's behavior
207 # can be altered by setting the following:
208 #
209 # SNAPSHOT
210 # If set, this variable signals that we should be using a snapshot
211 # of gcc from ftp://sources.redhat.com/pub/gcc/snapshots/. It is
212 # expected to be in the format "YYYY-MM-DD". Note that if the ebuild
213 # has a _pre suffix, this variable is ignored and the prerelease
214 # tarball is used instead.
215 #
216 # BRANCH_UPDATE
217 # If set, this variable signals that we should be using the main
218 # release tarball (determined by ebuild version) and applying a
219 # CVS branch update patch against it. The location of this branch
220 # update patch is assumed to be in ${GENTOO_TOOLCHAIN_BASE_URI}.
221 # Just like with SNAPSHOT, this variable is ignored if the ebuild
222 # has a _pre suffix.
223 #
224 # PATCH_VER
225 # PATCH_GCC_VER
226 # This should be set to the version of the gentoo patch tarball.
227 # The resulting filename of this tarball will be:
228 # gcc-${PATCH_GCC_VER:-${GCC_RELEASE_VER}}-patches-${PATCH_VER}.tar.bz2
229 #
230 # PIE_VER
231 # PIE_GCC_VER
232 # These variables control patching in various updates for the logic
233 # controlling Position Independant Executables. PIE_VER is expected
234 # to be the version of this patch, and PIE_GCC_VER the gcc version of
235 # the patch:
236 # An example:
237 # PIE_VER="8.7.6.5"
238 # PIE_GCC_VER="3.4.0"
239 # The resulting filename of this tarball will be:
240 # gcc-${PIE_GCC_VER:-${GCC_RELEASE_VER}}-piepatches-v${PIE_VER}.tar.bz2
241 #
242 # SPECS_VER
243 # SPECS_GCC_VER
244 # This is for the minispecs files included in the hardened gcc-4.x
245 # The specs files for hardenedno*, vanilla and for building the "specs" file.
246 # SPECS_VER is expected to be the version of this patch, SPECS_GCC_VER
247 # the gcc version of the patch.
248 # An example:
249 # SPECS_VER="8.7.6.5"
250 # SPECS_GCC_VER="3.4.0"
251 # The resulting filename of this tarball will be:
252 # gcc-${SPECS_GCC_VER:-${GCC_RELEASE_VER}}-specs-${SPECS_VER}.tar.bz2
253 #
254 # HTB_VER
255 # HTB_GCC_VER
256 # These variables control whether or not an ebuild supports Herman
257 # ten Brugge's bounds-checking patches. If you want to use a patch
258 # for an older gcc version with a new gcc, make sure you set
259 # HTB_GCC_VER to that version of gcc.
260 #
261 gentoo_urls() {
262 local devspace="HTTP~vapier/dist/URI HTTP~dirtyepic/dist/URI
263 HTTP~halcy0n/patches/URI HTTP~zorry/patches/gcc/URI"
264 devspace=${devspace//HTTP/http:\/\/dev.gentoo.org\/}
265 echo mirror://gentoo/$1 ${devspace//URI/$1}
266 }
267
268 get_gcc_src_uri() {
269 export PATCH_GCC_VER=${PATCH_GCC_VER:-${GCC_RELEASE_VER}}
270 export UCLIBC_GCC_VER=${UCLIBC_GCC_VER:-${PATCH_GCC_VER}}
271 export PIE_GCC_VER=${PIE_GCC_VER:-${GCC_RELEASE_VER}}
272 export HTB_GCC_VER=${HTB_GCC_VER:-${GCC_RELEASE_VER}}
273 export SPECS_GCC_VER=${SPECS_GCC_VER:-${GCC_RELEASE_VER}}
274
275 # Set where to download gcc itself depending on whether we're using a
276 # prerelease, snapshot, or release tarball.
277 if [[ -n ${PRERELEASE} ]] ; then
278 GCC_SRC_URI="ftp://gcc.gnu.org/pub/gcc/prerelease-${PRERELEASE}/gcc-${PRERELEASE}.tar.bz2"
279 elif [[ -n ${SNAPSHOT} ]] ; then
280 GCC_SRC_URI="ftp://sources.redhat.com/pub/gcc/snapshots/${SNAPSHOT}/gcc-${SNAPSHOT}.tar.bz2"
281 elif [[ ${PV} != *9999* ]] ; then
282 GCC_SRC_URI="mirror://gnu/gcc/gcc-${GCC_PV}/gcc-${GCC_RELEASE_VER}.tar.bz2"
283 # we want all branch updates to be against the main release
284 [[ -n ${BRANCH_UPDATE} ]] && \
285 GCC_SRC_URI+=" $(gentoo_urls gcc-${GCC_RELEASE_VER}-branch-update-${BRANCH_UPDATE}.patch.bz2)"
286 fi
287
288 [[ -n ${UCLIBC_VER} ]] && GCC_SRC_URI+=" $(gentoo_urls gcc-${UCLIBC_GCC_VER}-uclibc-patches-${UCLIBC_VER}.tar.bz2)"
289 [[ -n ${PATCH_VER} ]] && GCC_SRC_URI+=" $(gentoo_urls gcc-${PATCH_GCC_VER}-patches-${PATCH_VER}.tar.bz2)"
290
291 # strawberry pie, Cappuccino and a Gauloises (it's a good thing)
292 [[ -n ${PIE_VER} ]] && \
293 PIE_CORE=${PIE_CORE:-gcc-${PIE_GCC_VER}-piepatches-v${PIE_VER}.tar.bz2} && \
294 GCC_SRC_URI+=" $(gentoo_urls ${PIE_CORE})"
295
296 # gcc minispec for the hardened gcc 4 compiler
297 [[ -n ${SPECS_VER} ]] && GCC_SRC_URI+=" $(gentoo_urls gcc-${SPECS_GCC_VER}-specs-${SPECS_VER}.tar.bz2)"
298
299 # gcc bounds checking patch
300 if [[ -n ${HTB_VER} ]] ; then
301 local HTBFILE="bounds-checking-gcc-${HTB_GCC_VER}-${HTB_VER}.patch.bz2"
302 GCC_SRC_URI+="
303 boundschecking? (
304 mirror://sourceforge/boundschecking/${HTBFILE}
305 $(gentoo_urls ${HTBFILE})
306 )"
307 fi
308
309 [[ -n ${D_VER} ]] && GCC_SRC_URI+=" d? ( mirror://sourceforge/dgcc/gdc-${D_VER}-src.tar.bz2 )"
310
311 # >= gcc-4.3 uses ecj.jar and we only add gcj as a use flag under certain
312 # conditions
313 if [[ ${PN} != "kgcc64" && ${PN} != gcc-* ]] ; then
314 if tc_version_is_at_least "4.5" ; then
315 GCC_SRC_URI+=" gcj? ( ftp://sourceware.org/pub/java/ecj-4.5.jar )"
316 elif tc_version_is_at_least "4.3" ; then
317 GCC_SRC_URI+=" gcj? ( ftp://sourceware.org/pub/java/ecj-4.3.jar )"
318 fi
319 fi
320
321 echo "${GCC_SRC_URI}"
322 }
323 SRC_URI=$(get_gcc_src_uri)
324 #---->> S + SRC_URI essentials >>----
325
326
327 #---->> support checks <<----
328
329 # Grab a variable from the build system (taken from linux-info.eclass)
330 get_make_var() {
331 local var=$1 makefile=${2:-${WORKDIR}/build/Makefile}
332 echo -e "e:\\n\\t@echo \$(${var})\\ninclude ${makefile}" | \
333 r=${makefile%/*} emake --no-print-directory -s -f - 2>/dev/null
334 }
335 XGCC() { get_make_var GCC_FOR_TARGET ; }
336
337 # The gentoo piessp patches allow for 3 configurations:
338 # 1) PIE+SSP by default
339 # 2) PIE by default
340 # 3) SSP by default
341 hardened_gcc_works() {
342 if [[ $1 == "pie" ]] ; then
343 # $gcc_cv_ld_pie is unreliable as it simply take the output of
344 # `ld --help | grep -- -pie`, that reports the option in all cases, also if
345 # the loader doesn't actually load the resulting executables.
346 # To avoid breakage, blacklist FreeBSD here at least
347 [[ ${CTARGET} == *-freebsd* ]] && return 1
348
349 want_pie || return 1
350 use_if_iuse nopie && return 1
351 hardened_gcc_is_stable pie
352 return $?
353 elif [[ $1 == "ssp" ]] ; then
354 [[ -n ${SPECS_VER} ]] || return 1
355 use_if_iuse nossp && return 1
356 hardened_gcc_is_stable ssp
357 return $?
358 else
359 # laziness ;)
360 hardened_gcc_works pie || return 1
361 hardened_gcc_works ssp || return 1
362 return 0
363 fi
364 }
365
366 hardened_gcc_is_stable() {
367 local tocheck
368 if [[ $1 == "pie" ]] ; then
369 if [[ ${CTARGET} == *-uclibc* ]] ; then
370 tocheck=${PIE_UCLIBC_STABLE}
371 else
372 tocheck=${PIE_GLIBC_STABLE}
373 fi
374 elif [[ $1 == "ssp" ]] ; then
375 if [[ ${CTARGET} == *-uclibc* ]] ; then
376 tocheck=${SSP_UCLIBC_STABLE}
377 else
378 tocheck=${SSP_STABLE}
379 fi
380 else
381 die "hardened_gcc_stable needs to be called with pie or ssp"
382 fi
383
384 has $(tc-arch) ${tocheck} && return 0
385 return 1
386 }
387
388 want_pie() {
389 ! use hardened && [[ -n ${PIE_VER} ]] && use nopie && return 1
390 [[ -n ${PIE_VER} ]] && [[ -n ${SPECS_VER} ]] && return 0
391 tc_version_is_at_least 4.3.2 && return 1
392 [[ -z ${PIE_VER} ]] && return 1
393 use !nopie && return 0
394 return 1
395 }
396
397 want_minispecs() {
398 if tc_version_is_at_least 4.3.2 && use hardened ; then
399 if ! want_pie ; then
400 ewarn "PIE_VER or SPECS_VER is not defiend in the GCC ebuild."
401 elif use vanilla ; then
402 ewarn "You will not get hardened features if you have the vanilla USE-flag."
403 elif use nopie && use nossp ; then
404 ewarn "You will not get hardened features if you have the nopie and nossp USE-flag."
405 elif ! hardened_gcc_works ; then
406 ewarn "Your $(tc-arch) arch is not supported."
407 else
408 return 0
409 fi
410 ewarn "Hope you know what you are doing. Hardened will not work."
411 return 0
412 fi
413 return 1
414 }
415
416 # This is to make sure we don't accidentally try to enable support for a
417 # language that doesnt exist. GCC 3.4 supports f77, while 4.0 supports f95, etc.
418 #
419 # Also add a hook so special ebuilds (kgcc64) can control which languages
420 # exactly get enabled
421 gcc-lang-supported() {
422 grep ^language=\"${1}\" "${S}"/gcc/*/config-lang.in > /dev/null || return 1
423 [[ -z ${TOOLCHAIN_ALLOWED_LANGS} ]] && return 0
424 has $1 ${TOOLCHAIN_ALLOWED_LANGS}
425 }
426
427 #----<< support checks >>----
428
429 #---->> specs + env.d logic <<----
430
431 # configure to build with the hardened GCC specs as the default
432 make_gcc_hard() {
433 # defaults to enable for all hardened toolchains
434 local gcc_hard_flags="-DEFAULT_RELRO -DEFAULT_BIND_NOW"
435
436 if hardened_gcc_works ; then
437 einfo "Updating gcc to use automatic PIE + SSP building ..."
438 gcc_hard_flags+=" -DEFAULT_PIE_SSP"
439 elif hardened_gcc_works pie ; then
440 einfo "Updating gcc to use automatic PIE building ..."
441 ewarn "SSP has not been enabled by default"
442 gcc_hard_flags+=" -DEFAULT_PIE"
443 elif hardened_gcc_works ssp ; then
444 einfo "Updating gcc to use automatic SSP building ..."
445 ewarn "PIE has not been enabled by default"
446 gcc_hard_flags+=" -DEFAULT_SSP"
447 else
448 # do nothing if hardened isnt supported, but dont die either
449 ewarn "hardened is not supported for this arch in this gcc version"
450 ebeep
451 return 0
452 fi
453
454 sed -i \
455 -e "/^HARD_CFLAGS = /s|=|= ${gcc_hard_flags} |" \
456 "${S}"/gcc/Makefile.in || die
457
458 # rebrand to make bug reports easier
459 BRANDING_GCC_PKGVERSION=${BRANDING_GCC_PKGVERSION/Gentoo/Gentoo Hardened}
460 }
461
462 create_gcc_env_entry() {
463 dodir /etc/env.d/gcc
464 local gcc_envd_base="/etc/env.d/gcc/${CTARGET}-${GCC_CONFIG_VER}"
465
466 if [[ -z $1 ]] ; then
467 gcc_envd_file="${D}${gcc_envd_base}"
468 # I'm leaving the following commented out to remind me that it
469 # was an insanely -bad- idea. Stuff broke. GCC_SPECS isnt unset
470 # on chroot or in non-toolchain.eclass gcc ebuilds!
471 #gcc_specs_file="${LIBPATH}/specs"
472 gcc_specs_file=""
473 else
474 gcc_envd_file="${D}${gcc_envd_base}-$1"
475 gcc_specs_file="${LIBPATH}/$1.specs"
476 fi
477
478 # phase PATH/ROOTPATH out ...
479 echo "PATH=\"${BINPATH}\"" > ${gcc_envd_file}
480 echo "ROOTPATH=\"${BINPATH}\"" >> ${gcc_envd_file}
481 echo "GCC_PATH=\"${BINPATH}\"" >> ${gcc_envd_file}
482
483 # We want to list the default ABI's LIBPATH first so libtool
484 # searches that directory first. This is a temporary
485 # workaround for libtool being stupid and using .la's from
486 # conflicting ABIs by using the first one in the search path
487 local abi=${TARGET_DEFAULT_ABI}
488 local MULTIDIR=$($(XGCC) $(get_abi_CFLAGS ${abi}) --print-multi-directory)
489 local LDPATH=${LIBPATH}
490 [[ ${MULTIDIR} != "." ]] && LDPATH+=/${MULTIDIR}
491 for abi in $(get_all_abis TARGET) ; do
492 [[ ${abi} == ${TARGET_DEFAULT_ABI} ]] && continue
493
494 MULTIDIR=$($(XGCC) $(get_abi_CFLAGS ${abi}) --print-multi-directory)
495 LDPATH+=:${LIBPATH}
496 [[ ${MULTIDIR} != "." ]] && LDPATH+=/${MULTIDIR}
497 done
498
499 echo "LDPATH=\"${LDPATH}\"" >> ${gcc_envd_file}
500 echo "MANPATH=\"${DATAPATH}/man\"" >> ${gcc_envd_file}
501 echo "INFOPATH=\"${DATAPATH}/info\"" >> ${gcc_envd_file}
502 echo "STDCXX_INCDIR=\"${STDCXX_INCDIR##*/}\"" >> ${gcc_envd_file}
503
504 is_crosscompile && echo "CTARGET=${CTARGET}" >> ${gcc_envd_file}
505
506 # Set which specs file to use
507 [[ -n ${gcc_specs_file} ]] && echo "GCC_SPECS=\"${gcc_specs_file}\"" >> ${gcc_envd_file}
508 }
509 setup_minispecs_gcc_build_specs() {
510 # Setup the "build.specs" file for gcc 4.3 to use when building.
511 if hardened_gcc_works pie ; then
512 cat "${WORKDIR}"/specs/pie.specs >> "${WORKDIR}"/build.specs
513 fi
514 if hardened_gcc_works ssp ; then
515 for s in ssp sspall ; do
516 cat "${WORKDIR}"/specs/${s}.specs >> "${WORKDIR}"/build.specs
517 done
518 fi
519 for s in nostrict znow ; do
520 cat "${WORKDIR}"/specs/${s}.specs >> "${WORKDIR}"/build.specs
521 done
522 export GCC_SPECS="${WORKDIR}"/build.specs
523 }
524 copy_minispecs_gcc_specs() {
525 # setup the hardenedno* specs files and the vanilla specs file.
526 if hardened_gcc_works ; then
527 create_gcc_env_entry hardenednopiessp
528 fi
529 if hardened_gcc_works pie ; then
530 create_gcc_env_entry hardenednopie
531 fi
532 if hardened_gcc_works ssp ; then
533 create_gcc_env_entry hardenednossp
534 fi
535 create_gcc_env_entry vanilla
536 insinto ${LIBPATH}
537 doins "${WORKDIR}"/specs/*.specs || die "failed to install specs"
538 # Build system specs file which, if it exists, must be a complete set of
539 # specs as it completely and unconditionally overrides the builtin specs.
540 # For gcc 4.3
541 if ! tc_version_is_at_least 4.4 ; then
542 $(XGCC) -dumpspecs > "${WORKDIR}"/specs/specs
543 cat "${WORKDIR}"/build.specs >> "${WORKDIR}"/specs/specs
544 doins "${WORKDIR}"/specs/specs || die "failed to install the specs file"
545 fi
546 }
547
548 #----<< specs + env.d logic >>----
549
550 #---->> pkg_* <<----
551 toolchain_pkg_setup() {
552 if [[ -n ${PRERELEASE}${SNAPSHOT} || ${PV} == *9999* ]] &&
553 [[ -z ${I_PROMISE_TO_SUPPLY_PATCHES_WITH_BUGS} ]]
554 then
555 die "Please \`export I_PROMISE_TO_SUPPLY_PATCHES_WITH_BUGS=1\` or define it in your make.conf if you want to use this version." \
556 "This is to try and cut down on people filing bugs for a compiler we do not currently support."
557 fi
558
559 # we dont want to use the installed compiler's specs to build gcc!
560 unset GCC_SPECS
561
562 if ! use_if_iuse cxx ; then
563 use_if_iuse go && ewarn 'Go requires a C++ compiler, disabled due to USE="-cxx"'
564 use_if_iuse objc++ && ewarn 'Obj-C++ requires a C++ compiler, disabled due to USE="-cxx"'
565 use_if_iuse gcj && ewarn 'GCJ requires a C++ compiler, disabled due to USE="-cxx"'
566 fi
567
568 want_minispecs
569
570 unset LANGUAGES #265283
571 }
572
573 toolchain_pkg_postinst() {
574 do_gcc_config
575
576 if ! is_crosscompile ; then
577 echo
578 ewarn "If you have issues with packages unable to locate libstdc++.la,"
579 ewarn "then try running 'fix_libtool_files.sh' on the old gcc versions."
580 echo
581 ewarn "You might want to review the GCC upgrade guide when moving between"
582 ewarn "major versions (like 4.2 to 4.3):"
583 ewarn "http://www.gentoo.org/doc/en/gcc-upgrading.xml"
584 echo
585 fi
586
587 if ! is_crosscompile ; then
588 # hack to prevent collisions between SLOTs
589
590 # Clean up old paths
591 rm -f "${ROOT}"/*/rcscripts/awk/fixlafiles.awk "${ROOT}"/sbin/fix_libtool_files.sh
592 rmdir "${ROOT}"/*/rcscripts{/awk,} 2>/dev/null
593
594 mkdir -p "${ROOT}"/usr/{share/gcc-data,sbin,bin}
595 cp "${ROOT}/${DATAPATH}"/fixlafiles.awk "${ROOT}"/usr/share/gcc-data/ || die
596 cp "${ROOT}/${DATAPATH}"/fix_libtool_files.sh "${ROOT}"/usr/sbin/ || die
597
598 # Since these aren't critical files and portage sucks with
599 # handling of binpkgs, don't require these to be found
600 cp "${ROOT}/${DATAPATH}"/c{89,99} "${ROOT}"/usr/bin/ 2>/dev/null
601 fi
602 }
603
604 toolchain_pkg_postrm() {
605 # to make our lives easier (and saner), we do the fix_libtool stuff here.
606 # rather than checking SLOT's and trying in upgrade paths, we just see if
607 # the common libstdc++.la exists in the ${LIBPATH} of the gcc that we are
608 # unmerging. if it does, that means this was a simple re-emerge.
609
610 # clean up the cruft left behind by cross-compilers
611 if is_crosscompile ; then
612 if [[ -z $(ls "${ROOT}"/etc/env.d/gcc/${CTARGET}* 2>/dev/null) ]] ; then
613 rm -f "${ROOT}"/etc/env.d/gcc/config-${CTARGET}
614 rm -f "${ROOT}"/etc/env.d/??gcc-${CTARGET}
615 rm -f "${ROOT}"/usr/bin/${CTARGET}-{gcc,{g,c}++}{,32,64}
616 fi
617 return 0
618 fi
619
620 # ROOT isnt handled by the script
621 [[ ${ROOT} != "/" ]] && return 0
622
623 if [[ ! -e ${LIBPATH}/libstdc++.so ]] ; then
624 # make sure the profile is sane during same-slot upgrade #289403
625 do_gcc_config
626
627 einfo "Running 'fix_libtool_files.sh ${GCC_RELEASE_VER}'"
628 /usr/sbin/fix_libtool_files.sh ${GCC_RELEASE_VER}
629 if [[ -n ${BRANCH_UPDATE} ]] ; then
630 einfo "Running 'fix_libtool_files.sh ${GCC_RELEASE_VER}-${BRANCH_UPDATE}'"
631 /usr/sbin/fix_libtool_files.sh ${GCC_RELEASE_VER}-${BRANCH_UPDATE}
632 fi
633 fi
634
635 return 0
636 }
637
638 #---->> pkg_* <<----
639
640 #---->> src_* <<----
641
642 guess_patch_type_in_dir() {
643 [[ -n $(ls "$1"/*.bz2 2>/dev/null) ]] \
644 && EPATCH_SUFFIX="patch.bz2" \
645 || EPATCH_SUFFIX="patch"
646 }
647 do_gcc_rename_java_bins() {
648 # bug #139918 - conflict between gcc and java-config-2 for ownership of
649 # /usr/bin/rmi{c,registry}. Done with mv & sed rather than a patch
650 # because patches would be large (thanks to the rename of man files),
651 # and it's clear from the sed invocations that all that changes is the
652 # rmi{c,registry} names to grmi{c,registry} names.
653 # Kevin F. Quinn 2006-07-12
654 einfo "Renaming jdk executables rmic and rmiregistry to grmic and grmiregistry."
655 # 1) Move the man files if present (missing prior to gcc-3.4)
656 for manfile in rmic rmiregistry; do
657 [[ -f ${S}/gcc/doc/${manfile}.1 ]] || continue
658 mv "${S}"/gcc/doc/${manfile}.1 "${S}"/gcc/doc/g${manfile}.1
659 done
660 # 2) Fixup references in the docs if present (mission prior to gcc-3.4)
661 for jfile in gcc/doc/gcj.info gcc/doc/grmic.1 gcc/doc/grmiregistry.1 gcc/java/gcj.texi; do
662 [[ -f ${S}/${jfile} ]] || continue
663 sed -i -e 's:rmiregistry:grmiregistry:g' "${S}"/${jfile} ||
664 die "Failed to fixup file ${jfile} for rename to grmiregistry"
665 sed -i -e 's:rmic:grmic:g' "${S}"/${jfile} ||
666 die "Failed to fixup file ${jfile} for rename to grmic"
667 done
668 # 3) Fixup Makefiles to build the changed executable names
669 # These are present in all 3.x versions, and are the important bit
670 # to get gcc to build with the new names.
671 for jfile in libjava/Makefile.am libjava/Makefile.in gcc/java/Make-lang.in; do
672 sed -i -e 's:rmiregistry:grmiregistry:g' "${S}"/${jfile} ||
673 die "Failed to fixup file ${jfile} for rename to grmiregistry"
674 # Careful with rmic on these files; it's also the name of a directory
675 # which should be left unchanged. Replace occurrences of 'rmic$',
676 # 'rmic_' and 'rmic '.
677 sed -i -e 's:rmic\([$_ ]\):grmic\1:g' "${S}"/${jfile} ||
678 die "Failed to fixup file ${jfile} for rename to grmic"
679 done
680 }
681 toolchain_src_unpack() {
682 [[ -z ${UCLIBC_VER} ]] && [[ ${CTARGET} == *-uclibc* ]] && die "Sorry, this version does not support uClibc"
683
684 if [[ ${PV} == *9999* ]]; then
685 git-2_src_unpack
686 else
687 gcc_quick_unpack
688 fi
689
690 export BRANDING_GCC_PKGVERSION="Gentoo ${GCC_PVR}"
691 cd "${S}"
692
693 if ! use vanilla ; then
694 if [[ -n ${PATCH_VER} ]] ; then
695 guess_patch_type_in_dir "${WORKDIR}"/patch
696 EPATCH_MULTI_MSG="Applying Gentoo patches ..." \
697 epatch "${WORKDIR}"/patch
698 BRANDING_GCC_PKGVERSION="${BRANDING_GCC_PKGVERSION} p${PATCH_VER}"
699 fi
700 if [[ -n ${UCLIBC_VER} ]] ; then
701 guess_patch_type_in_dir "${WORKDIR}"/uclibc
702 EPATCH_MULTI_MSG="Applying uClibc patches ..." \
703 epatch "${WORKDIR}"/uclibc
704 fi
705 fi
706 do_gcc_HTB_patches
707 do_gcc_PIE_patches
708 epatch_user
709
710 use hardened && make_gcc_hard
711
712 # install the libstdc++ python into the right location
713 # http://gcc.gnu.org/PR51368
714 if tc_version_is_at_least 4.5 ; then
715 sed -i \
716 '/^pythondir =/s:=.*:= $(datadir)/python:' \
717 "${S}"/libstdc++-v3/python/Makefile.in || die
718 fi
719
720 # No idea when this first started being fixed, but let's go with 4.3.x for now
721 if ! tc_version_is_at_least 4.3 ; then
722 fix_files=""
723 for x in contrib/test_summary libstdc++-v3/scripts/check_survey.in ; do
724 [[ -e ${x} ]] && fix_files="${fix_files} ${x}"
725 done
726 ht_fix_file ${fix_files} */configure *.sh */Makefile.in
727 fi
728
729 setup_multilib_osdirnames
730
731 gcc_version_patch
732 if tc_version_is_at_least 4.1 ; then
733 if [[ -n ${SNAPSHOT} || -n ${PRERELEASE} ]] ; then
734 # BASE-VER must be a three-digit version number
735 # followed by an optional -pre string
736 # eg. 4.5.1, 4.6.2-pre20120213, 4.7.0-pre9999
737 # If BASE-VER differs from ${PV/_/-} then libraries get installed in
738 # the wrong directory.
739 echo ${PV/_/-} > "${S}"/gcc/BASE-VER
740 fi
741 fi
742
743 # >= gcc-4.3 doesn't bundle ecj.jar, so copy it
744 if tc_version_is_at_least 4.3 && use gcj ; then
745 if tc_version_is_at_least "4.5" ; then
746 einfo "Copying ecj-4.5.jar"
747 cp -pPR "${DISTDIR}/ecj-4.5.jar" "${S}/ecj.jar" || die
748 elif tc_version_is_at_least "4.3" ; then
749 einfo "Copying ecj-4.3.jar"
750 cp -pPR "${DISTDIR}/ecj-4.3.jar" "${S}/ecj.jar" || die
751 fi
752 fi
753
754 # disable --as-needed from being compiled into gcc specs
755 # natively when using a gcc version < 3.4.4
756 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14992
757 if ! tc_version_is_at_least 3.4.4 ; then
758 sed -i -e s/HAVE_LD_AS_NEEDED/USE_LD_AS_NEEDED/g "${S}"/gcc/config.in
759 fi
760
761 # In gcc 3.3.x and 3.4.x, rename the java bins to gcc-specific names
762 # in line with gcc-4.
763 if tc_version_is_at_least 3.3 && ! tc_version_is_at_least 4.0 ; then
764 do_gcc_rename_java_bins
765 fi
766
767 # Prevent libffi from being installed
768 sed -i -e 's/\(install.*:\) install-.*recursive/\1/' "${S}"/libffi/Makefile.in
769 sed -i -e 's/\(install-data-am:\).*/\1/' "${S}"/libffi/include/Makefile.in
770
771 # Fixup libtool to correctly generate .la files with portage
772 cd "${S}"
773 elibtoolize --portage --shallow --no-uclibc
774
775 gnuconfig_update
776
777 # update configure files
778 local f
779 einfo "Fixing misc issues in configure files"
780 tc_version_is_at_least 4.1 && epatch "${GCC_FILESDIR}"/gcc-configure-texinfo.patch
781 for f in $(grep -l 'autoconf version 2.13' $(find "${S}" -name configure)) ; do
782 ebegin " Updating ${f/${S}\/} [LANG]"
783 patch "${f}" "${GCC_FILESDIR}"/gcc-configure-LANG.patch >& "${T}"/configure-patch.log \
784 || eerror "Please file a bug about this"
785 eend $?
786 done
787 sed -i 's|A-Za-z0-9|[:alnum:]|g' "${S}"/gcc/*.awk #215828
788
789 if [[ -x contrib/gcc_update ]] ; then
790 einfo "Touching generated files"
791 ./contrib/gcc_update --touch | \
792 while read f ; do
793 einfo " ${f%%...}"
794 done
795 fi
796
797 disable_multilib_libjava || die "failed to disable multilib java"
798 }
799
800 gcc-abi-map() {
801 # Convert the ABI name we use in Gentoo to what gcc uses
802 local map=()
803 case ${CTARGET} in
804 mips*) map=("o32 32" "n32 n32" "n64 64") ;;
805 x86_64*) map=("amd64 m64" "x86 m32" "x32 mx32") ;;
806 esac
807
808 local m
809 for m in "${map[@]}" ; do
810 l=( ${m} )
811 [[ $1 == ${l[0]} ]] && echo ${l[1]} && break
812 done
813 }
814
815 gcc-multilib-configure() {
816 if ! is_multilib ; then
817 confgcc+=" --disable-multilib"
818 # Fun times: if we are building for a target that has multiple
819 # possible ABI formats, and the user has told us to pick one
820 # that isn't the default, then not specifying it via the list
821 # below will break that on us.
822 else
823 confgcc+=" --enable-multilib"
824 fi
825
826 # translate our notion of multilibs into gcc's
827 local abi list
828 for abi in $(get_all_abis TARGET) ; do
829 local l=$(gcc-abi-map ${abi})
830 [[ -n ${l} ]] && list+=",${l}"
831 done
832 if [[ -n ${list} ]] ; then
833 case ${CTARGET} in
834 x86_64*)
835 tc_version_is_at_least 4.7 && confgcc+=" --with-multilib-list=${list:1}"
836 ;;
837 esac
838 fi
839 }
840
841 gcc-compiler-configure() {
842 gcc-multilib-configure
843
844 if tc_version_is_at_least "4.0" ; then
845 if in_iuse mudflap ; then
846 confgcc+=" $(use_enable mudflap libmudflap)"
847 else
848 confgcc+=" --disable-libmudflap"
849 fi
850
851 if use_if_iuse libssp ; then
852 confgcc+=" --enable-libssp"
853 else
854 export gcc_cv_libc_provides_ssp=yes
855 confgcc+=" --disable-libssp"
856 fi
857
858 # If we want hardened support with the newer piepatchset for >=gcc 4.4
859 if tc_version_is_at_least 4.4 && want_minispecs ; then
860 confgcc+=" $(use_enable hardened esp)"
861 fi
862
863 if tc_version_is_at_least "4.2" ; then
864 if in_iuse openmp ; then
865 # Make sure target has pthreads support. #326757 #335883
866 # There shouldn't be a chicken&egg problem here as openmp won't
867 # build without a C library, and you can't build that w/out
868 # already having a compiler ...
869 if ! is_crosscompile || \
870 $(tc-getCPP ${CTARGET}) -E - <<<"#include <pthread.h>" >& /dev/null
871 then
872 confgcc+=" $(use_enable openmp libgomp)"
873 else
874 # Force disable as the configure script can be dumb #359855
875 confgcc+=" --disable-libgomp"
876 fi
877 else
878 # For gcc variants where we don't want openmp (e.g. kgcc)
879 confgcc+=" --disable-libgomp"
880 fi
881 fi
882
883 # Stick the python scripts in their own slotted directory
884 # bug #279252
885 #
886 # --with-python-dir=DIR
887 # Specifies where to install the Python modules used for aot-compile. DIR
888 # should not include the prefix used in installation. For example, if the
889 # Python modules are to be installed in /usr/lib/python2.5/site-packages,
890 # then --with-python-dir=/lib/python2.5/site-packages should be passed.
891 #
892 # This should translate into "/share/gcc-data/${CTARGET}/${GCC_CONFIG_VER}/python"
893 if tc_version_is_at_least "4.4" ; then
894 confgcc+=" --with-python-dir=${DATAPATH/$PREFIX/}/python"
895 fi
896 fi
897
898 # Enable build warnings by default with cross-compilers when system
899 # paths are included (e.g. via -I flags).
900 is_crosscompile && confgcc+=" --enable-poison-system-directories"
901
902 # For newer versions of gcc, use the default ("release"), because no
903 # one (even upstream apparently) tests with it disabled. #317217
904 if tc_version_is_at_least 4 || [[ -n ${GCC_CHECKS_LIST} ]] ; then
905 confgcc+=" --enable-checking=${GCC_CHECKS_LIST:-release}"
906 else
907 confgcc+=" --disable-checking"
908 fi
909
910 # GTK+ is preferred over xlib in 3.4.x (xlib is unmaintained
911 # right now). Much thanks to <csm@gnu.org> for the heads up.
912 # Travis Tilley <lv@gentoo.org> (11 Jul 2004)
913 if ! is_gcj ; then
914 confgcc+=" --disable-libgcj"
915 elif use gtk ; then
916 confgcc+=" --enable-java-awt=gtk"
917 fi
918
919 # newer gcc versions like to bootstrap themselves with C++,
920 # so we need to manually disable it ourselves
921 if tc_version_is_at_least 4.7 && ! is_cxx ; then
922 confgcc+=" --disable-build-with-cxx --disable-build-poststage1-with-cxx"
923 fi
924
925 # newer gcc's come with libquadmath, but only fortran uses
926 # it, so auto punt it when we don't care
927 if tc_version_is_at_least 4.6 && ! is_fortran ; then
928 confgcc+=" --disable-libquadmath"
929 fi
930
931 local with_abi_map=()
932 case $(tc-arch) in
933 arm) #264534 #414395
934 local a arm_arch=${CTARGET%%-*}
935 # Remove trailing endian variations first: eb el be bl b l
936 for a in e{b,l} {b,l}e b l ; do
937 if [[ ${arm_arch} == *${a} ]] ; then
938 arm_arch=${arm_arch%${a}}
939 break
940 fi
941 done
942 # Convert armv7{a,r,m} to armv7-{a,r,m}
943 [[ ${arm_arch} == armv7? ]] && arm_arch=${arm_arch/7/7-}
944 # See if this is a valid --with-arch flag
945 if (srcdir=${S}/gcc target=${CTARGET} with_arch=${arm_arch};
946 . "${srcdir}"/config.gcc) &>/dev/null
947 then
948 confgcc+=" --with-arch=${arm_arch}"
949 fi
950
951 # Enable hardvfp
952 if [[ $(tc-is-softfloat) == "no" ]] && \
953 [[ ${CTARGET} == armv[67]* ]] && \
954 tc_version_is_at_least "4.5"
955 then
956 # Follow the new arm hardfp distro standard by default
957 confgcc+=" --with-float=hard"
958 case ${CTARGET} in
959 armv6*) confgcc+=" --with-fpu=vfp" ;;
960 armv7*) confgcc+=" --with-fpu=vfpv3-d16" ;;
961 esac
962 fi
963 ;;
964 # Add --with-abi flags to set default ABI
965 mips)
966 confgcc+=" --with-abi=$(gcc-abi-map ${TARGET_DEFAULT_ABI})"
967 ;;
968 amd64)
969 # drop the older/ABI checks once this get's merged into some
970 # version of gcc upstream
971 if tc_version_is_at_least 4.7 && has x32 $(get_all_abis TARGET) ; then
972 confgcc+=" --with-abi=$(gcc-abi-map ${TARGET_DEFAULT_ABI})"
973 fi
974 ;;
975 # Default arch for x86 is normally i386, lets give it a bump
976 # since glibc will do so based on CTARGET anyways
977 x86)
978 confgcc+=" --with-arch=${CTARGET%%-*}"
979 ;;
980 # Enable sjlj exceptions for backward compatibility on hppa
981 hppa)
982 [[ ${GCCMAJOR} == "3" ]] && confgcc+=" --enable-sjlj-exceptions"
983 ;;
984 # Set up defaults based on current CFLAGS
985 ppc)
986 is-flagq -mfloat-gprs=double && confgcc+=" --enable-e500-double"
987 [[ ${CTARGET//_/-} == *-e500v2-* ]] && confgcc+=" --enable-e500-double"
988 ;;
989 esac
990
991 local GCC_LANG="c"
992 is_cxx && GCC_LANG+=",c++"
993 is_d && GCC_LANG+=",d"
994 is_gcj && GCC_LANG+=",java"
995 is_go && GCC_LANG+=",go"
996 if is_objc || is_objcxx ; then
997 GCC_LANG+=",objc"
998 if tc_version_is_at_least "4.0" ; then
999 use objc-gc && confgcc+=" --enable-objc-gc"
1000 fi
1001 is_objcxx && GCC_LANG+=",obj-c++"
1002 fi
1003 is_treelang && GCC_LANG+=",treelang"
1004
1005 # fortran support just got sillier! the lang value can be f77 for
1006 # fortran77, f95 for fortran95, or just plain old fortran for the
1007 # currently supported standard depending on gcc version.
1008 is_fortran && GCC_LANG+=",fortran"
1009 is_f77 && GCC_LANG+=",f77"
1010 is_f95 && GCC_LANG+=",f95"
1011
1012 # We do NOT want 'ADA support' in here!
1013 # is_ada && GCC_LANG+=",ada"
1014
1015 einfo "configuring for GCC_LANG: ${GCC_LANG}"
1016 confgcc+=" --enable-languages=${GCC_LANG}"
1017 }
1018
1019 gcc_do_configure() {
1020 local confgcc
1021
1022 # Sanity check for USE=nocxx -> USE=cxx migration
1023 if in_iuse cxx && in_iuse nocxx ; then
1024 if (use cxx && use nocxx) || (use !cxx && use !nocxx) ; then
1025 eerror "We are migrating USE=nocxx to USE=cxx, but your USE settings do not make"
1026 eerror "sense. Please make sure these two flags line up logically in your setup."
1027 die "USE='cxx nocxx' and USE='-cxx -nocxx' make no sense"
1028 fi
1029 fi
1030
1031 # Set configuration based on path variables
1032 confgcc+=" \
1033 --prefix=${PREFIX} \
1034 --bindir=${BINPATH} \
1035 --includedir=${INCLUDEPATH} \
1036 --datadir=${DATAPATH} \
1037 --mandir=${DATAPATH}/man \
1038 --infodir=${DATAPATH}/info \
1039 --with-gxx-include-dir=${STDCXX_INCDIR}"
1040 # On Darwin we need libdir to be set in order to get correct install names
1041 # for things like libobjc-gnu, libgcj and libfortran. If we enable it on
1042 # non-Darwin we screw up the behaviour this eclass relies on. We in
1043 # particular need this over --libdir for bug #255315.
1044 [[ ${CTARGET} == *-darwin* ]] && \
1045 confgcc+=" --enable-version-specific-runtime-libs"
1046
1047 # All our cross-compile logic goes here ! woo !
1048 confgcc+=" --host=${CHOST}"
1049 if is_crosscompile || tc-is-cross-compiler ; then
1050 # Straight from the GCC install doc:
1051 # "GCC has code to correctly determine the correct value for target
1052 # for nearly all native systems. Therefore, we highly recommend you
1053 # not provide a configure target when configuring a native compiler."
1054 confgcc+=" --target=${CTARGET}"
1055 fi
1056 [[ -n ${CBUILD} ]] && confgcc+=" --build=${CBUILD}"
1057
1058 # ppc altivec support
1059 confgcc+=" $(use_enable altivec)"
1060
1061 # gcc has fixed-point arithmetic support in 4.3 for mips targets that can
1062 # significantly increase compile time by several hours. This will allow
1063 # users to control this feature in the event they need the support.
1064 tc_version_is_at_least "4.3" && confgcc+=" $(use_enable fixed-point)"
1065
1066 # Graphite support was added in 4.4, which depends on external libraries
1067 # for optimizations. Current versions use cloog-ppl (cloog fork with Parma
1068 # PPL backend). Sometime in the future we will use upstream cloog with the
1069 # ISL backend (note: PPL will still be a requirement). cloog-ppl's include
1070 # path was modified to prevent collisions between the two packages (library
1071 # names are different).
1072 #
1073 # We disable the PPL version check so we can use >=ppl-0.11.
1074 if tc_version_is_at_least "4.4"; then
1075 confgcc+=" $(use_with graphite ppl)"
1076 confgcc+=" $(use_with graphite cloog)"
1077 if use graphite; then
1078 confgcc+=" --disable-ppl-version-check"
1079 confgcc+=" --with-cloog-include=/usr/include/cloog-ppl"
1080 fi
1081 fi
1082
1083 # LTO support was added in 4.5, which depends upon elfutils. This allows
1084 # users to enable that option, and pull in the additional library. In 4.6,
1085 # the dependency is no longer required.
1086 if tc_version_is_at_least "4.6" ; then
1087 confgcc+=" --enable-lto"
1088 elif tc_version_is_at_least "4.5" ; then
1089 confgcc+=" $(use_enable lto)"
1090 fi
1091
1092 case $(tc-is-softfloat) in
1093 yes) confgcc+=" --with-float=soft" ;;
1094 softfp) confgcc+=" --with-float=softfp" ;;
1095 *)
1096 # If they've explicitly opt-ed in, do hardfloat,
1097 # otherwise let the gcc default kick in.
1098 [[ ${CTARGET//_/-} == *-hardfloat-* ]] \
1099 && confgcc+=" --with-float=hard"
1100 ;;
1101 esac
1102
1103 # Native Language Support
1104 if use nls ; then
1105 confgcc+=" --enable-nls --without-included-gettext"
1106 else
1107 confgcc+=" --disable-nls"
1108 fi
1109
1110 # reasonably sane globals (hopefully)
1111 confgcc+=" \
1112 --with-system-zlib \
1113 --enable-obsolete \
1114 --disable-werror \
1115 --enable-secureplt"
1116
1117 gcc-compiler-configure || die
1118
1119 if is_crosscompile ; then
1120 # When building a stage1 cross-compiler (just C compiler), we have to
1121 # disable a bunch of features or gcc goes boom
1122 local needed_libc=""
1123 case ${CTARGET} in
1124 *-linux) needed_libc=no-fucking-clue;;
1125 *-dietlibc) needed_libc=dietlibc;;
1126 *-elf|*-eabi) needed_libc=newlib;;
1127 *-freebsd*) needed_libc=freebsd-lib;;
1128 *-gnu*) needed_libc=glibc;;
1129 *-klibc) needed_libc=klibc;;
1130 *-uclibc*) needed_libc=uclibc;;
1131 *-cygwin) needed_libc=cygwin;;
1132 x86_64-*-mingw*|\
1133 *-w64-mingw*) needed_libc=mingw64-runtime;;
1134 mingw*|*-mingw*) needed_libc=mingw-runtime;;
1135 avr) confgcc+=" --enable-shared --disable-threads";;
1136 esac
1137 if [[ -n ${needed_libc} ]] ; then
1138 if ! has_version ${CATEGORY}/${needed_libc} ; then
1139 confgcc+=" --disable-shared --disable-threads --without-headers"
1140 elif built_with_use --hidden --missing false ${CATEGORY}/${needed_libc} crosscompile_opts_headers-only ; then
1141 confgcc+=" --disable-shared --with-sysroot=${PREFIX}/${CTARGET}"
1142 else
1143 confgcc+=" --with-sysroot=${PREFIX}/${CTARGET}"
1144 fi
1145 fi
1146
1147 tc_version_is_at_least 4.2 && confgcc+=" --disable-bootstrap"
1148 else
1149 if tc-is-static-only ; then
1150 confgcc+=" --disable-shared"
1151 else
1152 confgcc+=" --enable-shared"
1153 fi
1154 case ${CHOST} in
1155 mingw*|*-mingw*|*-cygwin)
1156 confgcc+=" --enable-threads=win32" ;;
1157 *)
1158 confgcc+=" --enable-threads=posix" ;;
1159 esac
1160 fi
1161 # __cxa_atexit is "essential for fully standards-compliant handling of
1162 # destructors", but apparently requires glibc.
1163 case ${CTARGET} in
1164 *-uclibc*)
1165 confgcc+=" --disable-__cxa_atexit --enable-target-optspace $(use_enable nptl tls)"
1166 [[ ${GCCMAJOR}.${GCCMINOR} == 3.3 ]] && confgcc+=" --enable-sjlj-exceptions"
1167 if tc_version_is_at_least 3.4 && ! tc_version_is_at_least 4.3 ; then
1168 confgcc+=" --enable-clocale=uclibc"
1169 fi
1170 ;;
1171 *-elf|*-eabi)
1172 confgcc+=" --with-newlib"
1173 ;;
1174 *-gnu*)
1175 confgcc+=" --enable-__cxa_atexit"
1176 confgcc+=" --enable-clocale=gnu"
1177 ;;
1178 *-freebsd*)
1179 confgcc+=" --enable-__cxa_atexit"
1180 ;;
1181 *-solaris*)
1182 confgcc+=" --enable-__cxa_atexit"
1183 ;;
1184 esac
1185 tc_version_is_at_least 3.4 || confgcc+=" --disable-libunwind-exceptions"
1186
1187 # if the target can do biarch (-m32/-m64), enable it. overhead should
1188 # be small, and should simplify building of 64bit kernels in a 32bit
1189 # userland by not needing sys-devel/kgcc64. #349405
1190 case $(tc-arch) in
1191 ppc|ppc64) tc_version_is_at_least 3.4 && confgcc+=" --enable-targets=all" ;;
1192 sparc) tc_version_is_at_least 4.4 && confgcc+=" --enable-targets=all" ;;
1193 amd64|x86) tc_version_is_at_least 4.3 && confgcc+=" --enable-targets=all" ;;
1194 esac
1195
1196 tc_version_is_at_least 4.3 && set -- "$@" \
1197 --with-bugurl=http://bugs.gentoo.org/ \
1198 --with-pkgversion="${BRANDING_GCC_PKGVERSION}"
1199 set -- ${confgcc} "$@" ${EXTRA_ECONF}
1200
1201 # Nothing wrong with a good dose of verbosity
1202 echo
1203 einfo "PREFIX: ${PREFIX}"
1204 einfo "BINPATH: ${BINPATH}"
1205 einfo "LIBPATH: ${LIBPATH}"
1206 einfo "DATAPATH: ${DATAPATH}"
1207 einfo "STDCXX_INCDIR: ${STDCXX_INCDIR}"
1208 echo
1209 einfo "Configuring GCC with: ${@//--/\n\t--}"
1210 echo
1211
1212 # Build in a separate build tree
1213 mkdir -p "${WORKDIR}"/build
1214 pushd "${WORKDIR}"/build > /dev/null
1215
1216 # and now to do the actual configuration
1217 addwrite /dev/zero
1218 echo "${S}"/configure "$@"
1219 "${S}"/configure "$@" || die "failed to run configure"
1220
1221 # return to whatever directory we were in before
1222 popd > /dev/null
1223 }
1224
1225 has toolchain_death_notice ${EBUILD_DEATH_HOOKS} || EBUILD_DEATH_HOOKS+=" toolchain_death_notice"
1226 toolchain_death_notice() {
1227 pushd "${WORKDIR}"/build >/dev/null
1228 tar jcf gcc-build-logs.tar.bz2 $(find -name config.log)
1229 eerror
1230 eerror "Please include ${PWD}/gcc-build-logs.tar.bz2 in your bug report"
1231 eerror
1232 popd >/dev/null
1233 }
1234
1235 # This function accepts one optional argument, the make target to be used.
1236 # If ommitted, gcc_do_make will try to guess whether it should use all,
1237 # profiledbootstrap, or bootstrap-lean depending on CTARGET and arch. An
1238 # example of how to use this function:
1239 #
1240 # gcc_do_make all-target-libstdc++-v3
1241 #
1242 # In addition to the target to be used, the following variables alter the
1243 # behavior of this function:
1244 #
1245 # LDFLAGS
1246 # Flags to pass to ld
1247 #
1248 # STAGE1_CFLAGS
1249 # CFLAGS to use during stage1 of a gcc bootstrap
1250 #
1251 # BOOT_CFLAGS
1252 # CFLAGS to use during stages 2+3 of a gcc bootstrap.
1253 #
1254 # Travis Tilley <lv@gentoo.org> (04 Sep 2004)
1255 #
1256 gcc_do_make() {
1257 # Fix for libtool-portage.patch
1258 local OLDS=${S}
1259 S=${WORKDIR}/build
1260
1261 # Set make target to $1 if passed
1262 [[ -n $1 ]] && GCC_MAKE_TARGET=$1
1263 # default target
1264 if is_crosscompile || tc-is-cross-compiler ; then
1265 # 3 stage bootstrapping doesnt quite work when you cant run the
1266 # resulting binaries natively ^^;
1267 GCC_MAKE_TARGET=${GCC_MAKE_TARGET-all}
1268 else
1269 GCC_MAKE_TARGET=${GCC_MAKE_TARGET-bootstrap-lean}
1270 fi
1271
1272 # the gcc docs state that parallel make isnt supported for the
1273 # profiledbootstrap target, as collisions in profile collecting may occur.
1274 # boundschecking also seems to introduce parallel build issues.
1275 if [[ ${GCC_MAKE_TARGET} == "profiledbootstrap" ]] ||
1276 use_if_iuse boundschecking
1277 then
1278 export MAKEOPTS="${MAKEOPTS} -j1"
1279 fi
1280
1281 if [[ ${GCC_MAKE_TARGET} == "all" ]] ; then
1282 STAGE1_CFLAGS=${STAGE1_CFLAGS-"${CFLAGS}"}
1283 elif [[ $(gcc-version) == "3.4" && ${GCC_BRANCH_VER} == "3.4" ]] && gcc-specs-ssp ; then
1284 # See bug #79852
1285 STAGE1_CFLAGS=${STAGE1_CFLAGS-"-O2"}
1286 fi
1287
1288 if is_crosscompile; then
1289 # In 3.4, BOOT_CFLAGS is never used on a crosscompile...
1290 # but I'll leave this in anyways as someone might have had
1291 # some reason for putting it in here... --eradicator
1292 BOOT_CFLAGS=${BOOT_CFLAGS-"-O2"}
1293 else
1294 # we only want to use the system's CFLAGS if not building a
1295 # cross-compiler.
1296 BOOT_CFLAGS=${BOOT_CFLAGS-"$(get_abi_CFLAGS ${TARGET_DEFAULT_ABI}) ${CFLAGS}"}
1297 fi
1298
1299 pushd "${WORKDIR}"/build
1300
1301 emake \
1302 LDFLAGS="${LDFLAGS}" \
1303 STAGE1_CFLAGS="${STAGE1_CFLAGS}" \
1304 LIBPATH="${LIBPATH}" \
1305 BOOT_CFLAGS="${BOOT_CFLAGS}" \
1306 ${GCC_MAKE_TARGET} \
1307 || die "emake failed with ${GCC_MAKE_TARGET}"
1308
1309 if ! is_crosscompile && use cxx && use doc ; then
1310 if type -p doxygen > /dev/null ; then
1311 if tc_version_is_at_least 4.3 ; then
1312 cd "${CTARGET}"/libstdc++-v3/doc
1313 emake doc-man-doxygen || ewarn "failed to make docs"
1314 elif tc_version_is_at_least 3.0 ; then
1315 cd "${CTARGET}"/libstdc++-v3
1316 emake doxygen-man || ewarn "failed to make docs"
1317 fi
1318 else
1319 ewarn "Skipping libstdc++ manpage generation since you don't have doxygen installed"
1320 fi
1321 fi
1322
1323 popd
1324 }
1325
1326 # This is mostly a stub function to be overwritten in an ebuild
1327 gcc_do_filter_flags() {
1328 strip-flags
1329
1330 # In general gcc does not like optimization, and add -O2 where
1331 # it is safe. This is especially true for gcc 3.3 + 3.4
1332 replace-flags -O? -O2
1333
1334 # ... sure, why not?
1335 strip-unsupported-flags
1336
1337 # dont want to funk ourselves
1338 filter-flags '-mabi*' -m31 -m32 -m64
1339
1340 case ${GCC_BRANCH_VER} in
1341 3.2|3.3)
1342 replace-cpu-flags k8 athlon64 opteron i686 x86-64
1343 replace-cpu-flags pentium-m pentium3m pentium3
1344 case $(tc-arch) in
1345 amd64|x86) filter-flags '-mtune=*' ;;
1346 # in gcc 3.3 there is a bug on ppc64 where if -mcpu is used,
1347 # the compiler wrongly assumes a 32bit target
1348 ppc64) filter-flags "-mcpu=*";;
1349 esac
1350 case $(tc-arch) in
1351 amd64) replace-cpu-flags core2 nocona;;
1352 x86) replace-cpu-flags core2 prescott;;
1353 esac
1354
1355 replace-cpu-flags G3 750
1356 replace-cpu-flags G4 7400
1357 replace-cpu-flags G5 7400
1358
1359 # XXX: should add a sed or something to query all supported flags
1360 # from the gcc source and trim everything else ...
1361 filter-flags -f{no-,}unit-at-a-time -f{no-,}web -mno-tls-direct-seg-refs
1362 filter-flags -f{no-,}stack-protector{,-all}
1363 filter-flags -fvisibility-inlines-hidden -fvisibility=hidden
1364 ;;
1365 3.4|4.*)
1366 case $(tc-arch) in
1367 x86|amd64) filter-flags '-mcpu=*';;
1368 *-macos)
1369 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25127
1370 [[ ${GCC_BRANCH_VER} == 4.0 || ${GCC_BRANCH_VER} == 4.1 ]] && \
1371 filter-flags '-mcpu=*' '-march=*' '-mtune=*'
1372 ;;
1373 esac
1374 ;;
1375 esac
1376
1377 # Compile problems with these (bug #6641 among others)...
1378 #filter-flags "-fno-exceptions -fomit-frame-pointer -fforce-addr"
1379
1380 # CFLAGS logic (verified with 3.4.3):
1381 # CFLAGS:
1382 # This conflicts when creating a crosscompiler, so set to a sane
1383 # default in this case:
1384 # used in ./configure and elsewhere for the native compiler
1385 # used by gcc when creating libiberty.a
1386 # used by xgcc when creating libstdc++ (and probably others)!
1387 # this behavior should be removed...
1388 #
1389 # CXXFLAGS:
1390 # used by xgcc when creating libstdc++
1391 #
1392 # STAGE1_CFLAGS (not used in creating a crosscompile gcc):
1393 # used by ${CHOST}-gcc for building stage1 compiler
1394 #
1395 # BOOT_CFLAGS (not used in creating a crosscompile gcc):
1396 # used by xgcc for building stage2/3 compiler
1397
1398 if is_crosscompile ; then
1399 # Set this to something sane for both native and target
1400 CFLAGS="-O2 -pipe"
1401
1402 local VAR="CFLAGS_"${CTARGET//-/_}
1403 CXXFLAGS=${!VAR}
1404 fi
1405
1406 export GCJFLAGS=${GCJFLAGS:-${CFLAGS}}
1407 }
1408
1409 toolchain_src_compile() {
1410 gcc_do_filter_flags
1411 einfo "CFLAGS=\"${CFLAGS}\""
1412 einfo "CXXFLAGS=\"${CXXFLAGS}\""
1413
1414 # Force internal zip based jar script to avoid random
1415 # issues with 3rd party jar implementations. #384291
1416 export JAR=no
1417
1418 # For hardened gcc 4.3 piepatchset to build the hardened specs
1419 # file (build.specs) to use when building gcc.
1420 if ! tc_version_is_at_least 4.4 && want_minispecs ; then
1421 setup_minispecs_gcc_build_specs
1422 fi
1423 # Build in a separate build tree
1424 mkdir -p "${WORKDIR}"/build
1425 pushd "${WORKDIR}"/build > /dev/null
1426
1427 einfo "Configuring ${PN} ..."
1428 gcc_do_configure
1429
1430 touch "${S}"/gcc/c-gperf.h
1431
1432 # Do not make manpages if we do not have perl ...
1433 [[ ! -x /usr/bin/perl ]] \
1434 && find "${WORKDIR}"/build -name '*.[17]' | xargs touch
1435
1436 einfo "Compiling ${PN} ..."
1437 gcc_do_make ${GCC_MAKE_TARGET}
1438
1439 popd > /dev/null
1440 }
1441
1442 toolchain_src_test() {
1443 cd "${WORKDIR}"/build
1444 emake -k check || ewarn "check failed and that sucks :("
1445 }
1446
1447 toolchain_src_install() {
1448 local x=
1449
1450 cd "${WORKDIR}"/build
1451 # Do allow symlinks in private gcc include dir as this can break the build
1452 find gcc/include*/ -type l -print0 | xargs -0 rm -f
1453 # Remove generated headers, as they can cause things to break
1454 # (ncurses, openssl, etc).
1455 for x in $(find gcc/include*/ -name '*.h') ; do
1456 grep -q 'It has been auto-edited by fixincludes from' "${x}" \
1457 && rm -f "${x}"
1458 done
1459 # Do the 'make install' from the build directory
1460 S=${WORKDIR}/build \
1461 emake -j1 DESTDIR="${D}" install || die
1462 # Punt some tools which are really only useful while building gcc
1463 find "${D}" -name install-tools -prune -type d -exec rm -rf "{}" \;
1464 # This one comes with binutils
1465 find "${D}" -name libiberty.a -exec rm -f "{}" \;
1466
1467 # Move the libraries to the proper location
1468 gcc_movelibs
1469
1470 # Basic sanity check
1471 if ! is_crosscompile ; then
1472 local EXEEXT
1473 eval $(grep ^EXEEXT= "${WORKDIR}"/build/gcc/config.log)
1474 [[ -r ${D}${BINPATH}/gcc${EXEEXT} ]] || die "gcc not found in ${D}"
1475 fi
1476
1477 dodir /etc/env.d/gcc
1478 create_gcc_env_entry
1479
1480 # Setup the gcc_env_entry for hardened gcc 4 with minispecs
1481 if want_minispecs ; then
1482 copy_minispecs_gcc_specs
1483 fi
1484 # Make sure we dont have stuff lying around that
1485 # can nuke multiple versions of gcc
1486
1487 gcc_slot_java
1488
1489 # These should be symlinks
1490 dodir /usr/bin
1491 cd "${D}"${BINPATH}
1492 # Ugh: we really need to auto-detect this list.
1493 # It's constantly out of date.
1494 for x in cpp gcc g++ c++ gcov g77 gcj gcjh gfortran gccgo ; do
1495 # For some reason, g77 gets made instead of ${CTARGET}-g77...
1496 # this should take care of that
1497 [[ -f ${x} ]] && mv ${x} ${CTARGET}-${x}
1498
1499 if [[ -f ${CTARGET}-${x} ]] ; then
1500 if ! is_crosscompile ; then
1501 ln -sf ${CTARGET}-${x} ${x}
1502 dosym ${BINPATH}/${CTARGET}-${x} \
1503 /usr/bin/${x}-${GCC_CONFIG_VER}
1504 fi
1505
1506 # Create version-ed symlinks
1507 dosym ${BINPATH}/${CTARGET}-${x} \
1508 /usr/bin/${CTARGET}-${x}-${GCC_CONFIG_VER}
1509 fi
1510
1511 if [[ -f ${CTARGET}-${x}-${GCC_CONFIG_VER} ]] ; then
1512 rm -f ${CTARGET}-${x}-${GCC_CONFIG_VER}
1513 ln -sf ${CTARGET}-${x} ${CTARGET}-${x}-${GCC_CONFIG_VER}
1514 fi
1515 done
1516
1517 # Now do the fun stripping stuff
1518 env RESTRICT="" CHOST=${CHOST} prepstrip "${D}${BINPATH}"
1519 env RESTRICT="" CHOST=${CTARGET} prepstrip "${D}${LIBPATH}"
1520 # gcc used to install helper binaries in lib/ but then moved to libexec/
1521 [[ -d ${D}${PREFIX}/libexec/gcc ]] && \
1522 env RESTRICT="" CHOST=${CHOST} prepstrip "${D}${PREFIX}/libexec/gcc/${CTARGET}/${GCC_CONFIG_VER}"
1523
1524 cd "${S}"
1525 if is_crosscompile; then
1526 rm -rf "${D}"/usr/share/{man,info}
1527 rm -rf "${D}"${DATAPATH}/{man,info}
1528 else
1529 local cxx_mandir=$(find "${WORKDIR}/build/${CTARGET}/libstdc++-v3" -name man)
1530 if [[ -d ${cxx_mandir} ]] ; then
1531 # clean bogus manpages #113902
1532 find "${cxx_mandir}" -name '*_build_*' -exec rm {} \;
1533 cp -r "${cxx_mandir}"/man? "${D}/${DATAPATH}"/man/
1534 fi
1535 has noinfo ${FEATURES} \
1536 && rm -r "${D}/${DATAPATH}"/info \
1537 || prepinfo "${DATAPATH}"
1538 has noman ${FEATURES} \
1539 && rm -r "${D}/${DATAPATH}"/man \
1540 || prepman "${DATAPATH}"
1541 fi
1542 # prune empty dirs left behind
1543 find "${D}" -depth -type d -delete 2>/dev/null
1544
1545 # install testsuite results
1546 if use test; then
1547 docinto testsuite
1548 find "${WORKDIR}"/build -type f -name "*.sum" -print0 | xargs -0 dodoc
1549 find "${WORKDIR}"/build -type f -path "*/testsuite/*.log" -print0 \
1550 | xargs -0 dodoc
1551 fi
1552
1553 # Rather install the script, else portage with changing $FILESDIR
1554 # between binary and source package borks things ....
1555 if ! is_crosscompile ; then
1556 insinto "${DATAPATH}"
1557 if tc_version_is_at_least 4.0 ; then
1558 newins "${GCC_FILESDIR}"/awk/fixlafiles.awk-no_gcc_la fixlafiles.awk || die
1559 find "${D}/${LIBPATH}" -name libstdc++.la -type f -exec rm "{}" \;
1560 else
1561 doins "${GCC_FILESDIR}"/awk/fixlafiles.awk || die
1562 fi
1563 exeinto "${DATAPATH}"
1564 doexe "${GCC_FILESDIR}"/fix_libtool_files.sh || die
1565 doexe "${GCC_FILESDIR}"/c{89,99} || die
1566 fi
1567
1568 # Use gid of 0 because some stupid ports don't have
1569 # the group 'root' set to gid 0. Send to /dev/null
1570 # for people who are testing as non-root.
1571 chown -R root:0 "${D}"${LIBPATH} 2>/dev/null
1572
1573 # Move pretty-printers to gdb datadir to shut ldconfig up
1574 local py gdbdir=/usr/share/gdb/auto-load${LIBPATH/\/lib\//\/$(get_libdir)\/}
1575 pushd "${D}"${LIBPATH} >/dev/null
1576 for py in $(find . -name '*-gdb.py') ; do
1577 local multidir=${py%/*}
1578 insinto "${gdbdir}/${multidir}"
1579 sed -i "/^libdir =/s:=.*:= '${LIBPATH}/${multidir}':" "${py}" || die #348128
1580 doins "${py}" || die
1581 rm "${py}" || die
1582 done
1583 popd >/dev/null
1584
1585 # Don't scan .gox files for executable stacks - false positives
1586 export QA_EXECSTACK="usr/lib*/go/*/*.gox"
1587 export QA_WX_LOAD="usr/lib*/go/*/*.gox"
1588
1589 # Disable RANDMMAP so PCH works. #301299
1590 if tc_version_is_at_least 4.3 ; then
1591 pax-mark -r "${D}${PREFIX}/libexec/gcc/${CTARGET}/${GCC_CONFIG_VER}/cc1"
1592 pax-mark -r "${D}${PREFIX}/libexec/gcc/${CTARGET}/${GCC_CONFIG_VER}/cc1plus"
1593 fi
1594 }
1595
1596 gcc_slot_java() {
1597 local x
1598
1599 # Move Java headers to compiler-specific dir
1600 for x in "${D}"${PREFIX}/include/gc*.h "${D}"${PREFIX}/include/j*.h ; do
1601 [[ -f ${x} ]] && mv -f "${x}" "${D}"${LIBPATH}/include/
1602 done
1603 for x in gcj gnu java javax org ; do
1604 if [[ -d ${D}${PREFIX}/include/${x} ]] ; then
1605 dodir /${LIBPATH}/include/${x}
1606 mv -f "${D}"${PREFIX}/include/${x}/* "${D}"${LIBPATH}/include/${x}/
1607 rm -rf "${D}"${PREFIX}/include/${x}
1608 fi
1609 done
1610
1611 if [[ -d ${D}${PREFIX}/lib/security ]] || [[ -d ${D}${PREFIX}/$(get_libdir)/security ]] ; then
1612 dodir /${LIBPATH}/security
1613 mv -f "${D}"${PREFIX}/lib*/security/* "${D}"${LIBPATH}/security
1614 rm -rf "${D}"${PREFIX}/lib*/security
1615 fi
1616
1617 # Move random gcj files to compiler-specific directories
1618 for x in libgcj.spec logging.properties ; do
1619 x="${D}${PREFIX}/lib/${x}"
1620 [[ -f ${x} ]] && mv -f "${x}" "${D}"${LIBPATH}/
1621 done
1622
1623 # SLOT up libgcj.pc if it's available (and let gcc-config worry about links)
1624 for x in "${D}"${PREFIX}/lib*/pkgconfig/libgcj*.pc ; do
1625 [[ -f ${x} ]] || continue
1626 sed -i "/^libdir=/s:=.*:=${LIBPATH}:" "${x}"
1627 mv "${x}" "${D}"/usr/lib/pkgconfig/libgcj-${GCC_PV}.pc || die
1628 done
1629
1630 # Rename jar because it could clash with Kaffe's jar if this gcc is
1631 # primary compiler (aka don't have the -<version> extension)
1632 cd "${D}"${BINPATH}
1633 [[ -f jar ]] && mv -f jar gcj-jar
1634 }
1635
1636 # Move around the libs to the right location. For some reason,
1637 # when installing gcc, it dumps internal libraries into /usr/lib
1638 # instead of the private gcc lib path
1639 gcc_movelibs() {
1640 # older versions of gcc did not support --print-multi-os-directory
1641 tc_version_is_at_least 3.0 || return 0
1642
1643 local multiarg removedirs=""
1644 for multiarg in $($(XGCC) -print-multi-lib) ; do
1645 multiarg=${multiarg#*;}
1646 multiarg=${multiarg//@/ -}
1647
1648 local OS_MULTIDIR=$($(XGCC) ${multiarg} --print-multi-os-directory)
1649 local MULTIDIR=$($(XGCC) ${multiarg} --print-multi-directory)
1650 local TODIR=${D}${LIBPATH}/${MULTIDIR}
1651 local FROMDIR=
1652
1653 [[ -d ${TODIR} ]] || mkdir -p ${TODIR}
1654
1655 for FROMDIR in \
1656 ${LIBPATH}/${OS_MULTIDIR} \
1657 ${LIBPATH}/../${MULTIDIR} \
1658 ${PREFIX}/lib/${OS_MULTIDIR} \
1659 ${PREFIX}/${CTARGET}/lib/${OS_MULTIDIR}
1660 do
1661 removedirs="${removedirs} ${FROMDIR}"
1662 FROMDIR=${D}${FROMDIR}
1663 if [[ ${FROMDIR} != "${TODIR}" && -d ${FROMDIR} ]] ; then
1664 local files=$(find "${FROMDIR}" -maxdepth 1 ! -type d 2>/dev/null)
1665 if [[ -n ${files} ]] ; then
1666 mv ${files} "${TODIR}"
1667 fi
1668 fi
1669 done
1670 fix_libtool_libdir_paths "${LIBPATH}/${MULTIDIR}"
1671 done
1672
1673 # We remove directories separately to avoid this case:
1674 # mv SRC/lib/../lib/*.o DEST
1675 # rmdir SRC/lib/../lib/
1676 # mv SRC/lib/../lib32/*.o DEST # Bork
1677 for FROMDIR in ${removedirs} ; do
1678 rmdir "${D}"${FROMDIR} >& /dev/null
1679 done
1680 find "${D}" -type d | xargs rmdir >& /dev/null
1681 }
1682
1683 #----<< src_* >>----
1684
1685 #---->> unorganized crap in need of refactoring follows
1686
1687 # gcc_quick_unpack will unpack the gcc tarball and patches in a way that is
1688 # consistant with the behavior of get_gcc_src_uri. The only patch it applies
1689 # itself is the branch update if present.
1690 #
1691 # Travis Tilley <lv@gentoo.org> (03 Sep 2004)
1692 #
1693 gcc_quick_unpack() {
1694 pushd "${WORKDIR}" > /dev/null
1695 export PATCH_GCC_VER=${PATCH_GCC_VER:-${GCC_RELEASE_VER}}
1696 export UCLIBC_GCC_VER=${UCLIBC_GCC_VER:-${PATCH_GCC_VER}}
1697 export PIE_GCC_VER=${PIE_GCC_VER:-${GCC_RELEASE_VER}}
1698 export HTB_GCC_VER=${HTB_GCC_VER:-${GCC_RELEASE_VER}}
1699 export SPECS_GCC_VER=${SPECS_GCC_VER:-${GCC_RELEASE_VER}}
1700
1701 if [[ -n ${GCC_A_FAKEIT} ]] ; then
1702 unpack ${GCC_A_FAKEIT}
1703 elif [[ -n ${PRERELEASE} ]] ; then
1704 unpack gcc-${PRERELEASE}.tar.bz2
1705 elif [[ -n ${SNAPSHOT} ]] ; then
1706 unpack gcc-${SNAPSHOT}.tar.bz2
1707 elif [[ ${PV} != *9999* ]] ; then
1708 unpack gcc-${GCC_RELEASE_VER}.tar.bz2
1709 # We want branch updates to be against a release tarball
1710 if [[ -n ${BRANCH_UPDATE} ]] ; then
1711 pushd "${S}" > /dev/null
1712 epatch "${DISTDIR}"/gcc-${GCC_RELEASE_VER}-branch-update-${BRANCH_UPDATE}.patch.bz2
1713 popd > /dev/null
1714 fi
1715 fi
1716
1717 if [[ -n ${D_VER} ]] && use d ; then
1718 pushd "${S}"/gcc > /dev/null
1719 unpack gdc-${D_VER}-src.tar.bz2
1720 cd ..
1721 ebegin "Adding support for the D language"
1722 ./gcc/d/setup-gcc.sh >& "${T}"/dgcc.log
1723 if ! eend $? ; then
1724 eerror "The D gcc package failed to apply"
1725 eerror "Please include this log file when posting a bug report:"
1726 eerror " ${T}/dgcc.log"
1727 die "failed to include the D language"
1728 fi
1729 popd > /dev/null
1730 fi
1731
1732 [[ -n ${PATCH_VER} ]] && \
1733 unpack gcc-${PATCH_GCC_VER}-patches-${PATCH_VER}.tar.bz2
1734
1735 [[ -n ${UCLIBC_VER} ]] && \
1736 unpack gcc-${UCLIBC_GCC_VER}-uclibc-patches-${UCLIBC_VER}.tar.bz2
1737
1738 if want_pie ; then
1739 if [[ -n ${PIE_CORE} ]] ; then
1740 unpack ${PIE_CORE}
1741 else
1742 unpack gcc-${PIE_GCC_VER}-piepatches-v${PIE_VER}.tar.bz2
1743 fi
1744 [[ -n ${SPECS_VER} ]] && \
1745 unpack gcc-${SPECS_GCC_VER}-specs-${SPECS_VER}.tar.bz2
1746 fi
1747
1748 use_if_iuse boundschecking && unpack "bounds-checking-gcc-${HTB_GCC_VER}-${HTB_VER}.patch.bz2"
1749
1750 popd > /dev/null
1751 }
1752
1753 do_gcc_HTB_patches() {
1754 use_if_iuse boundschecking || return 0
1755
1756 # modify the bounds checking patch with a regression patch
1757 epatch "${WORKDIR}/bounds-checking-gcc-${HTB_GCC_VER}-${HTB_VER}.patch"
1758 BRANDING_GCC_PKGVERSION="${BRANDING_GCC_PKGVERSION}, HTB-${HTB_GCC_VER}-${HTB_VER}"
1759 }
1760
1761 # do various updates to PIE logic
1762 do_gcc_PIE_patches() {
1763 want_pie || return 0
1764
1765 use vanilla && return 0
1766
1767 if tc_version_is_at_least 4.3.2; then
1768 guess_patch_type_in_dir "${WORKDIR}"/piepatch/
1769 EPATCH_MULTI_MSG="Applying pie patches ..." \
1770 epatch "${WORKDIR}"/piepatch/
1771 else
1772 guess_patch_type_in_dir "${WORKDIR}"/piepatch/upstream
1773
1774 # corrects startfile/endfile selection and shared/static/pie flag usage
1775 EPATCH_MULTI_MSG="Applying upstream pie patches ..." \
1776 epatch "${WORKDIR}"/piepatch/upstream
1777 # adds non-default pie support (rs6000)
1778 EPATCH_MULTI_MSG="Applying non-default pie patches ..." \
1779 epatch "${WORKDIR}"/piepatch/nondef
1780 # adds default pie support (rs6000 too) if DEFAULT_PIE[_SSP] is defined
1781 EPATCH_MULTI_MSG="Applying default pie patches ..." \
1782 epatch "${WORKDIR}"/piepatch/def
1783 fi
1784
1785 # we want to be able to control the pie patch logic via something other
1786 # than ALL_CFLAGS...
1787 sed -e '/^ALL_CFLAGS/iHARD_CFLAGS = ' \
1788 -e 's|^ALL_CFLAGS = |ALL_CFLAGS = $(HARD_CFLAGS) |' \
1789 -i "${S}"/gcc/Makefile.in
1790 # Need to add HARD_CFLAGS to ALL_CXXFLAGS on >= 4.7
1791 if tc_version_is_at_least 4.7.0 ; then
1792 sed -e '/^ALL_CXXFLAGS/iHARD_CFLAGS = ' \
1793 -e 's|^ALL_CXXFLAGS = |ALL_CXXFLAGS = $(HARD_CFLAGS) |' \
1794 -i "${S}"/gcc/Makefile.in
1795 fi
1796
1797 BRANDING_GCC_PKGVERSION="${BRANDING_GCC_PKGVERSION}, pie-${PIE_VER}"
1798 }
1799
1800 should_we_gcc_config() {
1801 # we always want to run gcc-config if we're bootstrapping, otherwise
1802 # we might get stuck with the c-only stage1 compiler
1803 use_if_iuse bootstrap && return 0
1804 use build && return 0
1805
1806 # if the current config is invalid, we definitely want a new one
1807 # Note: due to bash quirkiness, the following must not be 1 line
1808 local curr_config
1809 curr_config=$(env -i ROOT="${ROOT}" gcc-config -c ${CTARGET} 2>&1) || return 0
1810
1811 # if the previously selected config has the same major.minor (branch) as
1812 # the version we are installing, then it will probably be uninstalled
1813 # for being in the same SLOT, make sure we run gcc-config.
1814 local curr_config_ver=$(env -i ROOT="${ROOT}" gcc-config -S ${curr_config} | awk '{print $2}')
1815
1816 local curr_branch_ver=$(get_version_component_range 1-2 ${curr_config_ver})
1817
1818 # If we're using multislot, just run gcc-config if we're installing
1819 # to the same profile as the current one.
1820 use multislot && return $([[ ${curr_config_ver} == ${GCC_CONFIG_VER} ]])
1821
1822 if [[ ${curr_branch_ver} == ${GCC_BRANCH_VER} ]] ; then
1823 return 0
1824 else
1825 # if we're installing a genuinely different compiler version,
1826 # we should probably tell the user -how- to switch to the new
1827 # gcc version, since we're not going to do it for him/her.
1828 # We don't want to switch from say gcc-3.3 to gcc-3.4 right in
1829 # the middle of an emerge operation (like an 'emerge -e world'
1830 # which could install multiple gcc versions).
1831 einfo "The current gcc config appears valid, so it will not be"
1832 einfo "automatically switched for you. If you would like to"
1833 einfo "switch to the newly installed gcc version, do the"
1834 einfo "following:"
1835 echo
1836 einfo "gcc-config ${CTARGET}-${GCC_CONFIG_VER}"
1837 einfo "source /etc/profile"
1838 echo
1839 ebeep
1840 return 1
1841 fi
1842 }
1843
1844 do_gcc_config() {
1845 if ! should_we_gcc_config ; then
1846 env -i ROOT="${ROOT}" gcc-config --use-old --force
1847 return 0
1848 fi
1849
1850 local current_gcc_config="" current_specs="" use_specs=""
1851
1852 current_gcc_config=$(env -i ROOT="${ROOT}" gcc-config -c ${CTARGET} 2>/dev/null)
1853 if [[ -n ${current_gcc_config} ]] ; then
1854 # figure out which specs-specific config is active
1855 current_specs=$(gcc-config -S ${current_gcc_config} | awk '{print $3}')
1856 [[ -n ${current_specs} ]] && use_specs=-${current_specs}
1857 fi
1858 if [[ -n ${use_specs} ]] && \
1859 [[ ! -e ${ROOT}/etc/env.d/gcc/${CTARGET}-${GCC_CONFIG_VER}${use_specs} ]]
1860 then
1861 ewarn "The currently selected specs-specific gcc config,"
1862 ewarn "${current_specs}, doesn't exist anymore. This is usually"
1863 ewarn "due to enabling/disabling hardened or switching to a version"
1864 ewarn "of gcc that doesnt create multiple specs files. The default"
1865 ewarn "config will be used, and the previous preference forgotten."
1866 ebeep
1867 epause
1868 use_specs=""
1869 fi
1870
1871 gcc-config ${CTARGET}-${GCC_CONFIG_VER}${use_specs}
1872 }
1873
1874 # This function allows us to gentoo-ize gcc's version number and bugzilla
1875 # URL without needing to use patches.
1876 gcc_version_patch() {
1877 # gcc-4.3+ has configure flags (whoo!)
1878 tc_version_is_at_least 4.3 && return 0
1879
1880 local version_string=${GCC_CONFIG_VER}
1881 [[ -n ${BRANCH_UPDATE} ]] && version_string+=" ${BRANCH_UPDATE}"
1882
1883 einfo "patching gcc version: ${version_string} (${BRANDING_GCC_PKGVERSION})"
1884
1885 local gcc_sed=( -e 's:gcc\.gnu\.org/bugs\.html:bugs\.gentoo\.org/:' )
1886 if grep -qs VERSUFFIX "${S}"/gcc/version.c ; then
1887 gcc_sed+=( -e "/VERSUFFIX \"\"/s:\"\":\" (${BRANDING_GCC_PKGVERSION})\":" )
1888 else
1889 version_string="${version_string} (${BRANDING_GCC_PKGVERSION})"
1890 gcc_sed+=( -e "/const char version_string\[\] = /s:= \".*\":= \"${version_string}\":" )
1891 fi
1892 sed -i "${gcc_sed[@]}" "${S}"/gcc/version.c || die
1893 }
1894
1895 # This is a historical wart. The original Gentoo/amd64 port used:
1896 # lib32 - 32bit binaries (x86)
1897 # lib64 - 64bit binaries (x86_64)
1898 # lib - "native" binaries (a symlink to lib64)
1899 # Most other distros use the logic (including mainline gcc):
1900 # lib - 32bit binaries (x86)
1901 # lib64 - 64bit binaries (x86_64)
1902 # Over time, Gentoo is migrating to the latter form.
1903 #
1904 # Unfortunately, due to distros picking the lib32 behavior, newer gcc
1905 # versions will dynamically detect whether to use lib or lib32 for its
1906 # 32bit multilib. So, to keep the automagic from getting things wrong
1907 # while people are transitioning from the old style to the new style,
1908 # we always set the MULTILIB_OSDIRNAMES var for relevant targets.
1909 setup_multilib_osdirnames() {
1910 is_multilib || return 0
1911
1912 local config
1913 local libdirs="../lib64 ../lib32"
1914
1915 # this only makes sense for some Linux targets
1916 case ${CTARGET} in
1917 x86_64*-linux*) config="i386" ;;
1918 powerpc64*-linux*) config="rs6000" ;;
1919 sparc64*-linux*) config="sparc" ;;
1920 s390x*-linux*) config="s390" ;;
1921 *) return 0 ;;
1922 esac
1923 config+="/t-linux64"
1924
1925 if [[ ${SYMLINK_LIB} == "yes" ]] ; then
1926 einfo "updating multilib directories to be: ${libdirs}"
1927 if tc_version_is_at_least 4.7 ; then
1928 set -- -e '/^MULTILIB_OSDIRNAMES.*lib32/s:[$][(]if.*):../lib32:'
1929 else
1930 set -- -e "/^MULTILIB_OSDIRNAMES/s:=.*:= ${libdirs}:"
1931 fi
1932 else
1933 einfo "using upstream multilib; disabling lib32 autodetection"
1934 set -- -r -e 's:[$][(]if.*,(.*)[)]:\1:'
1935 fi
1936 sed -i "$@" "${S}"/gcc/config/${config} || die
1937 }
1938
1939 disable_multilib_libjava() {
1940 # We dont want a multilib libjava, so lets use this hack taken from fedora
1941 sed -i -r \
1942 -e 's/^((all:) all-redirect)/ifeq (\$(MULTISUBDIR),)\n\1\nelse\n\2\n\techo Multilib libjava disabled\nendif/' \
1943 -e 's/^((install:) install-redirect)/ifeq (\$(MULTISUBDIR),)\n\1\nelse\n\2\n\techo Multilib libjava disabled\nendif/' \
1944 -e 's/^((check:) check-redirect)/ifeq (\$(MULTISUBDIR),)\n\1\nelse\n\2\n\techo Multilib libjava disabled\nendif/' \
1945 -e 's/^((all:) all-recursive)/ifeq (\$(MULTISUBDIR),)\n\1\nelse\n\2\n\techo Multilib libjava disabled\nendif/' \
1946 -e 's/^((install:) install-recursive)/ifeq (\$(MULTISUBDIR),)\n\1\nelse\n\2\n\techo Multilib libjava disabled\nendif/' \
1947 -e 's/^((check:) check-recursive)/ifeq (\$(MULTISUBDIR),)\n\1\nelse\n\2\n\techo Multilib libjava disabled\nendif/' \
1948 "${S}"/libjava/Makefile.in || die
1949 }
1950
1951 # make sure the libtool archives have libdir set to where they actually
1952 # -are-, and not where they -used- to be. also, any dependencies we have
1953 # on our own .la files need to be updated.
1954 fix_libtool_libdir_paths() {
1955 pushd "${D}" >/dev/null
1956
1957 pushd "./${1}" >/dev/null
1958 local dir="${PWD#${D%/}}"
1959 local allarchives=$(echo *.la)
1960 allarchives="\(${allarchives// /\\|}\)"
1961 popd >/dev/null
1962
1963 sed -i \
1964 -e "/^libdir=/s:=.*:='${dir}':" \
1965 ./${dir}/*.la
1966 sed -i \
1967 -e "/^dependency_libs=/s:/[^ ]*/${allarchives}:${LIBPATH}/\1:g" \
1968 $(find ./${PREFIX}/lib* -maxdepth 3 -name '*.la') \
1969 ./${dir}/*.la
1970
1971 popd >/dev/null
1972 }
1973
1974 is_multilib() {
1975 tc_version_is_at_least 3 || return 1
1976 use multilib
1977 }
1978
1979 is_cxx() {
1980 gcc-lang-supported 'c++' || return 1
1981 use cxx
1982 }
1983
1984 is_d() {
1985 gcc-lang-supported d || return 1
1986 use_if_iuse d
1987 }
1988
1989 is_f77() {
1990 gcc-lang-supported f77 || return 1
1991 use fortran
1992 }
1993
1994 is_f95() {
1995 gcc-lang-supported f95 || return 1
1996 use fortran
1997 }
1998
1999 is_fortran() {
2000 gcc-lang-supported fortran || return 1
2001 use fortran
2002 }
2003
2004 is_gcj() {
2005 gcc-lang-supported java || return 1
2006 use cxx && use_if_iuse gcj
2007 }
2008
2009 is_go() {
2010 gcc-lang-supported go || return 1
2011 use cxx && use_if_iuse go
2012 }
2013
2014 is_objc() {
2015 gcc-lang-supported objc || return 1
2016 use_if_iuse objc
2017 }
2018
2019 is_objcxx() {
2020 gcc-lang-supported 'obj-c++' || return 1
2021 use cxx && use_if_iuse objc++
2022 }
2023
2024 is_ada() {
2025 gcc-lang-supported ada || return 1
2026 use ada
2027 }
2028
2029 is_treelang() {
2030 use_if_iuse boundschecking && return 1 #260532
2031 is_crosscompile && return 1 #199924
2032 gcc-lang-supported treelang || return 1
2033 #use treelang
2034 return 0
2035 }
2036
2037 # should kill these off once all the ebuilds are migrated
2038 gcc_pkg_setup() { toolchain_pkg_setup ; }
2039 gcc_src_unpack() { toolchain_src_unpack ; }
2040 gcc_src_compile() { toolchain_src_compile ; }
2041 gcc_src_test() { toolchain_src_test ; }

  ViewVC Help
Powered by ViewVC 1.1.20