1 # Copyright 1999-2019 Gentoo Authors
2 # Distributed under the terms of the GNU General Public License v2
4 # Maintainer: Toolchain Ninjas <toolchain@gentoo.org>
5 # @SUPPORTED_EAPIS: 5 6 7
7 DESCRIPTION="The GNU Compiler Collection"
8 HOMEPAGE="https://gcc.gnu.org/"
10 inherit eutils fixheadtails flag-o-matic gnuconfig libtool multilib pax-utils toolchain-funcs prefix
12 if [[ ${PV} == *_pre9999* ]] ; then
13 EGIT_REPO_URI="git://gcc.gnu.org/git/gcc.git"
15 # gcc-4.7.1_pre9999 -> gcc-4_7-branch
16 # Note that the micro version is required or lots of stuff will break.
17 # To checkout master set gcc_LIVE_BRANCH="master" in the ebuild before
18 # inheriting this eclass.
19 EGIT_BRANCH="${PN}-${PV%.?_pre9999}-branch"
20 EGIT_BRANCH=${EGIT_BRANCH//./_}
24 FEATURES=${FEATURES/multilib-strict/}
27 0|1|2|3|4*) die "Need to upgrade to at least EAPI=5" ;;
28 5*|6) inherit eapi7-ver ;;
30 *) die "I don't speak EAPI ${EAPI}." ;;
33 tc_supports_dostrip() {
37 *) die "Update apply_patches() for ${EAPI}." ;;
41 tc_supports_dostrip || RESTRICT="strip" # cross-compilers need controlled stripping
43 EXPORT_FUNCTIONS pkg_pretend pkg_setup src_unpack src_prepare src_configure \
44 src_compile src_test src_install pkg_postinst pkg_postrm
46 #---->> globals <<----
48 export CTARGET=${CTARGET:-${CHOST}}
49 if [[ ${CTARGET} = ${CHOST} ]] ; then
50 if [[ ${CATEGORY} == cross-* ]] ; then
51 export CTARGET=${CATEGORY#cross-}
54 : ${TARGET_ABI:=${ABI}}
55 : ${TARGET_MULTILIB_ABIS:=${MULTILIB_ABIS}}
56 : ${TARGET_DEFAULT_ABI:=${DEFAULT_ABI}}
59 [[ ${CHOST} != ${CTARGET} ]]
62 # General purpose version check. Without a second arg matches up to minor version (x.x.x)
63 tc_version_is_at_least() {
64 ver_test "${2:-${GCC_RELEASE_VER}}" -ge "$1"
67 # General purpose version range check
68 # Note that it matches up to but NOT including the second version
69 tc_version_is_between() {
70 tc_version_is_at_least "${1}" && ! tc_version_is_at_least "${2}"
73 GCC_PV=${TOOLCHAIN_GCC_PV:-${PV}}
75 [[ ${PR} != "r0" ]] && GCC_PVR=${GCC_PVR}-${PR}
76 GCC_RELEASE_VER=$(ver_cut 1-3 ${GCC_PV})
77 GCC_BRANCH_VER=$(ver_cut 1-2 ${GCC_PV})
78 GCCMAJOR=$(ver_cut 1 ${GCC_PV})
79 GCCMINOR=$(ver_cut 2 ${GCC_PV})
80 GCCMICRO=$(ver_cut 3 ${GCC_PV})
82 # According to gcc/c-cppbuiltin.c, GCC_CONFIG_VER MUST match this regex.
83 # ([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)?
84 GCC_CONFIG_VER=${GCC_CONFIG_VER:-$(ver_rs 3 '-' ${GCC_PV})}
87 if [[ ${GCC_PV} == *_pre* ]] ; then
88 PRERELEASE=${GCC_PV/_pre/-}
89 elif [[ ${GCC_PV} == *_alpha* ]] ; then
90 SNAPSHOT=${GCC_BRANCH_VER}-${GCC_PV##*_alpha}
91 elif [[ ${GCC_PV} == *_beta* ]] ; then
92 SNAPSHOT=${GCC_BRANCH_VER}-${GCC_PV##*_beta}
93 elif [[ ${GCC_PV} == *_rc* ]] ; then
94 SNAPSHOT=${GCC_PV%_rc*}-RC-${GCC_PV##*_rc}
97 if [[ ${SNAPSHOT} == [56789].0-* ]] ; then
98 # The gcc-5+ releases have dropped the .0 for some reason.
99 SNAPSHOT=${SNAPSHOT/.0}
102 PREFIX=${TOOLCHAIN_PREFIX:-${EPREFIX}/usr}
104 if tc_version_is_at_least 3.4.0 ; then
105 LIBPATH=${TOOLCHAIN_LIBPATH:-${PREFIX}/lib/gcc/${CTARGET}/${GCC_CONFIG_VER}}
107 LIBPATH=${TOOLCHAIN_LIBPATH:-${PREFIX}/lib/gcc-lib/${CTARGET}/${GCC_CONFIG_VER}}
109 INCLUDEPATH=${TOOLCHAIN_INCLUDEPATH:-${LIBPATH}/include}
111 if is_crosscompile ; then
112 BINPATH=${TOOLCHAIN_BINPATH:-${PREFIX}/${CHOST}/${CTARGET}/gcc-bin/${GCC_CONFIG_VER}}
113 HOSTLIBPATH=${PREFIX}/${CHOST}/${CTARGET}/lib/${GCC_CONFIG_VER}
115 BINPATH=${TOOLCHAIN_BINPATH:-${PREFIX}/${CTARGET}/gcc-bin/${GCC_CONFIG_VER}}
118 DATAPATH=${TOOLCHAIN_DATAPATH:-${PREFIX}/share/gcc-data/${CTARGET}/${GCC_CONFIG_VER}}
120 # Dont install in /usr/include/g++-v3/, but in gcc internal directory.
121 # We will handle /usr/include/g++-v3/ with gcc-config ...
122 STDCXX_INCDIR=${TOOLCHAIN_STDCXX_INCDIR:-${LIBPATH}/include/g++-v${GCC_BRANCH_VER/\.*/}}
124 #---->> LICENSE+SLOT+IUSE logic <<----
126 if tc_version_is_at_least 4.6 ; then
127 LICENSE="GPL-3+ LGPL-3+ || ( GPL-3+ libgcc libstdc++ gcc-runtime-library-exception-3.1 ) FDL-1.3+"
128 elif tc_version_is_at_least 4.4 ; then
129 LICENSE="GPL-3+ LGPL-3+ || ( GPL-3+ libgcc libstdc++ gcc-runtime-library-exception-3.1 ) FDL-1.2+"
130 elif tc_version_is_at_least 4.3 ; then
131 LICENSE="GPL-3+ LGPL-3+ || ( GPL-3+ libgcc libstdc++ ) FDL-1.2+"
132 elif tc_version_is_at_least 4.2 ; then
133 LICENSE="GPL-3+ LGPL-2.1+ || ( GPL-3+ libgcc libstdc++ ) FDL-1.2+"
134 elif tc_version_is_at_least 3.3 ; then
135 LICENSE="GPL-2+ LGPL-2.1+ FDL-1.2+"
137 LICENSE="GPL-2+ LGPL-2.1+ FDL-1.1+"
140 if tc_version_is_at_least 8.3; then
141 GCC_EBUILD_TEST_FLAG='test'
143 # Don't force USE regression-test->test change on every
144 # gcc ebuild just yet. Let's do the change when >=gcc-8.3
145 # is commonly used as a main compiler.
146 GCC_EBUILD_TEST_FLAG='regression-test'
148 IUSE="${GCC_EBUILD_TEST_FLAG} vanilla +nls"
153 has "$1" "${TC_FEATURES[@]}"
156 if [[ ${PN} != "kgcc64" && ${PN} != gcc-* ]] ; then
157 IUSE+=" altivec debug +cxx +fortran +nptl" TC_FEATURES+=(fortran nptl)
158 [[ -n ${PIE_VER} ]] && IUSE+=" nopie"
159 [[ -n ${HTB_VER} ]] && IUSE+=" boundschecking"
160 [[ -n ${D_VER} ]] && IUSE+=" d"
161 [[ -n ${SPECS_VER} ]] && IUSE+=" nossp"
162 tc_version_is_at_least 3 && IUSE+=" doc hardened multilib objc"
163 tc_version_is_between 3 7 && IUSE+=" awt gcj" TC_FEATURES+=(gcj)
164 tc_version_is_at_least 3.3 && IUSE+=" pgo"
165 tc_version_is_at_least 4.0 &&
166 IUSE+=" objc-gc" TC_FEATURES+=(objc-gc)
167 tc_version_is_between 4.0 4.9 && IUSE+=" mudflap"
168 tc_version_is_at_least 4.1 && IUSE+=" libssp objc++"
169 tc_version_is_at_least 4.2 && IUSE+=" +openmp"
170 tc_version_is_at_least 4.3 && IUSE+=" fixed-point"
171 tc_version_is_at_least 4.7 && IUSE+=" go"
172 # Note: while <=gcc-4.7 also supported graphite, it required forked ppl
173 # versions which we dropped. Since graphite was also experimental in
174 # the older versions, we don't want to bother supporting it. #448024
175 tc_version_is_at_least 4.8 &&
176 IUSE+=" graphite +sanitize" TC_FEATURES+=(graphite)
177 tc_version_is_between 4.9 8 && IUSE+=" cilk"
178 tc_version_is_at_least 4.9 && IUSE+=" +vtv"
179 tc_version_is_at_least 5.0 && IUSE+=" jit"
180 tc_version_is_between 5.0 9 && IUSE+=" mpx"
181 tc_version_is_at_least 6.0 && IUSE+=" +pie +ssp +pch"
182 # systemtap is a gentoo-specific switch: bug #654748
183 tc_version_is_at_least 8.0 &&
184 IUSE+=" systemtap" TC_FEATURES+=(systemtap)
185 tc_version_is_at_least 9.0 && IUSE+=" d"
186 tc_version_is_at_least 9.1 && IUSE+=" lto"
189 SLOT="${GCC_CONFIG_VER}"
191 #---->> DEPEND <<----
193 RDEPEND="sys-libs/zlib
194 nls? ( virtual/libintl )"
196 tc_version_is_at_least 3 && RDEPEND+=" virtual/libiconv"
198 if tc_version_is_at_least 4 ; then
199 GMP_MPFR_DEPS=">=dev-libs/gmp-4.3.2:0= >=dev-libs/mpfr-2.4.2:0="
200 if tc_version_is_at_least 4.3 ; then
201 RDEPEND+=" ${GMP_MPFR_DEPS}"
202 elif tc_has_feature fortran ; then
203 RDEPEND+=" fortran? ( ${GMP_MPFR_DEPS} )"
207 tc_version_is_at_least 4.5 && RDEPEND+=" >=dev-libs/mpc-0.8.1:0="
209 if tc_has_feature objc-gc ; then
210 if tc_version_is_at_least 7 ; then
211 RDEPEND+=" objc-gc? ( >=dev-libs/boehm-gc-7.4.2 )"
215 if tc_has_feature graphite ; then
216 if tc_version_is_at_least 5.0 ; then
217 RDEPEND+=" graphite? ( >=dev-libs/isl-0.14:0= )"
218 elif tc_version_is_at_least 4.8 ; then
221 >=dev-libs/cloog-0.18.0:0=
222 >=dev-libs/isl-0.11.1:0=
228 >=sys-devel/bison-1.875
229 >=sys-devel/flex-2.5.4
230 nls? ( sys-devel/gettext )
231 ${GCC_EBUILD_TEST_FLAG}? (
232 >=dev-util/dejagnu-1.4.4
233 >=sys-devel/autogen-5.5.4
236 if tc_has_feature gcj ; then
237 GCJ_DEPS=">=media-libs/libart_lgpl-2.1"
246 tc_version_is_at_least 3.4 && GCJ_GTK_DEPS+=" x11-libs/pango"
247 tc_version_is_at_least 4.2 && GCJ_DEPS+=" app-arch/zip app-arch/unzip"
248 DEPEND+=" gcj? ( awt? ( ${GCJ_GTK_DEPS} ) ${GCJ_DEPS} )"
251 if tc_has_feature systemtap ; then
252 # gcc needs sys/sdt.h headers on target
253 DEPEND+=" systemtap? ( dev-util/systemtap )"
256 PDEPEND=">=sys-devel/gcc-config-1.7"
258 #---->> S + SRC_URI essentials <<----
260 # Set the source directory depending on whether we're using
261 # a prerelease, snapshot, or release tarball.
263 if [[ -n ${PRERELEASE} ]] ; then
264 echo ${WORKDIR}/gcc-${PRERELEASE}
265 elif [[ -n ${SNAPSHOT} ]] ; then
266 echo ${WORKDIR}/gcc-${SNAPSHOT}
268 echo ${WORKDIR}/gcc-${GCC_RELEASE_VER}
273 local devspace="HTTP~vapier/dist/URI HTTP~rhill/dist/URI
274 HTTP~zorry/patches/gcc/URI HTTP~blueness/dist/URI
275 HTTP~tamiko/distfiles/URI HTTP~slyfox/distfiles/URI"
276 devspace=${devspace//HTTP/https:\/\/dev.gentoo.org\/}
277 echo mirror://gentoo/$1 ${devspace//URI/$1}
280 # This function handles the basics of setting the SRC_URI for a gcc ebuild.
281 # To use, set SRC_URI with:
283 # SRC_URI="$(get_gcc_src_uri)"
285 # Other than the variables normally set by portage, this function's behavior
286 # can be altered by setting the following:
289 # If set, this variable signals that we should be using a snapshot of
290 # gcc. It is expected to be in the format "YYYY-MM-DD". Note that if
291 # the ebuild has a _pre suffix, this variable is ignored and the
292 # prerelease tarball is used instead.
296 # This should be set to the version of the gentoo patch tarball.
297 # The resulting filename of this tarball will be:
298 # gcc-${PATCH_GCC_VER:-${GCC_RELEASE_VER}}-patches-${PATCH_VER}.tar.bz2
302 # These variables control patching in various updates for the logic
303 # controlling Position Independant Executables. PIE_VER is expected
304 # to be the version of this patch, and PIE_GCC_VER the gcc version of
308 # PIE_GCC_VER="3.4.0"
309 # The resulting filename of this tarball will be:
310 # gcc-${PIE_GCC_VER:-${GCC_RELEASE_VER}}-piepatches-v${PIE_VER}.tar.bz2
314 # This is for the minispecs files included in the hardened gcc-4.x
315 # The specs files for hardenedno*, vanilla and for building the "specs" file.
316 # SPECS_VER is expected to be the version of this patch, SPECS_GCC_VER
317 # the gcc version of the patch.
319 # SPECS_VER="8.7.6.5"
320 # SPECS_GCC_VER="3.4.0"
321 # The resulting filename of this tarball will be:
322 # gcc-${SPECS_GCC_VER:-${GCC_RELEASE_VER}}-specs-${SPECS_VER}.tar.bz2
326 # These variables control whether or not an ebuild supports Herman
327 # ten Brugge's bounds-checking patches. If you want to use a patch
328 # for an older gcc version with a new gcc, make sure you set
329 # HTB_GCC_VER to that version of gcc.
332 # If set, this variable signals that we should apply additional patches
333 # maintained by upstream Cygwin developers at github/cygwinports/gcc,
334 # using the specified git commit id there. The list of patches to
335 # apply is extracted from gcc.cygport, maintained there as well.
336 # This is done for compilers running on Cygwin, not for cross compilers
337 # with a Cygwin target.
339 export PATCH_GCC_VER=${PATCH_GCC_VER:-${GCC_RELEASE_VER}}
340 export UCLIBC_GCC_VER=${UCLIBC_GCC_VER:-${PATCH_GCC_VER}}
341 export PIE_GCC_VER=${PIE_GCC_VER:-${GCC_RELEASE_VER}}
342 export HTB_GCC_VER=${HTB_GCC_VER:-${GCC_RELEASE_VER}}
343 export SPECS_GCC_VER=${SPECS_GCC_VER:-${GCC_RELEASE_VER}}
345 # Set where to download gcc itself depending on whether we're using a
346 # prerelease, snapshot, or release tarball.
347 if [[ ${PV} == *9999* ]] ; then
348 # Nothing to do w/git snapshots.
350 elif [[ -n ${PRERELEASE} ]] ; then
351 GCC_SRC_URI="ftp://gcc.gnu.org/pub/gcc/prerelease-${PRERELEASE}/gcc-${PRERELEASE}.tar.bz2"
352 elif [[ -n ${SNAPSHOT} ]] ; then
353 if tc_version_is_between 5.5 6 || tc_version_is_between 6.4 7 || tc_version_is_at_least 7.2 ; then
354 GCC_SRC_URI="ftp://gcc.gnu.org/pub/gcc/snapshots/${SNAPSHOT}/gcc-${SNAPSHOT}.tar.xz"
356 GCC_SRC_URI="ftp://gcc.gnu.org/pub/gcc/snapshots/${SNAPSHOT}/gcc-${SNAPSHOT}.tar.bz2"
359 if tc_version_is_between 5.5 6 || tc_version_is_between 6.4 7 || tc_version_is_at_least 7.2 ; then
360 GCC_SRC_URI="mirror://gnu/gcc/gcc-${GCC_PV}/gcc-${GCC_RELEASE_VER}.tar.xz"
362 GCC_SRC_URI="mirror://gnu/gcc/gcc-${GCC_PV}/gcc-${GCC_RELEASE_VER}.tar.bz2"
366 [[ -n ${UCLIBC_VER} ]] && \
367 GCC_SRC_URI+=" $(gentoo_urls gcc-${UCLIBC_GCC_VER}-uclibc-patches-${UCLIBC_VER}.tar.bz2)"
368 [[ -n ${PATCH_VER} ]] && \
369 GCC_SRC_URI+=" $(gentoo_urls gcc-${PATCH_GCC_VER}-patches-${PATCH_VER}.tar.bz2)"
371 [[ -n ${PIE_VER} ]] && \
372 PIE_CORE=${PIE_CORE:-gcc-${PIE_GCC_VER}-piepatches-v${PIE_VER}.tar.bz2} && \
373 GCC_SRC_URI+=" $(gentoo_urls ${PIE_CORE})"
375 # gcc minispec for the hardened gcc 4 compiler
376 [[ -n ${SPECS_VER} ]] && \
377 GCC_SRC_URI+=" $(gentoo_urls gcc-${SPECS_GCC_VER}-specs-${SPECS_VER}.tar.bz2)"
379 # gcc bounds checking patch
380 if [[ -n ${HTB_VER} ]] ; then
381 local HTBFILE="bounds-checking-gcc-${HTB_GCC_VER}-${HTB_VER}.patch.bz2"
384 mirror://sourceforge/boundschecking/${HTBFILE}
385 $(gentoo_urls ${HTBFILE})
389 [[ -n ${D_VER} ]] && \
390 GCC_SRC_URI+=" d? ( mirror://sourceforge/dgcc/gdc-${D_VER}-src.tar.bz2 )"
392 if tc_has_feature gcj ; then
393 if tc_version_is_at_least 4.5 ; then
394 GCC_SRC_URI+=" gcj? ( ftp://sourceware.org/pub/java/ecj-4.5.jar )"
395 elif tc_version_is_at_least 4.3 ; then
396 GCC_SRC_URI+=" gcj? ( ftp://sourceware.org/pub/java/ecj-4.3.jar )"
400 # Cygwin patches from https://github.com/cygwinports/gcc
401 [[ -n ${CYGWINPORTS_GITREV} ]] && \
402 GCC_SRC_URI+=" elibc_Cygwin? ( https://github.com/cygwinports/gcc/archive/${CYGWINPORTS_GITREV}.tar.gz
403 -> gcc-cygwinports-${CYGWINPORTS_GITREV}.tar.gz )"
405 echo "${GCC_SRC_URI}"
408 SRC_URI=$(get_gcc_src_uri)
410 #---->> pkg_pretend <<----
412 toolchain_pkg_pretend() {
413 if [[ -n ${PRERELEASE}${SNAPSHOT} || ${PV} == *9999* ]] &&
414 [[ -z ${I_PROMISE_TO_SUPPLY_PATCHES_WITH_BUGS} ]] ; then
415 die "Please \`export I_PROMISE_TO_SUPPLY_PATCHES_WITH_BUGS=1\` or define it" \
416 "in your make.conf if you want to use this version."
419 if ! use_if_iuse cxx ; then
420 use_if_iuse go && ewarn 'Go requires a C++ compiler, disabled due to USE="-cxx"'
421 use_if_iuse objc++ && ewarn 'Obj-C++ requires a C++ compiler, disabled due to USE="-cxx"'
422 use_if_iuse gcj && ewarn 'GCJ requires a C++ compiler, disabled due to USE="-cxx"'
428 #---->> pkg_setup <<----
430 toolchain_pkg_setup() {
431 # we dont want to use the installed compiler's specs to build gcc
433 unset LANGUAGES #265283
436 #---->> src_unpack <<----
438 toolchain_src_unpack() {
439 if [[ ${PV} == *9999* ]]; then
447 pushd "${WORKDIR}" > /dev/null
448 export PATCH_GCC_VER=${PATCH_GCC_VER:-${GCC_RELEASE_VER}}
449 export UCLIBC_GCC_VER=${UCLIBC_GCC_VER:-${PATCH_GCC_VER}}
450 export PIE_GCC_VER=${PIE_GCC_VER:-${GCC_RELEASE_VER}}
451 export HTB_GCC_VER=${HTB_GCC_VER:-${GCC_RELEASE_VER}}
452 export SPECS_GCC_VER=${SPECS_GCC_VER:-${GCC_RELEASE_VER}}
454 # Injection point for more tarballs. dev-lang/gnat-gpl uses
455 # 'GCC_A_FAKEIT' to specify it's own source and binary tarballs.
456 if [[ -n ${GCC_A_FAKEIT} ]] ; then
457 unpack ${GCC_A_FAKEIT}
458 elif [[ -n ${PRERELEASE} ]] ; then
459 unpack gcc-${PRERELEASE}.tar.bz2
460 elif [[ -n ${SNAPSHOT} ]] ; then
461 if tc_version_is_between 5.5 6 || tc_version_is_between 6.4 7 || tc_version_is_at_least 7.2 ; then
462 unpack gcc-${SNAPSHOT}.tar.xz
464 unpack gcc-${SNAPSHOT}.tar.bz2
466 elif [[ ${PV} != *9999* ]] ; then
467 if tc_version_is_between 5.5 6 || tc_version_is_between 6.4 7 || tc_version_is_at_least 7.2 ; then
468 unpack gcc-${GCC_RELEASE_VER}.tar.xz
470 unpack gcc-${GCC_RELEASE_VER}.tar.bz2
474 if [[ -n ${D_VER} ]] && use d ; then
475 pushd "${S}"/gcc > /dev/null
476 unpack gdc-${D_VER}-src.tar.bz2
478 ebegin "Adding support for the D language"
479 ./gcc/d/setup-gcc.sh >& "${T}"/dgcc.log
481 eerror "The D GCC package failed to apply"
482 eerror "Please include this log file when posting a bug report:"
483 eerror " ${T}/dgcc.log"
484 die "failed to include the D language"
489 [[ -n ${PATCH_VER} ]] && \
490 unpack gcc-${PATCH_GCC_VER}-patches-${PATCH_VER}.tar.bz2
492 [[ -n ${UCLIBC_VER} ]] && \
493 unpack gcc-${UCLIBC_GCC_VER}-uclibc-patches-${UCLIBC_VER}.tar.bz2
496 if [[ -n ${PIE_CORE} ]] ; then
499 unpack gcc-${PIE_GCC_VER}-piepatches-v${PIE_VER}.tar.bz2
501 [[ -n ${SPECS_VER} ]] && \
502 unpack gcc-${SPECS_GCC_VER}-specs-${SPECS_VER}.tar.bz2
505 use_if_iuse boundschecking && unpack "bounds-checking-gcc-${HTB_GCC_VER}-${HTB_VER}.patch.bz2"
507 [[ -n ${CYGWINPORTS_GITREV} ]] && use elibc_Cygwin && unpack "gcc-cygwinports-${CYGWINPORTS_GITREV}.tar.gz"
512 #---->> src_prepare <<----
514 # 'epatch' is not available in EAPI=7. Abstract away patchset application
515 # until we eventually get all gcc ebuilds on EAPI=7 or later.
517 [[ ${#@} -lt 2 ]] && die "usage: tc_apply_patches <message> <patches...>"
522 # Note: even for EAPI=6 we used 'epatch' semantics. To avoid
523 # breaking existing ebuilds use 'eapply' only in EAPI=7 or later.
526 *) die "Update apply_patches() for ${EAPI}." ;;
530 toolchain_src_prepare() {
531 export BRANDING_GCC_PKGVERSION="Gentoo ${GCC_PVR}"
534 do_gcc_gentoo_patches
537 do_gcc_CYGWINPORTS_patches
542 *) die "Update toolchain_src_prepare() for ${EAPI}." ;;
545 if ( tc_version_is_at_least 4.8.2 || use_if_iuse hardened ) && ! use vanilla ; then
549 # install the libstdc++ python into the right location
550 # http://gcc.gnu.org/PR51368
551 if tc_version_is_between 4.5 4.7 ; then
553 '/^pythondir =/s:=.*:= $(datadir)/python:' \
554 "${S}"/libstdc++-v3/python/Makefile.in || die
557 # make sure the pkg config files install into multilib dirs.
558 # since we configure with just one --libdir, we can't use that
559 # (as gcc itself takes care of building multilibs). #435728
560 find "${S}" -name Makefile.in \
561 -exec sed -i '/^pkgconfigdir/s:=.*:=$(toolexeclibdir)/pkgconfig:' {} +
563 # No idea when this first started being fixed, but let's go with 4.3.x for now
564 if ! tc_version_is_at_least 4.3 ; then
566 for x in contrib/test_summary libstdc++-v3/scripts/check_survey.in ; do
567 [[ -e ${x} ]] && fix_files="${fix_files} ${x}"
569 ht_fix_file ${fix_files} */configure *.sh */Makefile.in
572 setup_multilib_osdirnames
575 if tc_version_is_at_least 4.1 ; then
576 if [[ -n ${SNAPSHOT} || -n ${PRERELEASE} ]] ; then
577 # BASE-VER must be a three-digit version number
578 # followed by an optional -pre string
579 # eg. 4.5.1, 4.6.2-pre20120213, 4.7.0-pre9999
580 # If BASE-VER differs from ${PV/_/-} then libraries get installed in
581 # the wrong directory.
582 echo ${PV/_/-} > "${S}"/gcc/BASE-VER
586 # >= gcc-4.3 doesn't bundle ecj.jar, so copy it
587 if tc_version_is_at_least 4.3 && use_if_iuse gcj ; then
588 if tc_version_is_at_least 4.5 ; then
589 einfo "Copying ecj-4.5.jar"
590 cp -pPR "${DISTDIR}/ecj-4.5.jar" "${S}/ecj.jar" || die
592 einfo "Copying ecj-4.3.jar"
593 cp -pPR "${DISTDIR}/ecj-4.3.jar" "${S}/ecj.jar" || die
597 # disable --as-needed from being compiled into gcc specs
598 # natively when using a gcc version < 3.4.4
599 # http://gcc.gnu.org/PR14992
600 if ! tc_version_is_at_least 3.4.4 ; then
601 sed -i -e s/HAVE_LD_AS_NEEDED/USE_LD_AS_NEEDED/g "${S}"/gcc/config.in
604 # In gcc 3.3.x and 3.4.x, rename the java bins to gcc-specific names
605 # in line with gcc-4.
606 if tc_version_is_between 3.3 4.0 ; then
607 do_gcc_rename_java_bins
610 # Prevent libffi from being installed
611 if tc_version_is_between 3.0 4.8 ; then
612 sed -i -e 's/\(install.*:\) install-.*recursive/\1/' "${S}"/libffi/Makefile.in || die
613 sed -i -e 's/\(install-data-am:\).*/\1/' "${S}"/libffi/include/Makefile.in || die
616 # Fixup libtool to correctly generate .la files with portage
617 elibtoolize --portage --shallow --no-uclibc
621 # update configure files
623 einfo "Fixing misc issues in configure files"
624 for f in $(grep -l 'autoconf version 2.13' $(find "${S}" -name configure)) ; do
625 ebegin " Updating ${f/${S}\/} [LANG]"
626 patch "${f}" "${FILESDIR}"/gcc-configure-LANG.patch >& "${T}"/configure-patch.log \
627 || eerror "Please file a bug about this"
630 sed -i 's|A-Za-z0-9|[:alnum:]|g' "${S}"/gcc/*.awk #215828
632 # Prevent new texinfo from breaking old versions (see #198182, #464008)
633 if tc_version_is_at_least 4.1; then
634 tc_apply_patches "Remove texinfo (bug #198182, bug ##464008)" "${FILESDIR}"/gcc-configure-texinfo.patch
638 if [[ -x contrib/gcc_update ]] ; then
639 einfo "Touching generated files"
640 ./contrib/gcc_update --touch | \
647 do_gcc_gentoo_patches() {
648 if ! use vanilla ; then
649 if [[ -n ${PATCH_VER} ]] ; then
650 tc_apply_patches "Applying Gentoo patches ..." "${WORKDIR}"/patch/*.patch
651 BRANDING_GCC_PKGVERSION="${BRANDING_GCC_PKGVERSION} p${PATCH_VER}"
653 if [[ -n ${UCLIBC_VER} ]] ; then
654 tc_apply_patches "Applying uClibc patches ..." "${WORKDIR}"/uclibc/*.patch
659 do_gcc_HTB_patches() {
660 use_if_iuse boundschecking || return 0
662 # modify the bounds checking patch with a regression patch
663 tc_apply_patches "Bounds checking patch" "${WORKDIR}/bounds-checking-gcc-${HTB_GCC_VER}-${HTB_VER}.patch"
664 BRANDING_GCC_PKGVERSION="${BRANDING_GCC_PKGVERSION}, HTB-${HTB_GCC_VER}-${HTB_VER}"
667 do_gcc_PIE_patches() {
669 use vanilla && return 0
671 tc_apply_patches "Applying pie patches ..." "${WORKDIR}"/piepatch/*.patch
673 BRANDING_GCC_PKGVERSION="${BRANDING_GCC_PKGVERSION}, pie-${PIE_VER}"
676 do_gcc_CYGWINPORTS_patches() {
677 [[ -n ${CYGWINPORTS_GITREV} ]] || return 0
678 use elibc_Cygwin || return 0
680 local p d="${WORKDIR}/gcc-${CYGWINPORTS_GITREV}"
681 # readarray -t is available since bash-4.4 only, #690686
682 local patches=( $(sed -e '1,/PATCH_URI="/d;/"/,$d' < "${d}"/gcc.cygport) )
683 tc_apply_patches "Applying cygwin port patches ..." ${patches[*]}
686 # configure to build with the hardened GCC specs as the default
688 local gcc_hard_flags=""
690 # If we use gcc-6 or newer with pie enable to compile older gcc we need to pass -no-pie
691 # to stage1; bug #618908
692 if ! tc_version_is_at_least 6.0 && [[ $(gcc-major-version) -ge 6 ]] ; then
693 einfo "Disabling PIE in stage1 (only) ..."
694 sed -i -e "/^STAGE1_LDFLAGS/ s/$/ -no-pie/" "${S}"/Makefile.in || die
697 # Gcc >= 6.X we can use configurations options to turn pie/ssp on as default
698 if tc_version_is_at_least 6.0 ; then
699 if use_if_iuse pie ; then
700 einfo "Updating gcc to use automatic PIE building ..."
702 if use_if_iuse ssp ; then
703 einfo "Updating gcc to use automatic SSP building ..."
705 if use_if_iuse hardened ; then
706 # Will add some hardened options as default, like:
707 # -fstack-clash-protection
709 # see *_all_extra-options.patch gcc patches.
710 gcc_hard_flags+=" -DEXTRA_OPTIONS"
711 # rebrand to make bug reports easier
712 BRANDING_GCC_PKGVERSION=${BRANDING_GCC_PKGVERSION/Gentoo/Gentoo Hardened}
715 if use_if_iuse hardened ; then
716 # rebrand to make bug reports easier
717 BRANDING_GCC_PKGVERSION=${BRANDING_GCC_PKGVERSION/Gentoo/Gentoo Hardened}
718 if hardened_gcc_works ; then
719 einfo "Updating gcc to use automatic PIE + SSP building ..."
720 gcc_hard_flags+=" -DEFAULT_PIE_SSP"
721 elif hardened_gcc_works pie ; then
722 einfo "Updating gcc to use automatic PIE building ..."
723 ewarn "SSP has not been enabled by default"
724 gcc_hard_flags+=" -DEFAULT_PIE"
725 elif hardened_gcc_works ssp ; then
726 einfo "Updating gcc to use automatic SSP building ..."
727 ewarn "PIE has not been enabled by default"
728 gcc_hard_flags+=" -DEFAULT_SSP"
730 # do nothing if hardened isn't supported, but don't die either
731 ewarn "hardened is not supported for this arch in this gcc version"
735 if hardened_gcc_works ssp ; then
736 einfo "Updating gcc to use automatic SSP building ..."
737 gcc_hard_flags+=" -DEFAULT_SSP"
742 # we want to be able to control the pie patch logic via something other
744 sed -e '/^ALL_CFLAGS/iHARD_CFLAGS = ' \
745 -e 's|^ALL_CFLAGS = |ALL_CFLAGS = $(HARD_CFLAGS) |' \
746 -i "${S}"/gcc/Makefile.in
747 # Need to add HARD_CFLAGS to ALL_CXXFLAGS on >= 4.7
748 if tc_version_is_at_least 4.7 ; then
749 sed -e '/^ALL_CXXFLAGS/iHARD_CFLAGS = ' \
750 -e 's|^ALL_CXXFLAGS = |ALL_CXXFLAGS = $(HARD_CFLAGS) |' \
751 -i "${S}"/gcc/Makefile.in
755 -e "/^HARD_CFLAGS = /s|=|= ${gcc_hard_flags} |" \
756 "${S}"/gcc/Makefile.in || die
760 # This is a historical wart. The original Gentoo/amd64 port used:
761 # lib32 - 32bit binaries (x86)
762 # lib64 - 64bit binaries (x86_64)
763 # lib - "native" binaries (a symlink to lib64)
764 # Most other distros use the logic (including mainline gcc):
765 # lib - 32bit binaries (x86)
766 # lib64 - 64bit binaries (x86_64)
767 # Over time, Gentoo is migrating to the latter form.
769 # Unfortunately, due to distros picking the lib32 behavior, newer gcc
770 # versions will dynamically detect whether to use lib or lib32 for its
771 # 32bit multilib. So, to keep the automagic from getting things wrong
772 # while people are transitioning from the old style to the new style,
773 # we always set the MULTILIB_OSDIRNAMES var for relevant targets.
774 setup_multilib_osdirnames() {
775 is_multilib || return 0
778 local libdirs="../lib64 ../lib32"
780 # this only makes sense for some Linux targets
782 x86_64*-linux*) config="i386" ;;
783 powerpc64*-linux*) config="rs6000" ;;
784 sparc64*-linux*) config="sparc" ;;
785 s390x*-linux*) config="s390" ;;
791 if tc_version_is_at_least 4.6 ; then
792 sed_args+=( -e 's:$[(]call if_multiarch[^)]*[)]::g' )
794 if [[ ${SYMLINK_LIB} == "yes" ]] ; then
795 einfo "updating multilib directories to be: ${libdirs}"
796 if tc_version_is_at_least 4.6.4 || tc_version_is_at_least 4.7 ; then
797 sed_args+=( -e '/^MULTILIB_OSDIRNAMES.*lib32/s:[$][(]if.*):../lib32:' )
799 sed_args+=( -e "/^MULTILIB_OSDIRNAMES/s:=.*:= ${libdirs}:" )
802 einfo "using upstream multilib; disabling lib32 autodetection"
803 sed_args+=( -r -e 's:[$][(]if.*,(.*)[)]:\1:' )
805 sed -i "${sed_args[@]}" "${S}"/gcc/config/${config} || die
808 gcc_version_patch() {
809 # gcc-4.3+ has configure flags (whoo!)
810 tc_version_is_at_least 4.3 && return 0
812 local version_string=${GCC_CONFIG_VER}
814 einfo "patching gcc version: ${version_string} (${BRANDING_GCC_PKGVERSION})"
816 local gcc_sed=( -e 's:gcc\.gnu\.org/bugs\.html:bugs\.gentoo\.org/:' )
817 if grep -qs VERSUFFIX "${S}"/gcc/version.c ; then
818 gcc_sed+=( -e "/VERSUFFIX \"\"/s:\"\":\" (${BRANDING_GCC_PKGVERSION})\":" )
820 version_string="${version_string} (${BRANDING_GCC_PKGVERSION})"
821 gcc_sed+=( -e "/const char version_string\[\] = /s:= \".*\":= \"${version_string}\":" )
823 sed -i "${gcc_sed[@]}" "${S}"/gcc/version.c || die
826 do_gcc_rename_java_bins() {
827 # bug #139918 - conflict between gcc and java-config-2 for ownership of
828 # /usr/bin/rmi{c,registry}. Done with mv & sed rather than a patch
829 # because patches would be large (thanks to the rename of man files),
830 # and it's clear from the sed invocations that all that changes is the
831 # rmi{c,registry} names to grmi{c,registry} names.
832 # Kevin F. Quinn 2006-07-12
833 einfo "Renaming jdk executables rmic and rmiregistry to grmic and grmiregistry."
834 # 1) Move the man files if present (missing prior to gcc-3.4)
835 for manfile in rmic rmiregistry ; do
836 [[ -f ${S}/gcc/doc/${manfile}.1 ]] || continue
837 mv "${S}"/gcc/doc/${manfile}.1 "${S}"/gcc/doc/g${manfile}.1
839 # 2) Fixup references in the docs if present (mission prior to gcc-3.4)
840 for jfile in gcc/doc/gcj.info gcc/doc/grmic.1 gcc/doc/grmiregistry.1 gcc/java/gcj.texi ; do
841 [[ -f ${S}/${jfile} ]] || continue
842 sed -i -e 's:rmiregistry:grmiregistry:g' "${S}"/${jfile} ||
843 die "Failed to fixup file ${jfile} for rename to grmiregistry"
844 sed -i -e 's:rmic:grmic:g' "${S}"/${jfile} ||
845 die "Failed to fixup file ${jfile} for rename to grmic"
847 # 3) Fixup Makefiles to build the changed executable names
848 # These are present in all 3.x versions, and are the important bit
849 # to get gcc to build with the new names.
850 for jfile in libjava/Makefile.am libjava/Makefile.in gcc/java/Make-lang.in ; do
851 sed -i -e 's:rmiregistry:grmiregistry:g' "${S}"/${jfile} ||
852 die "Failed to fixup file ${jfile} for rename to grmiregistry"
853 # Careful with rmic on these files; it's also the name of a directory
854 # which should be left unchanged. Replace occurrences of 'rmic$',
855 # 'rmic_' and 'rmic '.
856 sed -i -e 's:rmic\([$_ ]\):grmic\1:g' "${S}"/${jfile} ||
857 die "Failed to fixup file ${jfile} for rename to grmic"
861 #---->> src_configure <<----
863 toolchain_src_configure() {
867 einfo "CFLAGS=\"${CFLAGS}\""
868 einfo "CXXFLAGS=\"${CXXFLAGS}\""
869 einfo "LDFLAGS=\"${LDFLAGS}\""
871 # Force internal zip based jar script to avoid random
872 # issues with 3rd party jar implementations. #384291
875 # For hardened gcc 4.3 piepatchset to build the hardened specs
876 # file (build.specs) to use when building gcc.
877 if ! tc_version_is_at_least 4.4 && want_minispecs ; then
878 setup_minispecs_gcc_build_specs
881 local confgcc=( --host=${CHOST} )
883 if is_crosscompile || tc-is-cross-compiler ; then
884 # Straight from the GCC install doc:
885 # "GCC has code to correctly determine the correct value for target
886 # for nearly all native systems. Therefore, we highly recommend you
887 # not provide a configure target when configuring a native compiler."
888 confgcc+=( --target=${CTARGET} )
890 [[ -n ${CBUILD} ]] && confgcc+=( --build=${CBUILD} )
894 --bindir="${BINPATH}"
895 --includedir="${INCLUDEPATH}"
896 --datadir="${DATAPATH}"
897 --mandir="${DATAPATH}/man"
898 --infodir="${DATAPATH}/info"
899 --with-gxx-include-dir="${STDCXX_INCDIR}"
902 # Stick the python scripts in their own slotted directory (bug #279252)
904 # --with-python-dir=DIR
905 # Specifies where to install the Python modules used for aot-compile. DIR
906 # should not include the prefix used in installation. For example, if the
907 # Python modules are to be installed in /usr/lib/python2.5/site-packages,
908 # then --with-python-dir=/lib/python2.5/site-packages should be passed.
910 # This should translate into "/share/gcc-data/${CTARGET}/${GCC_CONFIG_VER}/python"
911 if tc_version_is_at_least 4.4 ; then
912 confgcc+=( --with-python-dir=${DATAPATH/$PREFIX/}/python )
918 is_cxx && GCC_LANG+=",c++"
919 is_d && GCC_LANG+=",d"
920 is_gcj && GCC_LANG+=",java"
921 is_go && GCC_LANG+=",go"
922 is_jit && GCC_LANG+=",jit"
923 if is_objc || is_objcxx ; then
925 if tc_version_is_at_least 4 ; then
926 use objc-gc && confgcc+=( --enable-objc-gc )
928 is_objcxx && GCC_LANG+=",obj-c++"
931 # fortran support just got sillier! the lang value can be f77 for
932 # fortran77, f95 for fortran95, or just plain old fortran for the
933 # currently supported standard depending on gcc version.
934 is_fortran && GCC_LANG+=",fortran"
935 is_f77 && GCC_LANG+=",f77"
936 is_f95 && GCC_LANG+=",f95"
938 # We do NOT want 'ADA support' in here!
939 # is_ada && GCC_LANG+=",ada"
941 confgcc+=( --enable-languages=${GCC_LANG} )
953 confgcc+=( --enable-nls --without-included-gettext )
955 confgcc+=( --disable-nls )
958 tc_version_is_at_least 3.4 || confgcc+=( --disable-libunwind-exceptions )
960 # Use the default ("release") checking because upstream usually neglects
961 # to test "disabled" so it has a history of breaking. bug #317217
962 if tc_version_is_at_least 3.4 && in_iuse debug ; then
963 # The "release" keyword is new to 4.0. bug #551636
964 local off=$(tc_version_is_at_least 4.0 && echo release || echo no)
965 confgcc+=( --enable-checking="${GCC_CHECKS_LIST:-$(usex debug yes ${off})}" )
969 tc_version_is_at_least 4.3 && confgcc+=(
970 --with-bugurl=https://bugs.gentoo.org/
971 --with-pkgversion="${BRANDING_GCC_PKGVERSION}"
974 # If we want hardened support with the newer piepatchset for >=gcc 4.4
975 if tc_version_is_at_least 4.4 && want_minispecs && in_iuse hardened ; then
976 confgcc+=( $(use_enable hardened esp) )
979 # allow gcc to search for clock funcs in the main C lib.
980 # if it can't find them, then tough cookies -- we aren't
981 # going to link in -lrt to all C++ apps. bug #411681
982 if tc_version_is_at_least 4.4 && is_cxx ; then
983 confgcc+=( --enable-libstdcxx-time )
986 # Build compiler itself using LTO
987 if tc_version_is_at_least 9.1 && use_if_iuse lto ; then
988 confgcc+=( --with-build-config=bootstrap-lto )
991 # Support to disable pch when building libstdcxx
992 if tc_version_is_at_least 6.0 && ! use_if_iuse pch ; then
993 confgcc+=( --disable-libstdcxx-pch )
996 # The jit language requires this.
997 is_jit && confgcc+=( --enable-host-shared )
999 # build-id was disabled for file collisions: bug #526144
1001 # # Turn on the -Wl,--build-id flag by default for ELF targets. bug #525942
1002 # # This helps with locating debug files.
1003 # case ${CTARGET} in
1004 # *-linux-*|*-elf|*-eabi)
1005 # tc_version_is_at_least 4.5 && confgcc+=(
1006 # --enable-linker-build-id
1011 # newer gcc versions like to bootstrap themselves with C++,
1012 # so we need to manually disable it ourselves
1013 if tc_version_is_between 4.7 4.8 && ! is_cxx ; then
1014 confgcc+=( --disable-build-with-cxx --disable-build-poststage1-with-cxx )
1017 ### Cross-compiler options
1018 if is_crosscompile ; then
1019 # Enable build warnings by default with cross-compilers when system
1020 # paths are included (e.g. via -I flags).
1021 confgcc+=( --enable-poison-system-directories )
1023 # When building a stage1 cross-compiler (just C compiler), we have to
1024 # disable a bunch of features or gcc goes boom
1025 local needed_libc=""
1027 *-linux) needed_libc=error-unknown-libc;;
1028 *-dietlibc) needed_libc=dietlibc;;
1031 # Bare-metal targets don't have access to clock_gettime()
1032 # arm-none-eabi example: bug #589672
1033 # But we explicitly do --enable-libstdcxx-time above.
1035 confgcc+=( --disable-libstdcxx-time )
1037 *-freebsd*) needed_libc=freebsd-lib;;
1038 *-gnu*) needed_libc=glibc;;
1039 *-klibc) needed_libc=klibc;;
1040 *-musl*) needed_libc=musl;;
1042 # Enable shared library support only on targets
1043 # that support it: bug #291870
1044 if ! echo '#include <features.h>' | \
1045 $(tc-getCPP ${CTARGET}) -E -dD - 2>/dev/null | \
1046 grep -q __HAVE_SHARED__
1048 confgcc+=( --disable-shared )
1050 needed_libc=uclibc-ng
1052 *-cygwin) needed_libc=cygwin;;
1054 *-w64-mingw*) needed_libc=mingw64-runtime;;
1055 avr) confgcc+=( --enable-shared --disable-threads );;
1057 if [[ -n ${needed_libc} ]] ; then
1058 local confgcc_no_libc=( --disable-shared )
1059 tc_version_is_at_least 4.8 && confgcc_no_libc+=( --disable-libatomic )
1060 if ! has_version ${CATEGORY}/${needed_libc} ; then
1062 "${confgcc_no_libc[@]}"
1066 elif has_version "${CATEGORY}/${needed_libc}[headers-only(-)]" ; then
1068 "${confgcc_no_libc[@]}"
1069 --with-sysroot="${PREFIX}"/${CTARGET}
1072 confgcc+=( --with-sysroot="${PREFIX}"/${CTARGET} )
1076 tc_version_is_at_least 4.2 && confgcc+=( --disable-bootstrap )
1078 if tc-is-static-only ; then
1079 confgcc+=( --disable-shared )
1081 confgcc+=( --enable-shared )
1085 confgcc+=( --enable-threads=win32 ) ;;
1087 confgcc+=( --enable-threads=posix ) ;;
1091 # __cxa_atexit is "essential for fully standards-compliant handling of
1092 # destructors", but apparently requires glibc.
1095 if tc_has_feature nptl ; then
1097 --disable-__cxa_atexit
1098 $(use_enable nptl tls)
1101 tc_version_is_between 3.3 3.4 && confgcc+=( --enable-sjlj-exceptions )
1102 if tc_version_is_between 3.4 4.3 ; then
1103 confgcc+=( --enable-clocale=uclibc )
1107 confgcc+=( --with-newlib )
1110 confgcc+=( --enable-__cxa_atexit )
1114 --enable-__cxa_atexit
1115 --enable-clocale=gnu
1119 confgcc+=( --enable-__cxa_atexit )
1122 confgcc+=( --enable-__cxa_atexit )
1128 gcc-multilib-configure
1130 # ppc altivec support
1131 in_iuse altivec && confgcc+=( $(use_enable altivec) )
1133 # gcc has fixed-point arithmetic support in 4.3 for mips targets that can
1134 # significantly increase compile time by several hours. This will allow
1135 # users to control this feature in the event they need the support.
1136 tc_version_is_at_least 4.3 && in_iuse fixed-point && confgcc+=( $(use_enable fixed-point) )
1138 case $(tc-is-softfloat) in
1139 yes) confgcc+=( --with-float=soft ) ;;
1140 softfp) confgcc+=( --with-float=softfp ) ;;
1142 # If they've explicitly opt-ed in, do hardfloat,
1143 # otherwise let the gcc default kick in.
1144 case ${CTARGET//_/-} in
1145 *-hardfloat-*|*eabihf) confgcc+=( --with-float=hard ) ;;
1149 local with_abi_map=()
1151 arm) #264534 #414395
1152 local a arm_arch=${CTARGET%%-*}
1153 # Remove trailing endian variations first: eb el be bl b l
1154 for a in e{b,l} {b,l}e b l ; do
1155 if [[ ${arm_arch} == *${a} ]] ; then
1156 arm_arch=${arm_arch%${a}}
1160 # Convert armv7{a,r,m} to armv7-{a,r,m}
1161 [[ ${arm_arch} == armv7? ]] && arm_arch=${arm_arch/7/7-}
1162 # See if this is a valid --with-arch flag
1163 if (srcdir=${S}/gcc target=${CTARGET} with_arch=${arm_arch};
1164 . "${srcdir}"/config.gcc) &>/dev/null
1166 confgcc+=( --with-arch=${arm_arch} )
1169 # Make default mode thumb for microcontroller classes #418209
1170 [[ ${arm_arch} == *-m ]] && confgcc+=( --with-mode=thumb )
1173 if [[ $(tc-is-softfloat) == "no" ]] && \
1174 [[ ${CTARGET} == armv[67]* ]] && \
1175 tc_version_is_at_least 4.5
1177 # Follow the new arm hardfp distro standard by default
1178 confgcc+=( --with-float=hard )
1180 armv6*) confgcc+=( --with-fpu=vfp ) ;;
1181 armv7*) confgcc+=( --with-fpu=vfpv3-d16 ) ;;
1186 # Add --with-abi flags to set default ABI
1187 confgcc+=( --with-abi=$(gcc-abi-map ${TARGET_DEFAULT_ABI}) )
1190 # drop the older/ABI checks once this get's merged into some
1191 # version of gcc upstream
1192 if tc_version_is_at_least 4.8 && has x32 $(get_all_abis TARGET) ; then
1193 confgcc+=( --with-abi=$(gcc-abi-map ${TARGET_DEFAULT_ABI}) )
1197 # Default arch for x86 is normally i386, lets give it a bump
1198 # since glibc will do so based on CTARGET anyways
1199 confgcc+=( --with-arch=${CTARGET%%-*} )
1202 # Enable sjlj exceptions for backward compatibility on hppa
1203 [[ ${GCCMAJOR} == "3" ]] && confgcc+=( --enable-sjlj-exceptions )
1206 # Set up defaults based on current CFLAGS
1207 is-flagq -mfloat-gprs=double && confgcc+=( --enable-e500-double )
1208 [[ ${CTARGET//_/-} == *-e500v2-* ]] && confgcc+=( --enable-e500-double )
1211 # Add --with-abi flags to set default ABI
1212 confgcc+=( --with-abi=$(gcc-abi-map ${TARGET_DEFAULT_ABI}) )
1216 # if the target can do biarch (-m32/-m64), enable it. overhead should
1217 # be small, and should simplify building of 64bit kernels in a 32bit
1218 # userland by not needing sys-devel/kgcc64. #349405
1220 ppc|ppc64) tc_version_is_at_least 3.4 && confgcc+=( --enable-targets=all ) ;;
1221 sparc) tc_version_is_at_least 4.4 && confgcc+=( --enable-targets=all ) ;;
1222 amd64|x86) tc_version_is_at_least 4.3 && confgcc+=( --enable-targets=all ) ;;
1225 # On Darwin we need libdir to be set in order to get correct install names
1226 # for things like libobjc-gnu, libgcj and libfortran. If we enable it on
1227 # non-Darwin we screw up the behaviour this eclass relies on. We in
1228 # particular need this over --libdir for bug #255315.
1229 [[ ${CTARGET} == *-darwin* ]] && \
1230 confgcc+=( --enable-version-specific-runtime-libs )
1234 if tc_version_is_between 3.0 7.0 ; then
1236 confgcc+=( --disable-gjdoc )
1237 use awt && confgcc+=( --enable-java-awt=gtk )
1239 confgcc+=( --disable-libgcj )
1243 if tc_version_is_at_least 4.2 ; then
1244 if in_iuse openmp ; then
1245 # Make sure target has pthreads support. #326757 #335883
1246 # There shouldn't be a chicken & egg problem here as openmp won't
1247 # build without a C library, and you can't build that w/out
1248 # already having a compiler ...
1249 if ! is_crosscompile || \
1250 $(tc-getCPP ${CTARGET}) -E - <<<"#include <pthread.h>" >& /dev/null
1252 confgcc+=( $(use_enable openmp libgomp) )
1254 # Force disable as the configure script can be dumb #359855
1255 confgcc+=( --disable-libgomp )
1258 # For gcc variants where we don't want openmp (e.g. kgcc)
1259 confgcc+=( --disable-libgomp )
1263 if tc_version_is_at_least 4.0 ; then
1264 if in_iuse mudflap ; then
1265 confgcc+=( $(use_enable mudflap libmudflap) )
1267 confgcc+=( --disable-libmudflap )
1270 if use_if_iuse libssp ; then
1271 confgcc+=( --enable-libssp )
1273 if hardened_gcc_is_stable ssp; then
1274 export gcc_cv_libc_provides_ssp=yes
1276 if use_if_iuse ssp; then
1277 # On some targets USE="ssp -libssp" is an invalid
1278 # configuration as target libc does not provide
1279 # stack_chk_* functions. Do not disable libssp there.
1281 mingw*|*-mingw*) ewarn "Not disabling libssp" ;;
1282 *) confgcc+=( --disable-libssp ) ;;
1285 confgcc+=( --disable-libssp )
1290 if in_iuse cilk ; then
1291 confgcc+=( $(use_enable cilk libcilkrts) )
1294 if in_iuse mpx ; then
1295 confgcc+=( $(use_enable mpx libmpx) )
1298 if in_iuse systemtap ; then
1299 confgcc+=( $(use_enable systemtap) )
1302 if in_iuse vtv ; then
1304 $(use_enable vtv vtable-verify)
1305 # See Note [implicitly enabled flags]
1306 $(usex vtv '' --disable-libvtv)
1310 # newer gcc's come with libquadmath, but only fortran uses
1311 # it, so auto punt it when we don't care
1312 if tc_version_is_at_least 4.6 && ! is_fortran ; then
1313 confgcc+=( --disable-libquadmath )
1316 if tc_version_is_at_least 4.6 ; then
1317 confgcc+=( --enable-lto )
1318 elif tc_version_is_at_least 4.5 ; then
1319 confgcc+=( --disable-lto )
1322 # graphite was added in 4.4 but we only support it in 4.8+ due to external
1323 # library issues. #448024
1324 if tc_version_is_at_least 5.0 && in_iuse graphite ; then
1325 confgcc+=( $(use_with graphite isl) )
1326 use graphite && confgcc+=( --disable-isl-version-check )
1327 elif tc_version_is_at_least 4.8 && in_iuse graphite ; then
1328 confgcc+=( $(use_with graphite cloog) )
1329 use graphite && confgcc+=( --disable-isl-version-check )
1330 elif tc_version_is_at_least 4.4 ; then
1331 confgcc+=( --without-{cloog,ppl} )
1334 if tc_version_is_at_least 4.8 && in_iuse sanitize ; then
1335 # See Note [implicitly enabled flags]
1336 confgcc+=( $(usex sanitize '' --disable-libsanitizer) )
1339 if tc_version_is_at_least 6.0 && in_iuse pie ; then
1340 confgcc+=( $(use_enable pie default-pie) )
1343 if tc_version_is_at_least 6.0 && in_iuse ssp ; then
1345 # This defaults to -fstack-protector-strong.
1346 $(use_enable ssp default-ssp)
1350 # Disable gcc info regeneration -- it ships with generated info pages
1351 # already. Our custom version/urls/etc... trigger it. #464008
1352 export gcc_cv_prog_makeinfo_modern=no
1354 # Do not let the X detection get in our way. We know things can be found
1355 # via system paths, so no need to hardcode things that'll break multilib.
1356 # Older gcc versions will detect ac_x_libraries=/usr/lib64 which ends up
1357 # killing the 32bit builds which want /usr/lib.
1358 export ac_cv_have_x='have_x=yes ac_x_includes= ac_x_libraries='
1360 confgcc+=( "$@" ${EXTRA_ECONF} )
1362 # Nothing wrong with a good dose of verbosity
1364 einfo "PREFIX: ${PREFIX}"
1365 einfo "BINPATH: ${BINPATH}"
1366 einfo "LIBPATH: ${LIBPATH}"
1367 einfo "DATAPATH: ${DATAPATH}"
1368 einfo "STDCXX_INCDIR: ${STDCXX_INCDIR}"
1370 einfo "Languages: ${GCC_LANG}"
1372 einfo "Configuring GCC with: ${confgcc[@]//--/\n\t--}"
1375 # Build in a separate build tree
1376 mkdir -p "${WORKDIR}"/build
1377 pushd "${WORKDIR}"/build > /dev/null
1379 # and now to do the actual configuration
1381 echo "${S}"/configure "${confgcc[@]}"
1382 # Older gcc versions did not detect bash and re-exec itself, so force the
1383 # use of bash. Newer ones will auto-detect, but this is not harmful.
1384 CONFIG_SHELL="${EPREFIX}/bin/bash" \
1385 bash "${S}"/configure "${confgcc[@]}" || die "failed to run configure"
1387 # return to whatever directory we were in before
1391 # Replace -m flags unsupported by the version being built with the best
1392 # available equivalent
1393 downgrade_arch_flags() {
1394 local arch bver i isa myarch mytune rep ver
1396 bver=${1:-${GCC_BRANCH_VER}}
1397 [[ $(gcc-version) < ${bver} ]] && return 0
1398 [[ $(tc-arch) != amd64 && $(tc-arch) != x86 ]] && return 0
1400 myarch=$(get-flag march)
1401 mytune=$(get-flag mtune)
1403 # If -march=native isn't supported we have to tease out the actual arch
1404 if [[ ${myarch} == native || ${mytune} == native ]] ; then
1405 if [[ ${bver} < 4.2 ]] ; then
1406 arch=$($(tc-getCC) -march=native -v -E -P - </dev/null 2>&1 \
1407 | sed -rn "/cc1.*-march/s:.*-march=([^ ']*).*:\1:p")
1408 replace-cpu-flags native ${arch}
1412 # Handle special -mtune flags
1413 [[ ${mytune} == intel && ${bver} < 4.9 ]] && replace-cpu-flags intel generic
1414 [[ ${mytune} == generic && ${bver} < 4.2 ]] && filter-flags '-mtune=*'
1415 [[ ${mytune} == x86-64 ]] && filter-flags '-mtune=*'
1416 [[ ${bver} < 3.4 ]] && filter-flags '-mtune=*'
1418 # "added" "arch" "replacement"
1422 4.9 broadwell core-avx2
1423 4.9 haswell core-avx2
1424 4.9 ivybridge core-avx-i
1426 4.9 sandybridge corei7-avx
1427 4.9 silvermont corei7
1432 4.7 core-avx2 core-avx-i
1435 4.6 core-avx-i core2
1437 4.6 corei7-avx core2
1440 4.3 athlon64-sse3 k8
1443 4.3 geode k6-2 # gcc.gnu.org/PR41989#c22
1446 3.4 athlon-fx x86-64
1451 3.4 pentium-m pentium3
1452 3.4 pentium3m pentium3
1453 3.4 pentium4m pentium4
1456 for ((i = 0; i < ${#archlist[@]}; i += 3)) ; do
1457 myarch=$(get-flag march)
1458 mytune=$(get-flag mtune)
1461 arch=${archlist[i + 1]}
1462 rep=${archlist[i + 2]}
1464 [[ ${myarch} != ${arch} && ${mytune} != ${arch} ]] && continue
1466 if [[ ${ver} > ${bver} ]] ; then
1467 einfo "Replacing ${myarch} (added in gcc ${ver}) with ${rep}..."
1468 [[ ${myarch} == ${arch} ]] && replace-cpu-flags ${myarch} ${rep}
1469 [[ ${mytune} == ${arch} ]] && replace-cpu-flags ${mytune} ${rep}
1476 # we only check -mno* here since -m* get removed by strip-flags later on
1512 for ((i = 0; i < ${#isalist[@]}; i += 2)) ; do
1514 isa=${isalist[i + 1]}
1515 [[ ${ver} > ${bver} ]] && filter-flags ${isa} ${isa/-m/-mno-}
1519 gcc_do_filter_flags() {
1521 replace-flags -O? -O2
1523 # dont want to funk ourselves
1524 filter-flags '-mabi*' -m31 -m32 -m64
1526 filter-flags -frecord-gcc-switches # 490738
1527 filter-flags -mno-rtm -mno-htm # 506202
1529 if tc_version_is_between 3.2 3.4 ; then
1530 # XXX: this is so outdated it's barely useful, but it don't hurt...
1531 replace-cpu-flags G3 750
1532 replace-cpu-flags G4 7400
1533 replace-cpu-flags G5 7400
1535 # XXX: should add a sed or something to query all supported flags
1536 # from the gcc source and trim everything else ...
1537 filter-flags -f{no-,}unit-at-a-time -f{no-,}web -mno-tls-direct-seg-refs
1538 filter-flags -f{no-,}stack-protector{,-all}
1539 filter-flags -fvisibility-inlines-hidden -fvisibility=hidden
1540 # and warning options
1541 filter-flags -Wextra -Wstack-protector
1543 if ! tc_version_is_at_least 4.1 ; then
1544 filter-flags -fdiagnostics-show-option
1545 filter-flags -Wstack-protector
1548 if tc_version_is_at_least 3.4 ; then
1551 filter-flags '-mcpu=*'
1553 tc_version_is_between 4.4 4.5 && append-flags -mno-avx # 357287
1555 if tc_version_is_between 4.6 4.7 ; then
1556 # https://bugs.gentoo.org/411333
1557 # https://bugs.gentoo.org/466454
1558 replace-cpu-flags c3-2 pentium2 pentium3 pentium3m pentium-m i686
1562 # https://bugs.gentoo.org/454426
1563 append-ldflags -Wl,--no-relax
1566 # temporary workaround for random ICEs reproduced by multiple users
1567 # https://bugs.gentoo.org/457062
1568 tc_version_is_between 4.6 4.8 && MAKEOPTS+=" -j1"
1571 # http://gcc.gnu.org/PR25127
1572 tc_version_is_between 4.0 4.2 && \
1573 filter-flags '-mcpu=*' '-march=*' '-mtune=*'
1578 strip-unsupported-flags
1580 # these are set here so we have something sane at configure time
1581 if is_crosscompile ; then
1582 # Set this to something sane for both native and target
1587 # "hppa2.0-unknown-linux-gnu" -> hppa2_0_unknown_linux_gnu
1588 local VAR="CFLAGS_"${CTARGET//[-.]/_}
1589 CXXFLAGS=${!VAR-${CFLAGS}}
1592 export GCJFLAGS=${GCJFLAGS:-${CFLAGS}}
1595 setup_minispecs_gcc_build_specs() {
1596 # Setup the "build.specs" file for gcc 4.3 to use when building.
1597 if hardened_gcc_works pie ; then
1598 cat "${WORKDIR}"/specs/pie.specs >> "${WORKDIR}"/build.specs
1600 if hardened_gcc_works ssp ; then
1601 for s in ssp sspall ; do
1602 cat "${WORKDIR}"/specs/${s}.specs >> "${WORKDIR}"/build.specs
1605 for s in nostrict znow ; do
1606 cat "${WORKDIR}"/specs/${s}.specs >> "${WORKDIR}"/build.specs
1608 export GCC_SPECS="${WORKDIR}"/build.specs
1611 gcc-multilib-configure() {
1612 if ! is_multilib ; then
1613 confgcc+=( --disable-multilib )
1614 # Fun times: if we are building for a target that has multiple
1615 # possible ABI formats, and the user has told us to pick one
1616 # that isn't the default, then not specifying it via the list
1617 # below will break that on us.
1619 confgcc+=( --enable-multilib )
1622 # translate our notion of multilibs into gcc's
1624 for abi in $(get_all_abis TARGET) ; do
1625 local l=$(gcc-abi-map ${abi})
1626 [[ -n ${l} ]] && list+=",${l}"
1628 if [[ -n ${list} ]] ; then
1631 tc_version_is_at_least 4.8 && confgcc+=( --with-multilib-list=${list:1} )
1638 # Convert the ABI name we use in Gentoo to what gcc uses
1641 mips*) map=("o32 32" "n32 n32" "n64 64") ;;
1642 riscv*) map=("lp64d lp64d" "lp64 lp64") ;;
1643 x86_64*) map=("amd64 m64" "x86 m32" "x32 mx32") ;;
1647 for m in "${map[@]}" ; do
1649 [[ $1 == ${l[0]} ]] && echo ${l[1]} && break
1653 #----> src_compile <----
1655 toolchain_src_compile() {
1656 touch "${S}"/gcc/c-gperf.h
1658 # Do not make manpages if we do not have perl ...
1659 [[ ! -x /usr/bin/perl ]] \
1660 && find "${WORKDIR}"/build -name '*.[17]' -exec touch {} +
1662 # Older gcc versions did not detect bash and re-exec itself, so force the
1663 # use of bash. Newer ones will auto-detect, but this is not harmful.
1664 # This needs to be set for compile as well, as it's used in libtool
1665 # generation, which will break install otherwise (at least in 3.3.6): #664486
1666 CONFIG_SHELL="${EPREFIX}/bin/bash" \
1667 gcc_do_make ${GCC_MAKE_TARGET}
1671 # This function accepts one optional argument, the make target to be used.
1672 # If omitted, gcc_do_make will try to guess whether it should use all,
1673 # or bootstrap-lean depending on CTARGET and arch.
1674 # An example of how to use this function:
1676 # gcc_do_make all-target-libstdc++-v3
1678 [[ -n ${1} ]] && GCC_MAKE_TARGET=${1}
1681 if is_crosscompile || tc-is-cross-compiler ; then
1682 # 3 stage bootstrapping doesnt quite work when you cant run the
1683 # resulting binaries natively ^^;
1684 GCC_MAKE_TARGET=${GCC_MAKE_TARGET-all}
1686 if tc_version_is_at_least 3.3 && use_if_iuse pgo; then
1687 GCC_MAKE_TARGET=${GCC_MAKE_TARGET-profiledbootstrap}
1689 GCC_MAKE_TARGET=${GCC_MAKE_TARGET-bootstrap-lean}
1693 # Older versions of GCC could not do profiledbootstrap in parallel due to
1694 # collisions with profiling info.
1695 # boundschecking also seems to introduce parallel build issues.
1696 if [[ ${GCC_MAKE_TARGET} == "profiledbootstrap" ]] || use_if_iuse boundschecking ; then
1697 ! tc_version_is_at_least 4.6 && export MAKEOPTS="${MAKEOPTS} -j1"
1700 if [[ ${GCC_MAKE_TARGET} == "all" ]] ; then
1701 STAGE1_CFLAGS=${STAGE1_CFLAGS-"${CFLAGS}"}
1702 elif [[ $(gcc-version) == "3.4" && ${GCC_BRANCH_VER} == "3.4" ]] && gcc-specs-ssp ; then
1704 STAGE1_CFLAGS=${STAGE1_CFLAGS-"-O2"}
1707 if is_crosscompile; then
1708 # In 3.4, BOOT_CFLAGS is never used on a crosscompile...
1709 # but I'll leave this in anyways as someone might have had
1710 # some reason for putting it in here... --eradicator
1711 BOOT_CFLAGS=${BOOT_CFLAGS-"-O2"}
1713 # we only want to use the system's CFLAGS if not building a
1715 BOOT_CFLAGS=${BOOT_CFLAGS-"$(get_abi_CFLAGS ${TARGET_DEFAULT_ABI}) ${CFLAGS}"}
1718 einfo "Compiling ${PN} (${GCC_MAKE_TARGET})..."
1720 pushd "${WORKDIR}"/build >/dev/null
1723 LDFLAGS="${LDFLAGS}" \
1724 STAGE1_CFLAGS="${STAGE1_CFLAGS}" \
1725 LIBPATH="${LIBPATH}" \
1726 BOOT_CFLAGS="${BOOT_CFLAGS}" \
1727 ${GCC_MAKE_TARGET} \
1728 || die "emake failed with ${GCC_MAKE_TARGET}"
1730 if ! is_crosscompile && use_if_iuse cxx && use_if_iuse doc ; then
1731 if type -p doxygen > /dev/null ; then
1732 if tc_version_is_at_least 4.3 ; then
1733 cd "${CTARGET}"/libstdc++-v3/doc
1734 emake doc-man-doxygen || ewarn "failed to make docs"
1735 elif tc_version_is_at_least 3.0 ; then
1736 cd "${CTARGET}"/libstdc++-v3
1737 emake doxygen-man || ewarn "failed to make docs"
1739 # Clean bogus manpages. #113902
1740 find -name '*_build_*' -delete
1741 # Blow away generated directory references. Newer versions of gcc
1742 # have gotten better at this, but not perfect. This is easier than
1743 # backporting all of the various doxygen patches. #486754
1744 find -name '*_.3' -exec grep -l ' Directory Reference ' {} + | \
1747 ewarn "Skipping libstdc++ manpage generation since you don't have doxygen installed"
1754 #---->> src_test <<----
1756 toolchain_src_test() {
1757 if use ${GCC_EBUILD_TEST_FLAG} ; then
1758 cd "${WORKDIR}"/build
1759 # enable verbose test run and result logging
1760 emake -k check RUNTESTFLAGS='-a -v'
1764 #---->> src_install <<----
1766 toolchain_src_install() {
1767 cd "${WORKDIR}"/build
1769 # Don't allow symlinks in private gcc include dir as this can break the build
1770 find gcc/include*/ -type l -delete
1772 # Copy over the info pages. We disabled their generation earlier, but the
1773 # build system only expects to install out of the build dir, not the source. #464008
1776 for x in "${S}"/gcc/doc/*.info* ; do
1777 if [[ -f ${x} ]] ; then
1778 cp "${x}" gcc/doc/ || die
1782 # We remove the generated fixincludes, as they can cause things to break
1783 # (ncurses, openssl, etc). We do not prevent them from being built, as
1784 # in the following commit which we revert:
1785 # https://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/eclass/toolchain.eclass?r1=1.647&r2=1.648
1786 # This is because bsd userland needs fixedincludes to build gcc, while
1787 # linux does not. Both can dispose of them afterwards.
1789 grep -q 'It has been auto-edited by fixincludes from' "${x}" \
1791 done < <(find gcc/include*/ -name '*.h')
1793 # Do the 'make install' from the build directory
1794 S="${WORKDIR}"/build emake -j1 DESTDIR="${D}" install || die
1796 # Punt some tools which are really only useful while building gcc
1797 find "${ED}" -name install-tools -prune -type d -exec rm -rf "{}" \;
1798 # This one comes with binutils
1799 find "${ED}" -name libiberty.a -delete
1801 # Move the libraries to the proper location
1804 # Basic sanity check
1805 if ! is_crosscompile ; then
1807 eval $(grep ^EXEEXT= "${WORKDIR}"/build/gcc/config.log)
1808 [[ -r ${D}${BINPATH}/gcc${EXEEXT} ]] || die "gcc not found in ${ED}"
1811 dodir /etc/env.d/gcc
1812 create_gcc_env_entry
1813 create_revdep_rebuild_entry
1815 # Setup the gcc_env_entry for hardened gcc 4 with minispecs
1816 want_minispecs && copy_minispecs_gcc_specs
1818 # Make sure we dont have stuff lying around that
1819 # can nuke multiple versions of gcc
1824 # Ugh: we really need to auto-detect this list.
1825 # It's constantly out of date.
1826 for x in cpp gcc g++ c++ gcov g77 gcj gcjh gfortran gccgo ; do
1827 # For some reason, g77 gets made instead of ${CTARGET}-g77...
1828 # this should take care of that
1829 if [[ -f ${x} ]] ; then
1830 # In case they're hardlinks, clear out the target first
1831 # otherwise the mv below will complain.
1832 rm -f ${CTARGET}-${x}
1833 mv ${x} ${CTARGET}-${x}
1836 if [[ -f ${CTARGET}-${x} ]] ; then
1837 if ! is_crosscompile ; then
1838 ln -sf ${CTARGET}-${x} ${x}
1839 dosym ${BINPATH#${EPREFIX}}/${CTARGET}-${x} \
1840 /usr/bin/${x}-${GCC_CONFIG_VER}
1842 # Create versioned symlinks
1843 dosym ${BINPATH#${EPREFIX}}/${CTARGET}-${x} \
1844 /usr/bin/${CTARGET}-${x}-${GCC_CONFIG_VER}
1847 if [[ -f ${CTARGET}-${x}-${GCC_CONFIG_VER} ]] ; then
1848 rm -f ${CTARGET}-${x}-${GCC_CONFIG_VER}
1849 ln -sf ${CTARGET}-${x} ${CTARGET}-${x}-${GCC_CONFIG_VER}
1853 # When gcc builds a crosscompiler it does not install unprefixed tools.
1854 # When cross-building gcc does install native tools.
1855 if ! is_crosscompile; then
1856 # Rename the main go binaries as we don't want to clobber dev-lang/go
1857 # when gcc-config runs. #567806
1858 if tc_version_is_at_least 5 && is_go ; then
1859 for x in go gofmt; do
1860 mv ${x} ${x}-${GCCMAJOR} || die
1865 # As gcc installs object files built against bost ${CHOST} and ${CTARGET}
1866 # ideally we will need to strip them using different tools:
1867 # Using ${CHOST} tools:
1868 # - "${D}${BINPATH}"
1869 # - (for is_crosscompile) "${D}${HOSTLIBPATH}"
1870 # - "${D}${PREFIX}/libexec/gcc/${CTARGET}/${GCC_CONFIG_VER}"
1871 # Using ${CTARGET} tools:
1872 # - "${D}${LIBPATH}"
1873 # As dostrip does not specify host to override ${CHOST} tools just skip
1874 # non-native binary stripping.
1875 is_crosscompile && tc_supports_dostrip && dostrip -x "${LIBPATH}"
1878 if is_crosscompile; then
1879 rm -rf "${ED}"/usr/share/{man,info}
1880 rm -rf "${D}"${DATAPATH}/{man,info}
1882 if tc_version_is_at_least 3.0 ; then
1883 local cxx_mandir=$(find "${WORKDIR}/build/${CTARGET}/libstdc++-v3" -name man)
1884 if [[ -d ${cxx_mandir} ]] ; then
1885 cp -r "${cxx_mandir}"/man? "${D}${DATAPATH}"/man/
1890 # portage regenerates 'dir' files on it's own: bug #672408
1891 # Drop 'dir' files to avoid collisions.
1892 if [[ -f "${D}${DATAPATH}"/info/dir ]]; then
1893 einfo "Deleting '${D}${DATAPATH}/info/dir'"
1894 rm "${D}${DATAPATH}"/info/dir || die
1897 # prune empty dirs left behind
1898 find "${ED}" -depth -type d -delete 2>/dev/null
1900 # install testsuite results
1901 if use ${GCC_EBUILD_TEST_FLAG}; then
1903 find "${WORKDIR}"/build -type f -name "*.sum" -exec dodoc {} +
1904 find "${WORKDIR}"/build -type f -path "*/testsuite/*.log" -exec dodoc {} +
1907 # Rather install the script, else portage with changing $FILESDIR
1908 # between binary and source package borks things ....
1909 if ! is_crosscompile && [[ ${PN} != "kgcc64" ]] ; then
1910 insinto "${DATAPATH#${EPREFIX}}"
1911 newins "$(prefixify_ro "${FILESDIR}"/awk/fixlafiles.awk-no_gcc_la)" fixlafiles.awk || die
1912 exeinto "${DATAPATH#${EPREFIX}}"
1913 doexe "$(prefixify_ro "${FILESDIR}"/fix_libtool_files.sh)" || die
1914 doexe "${FILESDIR}"/c{89,99} || die
1917 # libstdc++.la: Delete as it doesn't add anything useful: g++ itself
1918 # handles linkage correctly in the dynamic & static case. It also just
1919 # causes us pain: any C++ progs/libs linking with libtool will gain a
1920 # reference to the full libstdc++.la file which is gcc version specific.
1921 # libstdc++fs.la: It doesn't link against anything useful.
1922 # libsupc++.la: This has no dependencies.
1923 # libcc1.la: There is no static library, only dynamic.
1924 # libcc1plugin.la: Same as above, and it's loaded via dlopen.
1925 # libcp1plugin.la: Same as above, and it's loaded via dlopen.
1926 # libgomp.la: gcc itself handles linkage (libgomp.spec).
1927 # libgomp-plugin-*.la: Same as above, and it's an internal plugin only
1928 # loaded via dlopen.
1929 # libgfortran.la: gfortran itself handles linkage correctly in the
1930 # dynamic & static case (libgfortran.spec). #573302
1931 # libgfortranbegin.la: Same as above, and it's an internal lib.
1932 # libmpx.la: gcc itself handles linkage correctly (libmpx.spec).
1933 # libmpxwrappers.la: See above.
1934 # libitm.la: gcc itself handles linkage correctly (libitm.spec).
1935 # libvtv.la: gcc itself handles linkage correctly.
1936 # lib*san.la: Sanitizer linkage is handled internally by gcc, and they
1937 # do not support static linking. #487550 #546700
1938 find "${D}${LIBPATH}" \
1940 -name libstdc++.la -o \
1941 -name libstdc++fs.la -o \
1942 -name libsupc++.la -o \
1943 -name libcc1.la -o \
1944 -name libcc1plugin.la -o \
1945 -name libcp1plugin.la -o \
1946 -name 'libgomp.la' -o \
1947 -name 'libgomp-plugin-*.la' -o \
1948 -name libgfortran.la -o \
1949 -name libgfortranbegin.la -o \
1950 -name libmpx.la -o \
1951 -name libmpxwrappers.la -o \
1952 -name libitm.la -o \
1953 -name libvtv.la -o \
1954 -name 'lib*san.la' \
1957 # Use gid of 0 because some stupid ports don't have
1958 # the group 'root' set to gid 0. Send to /dev/null
1959 # for people who are testing as non-root.
1960 chown -R root:0 "${D}${LIBPATH}" 2>/dev/null
1962 # Installing gdb pretty-printers into gdb-specific location.
1963 local py gdbdir=/usr/share/gdb/auto-load${LIBPATH}
1964 pushd "${D}${LIBPATH}" >/dev/null
1965 for py in $(find . -name '*-gdb.py') ; do
1966 local multidir=${py%/*}
1967 insinto "${gdbdir}/${multidir}"
1968 sed -i "/^libdir =/s:=.*:= '${LIBPATH}/${multidir}':" "${py}" || die #348128
1969 doins "${py}" || die
1974 # Don't scan .gox files for executable stacks - false positives
1975 export QA_EXECSTACK="usr/lib*/go/*/*.gox"
1976 export QA_WX_LOAD="usr/lib*/go/*/*.gox"
1978 # Disable RANDMMAP so PCH works. #301299
1979 if tc_version_is_at_least 4.3 ; then
1980 pax-mark -r "${D}${PREFIX}/libexec/gcc/${CTARGET}/${GCC_CONFIG_VER}/cc1"
1981 pax-mark -r "${D}${PREFIX}/libexec/gcc/${CTARGET}/${GCC_CONFIG_VER}/cc1plus"
1984 # Disable MPROTECT so java works. #574808
1986 pax-mark -m "${D}${PREFIX}/libexec/gcc/${CTARGET}/${GCC_CONFIG_VER}/ecj1"
1987 pax-mark -m "${D}${PREFIX}/${CTARGET}/gcc-bin/${GCC_CONFIG_VER}/gij"
1991 # Move around the libs to the right location. For some reason,
1992 # when installing gcc, it dumps internal libraries into /usr/lib
1993 # instead of the private gcc lib path
1995 # older versions of gcc did not support --print-multi-os-directory
1996 tc_version_is_at_least 3.2 || return 0
1998 # For non-target libs which are for CHOST and not CTARGET, we want to
1999 # move them to the compiler-specific CHOST internal dir. This is stuff
2000 # that you want to link against when building tools rather than building
2001 # code to run on the target.
2002 if tc_version_is_at_least 5 && is_crosscompile ; then
2003 dodir "${HOSTLIBPATH#${EPREFIX}}"
2004 mv "${ED}"/usr/$(get_libdir)/libcc1* "${D}${HOSTLIBPATH}" || die
2007 # For all the libs that are built for CTARGET, move them into the
2008 # compiler-specific CTARGET internal dir.
2009 local x multiarg removedirs=""
2010 for multiarg in $($(XGCC) -print-multi-lib) ; do
2011 multiarg=${multiarg#*;}
2012 multiarg=${multiarg//@/ -}
2014 local OS_MULTIDIR=$($(XGCC) ${multiarg} --print-multi-os-directory)
2015 local MULTIDIR=$($(XGCC) ${multiarg} --print-multi-directory)
2016 local TODIR="${D}${LIBPATH}"/${MULTIDIR}
2019 [[ -d ${TODIR} ]] || mkdir -p ${TODIR}
2022 "${LIBPATH}"/${OS_MULTIDIR} \
2023 "${LIBPATH}"/../${MULTIDIR} \
2024 "${PREFIX}"/lib/${OS_MULTIDIR} \
2025 "${PREFIX}"/${CTARGET}/lib/${OS_MULTIDIR}
2027 removedirs="${removedirs} ${FROMDIR}"
2028 FROMDIR=${D}${FROMDIR}
2029 if [[ ${FROMDIR} != "${TODIR}" && -d ${FROMDIR} ]] ; then
2030 local files=$(find "${FROMDIR}" -maxdepth 1 ! -type d 2>/dev/null)
2031 if [[ -n ${files} ]] ; then
2032 mv ${files} "${TODIR}" || die
2036 fix_libtool_libdir_paths "${LIBPATH}/${MULTIDIR}"
2038 # SLOT up libgcj.pc if it's available (and let gcc-config worry about links)
2039 FROMDIR="${PREFIX}/lib/${OS_MULTIDIR}"
2040 for x in "${D}${FROMDIR}"/pkgconfig/libgcj*.pc ; do
2041 [[ -f ${x} ]] || continue
2042 sed -i "/^libdir=/s:=.*:=${LIBPATH}/${MULTIDIR}:" "${x}" || die
2043 mv "${x}" "${D}${FROMDIR}"/pkgconfig/libgcj-${GCC_PV}.pc || die
2047 # We remove directories separately to avoid this case:
2048 # mv SRC/lib/../lib/*.o DEST
2049 # rmdir SRC/lib/../lib/
2050 # mv SRC/lib/../lib32/*.o DEST # Bork
2051 for FROMDIR in ${removedirs} ; do
2052 rmdir "${D}"${FROMDIR} >& /dev/null
2054 find -depth "${ED}" -type d -exec rmdir {} + >& /dev/null
2057 # make sure the libtool archives have libdir set to where they actually
2058 # -are-, and not where they -used- to be. also, any dependencies we have
2059 # on our own .la files need to be updated.
2060 fix_libtool_libdir_paths() {
2063 pushd "${D}" >/dev/null
2065 pushd "./${libpath}" >/dev/null
2066 local dir="${PWD#${D%/}}"
2067 local allarchives=$(echo *.la)
2068 allarchives="\(${allarchives// /\\|}\)"
2071 # The libdir might not have any .la files. #548782
2072 find "./${dir}" -maxdepth 1 -name '*.la' \
2073 -exec sed -i -e "/^libdir=/s:=.*:='${dir}':" {} + || die
2074 # Would be nice to combine these, but -maxdepth can not be specified
2075 # on sub-expressions.
2076 find "./${PREFIX}"/lib* -maxdepth 3 -name '*.la' \
2077 -exec sed -i -e "/^dependency_libs=/s:/[^ ]*/${allarchives}:${libpath}/\1:g" {} + || die
2078 find "./${dir}/" -maxdepth 1 -name '*.la' \
2079 -exec sed -i -e "/^dependency_libs=/s:/[^ ]*/${allarchives}:${libpath}/\1:g" {} + || die
2084 create_gcc_env_entry() {
2085 dodir /etc/env.d/gcc
2086 local gcc_envd_base="/etc/env.d/gcc/${CTARGET}-${GCC_CONFIG_VER}"
2088 local gcc_specs_file
2089 local gcc_envd_file="${ED}${gcc_envd_base}"
2090 if [[ -z $1 ]] ; then
2091 # I'm leaving the following commented out to remind me that it
2092 # was an insanely -bad- idea. Stuff broke. GCC_SPECS isnt unset
2093 # on chroot or in non-toolchain.eclass gcc ebuilds!
2094 #gcc_specs_file="${LIBPATH}/specs"
2097 gcc_envd_file+="-$1"
2098 gcc_specs_file="${LIBPATH}/$1.specs"
2101 # We want to list the default ABI's LIBPATH first so libtool
2102 # searches that directory first. This is a temporary
2103 # workaround for libtool being stupid and using .la's from
2104 # conflicting ABIs by using the first one in the search path
2105 local ldpaths mosdirs
2106 if tc_version_is_at_least 3.2 ; then
2107 local mdir mosdir abi ldpath
2108 for abi in $(get_all_abis TARGET) ; do
2109 mdir=$($(XGCC) $(get_abi_CFLAGS ${abi}) --print-multi-directory)
2111 [[ ${mdir} != "." ]] && ldpath+="/${mdir}"
2112 ldpaths="${ldpath}${ldpaths:+:${ldpaths}}"
2114 mosdir=$($(XGCC) $(get_abi_CFLAGS ${abi}) -print-multi-os-directory)
2115 mosdirs="${mosdir}${mosdirs:+:${mosdirs}}"
2118 # Older gcc's didn't do multilib, so logic is simple.
2122 cat <<-EOF > ${gcc_envd_file}
2123 GCC_PATH="${BINPATH}"
2125 MANPATH="${DATAPATH}/man"
2126 INFOPATH="${DATAPATH}/info"
2127 STDCXX_INCDIR="${STDCXX_INCDIR##*/}"
2128 CTARGET="${CTARGET}"
2129 GCC_SPECS="${gcc_specs_file}"
2130 MULTIOSDIRS="${mosdirs}"
2134 create_revdep_rebuild_entry() {
2135 local revdep_rebuild_base="/etc/revdep-rebuild/05cross-${CTARGET}-${GCC_CONFIG_VER}"
2136 local revdep_rebuild_file="${ED}${revdep_rebuild_base}"
2138 is_crosscompile || return 0
2140 dodir /etc/revdep-rebuild
2141 cat <<-EOF > "${revdep_rebuild_file}"
2142 # Generated by ${CATEGORY}/${PF}
2143 # Ignore libraries built for ${CTARGET}, https://bugs.gentoo.org/692844.
2144 SEARCH_DIRS_MASK="${LIBPATH}"
2148 copy_minispecs_gcc_specs() {
2149 # on gcc 6 we don't need minispecs
2150 if tc_version_is_at_least 6.0 ; then
2154 # setup the hardenedno* specs files and the vanilla specs file.
2155 if hardened_gcc_works ; then
2156 create_gcc_env_entry hardenednopiessp
2158 if hardened_gcc_works pie ; then
2159 create_gcc_env_entry hardenednopie
2161 if hardened_gcc_works ssp ; then
2162 create_gcc_env_entry hardenednossp
2164 create_gcc_env_entry vanilla
2165 insinto ${LIBPATH#${EPREFIX}}
2166 doins "${WORKDIR}"/specs/*.specs || die "failed to install specs"
2167 # Build system specs file which, if it exists, must be a complete set of
2168 # specs as it completely and unconditionally overrides the builtin specs.
2169 if ! tc_version_is_at_least 4.4 ; then
2170 $(XGCC) -dumpspecs > "${WORKDIR}"/specs/specs
2171 cat "${WORKDIR}"/build.specs >> "${WORKDIR}"/specs/specs
2172 doins "${WORKDIR}"/specs/specs || die "failed to install the specs file"
2179 # Move Java headers to compiler-specific dir
2180 for x in "${D}${PREFIX}"/include/gc*.h "${D}${PREFIX}"/include/j*.h ; do
2181 [[ -f ${x} ]] && mv -f "${x}" "${D}${LIBPATH}"/include/
2183 for x in gcj gnu java javax org ; do
2184 if [[ -d ${D}${PREFIX}/include/${x} ]] ; then
2185 dodir /${LIBPATH#${EPREFIX}}/include/${x}
2186 mv -f "${D}${PREFIX}"/include/${x}/* "${D}${LIBPATH}"/include/${x}/
2187 rm -rf "${D}${PREFIX}"/include/${x}
2191 if [[ -d ${D}${PREFIX}/lib/security ]] || [[ -d ${D}${PREFIX}/$(get_libdir)/security ]] ; then
2192 dodir /${LIBPATH#${EPREFIX}}/security
2193 mv -f "${D}${PREFIX}"/lib*/security/* "${D}${LIBPATH}"/security
2194 rm -rf "${D}${PREFIX}"/lib*/security
2197 # Move random gcj files to compiler-specific directories
2198 for x in libgcj.spec logging.properties ; do
2199 x="${D}${PREFIX}/lib/${x}"
2200 [[ -f ${x} ]] && mv -f "${x}" "${D}${LIBPATH}"/
2203 # Rename jar because it could clash with Kaffe's jar if this gcc is
2204 # primary compiler (aka don't have the -<version> extension)
2206 [[ -f jar ]] && mv -f jar gcj-jar
2209 #---->> pkg_post* <<----
2211 toolchain_pkg_postinst() {
2213 if [[ ! ${ROOT%/} && -f ${EPREFIX}/usr/share/eselect/modules/compiler-shadow.eselect ]] ; then
2214 eselect compiler-shadow update all
2217 if ! is_crosscompile && [[ ${PN} != "kgcc64" ]] ; then
2219 ewarn "If you have issues with packages unable to locate libstdc++.la,"
2220 ewarn "then try running 'fix_libtool_files.sh' on the old gcc versions."
2222 ewarn "You might want to review the GCC upgrade guide when moving between"
2223 ewarn "major versions (like 4.2 to 4.3):"
2224 ewarn "https://wiki.gentoo.org/wiki/Upgrading_GCC"
2227 # Clean up old paths
2228 rm -f "${EROOT%/}"/*/rcscripts/awk/fixlafiles.awk "${EROOT%/}"/sbin/fix_libtool_files.sh
2229 rmdir "${EROOT%/}"/*/rcscripts{/awk,} 2>/dev/null
2231 mkdir -p "${EROOT%/}"/usr/{share/gcc-data,sbin,bin}
2232 # DATAPATH has EPREFIX already, use ROOT with it
2233 cp "${ROOT%/}${DATAPATH}"/fixlafiles.awk "${EROOT%/}"/usr/share/gcc-data/ || die
2234 cp "${ROOT%/}${DATAPATH}"/fix_libtool_files.sh "${EROOT%/}"/usr/sbin/ || die
2236 # Since these aren't critical files and portage sucks with
2237 # handling of binpkgs, don't require these to be found
2238 cp "${ROOT%/}${DATAPATH}"/c{89,99} "${EROOT%/}"/usr/bin/ 2>/dev/null
2241 if use ${GCC_EBUILD_TEST_FLAG} ; then
2242 elog "Testsuite results have been installed into /usr/share/doc/${PF}/testsuite"
2246 if [[ -n ${PRERELEASE}${SNAPSHOT} ]] ; then
2247 einfo "This GCC ebuild is provided for your convenience, and the use"
2248 einfo "of this compiler is not supported by the Gentoo Developers."
2249 einfo "Please report bugs to upstream at http://gcc.gnu.org/bugzilla/"
2253 toolchain_pkg_postrm() {
2255 if [[ ! ${ROOT%/} && -f ${EPREFIX}/usr/share/eselect/modules/compiler-shadow.eselect ]] ; then
2256 eselect compiler-shadow clean all
2259 # to make our lives easier (and saner), we do the fix_libtool stuff here.
2260 # rather than checking SLOT's and trying in upgrade paths, we just see if
2261 # the common libstdc++.la exists in the ${LIBPATH} of the gcc that we are
2262 # unmerging. if it does, that means this was a simple re-emerge.
2264 # clean up the cruft left behind by cross-compilers
2265 if is_crosscompile ; then
2266 if [[ -z $(ls "${EROOT%/}"/etc/env.d/gcc/${CTARGET}* 2>/dev/null) ]] ; then
2267 einfo "Removing last cross-compiler instance. Deleting dangling symlinks."
2268 rm -f "${EROOT%/}"/etc/env.d/gcc/config-${CTARGET}
2269 rm -f "${EROOT%/}"/etc/env.d/??gcc-${CTARGET}
2270 rm -f "${EROOT%/}"/usr/bin/${CTARGET}-{gcc,{g,c}++}{,32,64}
2275 # ROOT isnt handled by the script
2276 [[ ${ROOT%/} ]] && return 0
2278 if [[ ! -e ${LIBPATH}/libstdc++.so ]] ; then
2279 einfo "Running 'fix_libtool_files.sh ${GCC_RELEASE_VER}'"
2280 fix_libtool_files.sh ${GCC_RELEASE_VER}
2287 if ! should_we_gcc_config ; then
2288 gcc-config --use-old --force
2292 local current_gcc_config target
2294 current_gcc_config=$(gcc-config -c ${CTARGET} 2>/dev/null)
2295 if [[ -n ${current_gcc_config} ]] ; then
2296 local current_specs use_specs
2297 # figure out which specs-specific config is active
2298 current_specs=$(gcc-config -S ${current_gcc_config} | awk '{print $3}')
2299 [[ -n ${current_specs} ]] && use_specs=-${current_specs}
2301 if [[ -n ${use_specs} ]] && \
2302 [[ ! -e ${EROOT%/}/etc/env.d/gcc/${CTARGET}-${GCC_CONFIG_VER}${use_specs} ]]
2304 ewarn "The currently selected specs-specific gcc config,"
2305 ewarn "${current_specs}, doesn't exist anymore. This is usually"
2306 ewarn "due to enabling/disabling hardened or switching to a version"
2307 ewarn "of gcc that doesnt create multiple specs files. The default"
2308 ewarn "config will be used, and the previous preference forgotten."
2312 target="${CTARGET}-${GCC_CONFIG_VER}${use_specs}"
2314 # The curent target is invalid. Attempt to switch to a valid one.
2315 # Blindly pick the latest version. #529608
2316 # TODO: Should update gcc-config to accept `-l ${CTARGET}` rather than
2317 # doing a partial grep like this.
2318 target=$(gcc-config -l 2>/dev/null | grep " ${CTARGET}-[0-9]" | tail -1 | awk '{print $2}')
2321 gcc-config "${target}"
2324 should_we_gcc_config() {
2325 # if the current config is invalid, we definitely want a new one
2326 # Note: due to bash quirkiness, the following must not be 1 line
2328 curr_config=$(gcc-config -c ${CTARGET} 2>&1) || return 0
2330 # if the previously selected config has the same major.minor (branch) as
2331 # the version we are installing, then it will probably be uninstalled
2332 # for being in the same SLOT, make sure we run gcc-config.
2333 local curr_config_ver=$(gcc-config -S ${curr_config} | awk '{print $2}')
2335 local curr_branch_ver=$(ver_cut 1-2 ${curr_config_ver})
2337 if [[ ${curr_branch_ver} == ${GCC_BRANCH_VER} ]] ; then
2340 # if we're installing a genuinely different compiler version,
2341 # we should probably tell the user -how- to switch to the new
2342 # gcc version, since we're not going to do it for him/her.
2343 # We don't want to switch from say gcc-3.3 to gcc-3.4 right in
2344 # the middle of an emerge operation (like an 'emerge -e world'
2345 # which could install multiple gcc versions).
2346 # Only warn if we're installing a pkg as we might be called from
2347 # the pkg_{pre,post}rm steps. #446830
2348 if [[ ${EBUILD_PHASE} == *"inst" ]] ; then
2349 einfo "The current gcc config appears valid, so it will not be"
2350 einfo "automatically switched for you. If you would like to"
2351 einfo "switch to the newly installed gcc version, do the"
2354 einfo "gcc-config ${CTARGET}-${GCC_CONFIG_VER}"
2355 einfo "source /etc/profile"
2362 #---->> support and misc functions <<----
2364 # This is to make sure we don't accidentally try to enable support for a
2365 # language that doesnt exist. GCC 3.4 supports f77, while 4.0 supports f95, etc.
2367 # Also add a hook so special ebuilds (kgcc64) can control which languages
2368 # exactly get enabled
2369 gcc-lang-supported() {
2370 grep ^language=\"${1}\" "${S}"/gcc/*/config-lang.in > /dev/null || return 1
2371 [[ -z ${TOOLCHAIN_ALLOWED_LANGS} ]] && return 0
2372 has $1 ${TOOLCHAIN_ALLOWED_LANGS}
2376 gcc-lang-supported ada || return 1
2381 gcc-lang-supported 'c++' || return 1
2386 gcc-lang-supported d || return 1
2391 gcc-lang-supported f77 || return 1
2396 gcc-lang-supported f95 || return 1
2401 gcc-lang-supported fortran || return 1
2406 gcc-lang-supported java || return 1
2407 use_if_iuse cxx && use_if_iuse gcj
2411 gcc-lang-supported go || return 1
2412 use_if_iuse cxx && use_if_iuse go
2416 gcc-lang-supported jit || return 1
2417 # cross-compiler does not really support jit as it has
2418 # to generate code for a target. On target like avr
2419 # libgcclit.so can't link at all: bug #594572
2420 is_crosscompile && return 1
2425 tc_version_is_at_least 3 || return 1
2426 use_if_iuse multilib
2430 gcc-lang-supported objc || return 1
2435 gcc-lang-supported 'obj-c++' || return 1
2436 use_if_iuse cxx && use_if_iuse objc++
2439 # Grab a variable from the build system (taken from linux-info.eclass)
2441 local var=$1 makefile=${2:-${WORKDIR}/build/Makefile}
2442 echo -e "e:\\n\\t@echo \$(${var})\\ninclude ${makefile}" | \
2443 r=${makefile%/*} emake --no-print-directory -s -f - 2>/dev/null
2446 XGCC() { get_make_var GCC_FOR_TARGET ; }
2448 # The gentoo piessp patches allow for 3 configurations:
2449 # 1) PIE+SSP by default
2452 hardened_gcc_works() {
2453 if [[ $1 == "pie" ]] ; then
2454 # $gcc_cv_ld_pie is unreliable as it simply take the output of
2455 # `ld --help | grep -- -pie`, that reports the option in all cases, also if
2456 # the loader doesn't actually load the resulting executables.
2457 # To avoid breakage, blacklist FreeBSD here at least
2458 [[ ${CTARGET} == *-freebsd* ]] && return 1
2460 want_pie || return 1
2461 use_if_iuse nopie && return 1
2462 hardened_gcc_is_stable pie
2464 elif [[ $1 == "ssp" ]] ; then
2465 [[ -n ${SPECS_VER} ]] || return 1
2466 use_if_iuse nossp && return 1
2467 hardened_gcc_is_stable ssp
2471 hardened_gcc_works pie || return 1
2472 hardened_gcc_works ssp || return 1
2477 hardened_gcc_is_stable() {
2479 if [[ $1 == "pie" ]] ; then
2480 if [[ ${CTARGET} == *-uclibc* ]] ; then
2481 tocheck=${PIE_UCLIBC_STABLE}
2483 tocheck=${PIE_GLIBC_STABLE}
2485 elif [[ $1 == "ssp" ]] ; then
2486 if [[ ${CTARGET} == *-uclibc* ]] ; then
2487 tocheck=${SSP_UCLIBC_STABLE}
2488 elif [[ ${CTARGET} == *-gnu* ]] ; then
2489 tocheck=${SSP_STABLE}
2492 die "hardened_gcc_stable needs to be called with pie or ssp"
2495 has $(tc-arch) ${tocheck} && return 0
2500 # on gcc 6 we don't need minispecs
2501 if tc_version_is_at_least 6.0 ; then
2504 if tc_version_is_at_least 4.3.2 && use_if_iuse hardened ; then
2505 if ! want_pie ; then
2506 ewarn "PIE_VER or SPECS_VER is not defined in the GCC ebuild."
2507 elif use vanilla ; then
2508 ewarn "You will not get hardened features if you have the vanilla USE-flag."
2509 elif use_if_iuse nopie && use_if_iuse nossp ; then
2510 ewarn "You will not get hardened features if you have the nopie and nossp USE-flag."
2511 elif ! hardened_gcc_works ; then
2512 ewarn "Your $(tc-arch) arch is not supported."
2516 ewarn "Hope you know what you are doing. Hardened will not work."
2523 ! use_if_iuse hardened && [[ -n ${PIE_VER} ]] && use_if_iuse nopie && return 1
2524 [[ -n ${PIE_VER} ]] && [[ -n ${SPECS_VER} ]] && return 0
2525 tc_version_is_at_least 4.3.2 && return 1
2526 [[ -z ${PIE_VER} ]] && return 1
2527 use_if_iuse nopie || return 0
2531 has toolchain_death_notice ${EBUILD_DEATH_HOOKS} || EBUILD_DEATH_HOOKS+=" toolchain_death_notice"
2532 toolchain_death_notice() {
2533 if [[ -e "${WORKDIR}"/build ]] ; then
2534 pushd "${WORKDIR}"/build >/dev/null
2535 (echo '' | $(tc-getCC ${CTARGET}) ${CFLAGS} -v -E - 2>&1) > gccinfo.log
2536 [[ -e "${T}"/build.log ]] && cp "${T}"/build.log .
2537 tar jcf "${WORKDIR}"/gcc-build-logs.tar.bz2 \
2538 gccinfo.log build.log $(find -name config.log)
2539 rm gccinfo.log build.log
2541 eerror "Please include ${WORKDIR}/gcc-build-logs.tar.bz2 in your bug report."
2547 # Note [implicitly enabled flags]
2548 # -------------------------------
2549 # Usually configure-based packages handle explicit feature requests
2551 # ./configure --enable-foo
2552 # as explicit request to check for support of 'foo' and bail out at
2555 # GCC does not follow this pattern and instead overrides autodetection
2556 # of the feature and enables it unconditionally.
2558 # https://gcc.gnu.org/PR85663 (libsanitizer on mips)
2559 # https://bugs.gentoo.org/661252 (libvtv on powerpc64)
2561 # Thus safer way to enable/disable the feature is to rely on implicit
2562 # enabled-by-default state:
2563 # econf $(usex foo '' --disable-foo)