binutils-config: upgraded package to upstream

Upgraded sys-devel/binutils-config to version 3-r3 on amd64.

This version handles gold switching for us.

BUG=None
TEST=`cbuildbot chromiumos-sdk` worked

Change-Id: Iae6b1797871a36007733b0a46d73526584b3f11c
Reviewed-on: https://gerrit.chromium.org/gerrit/38213
Reviewed-by: asharif <asharif@google.com>
Commit-Ready: Mike Frysinger <vapier@chromium.org>
Tested-by: Mike Frysinger <vapier@chromium.org>
This commit is contained in:
Mike Frysinger 2012-11-16 14:32:48 -05:00 committed by Gerrit
parent 2bcb7b7297
commit 49e2bdceab
5 changed files with 551 additions and 27 deletions

View File

@ -1,8 +0,0 @@
DEFINED_PHASES=install
DESCRIPTION=Utility to change the binutils version being used
HOMEPAGE=http://www.gentoo.org/
KEYWORDS=alpha amd64 arm hppa ia64 m68k mips ppc ppc64 s390 sh sparc ~sparc-fbsd x86 ~x86-fbsd
LICENSE=GPL-2
RDEPEND=userland_GNU? ( >=sys-apps/findutils-4.2 )
SLOT=0
_md5_=798ee0fd9adc157d2d9cc10b2af7b9ce

View File

@ -0,0 +1,8 @@
DEFINED_PHASES=install
DESCRIPTION=Utility to change the binutils version being used
HOMEPAGE=http://www.gentoo.org/
KEYWORDS=alpha amd64 arm hppa ia64 m68k ~mips ppc ppc64 s390 sh sparc x86 ~amd64-fbsd ~sparc-fbsd ~x86-fbsd
LICENSE=GPL-2
RDEPEND=userland_GNU? ( !<sys-apps/findutils-4.2 )
SLOT=0
_md5_=52bb5f9f832a0576a92781ebc46be639

View File

