Add support by Kevin F. Quinn for handling multiple files in GCC_SPECS #125805.
authorMike Frysinger <vapier@gentoo.org>
Sat, 9 Dec 2006 07:33:09 +0000 (07:33 +0000)
committerMike Frysinger <vapier@gentoo.org>
Sat, 9 Dec 2006 07:33:09 +0000 (07:33 +0000)
Package-Manager: portage-2.1.2_rc3

sys-devel/gcc-config/ChangeLog
sys-devel/gcc-config/Manifest
sys-devel/gcc-config/files/digest-gcc-config-1.3.15 [new file with mode: 0644]
sys-devel/gcc-config/files/gcc-config-1.3.15 [new file with mode: 0755]
sys-devel/gcc-config/gcc-config-1.3.15.ebuild [new file with mode: 0644]

index 8073fb17553f9ec65460d52922c90546ba7487e1..613f79a6f04f8682e196910fa9e23cccf2f7ca77 100644 (file)
@@ -1,6 +1,12 @@
 # ChangeLog for sys-devel/gcc-config
 # Copyright 1999-2006 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/sys-devel/gcc-config/ChangeLog,v 1.133 2006/10/19 12:53:54 uberlord Exp $
+# $Header: /var/cvsroot/gentoo-x86/sys-devel/gcc-config/ChangeLog,v 1.134 2006/12/09 07:33:08 vapier Exp $
+
+*gcc-config-1.3.15 (09 Dec 2006)
+
+  09 Dec 2006; Mike Frysinger <vapier@gentoo.org> +files/gcc-config-1.3.15,
+  +gcc-config-1.3.15.ebuild:
+  Add support by Kevin F. Quinn for handling multiple files in GCC_SPECS #125805.
 
   19 Oct 2006; Roy Marples <uberlord@gentoo.org> gcc-config-1.3.14.ebuild:
   Added ~sparc-fbsd keyword.
index f109c2d2f394270a2480b14c67a4e6d9baea87c4..1aa9c791f9945d7a7e4832cc95ee35f25fa94294 100644 (file)
@@ -9,6 +9,10 @@ AUX gcc-config-1.3.14 18828 RMD160 4f8b5962947dde209ffca5135a252e77c6e746d1 SHA1
 MD5 907258acebe67aa2ec71577dfa67da9b files/gcc-config-1.3.14 18828
 RMD160 4f8b5962947dde209ffca5135a252e77c6e746d1 files/gcc-config-1.3.14 18828
 SHA256 92ceadfe1e2799cd98b8b05503340337502e8d8a45a86d7efc96f63bd8b57678 files/gcc-config-1.3.14 18828
+AUX gcc-config-1.3.15 19348 RMD160 0916c09327b945892b0cd571faea6da32ed56299 SHA1 6d321179f5c111fa7ef423e7463dc6494d0167a5 SHA256 d0bf16eb630efebafe5ee32295f9d5534a1a228157e272290ef764912e642cc2
+MD5 0e514196c3b5e14aa7a83201e3cdd51e files/gcc-config-1.3.15 19348
+RMD160 0916c09327b945892b0cd571faea6da32ed56299 files/gcc-config-1.3.15 19348
+SHA256 d0bf16eb630efebafe5ee32295f9d5534a1a228157e272290ef764912e642cc2 files/gcc-config-1.3.15 19348
 AUX wrapper-1.4.7.c 9837 RMD160 e4feac8cd8746ad7036ec32ff09f1b02d7eceaf8 SHA1 4aee9df408a84b22b4007bc9b74543dd8a6f4fc8 SHA256 f462c49721d291ce3b91c46e5fb8e567d6344f0e359e788301bac07065987744
 MD5 1b19cf481e2777dff9722f36698c3b24 files/wrapper-1.4.7.c 9837
 RMD160 e4feac8cd8746ad7036ec32ff09f1b02d7eceaf8 files/wrapper-1.4.7.c 9837
@@ -22,14 +26,18 @@ EBUILD gcc-config-1.3.14.ebuild 1513 RMD160 e9497e2c339abc2b2b61e4110a1784b3ac5f
 MD5 c8bb9ed69ab7bbd8d6bf8c901e0b9a8a gcc-config-1.3.14.ebuild 1513
 RMD160 e9497e2c339abc2b2b61e4110a1784b3ac5fd721 gcc-config-1.3.14.ebuild 1513
 SHA256 396a0bf2ad206ee1f4f4db7e1c6fcf9520075271d53c9d9050a1ed4231c39205 gcc-config-1.3.14.ebuild 1513
