From cbcf8a9a914d88f8c61f27e1343776159a97d218 Mon Sep 17 00:00:00 2001 From: Fabian Groffen Date: Sun, 3 Sep 2023 21:39:28 +0200 Subject: toolchain.eclass: sync from gx86 Signed-off-by: Fabian Groffen --- eclass/toolchain.eclass | 1075 ++++++++++++++++++----------------------------- 1 file changed, 410 insertions(+), 665 deletions(-) (limited to 'eclass') diff --git a/eclass/toolchain.eclass b/eclass/toolchain.eclass index 642bf54a89..ce62b7b81d 100644 --- a/eclass/toolchain.eclass +++ b/eclass/toolchain.eclass @@ -1,4 +1,4 @@ -# Copyright 1999-2022 Gentoo Authors +# Copyright 1999-2023 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 # @ECLASS: toolchain.eclass @@ -6,14 +6,17 @@ # Toolchain Ninjas # @SUPPORTED_EAPIS: 7 8 # @BLURB: Common code for sys-devel/gcc ebuilds +# @DESCRIPTION: +# Common code for sys-devel/gcc ebuilds (and occasionally GCC forks, like +# GNAT for Ada). If not building GCC itself, please use toolchain-funcs.eclass +# instead. case ${EAPI} in - 7) inherit eutils ;; - 8) ;; + 7|8) ;; *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;; esac -if [[ ! ${_TOOLCHAIN_ECLASS} ]]; then +if [[ -z ${_TOOLCHAIN_ECLASS} ]]; then _TOOLCHAIN_ECLASS=1 DESCRIPTION="The GNU Compiler Collection" @@ -49,9 +52,9 @@ if [[ ${CTARGET} = ${CHOST} ]] ; then export CTARGET=${CATEGORY#cross-} fi fi -: ${TARGET_ABI:=${ABI}} -: ${TARGET_MULTILIB_ABIS:=${MULTILIB_ABIS}} -: ${TARGET_DEFAULT_ABI:=${DEFAULT_ABI}} +: "${TARGET_ABI:=${ABI}}" +: "${TARGET_MULTILIB_ABIS:=${MULTILIB_ABIS}}" +: "${TARGET_DEFAULT_ABI:=${DEFAULT_ABI}}" is_crosscompile() { [[ ${CHOST} != ${CTARGET} ]] @@ -141,6 +144,32 @@ GCCMINOR=$(ver_cut 2 ${GCC_PV}) # GCC micro version. GCCMICRO=$(ver_cut 3 ${GCC_PV}) +tc_use_major_version_only() { + local use_major_version_only=0 + + if ! tc_version_is_at_least 10 ; then + return 1 + fi + + if [[ ${GCCMAJOR} -eq 10 ]] && ver_test ${PV} -ge 10.4.1_p20220929 ; then + use_major_version_only=1 + elif [[ ${GCCMAJOR} -eq 11 ]] && ver_test ${PV} -ge 11.3.1_p20220930 ; then + use_major_version_only=1 + elif [[ ${GCCMAJOR} -eq 12 ]] && ver_test ${PV} -ge 12.2.1_p20221001 ; then + use_major_version_only=1 + elif [[ ${GCCMAJOR} -eq 13 ]] && ver_test ${PV} -ge 13.0.0_pre20221002 ; then + use_major_version_only=1 + elif [[ ${GCCMAJOR} -gt 13 ]] ; then + use_major_version_only=1 + fi + + if [[ ${use_major_version_only} -eq 1 ]] ; then + return 0 + fi + + return 1 +} + # @ECLASS_VARIABLE: GCC_CONFIG_VER # @INTERNAL # @DESCRIPTION: @@ -148,7 +177,11 @@ GCCMICRO=$(ver_cut 3 ${GCC_PV}) # of binary and gcc-config names not directly tied to upstream # versioning. In practice it's hard to untangle from gcc/BASE-VER # (GCC_RELEASE_VER) value. -GCC_CONFIG_VER=${GCC_RELEASE_VER} +if tc_use_major_version_only ; then + GCC_CONFIG_VER=${GCCMAJOR} +else + GCC_CONFIG_VER=${GCC_RELEASE_VER} +fi # Pre-release support. Versioning schema: # 1.0.0_pre9999: live ebuild @@ -168,7 +201,7 @@ fi # Require minimum gcc version to simplify assumptions. # Normally we would require gcc-6+ (based on sys-devel/gcc) # but we still have sys-devel/gcc-apple-4.2.1_p5666. -tc_version_is_at_least 4.2.1 || die "${ECLASS}: ${GCC_RELEASE_VER} is too old." +tc_version_is_at_least 8 || die "${ECLASS}: ${GCC_RELEASE_VER} is too old." PREFIX=${TOOLCHAIN_PREFIX:-${EPREFIX}/usr} @@ -204,49 +237,46 @@ tc_has_feature() { if [[ ${PN} != "kgcc64" && ${PN} != gcc-* ]] || [[ ${PN} == "gcc-apple" && $(tc_version_is_at_least 12.1) == 0 ]] ; then IUSE+=" debug +cxx +nptl" TC_FEATURES+=( nptl ) - [[ -n ${PIE_VER} ]] && IUSE+=" nopie" - [[ -n ${SPECS_VER} ]] && IUSE+=" nossp" IUSE+=" +fortran" TC_FEATURES+=( fortran ) IUSE+=" doc hardened multilib objc" - tc_version_is_between 3 7 && IUSE+=" awt gcj" TC_FEATURES+=( gcj ) IUSE+=" pgo" IUSE+=" objc-gc" TC_FEATURES+=( objc-gc ) IUSE+=" libssp objc++" - IUSE+=" +openmp" - - tc_version_is_at_least 4.3 && IUSE+=" fixed-point" - tc_version_is_at_least 4.7 && IUSE+=" go" - - # sanitizer support appeared in gcc-4.8, but > DEPEND <<---- -RDEPEND="sys-libs/zlib +RDEPEND=" + sys-libs/zlib virtual/libiconv nls? ( virtual/libintl ) " GMP_MPFR_DEPS=">=dev-libs/gmp-4.3.2:0= >=dev-libs/mpfr-2.4.2:0=" -if tc_version_is_at_least 4.3 ; then - RDEPEND+=" ${GMP_MPFR_DEPS}" -elif tc_has_feature fortran ; then - RDEPEND+=" fortran? ( ${GMP_MPFR_DEPS} )" -fi - -tc_version_is_at_least 4.5 && RDEPEND+=" >=dev-libs/mpc-0.8.1:0=" +RDEPEND+=" ${GMP_MPFR_DEPS}" +RDEPEND+=" >=dev-libs/mpc-0.8.1:0=" if tc_has_feature objc-gc ; then - if tc_version_is_at_least 7 ; then - RDEPEND+=" objc-gc? ( >=dev-libs/boehm-gc-7.4.2 )" - fi + RDEPEND+=" objc-gc? ( >=dev-libs/boehm-gc-7.4.2 )" fi if tc_has_feature graphite ; then @@ -290,26 +314,15 @@ BDEPEND=" test? ( >=dev-util/dejagnu-1.4.4 >=sys-devel/autogen-5.5.4 - )" + ) +" DEPEND="${RDEPEND}" -if tc_has_feature gcj ; then - DEPEND+=" - gcj? ( - app-arch/zip - app-arch/unzip - >=media-libs/libart_lgpl-2.1 - awt? ( - x11-base/xorg-proto - x11-libs/libXt - x11-libs/libX11 - x11-libs/libXtst - =x11-libs/gtk+-2* - x11-libs/pango - virtual/pkgconfig - ) - ) - " +if [[ ${PN} == gcc && ${PV} == *_p* ]] ; then + # Snapshots don't contain info pages. + # If they start to, adjust gcc_cv_prog_makeinfo_modern logic in toolchain_src_configure. + # Needed unless/until https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106899 is fixed + BDEPEND+=" sys-apps/texinfo" fi if tc_has_feature sanitize ; then @@ -329,12 +342,26 @@ if tc_has_feature zstd ; then RDEPEND+=" zstd? ( app-arch/zstd:= )" fi -if tc_has_feature valgrind; then +if tc_has_feature valgrind ; then BDEPEND+=" valgrind? ( dev-util/valgrind )" fi -# Prefix: our version is 1.9, so can't go with gx86's 2.3 -PDEPEND=">=sys-devel/gcc-config-1.9" +# TODO: Add a pkg_setup & pkg_pretend check for whether the active compiler +# supports Ada. +if tc_has_feature ada ; then + BDEPEND+=" ada? ( || ( sys-devel/gcc[ada] dev-lang/gnat-gpl[ada] ) )" +fi + +# TODO: Add a pkg_setup & pkg_pretend check for whether the active compiler +# supports D. +if tc_has_feature d && tc_version_is_at_least 12.0 ; then + # D in 12+ is self-hosting and needs D to bootstrap. + # TODO: package some binary we can use, like for Ada + # bug #840182 + BDEPEND+=" d? ( || ( sys-devel/gcc[d(-)] > S + SRC_URI essentials <<---- @@ -343,38 +370,39 @@ PDEPEND=">=sys-devel/gcc-config-1.9" # Used to override compression used for for patchsets. # Default is xz for EAPI 8+ and bz2 for older EAPIs. if [[ ${EAPI} == 8 ]] ; then - : ${TOOLCHAIN_PATCH_SUFFIX:=xz} + : "${TOOLCHAIN_PATCH_SUFFIX:=xz}" else # Older EAPIs - : ${TOOLCHAIN_PATCH_SUFFIX:=bz2} + : "${TOOLCHAIN_PATCH_SUFFIX:=bz2}" fi # @ECLASS_VARIABLE: TOOLCHAIN_SET_S # @DESCRIPTION: # Used to override value of S for snapshots and such. Mainly useful # if needing to set GCC_TARBALL_SRC_URI. -: ${TOOLCHAIN_SET_S:=yes} +: "${TOOLCHAIN_SET_S:=yes}" # Set the source directory depending on whether we're using # a live git tree, snapshot, or release tarball. if [[ ${TOOLCHAIN_SET_S} == yes ]] ; then - S=$( - if tc_is_live ; then - echo ${EGIT_CHECKOUT_DIR} - elif [[ -n ${SNAPSHOT} ]] ; then - echo ${WORKDIR}/gcc-${SNAPSHOT} - else - echo ${WORKDIR}/gcc-${GCC_RELEASE_VER} - fi - ) + if tc_is_live ; then + S=${EGIT_CHECKOUT_DIR} + elif [[ -n ${SNAPSHOT} ]] ; then + S=${WORKDIR}/gcc-${SNAPSHOT} + else + S=${WORKDIR}/gcc-${GCC_RELEASE_VER} + fi fi gentoo_urls() { + # the list is sorted by likelihood of getting the patches tarball from + # respective devspace # slyfox's distfiles are mirrored to sam's devspace declare -A devspace_urls=( [soap]=HTTP~soap/distfiles/URI [sam]=HTTP~sam/distfiles/sys-devel/gcc/URI [slyfox]=HTTP~sam/distfiles/URI + [xen0n]=HTTP~xen0n/distfiles/sys-devel/gcc/URI [tamiko]=HTTP~tamiko/distfiles/URI [zorry]=HTTP~zorry/patches/gcc/URI [vapier]=HTTP~vapier/dist/URI @@ -402,7 +430,8 @@ gentoo_urls() { HTTP~tamiko/distfiles/URI HTTP~zorry/patches/gcc/URI HTTP~vapier/dist/URI - HTTP~blueness/dist/URI" + HTTP~blueness/dist/URI + " devspace=${devspace//HTTP/https:\/\/dev.gentoo.org\/} echo ${devspace//URI/$1} mirror://gentoo/$1 } @@ -431,43 +460,9 @@ gentoo_urls() { # The resulting filename of this tarball will be: # gcc-${PATCH_GCC_VER:-${GCC_RELEASE_VER}}-patches-${PATCH_VER}.tar.xz # -# PIE_VER -# PIE_GCC_VER -# These variables control patching in various updates for the logic -# controlling Position Independent Executables. PIE_VER is expected -# to be the version of this patch, and PIE_GCC_VER the gcc version of -# the patch: -# An example: -# PIE_VER="8.7.6.5" -# PIE_GCC_VER="3.4.0" -# The resulting filename of this tarball will be: -# gcc-${PIE_GCC_VER:-${GCC_RELEASE_VER}}-piepatches-v${PIE_VER}.tar.xz -# -# SPECS_VER -# SPECS_GCC_VER -# This is for the minispecs files included in the hardened gcc-4.x -# The specs files for hardenedno*, vanilla and for building the "specs" file. -# SPECS_VER is expected to be the version of this patch, SPECS_GCC_VER -# the gcc version of the patch. -# An example: -# SPECS_VER="8.7.6.5" -# SPECS_GCC_VER="3.4.0" -# The resulting filename of this tarball will be: -# gcc-${SPECS_GCC_VER:-${GCC_RELEASE_VER}}-specs-${SPECS_VER}.tar.xz -# -# CYGWINPORTS_GITREV -# If set, this variable signals that we should apply additional patches -# maintained by upstream Cygwin developers at github/cygwinports/gcc, -# using the specified git commit id there. The list of patches to -# apply is extracted from gcc.cygport, maintained there as well. -# This is done for compilers running on Cygwin, not for cross compilers -# with a Cygwin target. get_gcc_src_uri() { export PATCH_GCC_VER=${PATCH_GCC_VER:-${GCC_RELEASE_VER}} export MUSL_GCC_VER=${MUSL_GCC_VER:-${PATCH_GCC_VER}} - export PIE_GCC_VER=${PIE_GCC_VER:-${GCC_RELEASE_VER}} - export HTB_GCC_VER=${HTB_GCC_VER:-${GCC_RELEASE_VER}} - export SPECS_GCC_VER=${SPECS_GCC_VER:-${GCC_RELEASE_VER}} # Set where to download gcc itself depending on whether we're using a # live git tree, snapshot, or release tarball. @@ -477,13 +472,12 @@ get_gcc_src_uri() { # Pull gcc tarball from another location. Frequently used by gnat-gpl. GCC_SRC_URI="${GCC_TARBALL_SRC_URI}" elif [[ -n ${SNAPSHOT} ]] ; then - GCC_SRC_URI="https://gcc.gnu.org/pub/gcc/snapshots/${SNAPSHOT}/gcc-${SNAPSHOT}.tar.xz" + GCC_SRC_URI="mirror://gcc/snapshots/${SNAPSHOT}/gcc-${SNAPSHOT}.tar.xz" else - if tc_version_is_between 5.5 6 || tc_version_is_between 6.4 7 || tc_version_is_at_least 7.2 ; then - GCC_SRC_URI="mirror://gnu/gcc/gcc-${GCC_PV}/gcc-${GCC_RELEASE_VER}.tar.xz" - else - GCC_SRC_URI="mirror://gnu/gcc/gcc-${GCC_PV}/gcc-${GCC_RELEASE_VER}.tar.bz2" - fi + GCC_SRC_URI=" + mirror://gcc/gcc-${GCC_PV}/gcc-${GCC_RELEASE_VER}.tar.xz + mirror://gnu/gcc/gcc-${GCC_PV}/gcc-${GCC_RELEASE_VER}.tar.xz + " fi [[ -n ${PATCH_VER} ]] && \ @@ -491,27 +485,6 @@ get_gcc_src_uri() { [[ -n ${MUSL_VER} ]] && \ GCC_SRC_URI+=" $(gentoo_urls gcc-${MUSL_GCC_VER}-musl-patches-${MUSL_VER}.tar.${TOOLCHAIN_PATCH_SUFFIX})" - [[ -n ${PIE_VER} ]] && \ - PIE_CORE=${PIE_CORE:-gcc-${PIE_GCC_VER}-piepatches-v${PIE_VER}.tar.${TOOLCHAIN_PATCH_SUFFIX}} && \ - GCC_SRC_URI+=" $(gentoo_urls ${PIE_CORE})" - - # gcc minispec for the hardened gcc 4 compiler - [[ -n ${SPECS_VER} ]] && \ - GCC_SRC_URI+=" $(gentoo_urls gcc-${SPECS_GCC_VER}-specs-${SPECS_VER}.tar.${TOOLCHAIN_PATCH_SUFFIX})" - - if tc_has_feature gcj ; then - if tc_version_is_at_least 4.5 ; then - GCC_SRC_URI+=" gcj? ( ftp://sourceware.org/pub/java/ecj-4.5.jar )" - elif tc_version_is_at_least 4.3 ; then - GCC_SRC_URI+=" gcj? ( ftp://sourceware.org/pub/java/ecj-4.3.jar )" - fi - fi - - # Cygwin patches from https://github.com/cygwinports/gcc - [[ -n ${CYGWINPORTS_GITREV} ]] && \ - GCC_SRC_URI+=" elibc_Cygwin? ( https://github.com/cygwinports/gcc/archive/${CYGWINPORTS_GITREV}.tar.gz - -> gcc-cygwinports-${CYGWINPORTS_GITREV}.tar.gz )" - echo "${GCC_SRC_URI}" } @@ -525,11 +498,7 @@ toolchain_pkg_pretend() { ewarn 'Go requires a C++ compiler, disabled due to USE="-cxx"' _tc_use_if_iuse objc++ && \ ewarn 'Obj-C++ requires a C++ compiler, disabled due to USE="-cxx"' - _tc_use_if_iuse gcj && \ - ewarn 'GCJ requires a C++ compiler, disabled due to USE="-cxx"' fi - - want_minispecs } #---->> pkg_setup <<---- @@ -584,6 +553,11 @@ toolchain_src_unpack() { if tc_is_live ; then git-r3_src_unpack + # Needed for gcc --version to include the upstream commit used + # rather than only the commit after we apply our patches. + # It includes both with this. + echo "${EGIT_VERSION}" > "${S}"/gcc/REVISION || die + if [[ -z ${PATCH_VER} ]] && ! use vanilla ; then toolchain_fetch_git_patches fi @@ -601,8 +575,6 @@ toolchain_src_prepare() { cd "${S}" || die do_gcc_gentoo_patches - do_gcc_PIE_patches - do_gcc_CYGWINPORTS_patches if tc_is_live ; then BRANDING_GCC_PKGVERSION="${BRANDING_GCC_PKGVERSION}, commit ${EGIT_VERSION}" @@ -610,9 +582,8 @@ toolchain_src_prepare() { eapply_user - if ( tc_version_is_at_least 4.8.2 || _tc_use_if_iuse hardened ) \ - && ! use vanilla ; then - make_gcc_hard + if ! use vanilla ; then + tc_enable_hardened_gcc fi # we use our libtool on Darwin (no longer applies since 12) @@ -634,7 +605,6 @@ toolchain_src_prepare() { -exec sed -i '/^pkgconfigdir/s:=.*:=$(toolexeclibdir)/pkgconfig:' {} + || die setup_multilib_osdirnames - gcc_version_patch local actual_version=$(< "${S}"/gcc/BASE-VER) if [[ "${GCC_RELEASE_VER}" != "${actual_version}" ]] ; then @@ -642,23 +612,6 @@ toolchain_src_prepare() { die "Please set 'TOOLCHAIN_GCC_PV' to '${actual_version}'" fi - # >= gcc-4.3 doesn't bundle ecj.jar, so copy it - if tc_version_is_at_least 4.3 && _tc_use_if_iuse gcj ; then - if tc_version_is_at_least 4.5 ; then - einfo "Copying ecj-4.5.jar" - cp -pPR "${DISTDIR}/ecj-4.5.jar" "${S}/ecj.jar" || die - else - einfo "Copying ecj-4.3.jar" - cp -pPR "${DISTDIR}/ecj-4.3.jar" "${S}/ecj.jar" || die - fi - fi - - # Prevent libffi from being installed - if tc_version_is_between 3.0 4.8 ; then - sed -i -e 's/\(install.*:\) install-.*recursive/\1/' "${S}"/libffi/Makefile.in || die - sed -i -e 's/\(install-data-am:\).*/\1/' "${S}"/libffi/include/Makefile.in || die - fi - # Fixup libtool to correctly generate .la files with portage elibtoolize --portage --shallow --no-uclibc @@ -673,21 +626,25 @@ toolchain_src_prepare() { || eerror "Please file a bug about this" eend $? done - # bug #215828 - sed -i 's|A-Za-z0-9|[:alnum:]|g' "${S}"/gcc/*.awk || die - - # Prevent new texinfo from breaking old versions (see #198182, bug #464008) - einfo "Remove texinfo (bug #198182, bug #464008)" - eapply "${FILESDIR}"/gcc-configure-texinfo.patch - - # >=gcc-4 - if [[ -x contrib/gcc_update ]] ; then - einfo "Touching generated files" - ./contrib/gcc_update --touch | \ - while read f ; do - einfo " ${f%%...}" - done + + if ! use prefix-guest && [[ -n ${EPREFIX} ]] ; then + einfo "Prefixifying dynamic linkers..." + for f in gcc/config/*/*linux*.h ; do + ebegin " Updating ${f}" + if [[ ${f} == gcc/config/rs6000/linux*.h ]]; then + sed -i -r "s,(DYNAMIC_LINKER_PREFIX\s+)\"\",\1\"${EPREFIX}\",g" "${f}" || die + else + sed -i -r "/_DYNAMIC_LINKER/s,([\":])(/lib),\1${EPREFIX}\2,g" "${f}" || die + fi + eend $? + done fi + + einfo "Touching generated files" + ./contrib/gcc_update --touch | \ + while read f ; do + einfo " ${f%%...}" + done } do_gcc_gentoo_patches() { @@ -718,93 +675,47 @@ do_gcc_gentoo_patches() { fi } -do_gcc_PIE_patches() { - want_pie || return 0 - use vanilla && return 0 - - einfo "Applying PIE patches ..." - eapply "${WORKDIR}"/piepatch/*.patch +# configure to build with the hardened GCC specs as the default +tc_enable_hardened_gcc() { + local hardened_gcc_flags="" - BRANDING_GCC_PKGVERSION="${BRANDING_GCC_PKGVERSION}, pie-${PIE_VER}" -} + if _tc_use_if_iuse pie ; then + einfo "Updating gcc to use automatic PIE building ..." + fi -do_gcc_CYGWINPORTS_patches() { - [[ -n ${CYGWINPORTS_GITREV} ]] || return 0 - use elibc_Cygwin || return 0 - - local p d="${WORKDIR}/gcc-${CYGWINPORTS_GITREV}" - # readarray -t is available since bash-4.4 only, bug #690686 - local patches=( $( - for p in $( - sed -e '1,/PATCH_URI="/d;/"/,$d' < "${d}"/gcc.cygport - ); do - echo "${d}/${p}" - done - ) ) - einfo "Applying cygwin port patches ..." - eapply -- "${patches[@]}" -} + if _tc_use_if_iuse ssp ; then + einfo "Updating gcc to use automatic SSP building ..." + fi -# configure to build with the hardened GCC specs as the default -make_gcc_hard() { - local gcc_hard_flags="" + if _tc_use_if_iuse default-stack-clash-protection ; then + # The define DEF_GENTOO_SCP is checked in 24_all_DEF_GENTOO_SCP-fstack-clash-protection.patch + einfo "Updating gcc to use automatic stack clash protection ..." + hardened_gcc_flags+=" -DDEF_GENTOO_SCP" + fi - # If we use gcc-6 or newer with PIE enabled to compile older gcc, - # we need to pass -no-pie to stage1; bug #618908 - if ! tc_version_is_at_least 6.0 && [[ $(gcc-major-version) -ge 6 ]] ; then - einfo "Disabling PIE in stage1 (only) ..." - sed -i -e "/^STAGE1_LDFLAGS/ s/$/ -no-pie/" "${S}"/Makefile.in || die + if _tc_use_if_iuse default-znow ; then + # The define DEF_GENTOO_ZNOW is checked in 23_all_DEF_GENTOO_ZNOW-z-now.patch + einfo "Updating gcc to request symbol resolution at start (-z now) ..." + hardened_gcc_flags+=" -DDEF_GENTOO_ZNOW" fi - # For gcc >= 6.x, we can use configuration options to turn PIE/SSP - # on as default - if tc_version_is_at_least 6.0 ; then - if _tc_use_if_iuse pie ; then - einfo "Updating gcc to use automatic PIE building ..." - fi - if _tc_use_if_iuse ssp ; then - einfo "Updating gcc to use automatic SSP building ..." - fi - if _tc_use_if_iuse hardened ; then - # Will add some hardened options as default, like: - # * -fstack-clash-protection - # * -z now - # See gcc *_all_extra-options.patch patches. - gcc_hard_flags+=" -DEXTRA_OPTIONS" - - if _tc_use_if_iuse cet && [[ ${CTARGET} == *x86_64*-linux* ]] ; then - gcc_hard_flags+=" -DEXTRA_OPTIONS_CF" - fi + if _tc_use_if_iuse hardened ; then + # Will add some hardened options as default, e.g. for gcc-12 + # * -fstack-clash-protection + # * -z now + # See gcc *_all_extra-options.patch patches. + hardened_gcc_flags+=" -DEXTRA_OPTIONS" + # Default to -D_FORTIFY_SOURCE=3 instead of -D_FORTIFY_SOURCE=2 + hardened_gcc_flags+=" -DGENTOO_FORTIFY_SOURCE_LEVEL=3" + # Add -D_GLIBCXX_ASSERTIONS + hardened_gcc_flags+=" -DDEF_GENTOO_GLIBCXX_ASSERTIONS" - # Rebrand to make bug reports easier - BRANDING_GCC_PKGVERSION=${BRANDING_GCC_PKGVERSION/Gentoo/Gentoo Hardened} - fi - else - if _tc_use_if_iuse hardened ; then - # Rebrand to make bug reports easier - BRANDING_GCC_PKGVERSION=${BRANDING_GCC_PKGVERSION/Gentoo/Gentoo Hardened} - if hardened_gcc_works ; then - einfo "Updating gcc to use automatic PIE + SSP building ..." - gcc_hard_flags+=" -DEFAULT_PIE_SSP" - elif hardened_gcc_works pie ; then - einfo "Updating gcc to use automatic PIE building ..." - ewarn "SSP has not been enabled by default" - gcc_hard_flags+=" -DEFAULT_PIE" - elif hardened_gcc_works ssp ; then - einfo "Updating gcc to use automatic SSP building ..." - ewarn "PIE has not been enabled by default" - gcc_hard_flags+=" -DEFAULT_SSP" - else - # Do nothing if hardened isn't supported, but don't die either - ewarn "hardened is not supported for this arch in this gcc version" - return 0 - fi - else - if hardened_gcc_works ssp ; then - einfo "Updating gcc to use automatic SSP building ..." - gcc_hard_flags+=" -DEFAULT_SSP" - fi + if _tc_use_if_iuse cet && [[ ${CTARGET} == *x86_64*-linux* ]] ; then + hardened_gcc_flags+=" -DEXTRA_OPTIONS_CF" fi + + # Rebrand to make bug reports easier + BRANDING_GCC_PKGVERSION=${BRANDING_GCC_PKGVERSION/Gentoo/Gentoo Hardened} fi # We want to be able to control the PIE patch logic via something other @@ -812,15 +723,13 @@ make_gcc_hard() { sed -e '/^ALL_CFLAGS/iHARD_CFLAGS = ' \ -e 's|^ALL_CFLAGS = |ALL_CFLAGS = $(HARD_CFLAGS) |' \ -i "${S}"/gcc/Makefile.in || die - # Need to add HARD_CFLAGS to ALL_CXXFLAGS on >= 4.7 - if tc_version_is_at_least 4.7 ; then - sed -e '/^ALL_CXXFLAGS/iHARD_CFLAGS = ' \ - -e 's|^ALL_CXXFLAGS = |ALL_CXXFLAGS = $(HARD_CFLAGS) |' \ - -i "${S}"/gcc/Makefile.in || die - fi + + sed -e '/^ALL_CXXFLAGS/iHARD_CFLAGS = ' \ + -e 's|^ALL_CXXFLAGS = |ALL_CXXFLAGS = $(HARD_CFLAGS) |' \ + -i "${S}"/gcc/Makefile.in || die sed -i \ - -e "/^HARD_CFLAGS = /s|=|= ${gcc_hard_flags} |" \ + -e "/^HARD_CFLAGS = /s|=|= ${hardened_gcc_flags} |" \ "${S}"/gcc/Makefile.in || die } @@ -832,7 +741,7 @@ make_gcc_hard() { # Most other distros use the logic (including mainline gcc): # lib - 32bit binaries (x86) # lib64 - 64bit binaries (x86_64) -# Over time, Gentoo is migrating to the latter form. +# Over time, Gentoo is migrating to the latter form (17.1 profiles). # # Unfortunately, due to distros picking the lib32 behavior, newer gcc # versions will dynamically detect whether to use lib or lib32 for its @@ -856,16 +765,10 @@ setup_multilib_osdirnames() { config+="/t-linux64" local sed_args=() - if tc_version_is_at_least 4.6 ; then - sed_args+=( -e 's:$[(]call if_multiarch[^)]*[)]::g' ) - fi + sed_args+=( -e 's:$[(]call if_multiarch[^)]*[)]::g' ) if [[ ${SYMLINK_LIB} == "yes" ]] ; then einfo "Updating multilib directories to be: ${libdirs}" - if tc_version_is_at_least 4.6.4 || tc_version_is_at_least 4.7 ; then - sed_args+=( -e '/^MULTILIB_OSDIRNAMES.*lib32/s:[$][(]if.*):../lib32:' ) - else - sed_args+=( -e "/^MULTILIB_OSDIRNAMES/s:=.*:= ${libdirs}:" ) - fi + sed_args+=( -e '/^MULTILIB_OSDIRNAMES.*lib32/s:[$][(]if.*):../lib32:' ) else einfo "Using upstream multilib; disabling lib32 autodetection" sed_args+=( -r -e 's:[$][(]if.*,(.*)[)]:\1:' ) @@ -873,30 +776,18 @@ setup_multilib_osdirnames() { sed -i "${sed_args[@]}" "${S}"/gcc/config/${config} || die } -gcc_version_patch() { - # gcc-4.3+ has configure flags (whoo!) - tc_version_is_at_least 4.3 && return 0 - - local version_string=${GCC_RELEASE_VER} - - einfo "Patching gcc version: ${version_string} (${BRANDING_GCC_PKGVERSION})" - - local gcc_sed=( -e 's:gcc\.gnu\.org/bugs\.html:bugs\.gentoo\.org/:' ) - if grep -qs VERSUFFIX "${S}"/gcc/version.c ; then - gcc_sed+=( -e "/VERSUFFIX \"\"/s:\"\":\" (${BRANDING_GCC_PKGVERSION})\":" ) - else - version_string="${version_string} (${BRANDING_GCC_PKGVERSION})" - gcc_sed+=( -e "/const char version_string\[\] = /s:= \".*\":= \"${version_string}\":" ) - fi - sed -i "${gcc_sed[@]}" "${S}"/gcc/version.c || die -} - #---->> src_configure <<---- toolchain_src_configure() { downgrade_arch_flags gcc_do_filter_flags + if ! tc_version_is_at_least 11 && [[ $(gcc-major-version) -ge 12 ]] ; then + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105695 + # bug #849359 + export ac_cv_std_swap_in_utility=no + fi + einfo "CFLAGS=\"${CFLAGS}\"" einfo "CXXFLAGS=\"${CXXFLAGS}\"" einfo "LDFLAGS=\"${LDFLAGS}\"" @@ -905,12 +796,6 @@ toolchain_src_configure() { # issues with 3rd party jar implementations. bug #384291 export JAR=no - # For hardened gcc 4.3: add the pie patchset to build the hardened specs - # file (build.specs) to use when building gcc. - if ! tc_version_is_at_least 4.4 && want_minispecs ; then - setup_minispecs_gcc_build_specs - fi - local confgcc=( --host=${CHOST} ) local build_config_targets=() @@ -932,8 +817,19 @@ toolchain_src_configure() { --mandir="${DATAPATH}/man" --infodir="${DATAPATH}/info" --with-gxx-include-dir="${STDCXX_INCDIR}" + + # portage's econf() does not detect presence of --d-s-r + # because it greps only top-level ./configure. But not + # libiberty's or gcc's configure. + --disable-silent-rules ) + if tc_version_is_at_least 10 ; then + confgcc+=( + --disable-dependency-tracking + ) + fi + # Stick the python scripts in their own slotted directory (bug #279252) # # --with-python-dir=DIR @@ -943,16 +839,13 @@ toolchain_src_configure() { # then --with-python-dir=/lib/python2.5/site-packages should be passed. # # This should translate into "/share/gcc-data/${CTARGET}/${GCC_CONFIG_VER}/python" - if tc_version_is_at_least 4.4 ; then - confgcc+=( --with-python-dir=${DATAPATH/$PREFIX/}/python ) - fi + confgcc+=( --with-python-dir=${DATAPATH/$PREFIX/}/python ) ### language options local GCC_LANG="c" is_cxx && GCC_LANG+=",c++" is_d && GCC_LANG+=",d" - is_gcj && GCC_LANG+=",java" is_go && GCC_LANG+=",go" if is_objc || is_objcxx ; then GCC_LANG+=",objc" @@ -966,8 +859,9 @@ toolchain_src_configure() { is_fortran && GCC_LANG+=",fortran" is_f77 && GCC_LANG+=",f77" is_f95 && GCC_LANG+=",f95" - is_ada && GCC_LANG+=",ada" + is_modula2 && GCC_LANG+=",m2" + is_rust && GCC_LANG+=",rust" confgcc+=( --enable-languages=${GCC_LANG} ) @@ -988,32 +882,46 @@ toolchain_src_configure() { confgcc+=( --disable-libunwind-exceptions ) - # Use the default ("release") checking because upstream usually neglects - # to test "disabled" so it has a history of breaking. bug #317217 if in_iuse debug ; then - # The "release" keyword is new to 4.0. bug #551636 - local off=$(tc_version_is_at_least 4.0 && echo release || echo no) - confgcc+=( --enable-checking="${GCC_CHECKS_LIST:-$(usex debug yes ${off})}" ) + # Non-released versions get extra checks, follow configure.ac's default to for those + # unless USE=debug. Note that snapshots on stable branches don't count as "non-released" + # for these purposes. + if grep -q "experimental" gcc/DEV-PHASE ; then + # - USE=debug for pre-releases: yes,extra,rtl + # - USE=-debug for pre-releases: yes,extra (following upstream default) + confgcc+=( --enable-checking="${GCC_CHECKS_LIST:-$(usex debug yes,extra,rtl yes,extra)}" ) + else + # - Use the default ("release") checking because upstream usually neglects + # to test "disabled" so it has a history of breaking. bug #317217. + # - The "release" keyword is new to 4.0. bug #551636. + # - After discussing in #gcc, we concluded that =yes,extra,rtl makes + # more sense when a user explicitly requests USE=debug. If rtl is too slow, + # we can change this to yes,extra. + confgcc+=( --enable-checking="${GCC_CHECKS_LIST:-$(usex debug yes,extra,rtl release)}" ) + fi fi # Branding - tc_version_is_at_least 4.3 && confgcc+=( + confgcc+=( --with-bugurl=https://bugs.gentoo.org/ --with-pkgversion="${BRANDING_GCC_PKGVERSION}" ) - # If we want hardened support with the newer PIE patchset for >=gcc 4.4 - if tc_version_is_at_least 4.4 && want_minispecs && in_iuse hardened ; then - confgcc+=( $(use_enable hardened esp) ) + if tc_use_major_version_only ; then + confgcc+=( --with-gcc-major-version-only ) fi # Allow gcc to search for clock funcs in the main C lib. # if it can't find them, then tough cookies -- we aren't # going to link in -lrt to all C++ apps. bug #411681 - if tc_version_is_at_least 4.4 && is_cxx ; then + if is_cxx ; then confgcc+=( --enable-libstdcxx-time ) fi + # This only controls whether the compiler *supports* LTO, not whether + # it's *built using* LTO. Hence we do it without a USE flag. + confgcc+=( --enable-lto ) + # Build compiler itself using LTO if tc_version_is_at_least 9.1 && _tc_use_if_iuse lto ; then build_config_targets+=( bootstrap-lto ) @@ -1024,7 +932,7 @@ toolchain_src_configure() { fi # Support to disable PCH when building libstdcxx - if tc_version_is_at_least 6.0 && ! _tc_use_if_iuse pch ; then + if ! _tc_use_if_iuse pch ; then confgcc+=( --disable-libstdcxx-pch ) fi @@ -1040,12 +948,6 @@ toolchain_src_configure() { # ;; # esac - # Newer gcc versions like to bootstrap themselves with C++, - # so we need to manually disable it ourselves - if tc_version_is_between 4.7 4.8 && ! is_cxx ; then - confgcc+=( --disable-build-with-cxx --disable-build-poststage1-with-cxx ) - fi - ### Cross-compiler options if is_crosscompile ; then # Enable build warnings by default with cross-compilers when system @@ -1079,15 +981,15 @@ toolchain_src_configure() { *-musl*) needed_libc=musl ;; - *-cygwin) - needed_libc=cygwin - ;; x86_64-*-mingw*|*-w64-mingw*) needed_libc=mingw64-runtime ;; avr) confgcc+=( --enable-shared --disable-threads ) ;; + nvptx*) + # "LTO is not supported for this target" + confgcc+=( --disable-lto ) # Prefix targets *-apple-darwin*) confgcc+=( --with-sysroot="${EPREFIX}${PREFIX}/${CTARGET}" ) @@ -1095,17 +997,14 @@ toolchain_src_configure() { *-solaris*) confgcc+=( --with-sysroot="${EPREFIX}${PREFIX}/${CTARGET}" ) ;; - *-freebsd*) - confgcc+=( --with-sysroot="${EPREFIX}${PREFIX}/${CTARGET}" ) - ;; esac if [[ -n ${needed_libc} ]] ; then local confgcc_no_libc=( --disable-shared ) # requires libc: bug #734820 - tc_version_is_at_least 4.6 && confgcc_no_libc+=( --disable-libquadmath ) + confgcc_no_libc+=( --disable-libquadmath ) # requires libc - tc_version_is_at_least 4.8 && confgcc_no_libc+=( --disable-libatomic ) + confgcc_no_libc+=( --disable-libatomic ) if ! has_version ${CATEGORY}/${needed_libc} ; then confgcc+=( @@ -1132,7 +1031,13 @@ toolchain_src_configure() { fi fi - confgcc+=( --disable-bootstrap ) + confgcc+=( + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100289 + # TOOD: Find a way to disable this just for stage1 cross? + --disable-gcov + + --disable-bootstrap + ) else if tc-is-static-only ; then confgcc+=( --disable-shared ) @@ -1148,7 +1053,20 @@ toolchain_src_configure() { ;; esac - if use prefix ; then + if ! use prefix-guest ; then + # GNU ld scripts, such as those in glibc, reference unprefixed paths + # as the sysroot given here is automatically prepended. For + # prefix-guest, we use the host's libc instead. + if [[ -n ${EPREFIX} ]] ; then + confgcc+=( --with-sysroot="${EPREFIX}" ) + fi + + # We need to build against the right headers and libraries. Again, + # for prefix-guest, this is the host's. + if [[ -n ${ESYSROOT} ]] ; then + confgcc+=( --with-build-sysroot="${ESYSROOT}" ) + fi + elif use prefix ; then # should be /usr, because it's the path to search includes # for, which is unrelated to TOOLCHAIN_PREFIX, a.k.a. # PREFIX @@ -1190,7 +1108,7 @@ toolchain_src_configure() { # gcc has fixed-point arithmetic support in 4.3 for mips targets that can # significantly increase compile time by several hours. This will allow # users to control this feature in the event they need the support. - tc_version_is_at_least 4.3 && in_iuse fixed-point && confgcc+=( $(use_enable fixed-point) ) + in_iuse fixed-point && confgcc+=( $(use_enable fixed-point) ) case $(tc-is-softfloat) in yes) @@ -1222,13 +1140,11 @@ toolchain_src_configure() { fi done - # Convert armv6m to armv6-m - [[ ${arm_arch} == armv6m ]] && arm_arch=armv6-m # Convert armv7{a,r,m} to armv7-{a,r,m} [[ ${arm_arch} == armv7? ]] && arm_arch=${arm_arch/7/7-} # See if this is a valid --with-arch flag if (srcdir=${S}/gcc target=${CTARGET} with_arch=${arm_arch}; - . "${srcdir}"/config.gcc) &>/dev/null + . "${srcdir}"/config.gcc) &>/dev/null then confgcc+=( --with-arch=${arm_arch} ) fi @@ -1237,10 +1153,7 @@ toolchain_src_configure() { [[ ${arm_arch} == *-m ]] && confgcc+=( --with-mode=thumb ) # Enable hardvfp - if [[ $(tc-is-softfloat) == "no" ]] && \ - [[ ${CTARGET} == armv[67]* ]] && \ - tc_version_is_at_least 4.5 - then + if [[ $(tc-is-softfloat) == "no" ]] && [[ ${CTARGET} == armv[67]* ]] ; then # Follow the new arm hardfp distro standard by default confgcc+=( --with-float=hard ) case ${CTARGET} in @@ -1248,6 +1161,15 @@ toolchain_src_configure() { armv7*) confgcc+=( --with-fpu=vfpv3-d16 ) ;; esac fi + + # If multilib is used, make the compiler build multilibs + # for A or R and M architecture profiles. Do this only + # when no specific arch/mode/float is specified, e.g. + # for target arm-none-eabi, since doing this is + # incompatible with --with-arch/cpu/float/fpu. + if is_multilib && [[ ${arm_arch} == arm ]] ; then + confgcc+=( --with-multilib-list=aprofile,rmprofile ) + fi ;; mips) # Add --with-abi flags to set default ABI @@ -1255,9 +1177,9 @@ toolchain_src_configure() { ;; amd64) - # drop the older/ABI checks once this get's merged into some + # drop the older/ABI checks once this gets merged into some # version of gcc upstream - if tc_version_is_at_least 4.8 && has x32 $(get_all_abis TARGET) ; then + if has x32 $(get_all_abis TARGET) ; then confgcc+=( --with-abi=$(gcc-abi-map ${TARGET_DEFAULT_ABI}) ) fi ;; @@ -1266,10 +1188,6 @@ toolchain_src_configure() { # since glibc will do so based on CTARGET anyways confgcc+=( --with-arch=${CTARGET%%-*} ) ;; - hppa) - # Enable sjlj exceptions for backward compatibility on hppa - [[ ${GCCMAJOR} == "3" ]] && confgcc+=( --enable-sjlj-exceptions ) - ;; ppc) # Set up defaults based on current CFLAGS is-flagq -mfloat-gprs=double && confgcc+=( --enable-e500-double ) @@ -1284,6 +1202,13 @@ toolchain_src_configure() { # - bug #704784 # - https://gcc.gnu.org/PR93157 [[ ${CTARGET} == powerpc64-*-musl ]] && confgcc+=( --with-abi=elfv2 ) + + if in_iuse ieee-long-double; then + # musl requires 64-bit long double, not IBM double-double or IEEE quad. + if [[ ${CTARGET} == powerpc64le-*-gnu ]]; then + use ieee-long-double && confgcc+=( --with-long-double-format=ieee ) + fi + fi ;; riscv) # Add --with-abi flags to set default ABI @@ -1295,19 +1220,15 @@ toolchain_src_configure() { # be small, and should simplify building of 64bit kernels in a 32bit # userland by not needing sys-devel/kgcc64. bug #349405 case $(tc-arch) in - ppc|ppc64) + amd64|ppc|ppc64|sparc|x86) confgcc+=( --enable-targets=all ) ;; - sparc) - tc_version_is_at_least 4.4 && confgcc+=( --enable-targets=all ) - ;; - amd64|x86) - tc_version_is_at_least 4.3 && confgcc+=( --enable-targets=all ) + *) ;; esac # On Darwin we need libdir to be set in order to get correct install names - # for things like libobjc-gnu, libgcj and libfortran. If we enable it on + # for things like libobjc-gnu and libfortran. If we enable it on # non-Darwin we screw up the behaviour this eclass relies on. We in # particular need this over --libdir for bug #255315. [[ ${CTARGET} == *-darwin* ]] && \ @@ -1315,15 +1236,6 @@ toolchain_src_configure() { ### library options - if tc_version_is_between 3.0 7.0 ; then - if is_gcj ; then - confgcc+=( --disable-gjdoc ) - use awt && confgcc+=( --enable-java-awt=gtk ) - else - confgcc+=( --disable-libgcj ) - fi - fi - if in_iuse openmp ; then # Make sure target has pthreads support: bug #326757, bug #335883 # There shouldn't be a chicken & egg problem here as openmp won't @@ -1345,10 +1257,6 @@ toolchain_src_configure() { if _tc_use_if_iuse libssp ; then confgcc+=( --enable-libssp ) else - if hardened_gcc_is_stable ssp; then - export gcc_cv_libc_provides_ssp=yes - fi - if _tc_use_if_iuse ssp; then # On some targets USE="ssp -libssp" is an invalid # configuration as the target libc does not provide @@ -1402,50 +1310,52 @@ toolchain_src_configure() { confgcc+=( $(use_with zstd) ) fi - # This only controls whether the compiler *supports* LTO, not whether - # it's *built using* LTO. Hence we do it without a USE flag. - if tc_version_is_at_least 4.6 ; then - confgcc+=( --enable-lto ) - elif tc_version_is_at_least 4.5 ; then - confgcc+=( --disable-lto ) - fi - # graphite was added in 4.4 but we only support it in 6.5+ due to external # library issues. bug #448024, bug #701270 - if tc_version_is_at_least 6.5 && in_iuse graphite ; then + if in_iuse graphite ; then confgcc+=( $(use_with graphite isl) ) use graphite && confgcc+=( --disable-isl-version-check ) - elif tc_version_is_at_least 5.0 ; then + else confgcc+=( --without-isl ) - elif tc_version_is_at_least 4.8 ; then - confgcc+=( --without-cloog ) - elif tc_version_is_at_least 4.4 ; then - confgcc+=( --without-{cloog,ppl} ) fi - if tc_version_is_at_least 4.8; then - if in_iuse sanitize ; then - # See Note [implicitly enabled flags] - confgcc+=( $(usex sanitize '' --disable-libsanitizer) ) - else - confgcc+=( --disable-libsanitizer ) - fi + if in_iuse sanitize ; then + # See Note [implicitly enabled flags] + confgcc+=( $(usex sanitize '' --disable-libsanitizer) ) + else + confgcc+=( --disable-libsanitizer ) fi - if tc_version_is_at_least 6.0 && in_iuse pie ; then + if in_iuse pie ; then confgcc+=( $(use_enable pie default-pie) ) + + if tc_version_is_at_least 14.0.0_pre20230612 ${PV} ; then + confgcc+=( --enable-host-pie ) + fi + fi + + if in_iuse default-znow && tc_version_is_at_least 14.0.0_pre20230619 ${PV}; then + # See https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=33ebb0dff9bb022f1e0709e0e73faabfc3df7931. + # TODO: Add to LDFLAGS_FOR_TARGET? + confgcc+=( + $(use_enable default-znow host-bind-now) + ) fi - if tc_version_is_at_least 6.0 && in_iuse ssp ; then + if in_iuse ssp ; then confgcc+=( # This defaults to -fstack-protector-strong. $(use_enable ssp default-ssp) ) fi - # Disable gcc info regeneration -- it ships with generated info pages - # already. Our custom version/urls/etc... trigger it. bug #464008 - export gcc_cv_prog_makeinfo_modern=no + # TODO: Ignore RCs here (but TOOLCHAIN_IS_RC isn't yet an eclass var) + if [[ ${PV} == *_p* && -f "${S}"/gcc/doc/gcc.info ]] ; then + # Safeguard against https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106899 being fixed + # without corresponding ebuild changes. + eqawarn "Snapshot release with pre-generated info pages found!" + eqawarn "The BDEPEND in the ebuild should be updated to drop texinfo." + fi # Do not let the X detection get in our way. We know things can be found # via system paths, so no need to hardcode things that'll break multilib. @@ -1455,8 +1365,8 @@ toolchain_src_configure() { confgcc+=( "$@" ${EXTRA_ECONF} ) - if [[ -n ${build_config_targets} ]] ; then - # ./configure --with-build-config='bootstrap-lto bootstrap-cet' + if ! is_crosscompile && ! tc-is-cross-compiler && [[ -n ${build_config_targets} ]] ; then + # e.g. ./configure --with-build-config='bootstrap-lto bootstrap-cet' confgcc+=( --with-build-config="${build_config_targets[*]}" ) fi @@ -1529,6 +1439,7 @@ downgrade_arch_flags() { # "added" "arch" "replacement" local archlist=( + 12.3 znver4 znver3 10 znver3 znver2 9 znver2 znver1 4.9 bdver4 bdver3 @@ -1637,6 +1548,9 @@ gcc_do_filter_flags() { append-flags -O2 fi + # Please use USE=lto instead (bug #906007). + filter-lto + # Avoid shooting self in foot filter-flags '-mabi*' -m31 -m32 -m64 @@ -1647,39 +1561,14 @@ gcc_do_filter_flags() { filter-flags '-fsanitize=*' - if tc_version_is_between 6 8 ; then - # -mstackrealign triggers crashes in exception throwing - # at least on ada: bug #688580 - # The reason is unknown. Drop the flag for now. - filter-flags -mstackrealign - fi - case $(tc-arch) in amd64|x86) filter-flags '-mcpu=*' - - # bug #357287 - tc_version_is_between 4.4 4.5 && append-flags -mno-avx - - if tc_version_is_between 4.6 4.7 ; then - # bug #411333, bug #466454 - replace-cpu-flags c3-2 pentium2 pentium3 pentium3m pentium-m i686 - fi ;; alpha) # bug #454426 append-ldflags -Wl,--no-relax ;; - sparc) - # Temporary workaround for random ICEs reproduced by multiple users - # bug #457062 - tc_version_is_between 4.6 4.8 && MAKEOPTS+=" -j1" - ;; - *-macos) - # https://gcc.gnu.org/PR25127 - tc_version_is_between 4.0 4.2 && \ - filter-flags '-mcpu=*' '-march=*' '-mtune=*' - ;; esac strip-unsupported-flags @@ -1695,27 +1584,6 @@ gcc_do_filter_flags() { local VAR="CFLAGS_"${CTARGET//[-.]/_} CXXFLAGS=${!VAR-${CFLAGS}} fi - - export GCJFLAGS=${GCJFLAGS:-${CFLAGS}} -} - -setup_minispecs_gcc_build_specs() { - # Setup the "build.specs" file for gcc 4.3 to use when building. - if hardened_gcc_works pie ; then - cat "${WORKDIR}"/specs/pie.specs >> "${WORKDIR}"/build.specs - fi - - if hardened_gcc_works ssp ; then - for s in ssp sspall ; do - cat "${WORKDIR}"/specs/${s}.specs >> "${WORKDIR}"/build.specs - done - fi - - for s in nostrict znow ; do - cat "${WORKDIR}"/specs/${s}.specs >> "${WORKDIR}"/build.specs - done - - export GCC_SPECS="${WORKDIR}"/build.specs } gcc-multilib-configure() { @@ -1739,7 +1607,7 @@ gcc-multilib-configure() { if [[ -n ${list} ]] ; then case ${CTARGET} in x86_64*) - tc_version_is_at_least 4.8 && confgcc+=( --with-multilib-list=${list:1} ) + confgcc+=( --with-multilib-list=${list:1} ) ;; esac fi @@ -1773,7 +1641,7 @@ toolchain_src_compile() { touch "${S}"/gcc/c-gperf.h || die # Do not make manpages if we do not have perl ... - [[ ! -x /usr/bin/perl ]] \ + [[ ! -x "${BROOT}"/usr/bin/perl ]] \ && find "${WORKDIR}"/build -name '*.[17]' -exec touch {} + # To compile ada library standard files special compiler options are passed @@ -1814,7 +1682,7 @@ gcc_do_make() { GCC_MAKE_TARGET=${GCC_MAKE_TARGET-all} ewarn "Disabling bootstrapping. ONLY recommended for development." - ewarn "This is NOT a safe configuration for endusers!" + ewarn "This is NOT a safe configuration for end users!" ewarn "This compiler may not be safe or reliable for production use!" elif _tc_use_if_iuse pgo; then GCC_MAKE_TARGET=${GCC_MAKE_TARGET-profiledbootstrap} @@ -1823,17 +1691,8 @@ gcc_do_make() { fi fi - # Older versions of GCC could not do profiledbootstrap in parallel due to - # collisions with profiling info. - if [[ ${GCC_MAKE_TARGET} == "profiledbootstrap" ]] ; then - ! tc_version_is_at_least 4.6 && export MAKEOPTS="${MAKEOPTS} -j1" - fi - if [[ ${GCC_MAKE_TARGET} == "all" ]] ; then STAGE1_CFLAGS=${STAGE1_CFLAGS-"${CFLAGS}"} - elif [[ $(gcc-version) == "3.4" && ${GCC_BRANCH_VER} == "3.4" ]] && gcc-specs-ssp ; then - # See bug #79852 - STAGE1_CFLAGS=${STAGE1_CFLAGS-"-O2"} fi if is_crosscompile; then @@ -1858,7 +1717,7 @@ gcc_do_make() { LIBPATH="${LIBPATH}" \ BOOT_CFLAGS="${BOOT_CFLAGS}" popd > /dev/null || die - fi + fi einfo "Compiling ${PN} (${GCC_MAKE_TARGET})..." @@ -1888,13 +1747,9 @@ gcc_do_make() { if ! is_crosscompile && _tc_use_if_iuse cxx && _tc_use_if_iuse doc ; then if type -p doxygen > /dev/null ; then - if tc_version_is_at_least 4.3 ; then - cd "${CTARGET}"/libstdc++-v3/doc - emake doc-man-doxygen - else - cd "${CTARGET}"/libstdc++-v3 - emake doxygen-man - fi + cd "${CTARGET}"/libstdc++-v3/doc || die + emake doc-man-doxygen + # Clean bogus manpages. bug #113902 find -name '*_build_*' -delete @@ -1923,12 +1778,39 @@ toolchain_src_test() { # 'asan' wants to be preloaded first, so does 'sandbox'. # To make asan tests work disable sandbox for all of test suite. # 'backtrace' tests also does not like 'libsandbox.so' presence. - SANDBOX_ON=0 LD_PRELOAD= emake -k check + # + # Nonfatal here as we die if compare_tests failed + SANDBOX_ON=0 LD_PRELOAD= nonfatal emake -k check + local success_tests=$? + + if [[ ! -d "${BROOT}"/var/cache/gcc/${SLOT} ]] && ! [[ ${success_tests} -eq 0 ]] ; then + # We have no reference data saved from a previous run to know if + # the failures are tolerable or not, so we bail out. + eerror "Reference test data does NOT exist at ${BROOT}/var/cache/gcc/${SLOT}" + eerror "Tests failed and nothing to compare with, so this is a fatal error." + eerror "(Set GCC_TESTS_IGNORE_NO_BASELINE=1 to make this non-fatal for initial run.)" + + if [[ -z ${GCC_TESTS_IGNORE_NO_BASELINE} ]] ; then + die "Tests failed (failures occurred with no reference data)" + fi + fi - einfo "Testing complete." + einfo "Testing complete! Review the following output to check for success or failure." einfo "Please ignore any 'mail' lines in the summary output below (no mail is sent)." einfo "Summary:" "${S}"/contrib/test_summary + + # If previous results exist on the system, compare with it + # TODO: Distribute some baseline results in e.g. gcc-patches.git? + if [[ -d "${BROOT}"/var/cache/gcc/${SLOT} ]] ; then + einfo "Comparing with previous cached results at ${BROOT}/var/cache/gcc/${SLOT}" + + # Exit with the following values: + # 0 if there is nothing of interest + # 1 if there are errors when comparing single test case files + # N for the number of errors found when comparing directories + "${S}"/contrib/compare_tests "${BROOT}"/var/cache/gcc/${SLOT}/ . || die "Comparison for tests results failed, error code: $?" + fi } #---->> src_install <<---- @@ -1939,26 +1821,20 @@ toolchain_src_install() { # Don't allow symlinks in private gcc include dir as this can break the build find gcc/include*/ -type l -delete || die - # Copy over the info pages. We disabled their generation earlier, but the - # build system only expects to install out of the build dir, not the source. bug #464008 - mkdir -p gcc/doc || die - local x= - for x in "${S}"/gcc/doc/*.info* ; do - if [[ -f ${x} ]] ; then - cp "${x}" gcc/doc/ || die - fi - done - - # We remove the generated fixincludes, as they can cause things to break - # (ncurses, openssl, etc). We do not prevent them from being built, as - # in the following commit which we revert: - # https://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/eclass/toolchain.eclass?r1=1.647&r2=1.648 - # This is because bsd userland needs fixedincludes to build gcc, while - # linux does not. Both can dispose of them afterwards. - while read x ; do - grep -q 'It has been auto-edited by fixincludes from' "${x}" \ - && use !prefix && rm -f "${x}" - done < <(find gcc/include*/ -name '*.h') + # Re-enable fixincludes for >= GCC 13 + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107128 + if [[ ${GCCMAJOR} -lt 13 ]] ; then + # We remove the generated fixincludes, as they can cause things to break + # (ncurses, openssl, etc). We do not prevent them from being built, as + # in the following commit which we revert: + # https://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/eclass/toolchain.eclass?r1=1.647&r2=1.648 + # This is because bsd userland needs fixedincludes to build gcc, while + # linux does not. Both can dispose of them afterwards. + while read x ; do + grep -q 'It has been auto-edited by fixincludes from' "${x}" \ + && rm -f "${x}" + done < <(find gcc/include*/ -name '*.h') + fi if is_jit ; then # See https://gcc.gnu.org/onlinedocs/gcc-11.3.0/jit/internals/index.html#packaging-notes @@ -1971,7 +1847,7 @@ toolchain_src_install() { # # Do the 'make install' from the build directory pushd "${WORKDIR}"/build-jit > /dev/null || die - S="${WORKDIR}"/build-jit emake DESTDIR="${D}" install + S="${WORKDIR}"/build-jit emake DESTDIR="${D}" -j1 install # Punt some tools which are really only useful while building gcc find "${ED}" -name install-tools -prune -type d -exec rm -rf "{}" \; @@ -1985,7 +1861,17 @@ toolchain_src_install() { fi # Do the 'make install' from the build directory - S="${WORKDIR}"/build emake DESTDIR="${D}" install + # + # Unfortunately, we have to use -j1 for make install. Upstream + # don't really test it and there's not much appetite for fixing bugs + # with it. Several reported bugs exist where the resulting image + # was wrong, rather than a simple compile/install failure: + # - bug #906155 + # - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42980 + # - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51814 + # - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103656 + # - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109898 + S="${WORKDIR}"/build emake DESTDIR="${D}" -j1 install # Punt some tools which are really only useful while building gcc find "${ED}" -name install-tools -prune -type d -exec rm -rf "{}" \; @@ -2006,18 +1892,11 @@ toolchain_src_install() { create_gcc_env_entry create_revdep_rebuild_entry - # Setup the gcc_env_entry for hardened gcc 4 with minispecs - want_minispecs && copy_minispecs_gcc_specs - - # Make sure we don't have stuff lying around that - # can nuke multiple versions of gcc - gcc_slot_java - dodir /usr/bin cd "${D}"${BINPATH} || die # Ugh: we really need to auto-detect this list. # It's constantly out of date. - for x in cpp gcc g++ c++ gcov g77 gcj gcjh gfortran gccgo gnat* ; do + for x in cpp gcc gccrs g++ c++ gcov g77 gfortran gccgo gnat* ; do # For some reason, g77 gets made instead of ${CTARGET}-g77... # this should take care of that if [[ -f ${x} ]] ; then @@ -2049,7 +1928,7 @@ toolchain_src_install() { if ! is_crosscompile; then # Rename the main go binaries as we don't want to clobber dev-lang/go # when gcc-config runs. bug #567806 - if tc_version_is_at_least 5 && is_go ; then + if is_go ; then for x in go gofmt; do mv ${x} ${x}-${GCCMAJOR} || die done @@ -2154,15 +2033,20 @@ toolchain_src_install() { export QA_WX_LOAD="usr/lib*/go/*/*.gox" # Disable RANDMMAP so PCH works, bug #301299 - if tc_version_is_at_least 4.3 ; then - pax-mark -r "${ED}/libexec/gcc/${CTARGET}/${GCC_CONFIG_VER}/cc1" - pax-mark -r "${ED}/libexec/gcc/${CTARGET}/${GCC_CONFIG_VER}/cc1plus" - fi - - # Disable MPROTECT so java works, bug #574808 - if is_gcj ; then - pax-mark -m "${ED}/libexec/gcc/${CTARGET}/${GCC_CONFIG_VER}/ecj1" - pax-mark -m "${ED}/${CTARGET}/gcc-bin/${GCC_CONFIG_VER}/gij" + pax-mark -r "${ED}/libexec/gcc/${CTARGET}/${GCC_CONFIG_VER}/cc1" + pax-mark -r "${ED}/libexec/gcc/${CTARGET}/${GCC_CONFIG_VER}/cc1plus" + + if use test ; then + # TODO: In future, install orphaned to allow comparison across + # more versions even after unmerged? Also would be useful for + # historical records and tracking down regressions a while + # after they first appeared, but were only just reported. + einfo "Copying test results to ${EPREFIX}/var/cache/gcc/${SLOT} for future comparison" + ( + dodir /var/cache/gcc/${SLOT} + cd "${WORKDIR}"/build || die + find . -name \*.sum -exec cp --parents -v {} "${ED}"/var/cache/gcc/${SLOT} \; + ) fi } @@ -2174,7 +2058,7 @@ gcc_movelibs() { # move them to the compiler-specific CHOST internal dir. This is stuff # that you want to link against when building tools rather than building # code to run on the target. - if tc_version_is_at_least 5 && is_crosscompile ; then + if is_crosscompile ; then dodir "${HOSTLIBPATH#${EPREFIX}}" mv "${ED}"/usr/$(get_libdir)/libcc1* "${D}${HOSTLIBPATH}" || die fi @@ -2216,14 +2100,6 @@ gcc_movelibs() { fi done fix_libtool_libdir_paths "${LIBPATH}/${MULTIDIR}" - - # SLOT up libgcj.pc if it's available (and let gcc-config worry about links) - FROMDIR="${PREFIX}/lib/${OS_MULTIDIR}" - for x in "${D}${FROMDIR}"/pkgconfig/libgcj*.pc ; do - [[ -f ${x} ]] || continue - sed -i "/^libdir=/s:=.*:=${LIBPATH}/${MULTIDIR}:" "${x}" || die - mv "${x}" "${D}${FROMDIR}"/pkgconfig/libgcj-${GCC_PV}.pc || die - done done # We remove directories separately to avoid this case: @@ -2272,7 +2148,7 @@ create_gcc_env_entry() { local gcc_envd_file="${ED}${gcc_envd_base}" if [[ -z $1 ]] ; then # I'm leaving the following commented out to remind me that it - # was an insanely -bad- idea. Stuff broke. GCC_SPECS isnt unset + # was an insanely -bad- idea. Stuff broke. GCC_SPECS isn't unset # on chroot or in non-toolchain.eclass gcc ebuilds! #gcc_specs_file="${LIBPATH}/specs" gcc_specs_file="" @@ -2336,67 +2212,6 @@ create_revdep_rebuild_entry() { EOF } -copy_minispecs_gcc_specs() { - # On gcc 6, we don't need minispecs - if tc_version_is_at_least 6.0 ; then - return 0 - fi - - # Setup the hardenedno* specs files and the vanilla specs file. - if hardened_gcc_works ; then - create_gcc_env_entry hardenednopiessp - fi - if hardened_gcc_works pie ; then - create_gcc_env_entry hardenednopie - fi - if hardened_gcc_works ssp ; then - create_gcc_env_entry hardenednossp - fi - create_gcc_env_entry vanilla - insinto ${LIBPATH#${EPREFIX}} - doins "${WORKDIR}"/specs/*.specs || die "failed to install specs" - # Build system specs file which, if it exists, must be a complete set of - # specs as it completely and unconditionally overrides the builtin specs. - if ! tc_version_is_at_least 4.4 ; then - $(XGCC) -dumpspecs > "${WORKDIR}"/specs/specs - cat "${WORKDIR}"/build.specs >> "${WORKDIR}"/specs/specs - doins "${WORKDIR}"/specs/specs || die "failed to install the specs file" - fi -} - -gcc_slot_java() { - local x - - # Move Java headers to compiler-specific dir - for x in "${D}${PREFIX}"/include/gc*.h "${D}${PREFIX}"/include/j*.h ; do - [[ -f ${x} ]] && mv -f "${x}" "${D}${LIBPATH}"/include/ - done - for x in gcj gnu java javax org ; do - if [[ -d ${D}${PREFIX}/include/${x} ]] ; then - dodir /${LIBPATH#${EPREFIX}}/include/${x} - mv -f "${D}${PREFIX}"/include/${x}/* "${D}${LIBPATH}"/include/${x}/ - rm -rf "${D}${PREFIX}"/include/${x} - fi - done - - if [[ -d ${D}${PREFIX}/lib/security ]] || [[ -d ${D}${PREFIX}/$(get_libdir)/security ]] ; then - dodir /${LIBPATH#${EPREFIX}}/security - mv -f "${D}${PREFIX}"/lib*/security/* "${D}${LIBPATH}"/security - rm -rf "${D}${PREFIX}"/lib*/security - fi - - # Move random gcj files to compiler-specific directories - for x in libgcj.spec logging.properties ; do - x="${D}${PREFIX}/lib/${x}" - [[ -f ${x} ]] && mv -f "${x}" "${D}${LIBPATH}"/ - done - - # Rename jar because it could clash with Kaffe's jar if this gcc is - # primary compiler (aka doesn't have the - extension) - cd "${D}${BINPATH}" - [[ -f jar ]] && mv -f jar gcj-jar -} - #---->> pkg_post* <<---- toolchain_pkg_postinst() { @@ -2459,14 +2274,14 @@ do_gcc_config() { ewarn "The currently selected specs-specific gcc config," ewarn "${current_specs}, doesn't exist anymore. This is usually" ewarn "due to enabling/disabling hardened or switching to a version" - ewarn "of gcc that doesnt create multiple specs files. The default" + ewarn "of gcc that doesn't create multiple specs files. The default" ewarn "config will be used, and the previous preference forgotten." use_specs="" fi target="${CTARGET}-${GCC_CONFIG_VER}${use_specs}" else - # The curent target is invalid. Attempt to switch to a valid one. + # The current target is invalid. Attempt to switch to a valid one. # Blindly pick the latest version. bug #529608 # TODO: Should update gcc-config to accept `-l ${CTARGET}` rather than # doing a partial grep like this. @@ -2519,7 +2334,7 @@ should_we_gcc_config() { #---->> support and misc functions <<---- # This is to make sure we don't accidentally try to enable support for a -# language that doesnt exist. GCC 3.4 supports f77, while 4.0 supports f95, etc. +# language that doesn't exist. GCC 3.4 supports f77, while 4.0 supports f95, etc. # # Also add a hook so special ebuilds (kgcc64) can control which languages # exactly get enabled @@ -2563,11 +2378,6 @@ is_fortran() { _tc_use_if_iuse fortran } -is_gcj() { - gcc-lang-supported java || return 1 - _tc_use_if_iuse cxx && _tc_use_if_iuse gcj -} - is_go() { gcc-lang-supported go || return 1 _tc_use_if_iuse cxx && _tc_use_if_iuse go @@ -2598,6 +2408,16 @@ is_objcxx() { _tc_use_if_iuse cxx && _tc_use_if_iuse objc++ } +is_modula2() { + gcc-lang-supported m2 || return 1 + _tc_use_if_iuse cxx && _tc_use_if_iuse modula2 +} + +is_rust() { + gcc-lang-supported rust || return 1 + _tc_use_if_iuse rust +} + # Grab a variable from the build system (taken from linux-info.eclass) get_make_var() { local var=$1 makefile=${2:-${WORKDIR}/build/Makefile} @@ -2607,91 +2427,17 @@ get_make_var() { XGCC() { get_make_var GCC_FOR_TARGET ; } -# The gentoo pie-ssp patches allow for 3 configurations: -# 1) PIE+SSP by default -# 2) PIE by default -# 3) SSP by default -hardened_gcc_works() { - if [[ $1 == "pie" ]] ; then - # $gcc_cv_ld_pie is unreliable as it simply take the output of - # `ld --help | grep -- -pie`, that reports the option in all cases, also if - # the loader doesn't actually load the resulting executables. - - want_pie || return 1 - _tc_use_if_iuse nopie && return 1 - hardened_gcc_is_stable pie - return $? - elif [[ $1 == "ssp" ]] ; then - [[ -n ${SPECS_VER} ]] || return 1 - _tc_use_if_iuse nossp && return 1 - hardened_gcc_is_stable ssp - return $? - else - # laziness ;) - hardened_gcc_works pie || return 1 - hardened_gcc_works ssp || return 1 - return 0 - fi -} - -hardened_gcc_is_stable() { - local tocheck - if [[ $1 == "pie" ]] ; then - tocheck=${PIE_GLIBC_STABLE} - elif [[ $1 == "ssp" ]] ; then - tocheck=${SSP_STABLE} - else - die "hardened_gcc_stable needs to be called with pie or ssp" - fi - - has $(tc-arch) ${tocheck} && return 0 - return 1 -} - -want_minispecs() { - # On gcc 6, we don't need minispecs - if tc_version_is_at_least 6.0 ; then - return 0 - fi - if tc_version_is_at_least 4.3.2 && _tc_use_if_iuse hardened ; then - if ! want_pie ; then - ewarn "PIE_VER or SPECS_VER is not defined in the GCC ebuild." - elif use vanilla ; then - ewarn "You will not get hardened features if you have the vanilla USE-flag." - elif _tc_use_if_iuse nopie && _tc_use_if_iuse nossp ; then - ewarn "You will not get hardened features if you have the nopie and nossp USE-flag." - elif ! hardened_gcc_works ; then - ewarn "Your $(tc-arch) arch is not supported." - else - return 0 - fi - ewarn "Hope you know what you are doing. Hardened will not work." - return 0 - fi - return 1 -} - -want_pie() { - ! _tc_use_if_iuse hardened && [[ -n ${PIE_VER} ]] \ - && _tc_use_if_iuse nopie && return 1 - [[ -n ${PIE_VER} ]] && [[ -n ${SPECS_VER} ]] && return 0 - tc_version_is_at_least 4.3.2 && return 1 - [[ -z ${PIE_VER} ]] && return 1 - _tc_use_if_iuse nopie || return 0 - return 1 -} - has toolchain_death_notice ${EBUILD_DEATH_HOOKS} || EBUILD_DEATH_HOOKS+=" toolchain_death_notice" toolchain_death_notice() { if [[ -e "${WORKDIR}"/build ]] ; then pushd "${WORKDIR}"/build >/dev/null (echo '' | $(tc-getCC ${CTARGET}) ${CFLAGS} -v -E - 2>&1) > gccinfo.log [[ -e "${T}"/build.log ]] && cp "${T}"/build.log . - tar jcf "${WORKDIR}"/gcc-build-logs.tar.bz2 \ + tar -acf "${WORKDIR}"/gcc-build-logs.tar.xz \ gccinfo.log build.log $(find -name config.log) rm gccinfo.log build.log eerror - eerror "Please include ${WORKDIR}/gcc-build-logs.tar.bz2 in your bug report." + eerror "Please include ${WORKDIR}/gcc-build-logs.tar.xz in your bug report." eerror popd >/dev/null fi @@ -2699,9 +2445,6 @@ toolchain_death_notice() { fi -EXPORT_FUNCTIONS pkg_pretend pkg_setup src_unpack src_prepare src_configure \ - src_compile src_test src_install pkg_postinst pkg_postrm - # Note [implicitly enabled flags] # ------------------------------- # Usually configure-based packages handle explicit feature requests @@ -2719,3 +2462,5 @@ EXPORT_FUNCTIONS pkg_pretend pkg_setup src_unpack src_prepare src_configure \ # Thus safer way to enable/disable the feature is to rely on implicit # enabled-by-default state: # econf $(usex foo '' --disable-foo) + +EXPORT_FUNCTIONS pkg_pretend pkg_setup src_unpack src_prepare src_configure src_compile src_test src_install pkg_postinst pkg_postrm -- cgit v1.2.3-65-gdbad