@ -1,6 +1,6 @@
# Copyright 1999-2007 Gentoo Foundation
# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sys-devel/binutils-config/binutils-config-1.9-r4.ebuild,v 1.1 2007/05/06 09:04:01 vapier Exp $
# $Header: /var/cvsroot/gentoo-x86/sys-devel/binutils-config/binutils-config-3-r3.ebuild,v 1.9 2012/07/29 18:36:13 armin76 Exp $
DESCRIPTION="Utility to change the binutils version being used"
HOMEPAGE="http://www.gentoo.org/"
@ -8,10 +8,10 @@ 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="alpha amd64 arm hppa ia64 m68k ~mips ppc ppc64 s390 sh sparc x86 ~amd64-fbsd ~sparc-fbsd ~x86-fbsd"
IUSE=""
RDEPEND="userland_GNU? ( >=sys-apps/findutils-4.2 )"
RDEPEND="userland_GNU? ( !<sys-apps/findutils-4.2 )"
src_install() {
newbin "${FILESDIR}"/${PN}-${PV} ${PN} || die

View File

@ -0,0 +1,504 @@
#!/bin/bash
# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sys-devel/binutils-config/files/binutils-config-3,v 1.9 2012/08/18 03:57:50 vapier Exp $
# Format of /etc/env.d/binutils/:
# config-TARGET: CURRENT=version for TARGET
# TARGET-VER: has a TARGET and VER variable
: ${ROOT:=/}
[[ ${ROOT} != */ ]] && ROOT="${ROOT}/"
[[ ${ROOT} != /* ]] && ROOT="${PWD%/}/${ROOT}"
cd /
trap ":" INT QUIT TSTP
argv0=${0##*/}
source /etc/init.d/functions.sh || {
echo "${argv0}: Could not source /etc/init.d/functions.sh!" 1>&2
exit 1
}
esyslog() { :; }
die() { eerror "${argv0}: $*"; exit 1; }
umask 022
usage() {
cat << USAGE_END
Usage: ${HILITE}binutils-config${NORMAL} ${GOOD}[options]${NORMAL} ${BRACKET}[binutils profile]${NORMAL}
${HILITE}General Options:${NORMAL}
${GOOD}-c, --get-current-profile${NORMAL} Print current profile
${GOOD}-l, --list-profiles${NORMAL} Print a list of available profiles
${GOOD}-u, --uninstall${NORMAL} Remove all signs of specified target
${GOOD}-d, --debug${NORMAL} Execute with debug output
${HILITE}General Cruft:${NORMAL}
${GOOD}--linker${NORMAL} <linker> Switch to specified linker (if supported)
${HILITE}Arch Specific Cruft:${NORMAL}
${GOOD}--amd64${NORMAL} Install extra amd64 links (x86_64)
${GOOD}--arm${NORMAL} Install extra arm links (arm/armeb)
${GOOD}--mips${NORMAL} Install extra mips links (mips/mipsel)
${GOOD}--x86${NORMAL} Install extra x86 links (i[3-6]86)
Profile names are of the form: ${BRACKET}<CTARGET>-<binutils version>${NORMAL}
For example: ${BRACKET}i686-pc-linux-gnu-2.15.92.0.2${NORMAL}
For more info, please see ${HILITE}binutils-config${NORMAL}(8).
USAGE_END
exit ${1:-1}
}
mv_if_diff() {
if cmp -s "$1" "$2" ; then
rm -f "$1"
else
mv -f "$1" "$2"
fi
}
atomic_ln() {
local target=$1 linkdir=$2 linkname=$3 linktmp linkfull
linktmp="${linkdir}/.binutils-config.tmp.${linkname}"
linkfull="${linkdir}/${linkname}"
if [[ -d ${linkfull} ]] ; then
# if linking to a dir, we need a little magic to
# make it atomic since `mv -T` is not portable
rm -rf "${linktmp}"
mkdir -p "${linktmp}"
ln -sf "${target}" "${linktmp}/${linkname}"
mv "${linktmp}/${linkname}" "${linktmp}/../"
rmdir "${linktmp}"
else
# `ln` will expand into unlink();symlink(); which
# is not atomic for a small amount of time, but
# `mv` is a single rename() call
ln -sf "${target}" "${linktmp}"
mv "${linktmp}" "${linkfull}"
fi
}
setup_env() {
unset TARGET VER LIBPATH FAKE_TARGETS
source "${ENV_D}/${PROFILE}"
if [[ -z ${TARGET} ]] ; then
eerror "${PROFILE} is invalid (no \$TARGET defined) :("
return 1
fi
if [[ -z ${VER} ]] ; then
eerror "${PROFILE} is invalid (no \$VER defined) :("
return 1
fi
#
# Older installs don't have 'FAKE_TARGETS' defined, so lets
# update these env.d entries so that we don't force the poor
# user to re-emerge their binutils just for 1 envvar :/
#
if [[ ${FAKE_TARGETS-poor user} == "poor user" ]] ; then
local targ=${TARGET/-*}
local FAKE_TARGETS=${TARGET}
case ${targ} in
mips|powerpc|sparc)
FAKE_TARGETS="${FAKE_TARGETS} ${TARGET/-/64-}";;
mips64|powerpc64|sparc64)
FAKE_TARGETS="${FAKE_TARGETS} ${TARGET/64-/-}";;
esac
echo "FAKE_TARGETS=\"${FAKE_TARGETS}\"" >> "${ENV_D}/${PROFILE}"
fi
local fake_targ_append="${TARGET#*-}"
FAKE_TARGETS="${FAKE_TARGETS} ${FAKE_TARGETS_USER// /-${fake_targ_append} }"
#
# Generate binary symlinks
# On systems that do 32bit/64bit, we need to fake an
# extra set of binary names (${FAKE_TARGETS})
#
BINPATH=""
BINPATH_LINKS=""
if [[ ${TARGET} != ${HOST} ]] ; then
#
# Newer paths: /usr/${HOST}/${TARGET}/...
# Older paths: /usr/${TARGET}/...
#
if [[ -d ${ROOT}/usr/${HOST}/${TARGET}/binutils-bin/${VER} ]] ; then
BINPATH=/usr/${HOST}/${TARGET}/binutils-bin/${VER}
BINPATH_LINKS=/usr/libexec/gcc/${TARGET}
fi
fi
if [[ -z ${BINPATH} ]] ; then
BINPATH=/usr/${TARGET}/binutils-bin/${VER}
BINPATH_LINKS=/usr/${TARGET}/bin
fi
}
switch_profile() {
ebegin "Switching to ${PROFILE}"
setup_env || return 1
cd "${ROOT}/${BINPATH}" || exit 1
mkdir -p "${ROOT}/${BINPATH_LINKS}" "${ROOT}/usr/bin"
for x in * ; do
atomic_ln "${BINPATH}/${x}" "${ROOT}/${BINPATH_LINKS}" "${x}"
atomic_ln "${BINPATH_LINKS}/${x}" "${ROOT}/usr/bin/" "${TARGET}-${x}"
for fake in ${FAKE_TARGETS} ; do
[[ -f ${ENV_D}/config-${fake} ]] && continue
atomic_ln "${BINPATH_LINKS}/${x}" "${ROOT}/usr/bin" "${fake}-${x}"
done
if [[ ${TARGET} == ${HOST} ]] ; then
atomic_ln "${TARGET}-${x}" "${ROOT}/usr/bin" "${x}"
fi
done
#
# Generate library / ldscripts symlinks
#
: ${LIBPATH:=/usr/lib/binutils/${TARGET}/${VER}}
cd "${ROOT}/${LIBPATH}" || exit 1
if [[ ${TARGET} == ${HOST} ]] ; then
dstlib=${ROOT}/usr/${HOST}/lib
else
dstlib=${ROOT}/usr/${HOST}/${TARGET}/lib
fi
# When upgrading, we need to clean up ldscripts and libs
mkdir -p "${dstlib}"
rm -rf "${ROOT}/${BINPATH_LINKS}"/ldscripts
atomic_ln "${LIBPATH}/ldscripts" "${dstlib}" "ldscripts"
find -L "${dstlib}" -type l -exec rm -v {} +
for x in lib* ; do
atomic_ln "${LIBPATH}/${x}" "${dstlib}" "${x}"
done
#
# Generate include symlinks
#
INCPATH=${LIBPATH}/include
if [[ -d ${ROOT}/${INCPATH} ]] ; then
cd "${ROOT}/${INCPATH}" || exit 1
if [[ ${HOST} == ${TARGET} ]] ; then
mkdir -p "${ROOT}/usr/include"
for x in * ; do
atomic_ln "${INCPATH}/${x}" "${ROOT}/usr/include" "${x}"
done
else
# Clean out old path -- cannot use '-exec {} +' syntax here
find . -type f -exec rm -f "${ROOT}/usr/${TARGET}/usr/include/{}" \;
rmdir "${ROOT}/usr/${TARGET}/usr/include" >& /dev/null
rmdir "${ROOT}/usr/${TARGET}/usr" >& /dev/null
rmdir "${ROOT}/usr/${TARGET}" >& /dev/null
fi
fi
#
# Make sure proper paths get updated
#
if [[ ${TARGET} == ${HOST} ]] ; then
DATAPATH=/usr/share/binutils-data/${TARGET}/${VER}
local e="${ROOT}"/etc/env.d/05binutils
local ee="${e}.tmp"
rm -f "${ee}"
[[ -d ${DATAPATH}/man ]] && echo "MANPATH=${DATAPATH}/man" >> "${ee}"
[[ -d ${DATAPATH}/info ]] && echo "INFOPATH=${DATAPATH}/info" >> "${ee}"
# hmm, `ld` has this in SEARCH_DIR(), but ld.so does not ...
if [[ -d ${ROOT}/etc/ld.so.conf.d ]] ; then
local l="${ROOT}"/etc/ld.so.conf.d/05binutils.conf
local ll="${l}.tmp"
echo "/usr/${TARGET}/lib" > "${ll}"
mv_if_diff "${ll}" "${l}"
else
echo "LDPATH=/usr/${TARGET}/lib" >> "${ee}"
fi
mv_if_diff "${ee}" "${e}"
fi
local c="${ENV_D}/config-${TARGET}"
local cc="${c}.tmp"
echo "CURRENT=${VER}" > "${cc}"
mv_if_diff "${cc}" "${c}"
eend 0
#
# Regen env.d if need/can be
#
if [[ ${ROOT} == "/" ]] && [[ ${TARGET} == ${HOST} ]] ; then
env-update
echo
ewarn "Please remember to run:"
echo
ewarn " # . /etc/profile"
echo
fi
return 0
}
uninstall_target() {
: ${TARGET:=${UARG}}
if [[ ${TARGET} == ${HOST} ]] ; then
die "refusing to uninstall native binutils"
fi
shopt -s nullglob
PROFILE=""
for PROFILE in "${ENV_D}"/${TARGET}-* ; do
ewarn "Removing all signs of ${PROFILE##*/}"
rm -f "${ENV_D}"/${PROFILE}
done
if [[ -z ${PROFILE} ]] && [[ ! -e ${ENV_D}/config-${TARGET} ]] ; then
die "no profiles exist for '${TARGET}'"
fi
rm -f "${ENV_D}"/config-${TARGET} "${ROOT}"/etc/ld.so.conf.d/05binutils.conf
# XXX: we still leave behind FAKE_TARGETS in /usr/bin ...
local x
for x in addr2line ar as c++filt elf2flt flthdr gprof ld ld.real \
nm objcopy objdump ranlib readelf size strings strip ; do
x=(
"${ROOT}"/usr/bin/${TARGET}-${x}
"${ROOT}"/usr/{${HOST}/,}${TARGET}/bin/${x}
"${ROOT}"/usr/libexec/gcc/${TARGET}/${x}
)
rm -f "${x[@]}"
done
for x in ansidecl.h bfd.h bfdlink.h dis-asm.h symcat.h ; do
rm -f "${ROOT}"/usr/{${HOST}/,}${TARGET}/{usr/,}include/${x}
done
for x in bfd iberty opcodes ; do
rm -f "${ROOT}"/usr/${HOST}/${TARGET}/lib/lib${x}{{-*,}.so,.a,.la}
done
# Delete broken symlinks
local destdir="${ROOT}/usr/${HOST}/${TARGET}"
rm -f "${destdir}"/lib/ldscripts
find -L "${destdir}"/lib -type l -exec rm {} +
rmdir \
"${destdir}"/{bin,include,lib,usr} \
"${destdir}" \
"${ROOT}"/var/db/pkg/cross-${TARGET} \
2>/dev/null
rm -f "${ENV_D}"/${TARGET}-*
}
set_current_profile() {
if [[ ! -f ${ENV_D}/config-${TARGET} ]] ; then
eerror "${argv0}: unable to locate a profile for target: ${TARGET}"
return 1
fi
source "${ENV_D}/config-${TARGET}"
if [[ -z ${CURRENT} ]] ; then
eerror "${argv0}: no binutils profile is active!"
return 1
fi
echo "${TARGET}-${CURRENT}"
return 0
}
get_current_profile() { echo "${PROFILE}" ; }
list_profiles() {
local x i target
if [[ ${ROOT} != / ]] ; then
echo "Using binutils-config info in ${ROOT}"
fi
set -- "${ENV_D}"/*
target=
i=1
for x ; do
# skip broken links and config files
[[ -f ${x} ]] || continue
[[ ${x} == */config-* ]] && continue
source "${x}"
if [[ ${target} != ${TARGET} ]] ; then
[[ -n ${target} ]] && echo
target=${TARGET}
fi
x=${x##*/}
if [[ -e ${ENV_D}/config-${TARGET} ]] ; then
source "${ENV_D}/config-${TARGET}"
if [[ ${VER} == ${CURRENT} ]] ; then
[[ ${TARGET} == ${HOST} ]] \
&& x="${x} ${GOOD}*${NORMAL}" \
|| x="${x} ${HILITE}*${NORMAL}"
fi
fi
# We would align the [...] field like so:
#printf ' [%*ss] %s\n' ${##} "${i}" "${x}"
# but this breaks simple scripting: `binutils -l | awk '{print $2}'`
# Or we could align the target col like so:
#printf ' [%s]%*s %s\n' "${i}" $(( ${##} - ${#i} )) "" "${x}"
# but i'm not sold that it looks better
# So keep it simple ... only makes a diff anyways for crazy people
# like me which have 100+ binutils packages installed ...
echo " [$i] ${x}"
((++i))
done
}
switch_linker() {
local bpath ld=$1
case ${ld} in
ld.*) ;;
*) die "not supported: linker must start with 'ld.'" ;;
esac
setup_env || return 1
bpath="${ROOT}/${BINPATH}"
# does this binutils even support the requested linker ?
if [[ ! -e ${bpath}/${ld} ]] ; then
die "sorry, but ${PROFILE} doesn't support the ${ld} linker"
fi
# switch it up
ebegin "Setting default linker to ${ld} for ${PROFILE}"
atomic_ln ${ld} "${bpath}" ld
eend $?
}
set_HOST() {
# Set HOST to CHOST if it isn't already set
: ${HOST:=${CHOST:-$(portageq envvar CHOST)}}
}
ENV_D="${ROOT}etc/env.d/binutils"
DEBUG="no"
NEED_ACTION="yes"
DOIT="switch_profile"
PROFILE="current"
FAKE_TARGETS_USER=""
HOST=""
TARGET=""
unset UARG
select_action() {
if [[ ${NEED_ACTION} != "no" ]] ; then
NEED_ACTION="no"
DOIT=$1
else
die "one action at a time!"
fi
}
while [[ $# -gt 0 ]] ; do
x=$1
shift
case ${x} in
-c|--get-current-profile) select_action get_current_profile ;;
-l|--list|--list-profiles) select_action list_profiles ;;
-u|--uninstall) select_action uninstall_target ;;
--linker) select_action "switch_linker $1"; shift ;;
-d|--debug) DEBUG="yes" ;;
-h|--help) usage 0 ;;
-V|--version)
unset Header
cvsver="$Header: /var/cvsroot/gentoo-x86/sys-devel/binutils-config/files/binutils-config-3,v 1.9 2012/08/18 03:57:50 vapier Exp $"
cvsver=${cvsver##*binutils-config-}
bver=${cvsver%%,v *}
cvsver=${cvsver#* }
echo "binutils-config-${bver} (r${cvsver%% *})"
exit 0
;;
--amd64|--arm|--mips|--x86)
if [[ ${NEED_ACTION} == "yes" ]] ; then
# Make sure we have a space after each target
NEED_ACTION="no"
case ${x} in
--amd64) FAKE_TARGETS_USER="x86_64 ";;
--arm) FAKE_TARGETS_USER="arm armeb ";;
--x86) FAKE_TARGETS_USER="i386 i486 i586 i686 ";;
--mips) FAKE_TARGETS_USER="mips mips64 mipsel mipsel64 ";;
esac
fi
;;
-*)
die "invalid switch! Try '--help'."
;;
*)
if [[ ${UARG+set} == "set" ]] ; then
die "only one profile/target at a time please"
fi
NEED_ACTION="maybe"
UARG=${x}
;;
esac
done
[[ ${NEED_ACTION} == "yes" ]] && usage 1
[[ ${DEBUG} == "yes" ]] && set -x
# All operations need to know the current HOST to figure out
# what is a native target and what is a cross target
set_HOST
# All operations need to know the profile the user wants
case ${DOIT} in
switch_profile|switch_linker_*)
# decode user's profile choice
x=${UARG:-$(TARGET=${HOST} set_current_profile)}
PROFILE=""
if [[ -z $(echo ${x} | tr -d '[:digit:]') ]] ; then
# User gave us a # representing the profile
i=1
for y in "${ENV_D}"/* ; do
[[ ${y/config-} != ${y} ]] && continue
if [[ -f ${y} ]] && [[ ${x} -eq ${i} ]] ; then
PROFILE=${y##*/}
break
fi
((++i))
done
fi
if [[ -z ${PROFILE} ]] ; then
# User gave us a full HOST-ver
x=${x##*/}
if [[ -f ${ENV_D}/${x} ]] ; then
# Valid HOST-ver yeah!
PROFILE=${x}
else
# Not a valid HOST-ver ...
if [[ ! -f ${ENV_D}/config-${x} ]] ; then
# Maybe they just gave us a ver ...
if [[ -f ${ENV_D}/${HOST}-${x} ]] ; then
x=${HOST}-${x}
else
die "could not locate '$x' in '${ENV_D}/'!"
fi
PROFILE=${x}
else
# Maybe they just gave us a target ... pick active profile
PROFILE=$(TARGET=${x} set_current_profile)
fi
fi
fi
;;
*)
# lookup current profile as the user gave us a target
PROFILE=$(TARGET=${UARG:-${HOST}} set_current_profile) || exit 1
;;
esac
eval ${DOIT}
# vim:ts=4