+EBUILD gcc-config-1.3.15.ebuild 1533 RMD160 350c84b1e1d552bddab7544429a93a3df4279037 SHA1 97c475aeff0d8ec4cb10f7ce0c5146d87ad2d9e9 SHA256 2b11f66be092d7964e93d1e82ae2b2989daf16b4a8db8f6f56b2855658685f3d
+MD5 8af4605b918cf995f6a70b98fb422b9a gcc-config-1.3.15.ebuild 1533
+RMD160 350c84b1e1d552bddab7544429a93a3df4279037 gcc-config-1.3.15.ebuild 1533
+SHA256 2b11f66be092d7964e93d1e82ae2b2989daf16b4a8db8f6f56b2855658685f3d gcc-config-1.3.15.ebuild 1533
 EBUILD gcc-config-2.0.0_rc1.ebuild 775 RMD160 a41c99cba464ed16040552f329c067326094174d SHA1 4a7a816e8e3d596369a53e127ac8933bb5fe2aa2 SHA256 5be5dcd340934282c6147d8e90dd47a36b9af54416a301855e5f767f021f0a7a
 MD5 d7781cb8103fd03712bf341e79153ed0 gcc-config-2.0.0_rc1.ebuild 775
 RMD160 a41c99cba464ed16040552f329c067326094174d gcc-config-2.0.0_rc1.ebuild 775
 SHA256 5be5dcd340934282c6147d8e90dd47a36b9af54416a301855e5f767f021f0a7a gcc-config-2.0.0_rc1.ebuild 775
-MISC ChangeLog 26074 RMD160 3401719e26994594c0830152da926b92ddae4883 SHA1 b3535d906086b501e01cff6d1e5b310270339674 SHA256 cf274eb0b340364d9aac230fac2dad3f0baf786c5f68160cf98863ac91800e52
-MD5 fbfea25e5ba0bd7b1acff55df03cabe8 ChangeLog 26074
-RMD160 3401719e26994594c0830152da926b92ddae4883 ChangeLog 26074
-SHA256 cf274eb0b340364d9aac230fac2dad3f0baf786c5f68160cf98863ac91800e52 ChangeLog 26074
+MISC ChangeLog 26294 RMD160 5dc504de4fa8eb792a3a9438a9dbedb93bc71dc0 SHA1 864fd0bdd743312a510e2a211d460ff213b86167 SHA256 e3de88a35e9784de02e83fc1959782c544d30f1edfb6a964d568fefba47c6649
+MD5 177733443bae2127c35afcc6d9d19913 ChangeLog 26294
+RMD160 5dc504de4fa8eb792a3a9438a9dbedb93bc71dc0 ChangeLog 26294
+SHA256 e3de88a35e9784de02e83fc1959782c544d30f1edfb6a964d568fefba47c6649 ChangeLog 26294
 MISC metadata.xml 162 RMD160 d002486a43522f2116b1d9d59828c484956d66e2 SHA1 d6b4923897f6ae673b4f93646f5b4ba61d5a2c3c SHA256 65a915d44de1f01d4b7f72d313b4192c38374a9835d24988c00c1e73dca5805a
 MD5 567094e03359ffc1c95af7356395228d metadata.xml 162
 RMD160 d002486a43522f2116b1d9d59828c484956d66e2 metadata.xml 162
@@ -40,13 +48,16 @@ SHA256 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 files/di
 MD5 d41d8cd98f00b204e9800998ecf8427e files/digest-gcc-config-1.3.14 0
 RMD160 9c1185a5c5e9fc54612808977ee8f548b2258d31 files/digest-gcc-config-1.3.14 0
 SHA256 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 files/digest-gcc-config-1.3.14 0
+MD5 d41d8cd98f00b204e9800998ecf8427e files/digest-gcc-config-1.3.15 0
+RMD160 9c1185a5c5e9fc54612808977ee8f548b2258d31 files/digest-gcc-config-1.3.15 0
+SHA256 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 files/digest-gcc-config-1.3.15 0
 MD5 63440bc21fdf46cc94352893f2fd6e3e files/digest-gcc-config-2.0.0_rc1 277
 RMD160 3b08c6248c4f7f8d14ac66ff0fb70bb8c8276c53 files/digest-gcc-config-2.0.0_rc1 277
 SHA256 ba21ae92f613fd0a6f34b3fda34d1d82c6b284c045481b9686b66fd9e373c21e files/digest-gcc-config-2.0.0_rc1 277
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.5 (GNU/Linux)
 
-iD8DBQFFemOiamhnQswr0vIRAlNqAJ9/MYMmoLiihTqqjq4UNAagymioawCeIjIL
-VhKr0Nz04tRWPkkcdJkQWDI=
-=Fbp0
+iD8DBQFFembcamhnQswr0vIRAtejAJ9vOH00A7of8lu4fd5YUb6INy2SuACgoLon
+DMjY1vlUP95zoO5tygqcjm8=
+=ioW7
 -----END PGP SIGNATURE-----
