diff options
Diffstat (limited to 'eclass/toolchain.eclass')
-rw-r--r-- | eclass/toolchain.eclass | 175 |
1 files changed, 118 insertions, 57 deletions
diff --git a/eclass/toolchain.eclass b/eclass/toolchain.eclass index 505e7c2666d7..114a008b700f 100644 --- a/eclass/toolchain.eclass +++ b/eclass/toolchain.eclass @@ -33,7 +33,12 @@ tc_is_live() { } if tc_is_live ; then - EGIT_REPO_URI="https://gcc.gnu.org/git/gcc.git https://github.com/gcc-mirror/gcc" + EGIT_REPO_URI=" + https://gcc.gnu.org/git/gcc.git + https://git.sr.ht/~sourceware/gcc + https://gitlab.com/x86-gcc/gcc.git + https://github.com/gcc-mirror/gcc.git + " # Naming style: # gcc-10.1.0_pre9999 -> gcc-10-branch # Note that the micro version is required or lots of stuff will break. @@ -847,19 +852,107 @@ setup_multilib_osdirnames() { sed -i "${sed_args[@]}" "${S}"/gcc/config/${config} || die } +# @FUNCTION: _get_bootstrap_gcc_info +# @USAGE: [gcc_pkg|gcc_bin_base]... +# @DESCRIPTION: +# Get some information about the gcc that would be used to build this package. +# All the variables that are passed as arguments will be set to their apropriate +# values: +# +# - bootstrap_gcc_pkg = the ${CATEGORY}/${PN} that provides the build gcc +# +# - bootstrap_gcc_bin_base = the directory up to /gcc-bin but excluding the slot, of +# the aformentioned package. +_get_bootstrap_gcc_info() { + crossp() { + tc-is-cross-compiler && echo "${2}" || echo "${1}" + } + + local arg + for arg ; do + case "${arg}" in + bootstrap_gcc_pkg) + bootstrap_gcc_pkg=$(crossp sys-devel/gcc cross-${CHOST}/gcc) + ;; + bootstrap_gcc_bin_base) + bootstrap_gcc_bin_base=${BROOT}/usr/$(crossp ${CHOST} ${CBUILD}/${CHOST})/gcc-bin + ;; + *) + die "Unknown argument '${arg}' passed to ${FUNCNAME}" + esac + done +} + +# @FUNCTION: _find_bootstrap_gcc_with +# @USAGE: <use_expression> <pretty_use_name> <minimum_slot> +# @RETURN: Shell true if a matching gcc installation was found, false otherwise +# @INTERNAL +# @DESCRIPTION: +# Check installed versions of gcc that can be used as a compiler for the current +# build for one matching a certain USE expression. The order of preference is +# checking for the same SLOT we are building, then iterate downwards until (and +# including) minimum_slot, then iterate upward starting with SLOT+1. When +# cross-compiling only SLOT is checked. +# +# If a proper installation is discovered this function will set +# ${bootstrap_gcc_bin_dir} to the full path of the directory in which +# ${CHOST}-gcc and friends are found and ${bootstrap_gcc_slot} to the slot that +# was found. If nothing was found those variables will be empty. +# +# This function is provided to aid languages like ada and d that require +# bootstraping. +_find_bootstrap_gcc_with() { + local use="${1}" + local pretty_use="${2}" + local bootstrap_gcc_pkg bootstrap_gcc_bin_base + _get_bootstrap_gcc_info bootstrap_gcc_pkg bootstrap_gcc_bin_base + + local min_slot max_slot + if tc-is-cross-compiler ; then + min_slot="${SLOT}" + max_slot="${SLOT}" + else + min_slot="${3}" + max_slot=$(best_version -b "${bootstrap_gcc_pkg}") + max_slot="${max_slot#${bootstrap_gcc_pkg}-}" + max_slot=$(ver_cut 1 ${max_slot}) + fi + + local candidate result + for candidate in ${SLOT} $(seq $((${SLOT} - 1)) -1 ${min_slot}) $(seq $((${SLOT} + 1)) ${max_slot}) ; do + has_version -b "${bootstrap_gcc_pkg}:${candidate}" || continue + + ebegin "Testing ${bootstrap_gcc_pkg}:${candidate} for ${pretty_use}" + if has_version -b "${bootstrap_gcc_pkg}:${candidate}${use}" ; then + result=${candidate} + + eend 0 + break + fi + eend 1 + done + + if [[ ${result} ]] ; then + bootstrap_gcc_bin_dir="${bootstrap_gcc_bin_base}/${result}" + bootstrap_gcc_slot=${result} + return 0 + else + bootstrap_gcc_bin_dir= + bootstrap_gcc_slot= + return 1 + fi +} + # @FUNCTION: toolchain_setup_ada # @INTERNAL # @DESCRIPTION: # Determine the most suitable GNAT (Ada compiler) for bootstrapping # and setup the environment, including wrappers, for building. toolchain_setup_ada() { - local latest_gcc=$(best_version -b "sys-devel/gcc") - latest_gcc="${latest_gcc#sys-devel/gcc-}" - latest_gcc=$(ver_cut 1 ${latest_gcc}) - local ada_bootstrap local ada_candidate local ada_bootstrap_type + local ada_bootstrap_bin_dir # GNAT can usually be built using the last major version and # the current version, at least. # @@ -867,19 +960,12 @@ toolchain_setup_ada() { # 1) Match the version being built; # 2) Iterate downwards from the version being built; # 3) Iterate upwards from the version being built to the greatest version installed. - for ada_candidate in ${SLOT} $(seq $((${SLOT} - 1)) -1 10) $(seq $((${SLOT} + 1)) ${latest_gcc}) ; do - has_version -b "sys-devel/gcc:${ada_candidate}" || continue - - ebegin "Testing sys-devel/gcc:${ada_candidate} for Ada" - if has_version -b "sys-devel/gcc:${ada_candidate}[ada(-)]" ; then - ada_bootstrap=${ada_candidate} - ada_bootstrap_type=gcc - - eend 0 - break - fi - eend 1 - done + local bootstrap_gcc_slot bootstrap_gcc_bin_dir + if _find_bootstrap_gcc_with "[ada(-)]" "Ada" 10 ; then + ada_bootstrap=${bootstrap_gcc_slot} + ada_bootstrap_type=gcc + ada_bootstrap_bin_dir="${bootstrap_gcc_bin_dir}" + fi # As a penultimate resort, try dev-lang/ada-bootstrap. if ver_test ${ada_bootstrap} -gt ${PV} || [[ -z ${ada_bootstrap} ]] ; then @@ -892,6 +978,7 @@ toolchain_setup_ada() { #latest_ada_bootstrap=$(ver_cut 1 ${latest_ada_bootstrap}) ada_bootstrap="10" ada_bootstrap_type=ada-bootstrap + ada_bootstrap_bin_dir="${BROOT}/usr/lib/ada-bootstrap/bin" eend 0 else @@ -905,6 +992,7 @@ toolchain_setup_ada() { if has_version -b "dev-lang/gnat-gpl" ; then ada_bootstrap=10 ada_bootstrap_type=gcc + ada_bootstrap_bin_dir="${BROOT}/usr/${CHOST}/gcc-bin/${ada_bootstrap}" eend 0 else eend 1 @@ -969,10 +1057,10 @@ toolchain_setup_ada() { case ${ada_bootstrap_type} in ada-bootstrap) export PATH="${BROOT}/usr/lib/ada-bootstrap/bin:${PATH}" - gnat1_path=${BROOT}/usr/lib/ada-bootstrap/libexec/gcc/${CBUILD}/${ada_bootstrap}/gnat1 + gnat1_path=${BROOT}/usr/lib/ada-bootstrap/libexec/gcc/${CHOST}/${ada_bootstrap}/gnat1 ;; *) - gnat1_path=${BROOT}/usr/libexec/gcc/${CBUILD}/${ada_bootstrap}/gnat1 + gnat1_path=${BROOT}/usr/libexec/gcc/${CHOST}/${ada_bootstrap}/gnat1 ;; esac @@ -989,7 +1077,7 @@ toolchain_setup_ada() { # work for us as the stage1 compiler doesn't necessarily have Ada # support. Substitute the Ada compiler we found earlier. local adalib - adalib=$(${CBUILD}-gcc-${ada_bootstrap} -print-libgcc-file-name || die "Finding adalib dir failed") + adalib=$("${ada_bootstrap_bin_dir}"/${CHOST}-gcc -print-libgcc-file-name || die "Finding adalib dir failed") adalib="${adalib%/*}/adalib" sed -i \ -e "s:adalib=.*:adalib=${adalib}:" \ @@ -1002,7 +1090,7 @@ toolchain_setup_ada() { for tool in gnat{,bind,chop,clean,kr,link,ls,make,name,prep} ; do cat <<-EOF > "${T}"/ada-wrappers/${tool} || die #!/bin/sh - exec $(type -P ${CBUILD}-${tool}-${ada_bootstrap}) "\$@" + exec "${ada_bootstrap_bin_dir}"/${CHOST}-${tool} "\$@" EOF export "${tool^^}"="${T}"/ada-wrappers/${tool} @@ -1019,47 +1107,20 @@ toolchain_setup_ada() { # Determine the most suitable GDC (D compiler) for bootstrapping # and setup the environment for building. toolchain_setup_d() { - local gcc_pkg gcc_bin_base - if tc-is-cross-compiler ; then - gcc_pkg=cross-${CHOST}/gcc - gcc_bin_base=${BROOT}/usr/${CBUILD}/${CHOST}/gcc-bin - else - gcc_pkg=sys-devel/gcc - gcc_bin_base=${BROOT}/usr/${CHOST}/gcc-bin - fi - - local latest_gcc=$(best_version -b "${gcc_pkg}") - latest_gcc="${latest_gcc#${gcc_pkg}-}" - latest_gcc=$(ver_cut 1 ${latest_gcc}) - - local d_bootstrap - local d_candidate - # Order of preference (descending): - # 1) Match the version being built; - # 2) Iterate downwards from the version being built; - # 3) Iterate upwards from the version being built to the greatest version installed. - for d_candidate in ${SLOT} $(seq $((${SLOT} - 1)) -1 10) $(seq $((${SLOT} + 1)) ${latest_gcc}) ; do - has_version -b "${gcc_pkg}:${d_candidate}" || continue - - ebegin "Testing ${gcc_pkg}:${d_candidate} for D" - if has_version -b "${gcc_pkg}:${d_candidate}[d(-)]" ; then - d_bootstrap=${d_candidate} - - eend 0 - break - fi - eend 1 - done + local bootstrap_gcc_slot bootstrap_gcc_bin_dir + _find_bootstrap_gcc_with "[d(-)]" "D" 11 - if [[ -z ${d_bootstrap} ]] ; then + if [[ -z ${bootstrap_gcc_bin_dir} ]] ; then if tc-is-cross-compiler ; then # We can't add cross-${CHOST}/gcc[d] to BDEPEND but we can # print a useful message to the user. - eerror "No ${gcc_pkg}[d] was found installed." + local bootstrap_gcc_pkg + _get_bootstrap_gcc_info bootstrap_gcc_pkg + eerror "No ${bootstrap_gcc_pkg}[d] was found installed." eerror "When cross-compiling GDC a bootstrap GDC is required." eerror "Either disable the d USE flag or add:" eerror "" - eerror " ${gcc_pkg} d" + eerror " ${bootstrap_gcc_pkg} d" eerror "" eerror "In your package.use and re-emerge it." eerror "" @@ -1068,7 +1129,7 @@ toolchain_setup_d() { die "Did not find any appropriate GDC compiler installed" fi - export GDC=${gcc_bin_base}/${d_bootstrap}/${CHOST}-gdc + export GDC=${bootstrap_gcc_bin_dir}/${CHOST}-gdc } #---->> src_configure <<---- |