View File

@ -3,28 +3,39 @@
binutils-config \- manage active versions of the binutils programs
.SH "DESCRIPTION"
The \fBbinutils-config\fR script allows you to switch between different
versions of binutils when you have installed multiple copies via portage.
It also allows you to manage multiple cross-compiling targets.
versions of binutils when you have installed multiple copies (see
USE=multislot). It also allows you to manage multiple cross-compiling
targets simultaneously.
Remember, you may have one version of binutils active per \fBCTARGET\fR.
Remember, you may have one version of binutils active per \fICTARGET\fR,
and changing the version for one target has no bearing on any other. So
changing an active cross-compiler will not break your native compiler
(i.e. \fICHOST\fR).
.SH "SYNOPSIS"
\fBbinutils-config\fR \fI--get-current-profile\fR \fI[TARGET]\fR
\fBbinutils-config\fR [\fIcrufty options\fR] \fIPROFILE\fR
\fBbinutils-config\fR \fI--list-profiles\fR
\fBbinutils-config\fR \fB--get-current-profile\fR \fI[TARGET]\fR
\fBbinutils-config\fR \fI--uninstall\fR \fI<TARGET>\fR
\fBbinutils-config\fR \fB--list-profiles\fR
\fBbinutils-config\fR \fB--uninstall\fR \fITARGET\fR
.SH "GENERIC OPTIONS"
.TP
\fBTARGET\fR
\fBPROFILE\fR
Change the system to use the specified binutils version. This may take the
form of the list index number (the number shown in the
\fI\-\-list\-profiles\fR output), a full \fBCTARGET-VERSION\fR (useful when
working with cross-compilers), or just a binutils \fBVERSION\fR where the
\fBCTARGET\fR is assumed to be the native \fBCHOST\fR value.
form of the list index number (the number shown on the left in the
\fB\-\-list\-profiles\fR output), a full \fITARGET-VERSION\fR (useful when
working with cross-compilers), just a \fITARGET\fR where the \fIVERSION\fR
is picked from the active, or just a binutils \fIVERSION\fR where the
\fITARGET\fR is assumed to be the native \fIHOST\fR value.
.TP
\fBTARGET\fR
Similiar to \fBPROFILE\fR, but this is only the target and no version info
(i.e. \fICTARGET\fR or \fICHOST\fR).
.TP
\fB\-c\fR, \fB\-\-get\-current\-profile\fR \fI[TARGET]\fR
Display the active profile for \fITARGET\fR. If none is specified, the
host system's \fITARGET\fR will be shown.
host system's \fITARGET\fR will be shown (i.e. \fICHOST\fR).
.TP
\fB\-l\fR, \fB\-\-list\-profiles\fR
Show all the profiles that your system currently has installed and what
@ -32,10 +43,19 @@ versions are active. The active native version is noted with a bright green
asterisk while the active cross-compiler versions are noted with a light blue
asterisk.
.TP
\fB-u\fR, \fB\-\-uninstall\fR <\fBTARGET\fR>
\fB-u\fR, \fB\-\-uninstall\fR \fITARGET\fR
This is really for internal use only. Used to remove all traces of the
\fBTARGET\fR binutils from your system.
.SH "SPECIFIC OPTIONS"
\fITARGET\fR binutils from your system.
.SH "CRUFTY OPTIONS"
.TP
\fB\-\-gold\fR
Change the default linker for the specified \fIPROFILE\fR to the [newer] gold
linker. This only works if the binutils actually supports gold. Note that
not all options supported by the bfd linker are supportd by the gold linker.
.TP
\fB\-\-bfd\fR
Change the default linker for the specified \fIPROFILE\fR to the [older but
stable] bfd linker. If unsure, stick to this one.
.TP
\fB\-\-amd64\fR
A nice feature of the amd64/x86 toolchain is that each can produce code for