diff --git a/sys-devel/gcc-config/files/digest-gcc-config-1.3.15 b/sys-devel/gcc-config/files/digest-gcc-config-1.3.15
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/sys-devel/gcc-config/files/gcc-config-1.3.15 b/sys-devel/gcc-config/files/gcc-config-1.3.15
new file mode 100755 (executable)
index 0000000..7380a09
--- /dev/null
@@ -0,0 +1,742 @@
+#!/bin/bash
+# Copyright 1999-2006 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/sys-devel/gcc-config/files/gcc-config-1.3.15,v 1.1 2006/12/09 07:33:09 vapier Exp $
+
+trap ":" INT QUIT TSTP
+
+argv0=${0##*/}
+source /etc/init.d/functions.sh || {
+       echo "${argv0}: Could not source /etc/init.d/functions.sh!"
+       exit 1
+}
+umask 022
+
+usage() {
+cat << "USAGE_END"
+Usage: gcc-config [options] [CC Profile]
+Change the current cc/gcc profile, or give info about profiles.
+
+Options:
+  -O, --use-old              Use the old profile if one was selected.
+  -f, --force                Make sure all config files are regenerated.
+  -P, --use-portage-chost    Only set to given profile if its CHOST is the 
+                             same as that set for portage in /etc/make.conf
+                             (or one of other portage config files...).
+  -c, --get-current-profile  Print current used gcc profile.
+  -l, --list-profiles        Print a list of available profiles.
+  -S, --split-profile        Split profiles into their components
+  -E, --print-environ        Print environment that can be used to setup the
+                             current gcc profile, or a specified one.
+  -B, --get-bin-path         Print path where binaries of the given/current
+                             profile are located.
+  -L, --get-lib-path         Print path where libraries of the given/current
+                             profile are located.
+  -X, --get-stdcxx-incdir    Print path where g++ include files of the
+                             given/current profile are located.
+
+Profile names are of the form:  <CHOST>-<gcc version>
+For example:                    i686-pc-linux-gnu-3.2.1
+USAGE_END
+       exit $1
+}
+[[ $# -lt 1 ]] && usage 1
+
+find_path() {
+       [[ -z $1 ]] && return 0
+
+       local fullpath=$(type -P $1)
+       
+       if [[ -x ${fullpath} ]] ; then
+               echo "${fullpath}"
+               return 0
+       fi
+
+       for x in /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin ; do
+               if [[ -x ${x}/$1 ]] && [[ -r ${x}/$1 ]] ; then
+                       echo "${x}/$1"
+                       return 0
+               fi
+       done
+
+       return 0
+}
+
+cmd_setup() {
+       # Sourcing /etc/env.d/gcc/${CC_COMP} is going to mess up
+       # PATH among things...
+       CP=$(find_path cp)
+       RM=$(find_path rm)
+       MV=$(find_path mv)
+       LN=$(find_path ln)
+       CAT=$(find_path cat)
+       ENV=$(find_path env)
+       SED=$(find_path sed)
+       AWK=$(find_path gawk)
+       GREP=$(find_path grep)
+       FIND=$(find_path find)
+       CHMOD=$(find_path chmod)
+       TOUCH=$(find_path touch)
+       PYTHON=$(find_path python)
+       PORTAGEQ=$(find_path portageq)
+       ENV_UPDATE=$(find_path env-update)
+}
+
+try_real_hard_to_find_CHOST() {
+       #
+       # First we read make.conf
+       #
+
+       local varname=$1
+       local conf=${ROOT}/etc/make.conf
+       local ret=$(source "${conf}" 2>/dev/null ; echo ${!varname})
+       if [[ -z ${ret} ]] ; then
+               # newer portage supports spaces between the var and =
+               # CHOST     =  "this-is-retarded"
+               ret=$(eval $(
+                       ${SED} -n \
+                               -e 's:[[:space:]]::g' \
+                               -e '/^CHOST=/p' \
+                               "${conf}"
+                       ) ; echo ${!varname}
+               )
+       fi
+
+       if [[ -n ${ret} ]] ; then
+               echo ${ret}
+               return 0
+       fi
+
+       #
+       # Then we try /etc/env.d/gcc/config
+       #
+       if [[ -s ${ROOT}/etc/env.d/gcc/config ]] ; then
+               ret=$(split_gcc_ver $(eval $(<"${ROOT}"/etc/env.d/gcc/config) ; echo ${CURRENT}))
+               echo ${ret% *}
+       fi
+}
+
+get_real_chost() {
+       [[ -n ${REAL_CHOST} ]] && return 0
+
+       # shortcut for switching compilers in a cross chroot
+       if [[ -n ${CHOST} && ${ROOT} != "/" ]] ; then
+               REAL_CHOST=${CHOST}
+               return 0
+       fi
+
+       # make sure portage isnt broken
+       if ${PYTHON} -V &>/dev/null ; then
+               export REAL_CHOST=$(${ENV} -i ${PORTAGEQ} envvar CHOST 2>/dev/null)
+       else
+               ewarn "Python seems to be broken, attempting to locate CHOST ourselves ..."
+               export REAL_CHOST=$(try_real_hard_to_find_CHOST)
+       fi
+
+       if [[ -z ${REAL_CHOST} ]] ; then
+               eerror "${argv0}: Could not get portage CHOST!"
+               eerror "${argv0}: You should verify that CHOST is set in one of these places:"
+               eerror "${argv0}:  - ${ROOT}/etc/make.conf"
+               eerror "${argv0}:  - active environment"
+               exit 1
+       fi
+}
+
+is_cross_compiler() {
+       get_real_chost
+       [[ ${CC_COMP/${REAL_CHOST}} == ${CC_COMP} ]]
+}
+
+# bool files_exists(search_path, files)
+#      Return shell true if the specified files exist.
+#      Files with relative paths are searched for in search_path.
+#      Both lists are : delimited.
+files_exist() {
+       local p f ret old_IFS
+       local paths=$1 files=$2
+
+       old_IFS=${IFS}
+       export IFS=":"
+
+       ret=0
+       for f in ${files} ; do
+               if [[ ${f} == /* ]] ; then
+                       [[ ! -f ${f} ]] && ret=1 && break
+               else
+                       for p in ${paths} ; do
+                               [[ ! -f ${p}/${f} ]] && ret=1 && break 2
+                       done
+               fi
+       done
+
+       export IFS=${old_IFS}
+       return ${ret}
+}
+
+switch_profile() {
+       local MY_LDPATH=
+       local GCC_PROFILES=
+       local OLD_CC_COMP=
+       local GCC_BIN_PATH=
+
+       if [[ "$(id -u)" -ne 0 ]] ; then
+               eerror "${argv0}: Must be root."
+               exit 1
+       fi
+
+       if is_cross_compiler ; then
+               ebegin "Switching cross-compiler to ${CC_COMP}"
+       else
+               ebegin "Switching native-compiler to ${CC_COMP}"
+       fi
+
+       # Sourcing /etc/env.d/gcc/${CC_COMP} is going to mess up
+       # PATH among things...
+       cmd_setup
+
+       if ! is_cross_compiler ; then
+               # Order our profiles to have the default first ...
+               # We do this so that we can have them ordered with default
+               # first in /etc/ld.so.conf, as the logical is that all
+               # compilers for default CHOST will be used to compile stuff,
+               # and thus we want all their lib paths in /etc/ld.so.conf ...
+               get_real_chost
+               GCC_PROFILES=$(${FIND} "${GCC_ENV_D}" -maxdepth 1 -name "${REAL_CHOST}-*" -a ! -name "${CC_COMP}")
+               GCC_PROFILES="${GCC_ENV_D}/${CC_COMP} ${GCC_PROFILES}"
+
+               # Extract all LDPATH's for our CHOST
+               MY_LDPATH=""
+               for x in ${GCC_PROFILES} ; do
+                       if [[ -f ${x} ]] ; then
+                               source "${x}"
+
+                               # Handle LDPATH's that have multiple directories
+                               local old_IFS=${IFS}
+                               export IFS=":"
+                               local sub_ldpath=
+                               for sub_ldpath in ${LDPATH} ; do
+                                       if [[ -d ${sub_ldpath} ]] ; then
+                                               if [[ ${MY_LDPATH/:${sub_ldpath}} == ${MY_LDPATH} ]] ; then
+                                                       MY_LDPATH="${MY_LDPATH}:${sub_ldpath}"
+                                               fi
+                                       fi
+                               done
+                               export IFS=${old_IFS}
+                       fi
+               done
+               MY_LDPATH="${MY_LDPATH:1}" # trim leading :
+       fi
+
+       # Setup things properly again for this profile
+       unset GCC_SPECS LDPATH
+       source "${GCC_ENV_D}/${CC_COMP}"
+       OLD_CC_COMP=$(get_current_profile)
+       CTARGET=${CTARGET:-${REAL_CHOST}}
+
+       # What kind of env.d entry are we going to generate ?
+       if is_cross_compiler ; then
+               # Only keep PATH/ROOTPATH
+               ${AWK} '/^(PATH|ROOTPATH)=/ {print $0}' \
+                       "${GCC_ENV_D}/${CC_COMP}" > "${ENV_D}/05gcc-${CTARGET}"
+
+               echo "CURRENT=${CC_COMP}" > "${GCC_ENV_D}/config-${CTARGET}"
+       else
+               # Pass all by default
+               ${AWK} '!/^(STDCXX_INCDIR|LDPATH|CC|CXX|CTARGET|GCCBITS|GCC_SPECS)=/ {print $0}' \
+                       "${GCC_ENV_D}/${CC_COMP}" > "${ENV_D}/05gcc"
+               echo "LDPATH=\"${MY_LDPATH}\"" >> "${ENV_D}/05gcc"
+               if [[ -n ${GCC_SPECS} ]] && files_exist ${MY_LDPATH} ${GCC_SPECS} ; then
+                       echo "GCC_SPECS=\"${GCC_SPECS}\"" >> "${ENV_D}/05gcc"
+               else
+                       # People need to rebuild their gcc or setting GCC_SPECS to
+                       # "" will cause issues again :(
+                       if [[ ${ROOT} != "/" ]] ; then
+                               echo "GCC_SPECS=\"\"" >> "${ENV_D}/05gcc"
+                       else
+                               if ! GCC_SPECS="" /usr/bin/gcc -v &>/dev/null ; then
+                                       echo
+                                       ewarn "Your gcc has a bug with GCC_SPECS."
+                                       ewarn "Please re-emerge gcc."
+                                       ewarn "http://bugs.gentoo.org/68395"
+                                       echo
+                               else
+                                       echo "GCC_SPECS=\"\"" >> "${ENV_D}/05gcc"
+                               fi
+                       fi
+               fi
+
+               echo "CURRENT=${CC_COMP}" > "${GCC_ENV_D}/config"
+       fi
+
+       # Save PATH
+       GCC_BIN_PATH=${PATH}
+       # Fix environment
+       source /etc/profile >& /dev/null
+       umask 022
+       # Find the bin wrapper
+       local wrapper
+       for wrapper in GENTOO_LIBDIR lib lib64 lib32 lib ; do
+               wrapper="${ROOT}usr/${wrapper}/misc/gcc-config"
+               [[ -e ${wrapper} ]] && break
+       done
+
+       # Update the wrappers for this profile
+       local native="gcc cpp cc c++ g++ f77 g77 gcj"
+       is_cross_compiler && native=""
+       for x in ${native} ${CTARGET}-{cpp,gcc,c++,g++,f77,g77,gcj} ; do
+               # Make sure we have no stale wrappers
+               ${RM} -f "${ROOT}/usr/bin/${x}"
+               [[ ${x:${#x}-3} == "gcc" || ${x:${#x}-3} == "g++" ]] \
+                       && ${RM} -f "${ROOT}/usr/bin/${x}"{32,64}
+
+               # Only install a wrapper if the binary exists ...
+               # We want to figure out the 'reference file' for each 
+               # wrapper (the binary we're 'wrapping') so that we can 
+               # sync mtimes together.  This makes things like ccache
+               # happy.  See Bug #70548 for more info.
+               local ref
+               case ${x} in
+                       cc)  ref=${ROOT}/${GCC_BIN_PATH}/gcc;;
+                       f77) ref=${ROOT}/${GCC_BIN_PATH}/g77;;
+                       *)   ref=${ROOT}/${GCC_BIN_PATH}/${x};;
+               esac
+               if [[ -x ${ref} ]] ; then
+                       ${CP} -f "${wrapper}" "${ROOT}/usr/bin/${x}"
+                       ${TOUCH} -r "${ref}" "${ROOT}/usr/bin/${x}"
+
+                       # Install 32bit and 64bit wrappers if need be
+                       # This should probably get folded back into the wrapper ...
+                       if [[ ${x:${#x}-3} == "gcc" ]] || [[ ${x:${#x}-3} == "g++" ]] ; then
+                               for bits in ${GCCBITS} ; do
+                                       ${CP} -f "${wrapper}" "${ROOT}/usr/bin/${x}${bits}"
+                               done
+                       fi
+               fi
+       done
+       # legacy cruft, make sure we dont leave it laying around #143205
+       ${RM} -f "${ROOT}/usr/bin/${CTARGET}-cc"
+       # Only install cpp if switching to a native one
+       if ! is_cross_compiler && [[ ${CTARGET} != *-solaris* ]] ; then
+               ${RM} -f "${ROOT}/lib/cpp"
+               ${CP} -f "${wrapper}" "${ROOT}/lib/cpp"
+       fi
+
+       # We need to make sure that libgcc_s.so / libunwind.so make it into /lib.
+       # On many systems (x86/amd64/etc...), this will probably never matter, 
+       # but on other systems (arm/mips/etc...), this is quite critical.
+       # http://bugs.gentoo.org/60190
+       #
+       # The funky move magic is required for proper updating of in-use files.
+       if ! is_cross_compiler ; then
+               # Need to cut out extra paths in multilib case and pray the first path
+               # is the "root" multilib path ... maybe some day change this to use
+               # `gcc -print-file-name` ...
+               LDPATH=${LDPATH%%:*}
+               for multilib in $("${ROOT}/${GCC_BIN_PATH}"/gcc -print-multi-lib); do
+                       multiarg=${multilib#*;}
+                       multiarg=${multiarg/@/-}
+                       multilibdir=${multilib%;*}
+                       libdir="lib/"$("${ROOT}/${GCC_BIN_PATH}"/gcc ${multiarg} -print-multi-os-directory)
+                       if mkdir -p "${ROOT}/${libdir}"/.gcc.config.new ; then
+                               for gcclib in gcc_s unwind ; do
+                                       if [[ -n $(ls "${ROOT}/${LDPATH}/${multilibdir}"/lib${gcclib}.so.* 2>/dev/null) ]]; then
+                                               ${CP} -pP "${ROOT}/${LDPATH}/${multilibdir}"/lib${gcclib}.so.* "${ROOT}/${libdir}"/.gcc.config.new/
+                                               # no need to sanity remove this as the `mv` should take
+                                               # care of it.  we also need this step to be completly atomic
+                                               # for systems that have even `mv` linked against libgcc_s.so.
+                                               # http://bugs.gentoo.org/150257
+                                               #${RM} -f "${ROOT}/${libdir}"/lib${gcclib}.so*
+                                               ${MV} -f "${ROOT}/${libdir}"/.gcc.config.new/* "${ROOT}/${libdir}"/
+                                       fi
+                               done
+                               rmdir "${ROOT}/${libdir}"/.gcc.config.new
+                       fi
+               done
+               unset multilib
+               unset multilibdir
+               unset multiarg
+               unset libdir
+       fi
+
+       if [[ ${ROOT} == "/" ]] && [[ ${OLD_CC_COMP} != ${CC_COMP} || ${FORCE} == "yes" ]] ; then
+               # in case python is broken ...
+               if ! ${ENV_UPDATE} ; then
+                       echo ""
+                       ewarn "env-update failed to work properly; making sure ld.so.conf paths"
+                       ewarn "are setup properly.  Please rerun gcc-config with the -f option."
+                       echo ""
+                       ${GREP} -h ^LDPATH= "${ROOT}"/etc/env.d/05gcc \
+                               | ${SED} -e 's:^LDPATH=::' -e 's:"::g' -e 's|:|\n|g' \
+                               >> /etc/ld.so.conf
+                       ldconfig
+               fi
+       fi
+
+       eend 0
+
+       if [[ ${ROOT} == "/" ]] && [[ ${OLD_CC_COMP} != ${CC_COMP} ]] ; then
+               echo
+               ewarn "If you intend to use the gcc from the new profile in an already"
+               ewarn "running shell, please remember to do:"
+               echo
+               ewarn "  # source /etc/profile"
+               echo
+       fi
+
+       return 0
+}
+
+get_current_profile() {
+       local conf="${GCC_ENV_D}/config"
+       if [[ -n ${CTARGET} ]] ; then
+               conf="${conf}-${CTARGET}"
+       elif [[ -n ${CC_COMP} ]] && is_cross_compiler ; then
+               conf="${conf}-${CC_COMP}"
+       fi
+
+       if [[ ! -f ${conf} ]] ; then
+               eerror "${argv0}: No gcc profile is active!"
+               return 1
+       fi
+
+       source "${conf}"
+
+       if [[ -z ${CURRENT} ]] ; then
+               eerror "${argv0}: No gcc profile is active!"
+               return 1
+       elif [[ ! -f ${GCC_ENV_D}/${CURRENT} ]] ; then
+               eerror "${argv0}: Active gcc profile is invalid!"
+               return 1
+       fi
+
+       echo "${CURRENT}"
+
+       return 0
+}
+
+list_profiles() {
+       local i=1
+
+       if [[ ${ROOT} != "/" ]] ; then
+               echo "Using gcc-config info in ${ROOT}"
+       fi
+
+       if [[ ! -f ${GCC_ENV_D}/config ]] ; then
+               eerror "${argv0}: No gcc profile is active; please select one!"
+       fi
+
+       eval $(grep -s ^CURRENT= "${GCC_ENV_D}"/config)
+       CURRENT_NATIVE=${CURRENT}
+       local target=
+       for x in "${GCC_ENV_D}"/* ; do
+               if [[ -f ${x} ]] && [[ ${x/\/config} == ${x} ]] ; then
+                       source "${x}"
+                       if [[ ${target} != ${CTARGET} ]] ; then
+                               [[ -n ${target} ]] && echo
+                               target=${CTARGET}
+                               CTARGET=""
+                       fi
+
+                       x=${x##*/}
+                       if [[ ${x} == ${CURRENT_NATIVE} ]] ; then
+                               x="${x} ${GOOD}*${NORMAL}"
+                       elif [[ -e ${GCC_ENV_D}/config-${target} ]] ; then
+                               source "${GCC_ENV_D}/config-${target}"
+                               [[ ${x} == ${CURRENT} ]] && x="${x} ${HILITE}*${NORMAL}"
+                       fi
+                       echo " [${i}] ${x}"
+                       ((++i))
+               fi
+       done
+}
+
+print_environ() {
+       local OLDPATH=${PATH}
+       local ENV_CMD=
+       local SET_ELEMENT=
+
+       source "${GCC_ENV_D}/${CC_COMP}"
+
+       case ${SHELL} in
+               */csh|*/tsch)
+                       ENV_CMD="setenv"
+                       SET_ELEMENT=" "
+                       ;;
+               *)
+                       ENV_CMD="export"
+                       SET_ELEMENT="="
+                       ;;
+       esac
+
+       echo "${ENV_CMD} PATH${SET_ELEMENT}\"${PATH}:${OLDPATH}\""
+}
+
+get_bin_path() {
+       if [[ -e ${GCC_ENV_D}/${CC_COMP} ]] ; then
+               source "${GCC_ENV_D}/${CC_COMP}"
+               echo "${PATH}"
+       else
+               echo "no-config"
+               echo "${GCC_ENV_D}/${CC_COMP} doesnt exist" 1>&2
+       fi
+
+       return 0
+}
+
+get_lib_path() {
+       if [[ -e ${GCC_ENV_D}/${CC_COMP} ]] ; then
+               source "${GCC_ENV_D}/${CC_COMP}"
+               echo "${LDPATH}"
+       else
+               echo "no-config"
+               echo "${GCC_ENV_D}/${CC_COMP} doesnt exist" 1>&2
+       fi
+
+       return 0
+}
+
+get_stdcxx_incdir() {
+       if [[ -e ${GCC_ENV_D}/${CC_COMP} ]] ; then
+               source "${GCC_ENV_D}/${CC_COMP}"
+               echo "${LDPATH}/include/${STDCXX_INCDIR}"
+       else
+               echo "no-config"
+               echo "${GCC_ENV_D}/${CC_COMP} doesnt exist" 1>&2
+       fi
+
+       return 0
+}
+
+split_gcc_ver() {
+       # Split up the gcc profile into components:
+       # TARGET-VER[-specs] -> TARGET VER [specs]
+       # arm-linux-3.3.6 -> arm-linux 3.3.6
+       # x86_64-linux-4.0.1-pre1234 -> x86_64-linux 4.0.1-pre1234
+       # sh-linux-3.4.4-hardened -> sh-linux 3.4.4 hardened
+       #
+       # So below we will start at the end and run a small state machine ...
+       # specs [3]
+       #    accept everything
+       # specs -> version transition [3->2]
+       #    when we find a version component
+       # version [2]
+       #    accept only version components (see the regex)
+       # version -> target transition [2->1]
+       #    when we hit a non version component
+       # target [1]
+       #    accept everything we have left
+       #
+       echo "$@" | ${AWK} -F- '
+       function pushit(onme, pushee) {
+               return (onme == "" ? pushee : pushee"-"onme);
+       }
+       {
+               state=3
+               targ=""
+               ver=""
+               spec=""
+               for (i=NF; i > 0; --i) {
+                       if (state >= 2) {
+                               if ($i ~ /^(alpha|beta|pre|rc|p)?[[:digit:].]+$/) {
+                                       ver=pushit(ver, $i)
+                                       state=2
+                               } else if (state == 3)
+                                       spec=pushit(spec, $i)
+                               else
+                                       state=1
+                       }
+                       if (state == 1)
+                               targ = pushit(targ, $i)
+               }
+
+               if (targ == "") {
+                       if (ver == "") {
+                               ver=spec
+                               spec=""
+                       }
+                       targ=ver
+                       ver=""
+               }
+               print targ " " ver (spec != "" ? " " spec : "")
+       }'
+}
+chop_gcc_ver_spec() {
+       local splitTED=$(split_gcc_ver $@) # target ver spec
+       splitTED=${splitTED#* }            # ver spec
+       echo ${splitTED/ /-}               # ver-spec
+}
+
+cmd_setup
+
+NEED_ACTION="yes"
+DOIT="switch_profile"
+CHECK_CHOST="no"
+FORCE="no"
+
+CC_COMP=
+[[ -z ${ROOT} ]] && ROOT="/"
+[[ ${ROOT:0-1} != "/" ]] && ROOT="${ROOT}/"
+ENV_D="${ROOT}etc/env.d"
+GCC_ENV_D="${ENV_D}/gcc"
+
+for x in "$@" ; do
+       case "${x}" in
+               # Only use specified compiler if one is not already selected.
+               -O|--use-old)
+                       if get_current_profile &>/dev/null ; then
+                               CC_COMP=$(get_current_profile)
+                       else
+                               eerror "No profile selected, unable to utilize --use-old"
+                               exit 1
+                       fi
+                       ;;
+               -f|--force)
+                       FORCE="yes"
+                       ;;
+               -P|--use-portage-chost)
+                       CHECK_CHOST="yes"
+                       ;;
+               -c|--get-current-profile)
+                       if [[ ${NEED_ACTION} == "yes" ]] ; then
+                               NEED_ACTION="no"
+                               DOIT="get_current_profile"
+                       fi
+                       ;;
+               -l|--list-profiles)
+                       if [[ ${NEED_ACTION} == "yes" ]] ; then
+                               NEED_ACTION="no"
+                               DOIT="list_profiles"
+                       fi
+                       ;;
+               -S|--split-profile)
+                       if [[ ( $1 != "-S" && $1 != "--split-profile" ) || $# -eq 1 ]] ; then
+                               usage 1
+                       fi
+                       shift # push -S out
+                       for x in "$@" ; do
+                               split_gcc_ver ${x}
+                       done
+                       exit 0
+                       ;;
+               -E|--print-environ)
+                       if [[ ${NEED_ACTION} == "yes" ]] ; then
+                               NEED_ACTION="no"
+                               DOIT="print_environ"
+                       fi
+                       ;;
+               -B|--get-bin-path)
+                       if [[ ${NEED_ACTION} == "yes" ]] ; then
+                               NEED_ACTION="no"
+                               DOIT="get_bin_path"
+                       fi
+                       ;;
+               -L|--get-lib-path)
+                       if [[ ${NEED_ACTION} == "yes" ]] ; then
+                               NEED_ACTION="no"
+                               DOIT="get_lib_path"
+                       fi
+                       ;;
+               -X|--get-stdcxx-incdir)
+                       if [[ ${NEED_ACTION} == "yes" ]] ; then
+                               NEED_ACTION="no"
+                               DOIT="get_stdcxx_incdir"
+                       fi
+                       ;;
+               -h|--help)
+                       usage 0
+                       ;;
+               -V|--version)
+                       echo "gcc-config-PORTAGE-VERSION"
+                       exit 0
+                       ;;
+               -*)
+                       eerror "${argv0}: Invalid switch!  Run ${argv0} without parameters for help."
+                       exit 1
+                       ;;
+               *)
+                       if [[ -z ${CC_COMP} ]] ; then
+                               if [[ -z $(echo ${x} | tr -d '[:digit:]') ]] ; then
+                                       # User gave us a # representing the profile
+                                       i=1
+                                       for y in "${GCC_ENV_D}"/* ; do
+                                               [[ -f ${y} ]] || continue
+                                               [[ ${y/\/config} != ${y} ]] && continue
+
+                                               if [[ -f ${y} ]] && [[ ${x} == ${i} ]] ; then
+                                                       CC_COMP=${y##*/}
+                                                       break
+                                               fi
+                                               ((++i))
+                                       done
+                               else
+                                       # User gave us a full HOST-gccver
+                                       x=${x##*/}
+                                       if [[ ${DOIT} == "get_current_profile" && -z $(ls "${GCC_ENV_D}"/${x}-* 2>/dev/null) ]] || \
+                                          [[ ${DOIT} != "get_current_profile" && ! -f ${GCC_ENV_D}/${x} ]]
+                                       then
+                                               # Maybe they just gave us a gccver ...
+                                               get_real_chost
+                                               if [[ -f ${GCC_ENV_D}/${REAL_CHOST}-${x} ]] ; then
+                                                       x=${REAL_CHOST}-${x}
+                                               else
+                                                       eerror "${argv0}: Could not locate '$x' in '${GCC_ENV_D}/' !"
+                                                       exit 1
+                                               fi
+                                       fi
+                                       CC_COMP=${x}
+                               fi
+                       else
+                               eerror "${argv0}: Too many arguments!  Run ${argv0} without parameters for help."
+                               exit 1
+                       fi
+                       ;;
+       esac
+done
+
+if [[ ${DOIT} == "switch_profile" ]] && [[ -z ${CC_COMP} ]] ; then
+       usage 1
+fi
+
+if [[ -z ${CC_COMP} ]] ; then
+       CC_COMP=$(get_current_profile)
+       if [[ $? -ne 0 ]] ; then
+               echo "${CC_COMP}"
+               list_profiles
+               exit 1
+       fi
+fi
+
+if [[ ${DOIT} != "get_current_profile" ]] ; then
+       GCC_LIB=$(
+               source "${GCC_ENV_D}/${CC_COMP}"
+               echo ${LDPATH} | ${AWK} -F/ '{ print  "/"$2"/"$3"/"$4"/" }'
+       )
+
+       CC_COMP_VERSION=$(chop_gcc_ver_spec ${CC_COMP})
+       CC_COMP_TARGET=${CC_COMP%-${CC_COMP_VERSION}*}
+
+       if [[ ! -d ${ROOT}/${GCC_LIB}/${CC_COMP_TARGET}/${CC_COMP_VERSION} ]]; then
+               CC_COMP_VERSION=${CC_COMP_VERSION%-*}
+       fi
+
+       if [[ ! -d ${ROOT}/${GCC_LIB}/${CC_COMP_TARGET}/${CC_COMP_VERSION} ]] || \
+          [[ ! -f ${GCC_ENV_D}/${CC_COMP} ]]
+       then
+               eerror "${argv0}: Profile does not exist or invalid setting for ${GCC_ENV_D}/${CC_COMP}" 1>&2
+               #exit 1
+       fi
+fi
+
+if [[ ${CHECK_CHOST} == "yes" ]] ; then
+       # Chosen CHOST are not the same as the real CHOST according to
+       # make.conf, and --use-portage-chost option was given, so do nothing
+       get_real_chost
+       CC_COMP_VERSION=$(chop_gcc_ver_spec ${CC_COMP})
+       CC_COMP_TARGET=${CC_COMP:0:${#CC_COMP}-${#CC_COMP_VERSION}-1}
+       [[ ${CC_COMP_TARGET} != ${REAL_CHOST} ]] && exit 0
+fi
+
+eval ${DOIT}
+
+
+# vim:ts=4
diff --git a/sys-devel/gcc-config/gcc-config-1.3.15.ebuild b/sys-devel/gcc-config/gcc-config-1.3.15.ebuild
new file mode 100644 (file)
index 0000000..f8c31ab
--- /dev/null
@@ -0,0 +1,52 @@
+# Copyright 1999-2006 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/sys-devel/gcc-config/gcc-config-1.3.15.ebuild,v 1.1 2006/12/09 07:33:09 vapier Exp $
+
+inherit toolchain-funcs multilib
+
+# Version of .c wrapper to use
+W_VER="1.4.7"
+
+DESCRIPTION="Utility to change the gcc compiler being used"
+HOMEPAGE="http://www.gentoo.org/"
+SRC_URI=""
+
+LICENSE="GPL-2"
+SLOT="0"
+#KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~sparc-fbsd ~x86 ~x86-fbsd"
+KEYWORDS="-*"
+IUSE=""
+
+RDEPEND="!app-admin/eselect-compiler"
+
+S=${WORKDIR}
+
+src_compile() {
+       $(tc-getCC) -O2 -Wall -o wrapper \
+               "${FILESDIR}"/wrapper-${W_VER}.c || die "compile wrapper"
+}
+
+src_install() {
+       newbin "${FILESDIR}"/${PN}-${PV} ${PN} || die "install gcc-config"
+       sed -i \
+               -e "s:PORTAGE-VERSION:${PVR}:g" \
+               -e "s:GENTOO_LIBDIR:$(get_libdir):g" \
+               "${D}"/usr/bin/${PN}
+
+       exeinto /usr/$(get_libdir)/misc
+       newexe wrapper gcc-config || die "install wrapper"
+}
+
+pkg_postinst() {
+       # Do we have a valid multi ver setup ?
+       if gcc-config --get-current-profile &>/dev/null ; then
+               # We not longer use the /usr/include/g++-v3 hacks, as
+               # it is not needed ...
+               [[ -L ${ROOT}/usr/include/g++ ]] && rm -f "${ROOT}"/usr/include/g++
+               [[ -L ${ROOT}/usr/include/g++-v3 ]] && rm -f "${ROOT}"/usr/include/g++-v3
+               [[ ${ROOT} = "/" ]] && gcc-config $(/usr/bin/gcc-config --get-current-profile)
+       fi
+
+       # Make sure old versions dont exist #79062
+       rm -f "${ROOT}"/usr/sbin/gcc-config
+}