From: "the guard" <the.guard@mail.ru>
To: gentoo-user@lists.gentoo.org
Subject: [gentoo-user] bus error during compilation of gcc
Date: Sat, 20 Apr 2013 21:29:09 +0400 [thread overview]
Message-ID: <1366478949.973562149@f243.mail.ru> (raw)
[-- Attachment #1.1: Type: text/plain, Size: 212 bytes --]
Hello, gentlemen
The package i decided to install required a gcc rebuild so I started rebuilding it and got a bus error. I've googled and found suggestions to lower makeopts, but it didn't help.
--
the guard
[-- Attachment #1.2: Type: text/html, Size: 254 bytes --]
[-- Attachment #2: environment --]
[-- Type: application/octet-stream, Size: 168262 bytes --]
declare -x ABI_X86="32"
declare -x ALSA_CARDS=""
declare -x ALSA_PCM_PLUGINS="adpcm alaw asym copy dmix dshare dsnoop empty extplug file hooks iec958 ioplug ladspa lfloat linear meter mmap_emul mulaw multi null plug rate route share shm softvol"
declare -x APACHE2_MODULES="authn_core authz_core socache_shmcb unixd actions alias auth_basic authn_alias authn_anon authn_dbm authn_default authn_file authz_dbm authz_default authz_groupfile authz_host authz_owner authz_user autoindex cache cgi cgid dav dav_fs dav_lock deflate dir disk_cache env expires ext_filter file_cache filter headers include info log_config logio mem_cache mime mime_magic negotiation rewrite setenvif speling status unique_id userdir usertrack vhost_alias"
declare -x ARCH="x86"
declare -- BINPATH="/usr/i686-pc-linux-gnu/gcc-bin/4.6.3"
declare -x BOOTSTRAP_USE="cxx unicode python_targets_python3_2 python_targets_python2_7"
declare -- BRANCH_UPDATE=""
declare -x BRANDING_GCC_PKGVERSION="Gentoo 4.6.3 p1.11, pie-0.5.2"
declare -x CALLIGRA_FEATURES="kexi words flow plan sheets stage tables krita karbon braindump"
declare -x CAMERAS="ptp2"
declare -x CBUILD="i686-pc-linux-gnu"
declare -x CFLAGS="-O2 -march=native -pipe"
declare -x CFLAGS_default
declare -x CHOST="i686-pc-linux-gnu"
declare -x CHOST_default="i686-pc-linux-gnu"
declare -x COLLECTD_PLUGINS="df interface irq load memory rrdtool swap syslog"
declare -x CONSOLE="/dev/console"
declare -x CTARGET="i686-pc-linux-gnu"
declare -x CTARGET_default="i686-pc-linux-gnu"
declare -x CXXFLAGS="-O2 -march=native -pipe"
declare -- DATAPATH="/usr/share/gcc-data/i686-pc-linux-gnu/4.6.3"
declare -x DBUS_SESSION_BUS_ADDRESS="unix:abstract=/tmp/dbus-T8kqWLhs0V,guid=4814da52eb1b2ff26c697a975172c8d3"
declare -x DEBUGBUILD="1"
declare -x DEFAULT_ABI="default"
declare -x DEFINED_PHASES=" compile install postinst postrm setup test unpack"
declare DEPEND="
elibc_glibc? ( >=sys-libs/glibc-2.8 )
>=sys-devel/binutils-2.18 sys-devel/gnuconfig >=sys-apps/sed-4 sys-libs/zlib
nls? ( sys-devel/gettext ) virtual/libiconv >=dev-libs/gmp-4.3.2 >=dev-libs/mpfr-2.4.2 >=dev-libs/mpc-0.8.1
graphite? (
>=dev-libs/cloog-ppl-0.15.10
>=dev-libs/ppl-0.11
)
>=sys-devel/bison-1.875
>=sys-devel/flex-2.5.4
test? (
>=dev-util/dejagnu-1.4.4
>=sys-devel/autogen-5.5.4
) gcj? ( gtk? (
x11-libs/libXt
x11-libs/libX11
x11-libs/libXtst
x11-proto/xproto
x11-proto/xextproto
=x11-libs/gtk+-2*
virtual/pkgconfig
amd64? ( multilib? (
app-emulation/emul-linux-x86-gtklibs
app-emulation/emul-linux-x86-xlibs
) )
x11-libs/pango ) >=media-libs/libart_lgpl-2.1 app-arch/zip app-arch/unzip )"
declare DESCRIPTION="The GNU Compiler Collection"
declare -x DESKTOP_SESSION="LXDE"
declare -x DESTTREE="/usr"
declare -x DIROPTIONS="-m0755"
declare -x EAPI="0"
declare -- EBUILD_DEATH_HOOKS=" toolchain_death_notice"
declare -- ECLASSDIR_LOCAL="/usr/portage/eclass"
declare -x EINFO_LOG="/etc/init.d/xdm"
declare -x ELIBC="glibc"
declare -x ELT_APPLIED_PATCHES=" portage/2.2 sed/1.5.6 as-needed/2.2.6"
declare -- EPATCH_COMMON_OPTS="-g0 -E --no-backup-if-mismatch"
declare -- EPATCH_EXCLUDE=""
declare -- EPATCH_FORCE="no"
declare -- EPATCH_MULTI_MSG="Applying various patches (bugfixes/updates) ..."
declare -- EPATCH_OPTS=""
declare -- EPATCH_SINGLE_MSG=""
declare -- EPATCH_SOURCE="/var/tmp/portage/sys-devel/gcc-4.6.3/work/patch"
declare -- EPATCH_SUFFIX="patch"
declare -x EXEOPTIONS="-m0755"
declare -x FCFLAGS="-O2 -march=i686 -pipe"
declare -x FETCHCOMMAND_SSH="bash -c \"x=\\\${2#ssh://} ; host=\\\${x%%/*} ; port=\\\${host##*:} ; host=\\\${host%:*} ; [[ \\\${host} = \\\${port} ]] && port=22 ; exec rsync --rsh=\\\"ssh -p\\\${port}\\\" -avP \\\"\\\${host}:/\\\${x#*/}\\\" \\\"\\\$1\\\"\" rsync \"\${DISTDIR}/\${FILE}\" \"\${URI}\""
declare -x FFLAGS="-O2 -march=i686 -pipe"
declare -- GCCMAJOR="4"
declare -- GCCMICRO="3"
declare -- GCCMINOR="6"
declare -- GCC_BRANCH_VER="4.6"
declare -- GCC_CONFIG_VER="4.6.3"
declare -x GCC_FILESDIR="/usr/portage/sys-devel/gcc/files"
declare -- GCC_PV="4.6.3"
declare -- GCC_PVR="4.6.3"
declare -- GCC_RELEASE_VER="4.6.3"
declare -- GCJ_DEPS=">=media-libs/libart_lgpl-2.1 app-arch/zip app-arch/unzip"
declare -- GCJ_GTK_DEPS="
x11-libs/libXt
x11-libs/libX11
x11-libs/libXtst
x11-proto/xproto
x11-proto/xextproto
=x11-libs/gtk+-2*
virtual/pkgconfig
amd64? ( multilib? (
app-emulation/emul-linux-x86-gtklibs
app-emulation/emul-linux-x86-xlibs
) )
x11-libs/pango"
declare -x GDK_USE_XFT="1"
declare -- GMP_MPFR_DEPS=">=dev-libs/gmp-4.3.2 >=dev-libs/mpfr-2.4.2"
declare -x GPSD_PROTOCOLS="ashtech aivdm earthmate evermore fv18 garmin garmintxt gpsclock itrax mtk3301 nmea ntrip navcom oceanserver oldstyle oncore rtcm104v2 rtcm104v3 sirf superstar2 timing tsip tripmate tnt ubx"
declare -x GRUB_PLATFORMS=""
declare -x GSETTINGS_BACKEND="gconf"
declare HDEPEND=""
declare HOMEPAGE="http://gcc.gnu.org/"
declare -x HTB_GCC_VER="4.6.3"
declare -- INCLUDEPATH="/usr/lib/gcc/i686-pc-linux-gnu/4.6.3/include"
declare -x INHERITED=" multilib toolchain-funcs user eutils versionator libtool flag-o-matic gnuconfig fixheadtails pax-utils toolchain"
declare -x INPUT_DEVICES="evdev keyboard mouse synaptics"
declare -x INSDESTTREE=""
declare -x INSOPTIONS="-m0644"
declare IUSE="multislot nls nptl test vanilla altivec cxx fortran nopie nossp doc gcj gtk hardened multilib objc objc-gc mudflap libssp objc++ openmp fixed-point graphite"
declare -x IUSE_IMPLICIT="prefix"
declare -x KERNEL="linux"
declare -x KERNEL_ABI="default"
declare -x KEYWORDS="~alpha amd64 arm hppa ia64 ~m68k ~mips ppc ppc64 s390 sh ~sparc x86 ~amd64-fbsd ~x86-fbsd"
declare -x KV="3.7.10-gentoo"
declare -x LCD_DEVICES="bayrad cfontz cfontz633 glk hd44780 lb216 lcdm001 mtxorb ncurses text"
declare -x LDFLAGS="-Wl,-O1 -Wl,--as-needed"
declare -x LDFLAGS_default
declare -x LIBDIR_default="lib"
declare -x LIBOPTIONS="-m0644"
declare -- LIBPATH="/usr/lib/gcc/i686-pc-linux-gnu/4.6.3"
declare -x LIBREOFFICE_EXTENSIONS="presenter-console presenter-minimizer"
declare -x LICENSE="GPL-3+ LGPL-3+ || ( GPL-3+ libgcc libstdc++ gcc-runtime-library-exception-3.1 ) FDL-1.3+"
declare -x MAKEOPTS="-j3"
declare -x MULTILIB_ABIS="default"
declare -x MULTIOSDIRS="../lib"
declare -x NETBEANS="apisupport cnd groovy gsf harness ide identity j2ee java mobility nb php profiler soa visualweb webcommon websvccommon xml"
declare -x OFFICE_IMPLEMENTATION="libreoffice"
declare -x OPENGL_PROFILE="xorg-x11"
declare -x PATCH_GCC_VER="4.6.3"
declare -- PATCH_VER="1.11"
declare -x PATH="/usr/lib/portage/bin/ebuild-helpers:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/i686-pc-linux-gnu/gcc-bin/4.6.3"
declare -- PAX_MARKINGS="PT"
declare PDEPEND=" elibc_glibc? ( >=sys-libs/glibc-2.8 ) >=sys-devel/gcc-config-1.7"
declare -x PHP_TARGETS=""
declare -x PIE_GCC_VER="4.6.3"
declare -- PIE_GLIBC_STABLE="x86 amd64 mips ppc ppc64 arm ia64"
declare -- PIE_UCLIBC_STABLE="x86 arm amd64 ppc ppc64"
declare -- PIE_VER="0.5.2"
declare -a PORTAGE_DOCOMPRESS='([0]="/usr/share/doc" [1]="/usr/share/info" [2]="/usr/share/man")'
declare -a PORTAGE_DOCOMPRESS_SKIP='([0]="/usr/share/doc/gcc-4.6.3/html")'
declare -- PREFIX="/usr"
declare -x PRELINK_PATH_MASK="/usr/lib/libfreebl3.so:/usr/lib/libnssdbm3.so:/usr/lib/libsoftokn3.so"
declare -x PROFILE_ONLY_VARIABLES="ARCH ELIBC IUSE_IMPLICIT KERNEL USERLAND USE_EXPAND_IMPLICIT USE_EXPAND_UNPREFIXED USE_EXPAND_VALUES_ARCH USE_EXPAND_VALUES_ELIBC USE_EXPAND_VALUES_KERNEL USE_EXPAND_VALUES_USERLAND"
declare -x PROPERTIES=""
declare -x PROVIDE=""
declare -x PYTHONDONTWRITEBYTECODE="1"
declare -x PYTHONPATH="/usr/lib/portage/pym"
declare -x PYTHON_SINGLE_TARGET=""
declare -x PYTHON_TARGETS=""
declare -x QT_GRAPHICSSYSTEM="raster"
declare -x RC_SERVICE="/etc/init.d/xdm"
declare -x RC_SVCNAME="xdm"
declare -x RDEPEND="sys-libs/zlib
nls? ( sys-devel/gettext ) virtual/libiconv >=dev-libs/gmp-4.3.2 >=dev-libs/mpfr-2.4.2 >=dev-libs/mpc-0.8.1
graphite? (
>=dev-libs/cloog-ppl-0.15.10
>=dev-libs/ppl-0.11
)"
declare REPOSITORY
declare REQUIRED_USE=""
declare -x RESTRICT="strip"
declare -x RESUMECOMMAND_SSH="bash -c \"x=\\\${2#ssh://} ; host=\\\${x%%/*} ; port=\\\${host##*:} ; host=\\\${host%:*} ; [[ \\\${host} = \\\${port} ]] && port=22 ; exec rsync --rsh=\\\"ssh -p\\\${port}\\\" -avP \\\"\\\${host}:/\\\${x#*/}\\\" \\\"\\\$1\\\"\" rsync \"\${DISTDIR}/\${FILE}\" \"\${URI}\""
declare -x RUBY_TARGETS=""
declare -x S="/var/tmp/portage/sys-devel/gcc-4.6.3/work/gcc-4.6.3"
declare -x SAL_USE_VCLPLUGIN="gtk"
declare -x SANDBOX_DEBUG="0"
declare -x SANDBOX_DENY=""
declare -x SANDBOX_PID="3189"
declare -x SANDBOX_PREDICT="/var/tmp/portage/sys-devel/gcc-4.6.3/homedir:/dev/crypto:/var/cache/fontconfig"
declare -x SANDBOX_READ="/:/var/tmp"
declare -x SANDBOX_VERBOSE="1"
declare -x SANDBOX_WRITE=":/dev/console:/dev/fd:/dev/full:/dev/null:/dev/pts/:/dev/pty:/dev/shm:/dev/tts:/dev/tty:/dev/vc/:/dev/zero:/proc/self/fd:/tmp/:/usr/lib/cf:/usr/lib/conftest:/usr/lib32/cf:/usr/lib32/conftest:/usr/lib64/cf:/usr/lib64/conftest:/usr/tmp/cf:/usr/tmp/conftest:/var/tmp:/var/tmp/:/var/tmp/portage/sys-devel/gcc-4.6.3/homedir/.bash_history"
declare -x SLOT="4.6"
declare -x SPECS_GCC_VER="4.4.3"
declare -- SPECS_VER="0.2.0"
declare SRC_URI="mirror://gnu/gcc/gcc-4.6.3/gcc-4.6.3.tar.bz2 mirror://gentoo/gcc-4.6.3-uclibc-patches-1.0.tar.bz2 http://dev.gentoo.org/~vapier/dist/gcc-4.6.3-uclibc-patches-1.0.tar.bz2 http://dev.gentoo.org/~dirtyepic/dist/gcc-4.6.3-uclibc-patches-1.0.tar.bz2 http://dev.gentoo.org/~halcy0n/patches/gcc-4.6.3-uclibc-patches-1.0.tar.bz2 http://dev.gentoo.org/~zorry/patches/gcc/gcc-4.6.3-uclibc-patches-1.0.tar.bz2 mirror://gentoo/gcc-4.6.3-patches-1.11.tar.bz2 http://dev.gentoo.org/~vapier/dist/gcc-4.6.3-patches-1.11.tar.bz2 http://dev.gentoo.org/~dirtyepic/dist/gcc-4.6.3-patches-1.11.tar.bz2 http://dev.gentoo.org/~halcy0n/patches/gcc-4.6.3-patches-1.11.tar.bz2 http://dev.gentoo.org/~zorry/patches/gcc/gcc-4.6.3-patches-1.11.tar.bz2 mirror://gentoo/gcc-4.6.3-piepatches-v0.5.2.tar.bz2 http://dev.gentoo.org/~vapier/dist/gcc-4.6.3-piepatches-v0.5.2.tar.bz2 http://dev.gentoo.org/~dirtyepic/dist/gcc-4.6.3-piepatches-v0.5.2.tar.bz2 http://dev.gentoo.org/~halcy0n/patches/gcc-4.6.3-piepatches-v0.5.2.tar.bz2 http://dev.gentoo.org/~zorry/patches/gcc/gcc-4.6.3-piepatches-v0.5.2.tar.bz2 mirror://gentoo/gcc-4.4.3-specs-0.2.0.tar.bz2 http://dev.gentoo.org/~vapier/dist/gcc-4.4.3-specs-0.2.0.tar.bz2 http://dev.gentoo.org/~dirtyepic/dist/gcc-4.4.3-specs-0.2.0.tar.bz2 http://dev.gentoo.org/~halcy0n/patches/gcc-4.4.3-specs-0.2.0.tar.bz2 http://dev.gentoo.org/~zorry/patches/gcc/gcc-4.4.3-specs-0.2.0.tar.bz2 gcj? ( ftp://sourceware.org/pub/java/ecj-4.5.jar )"
declare -- SSP_STABLE="amd64 x86 mips ppc ppc64 arm"
declare -- SSP_UCLIBC_STABLE="x86 amd64 ppc ppc64 arm"
declare -- STDCXX_INCDIR="/usr/lib/gcc/i686-pc-linux-gnu/4.6.3/include/g++-v4"
declare -x STEAM_FRAME_FORCE_CLOSE="1"
declare -x SVCNAME="xdm"
declare -- TARGET_ABI=""
declare -- TARGET_DEFAULT_ABI="default"
declare -- TARGET_MULTILIB_ABIS="default"
declare -x UCLIBC_GCC_VER="4.6.3"
declare -- UCLIBC_VER="1.0"
declare -x USE="abi_x86_32 cxx elibc_glibc fortran gtk kernel_linux mudflap nls nptl openmp userland_GNU x86"
declare -x USERLAND="GNU"
declare -x USE_EXPAND_IMPLICIT="ARCH ELIBC KERNEL USERLAND"
declare -x USE_EXPAND_UNPREFIXED="ARCH"
declare -x USE_EXPAND_VALUES_ARCH="alpha amd64 amd64-fbsd amd64-linux arm arm-linux hppa hppa-hpux ia64 ia64-hpux ia64-linux m68k m68k-mint mips ppc ppc64 ppc64-linux ppc-aix ppc-macos ppc-openbsd s390 sh sparc sparc64-freebsd sparc64-solaris sparc-fbsd sparc-solaris x64-freebsd x64-macos x64-openbsd x64-solaris x86 x86-cygwin x86-fbsd x86-freebsd x86-interix x86-linux x86-macos x86-netbsd x86-openbsd x86-solaris x86-winnt"
declare -x USE_EXPAND_VALUES_ELIBC="AIX Cygwin Darwin FreeBSD glibc HPUX Interix mintlib NetBSD OpenBSD SunOS uclibc Winnt"
declare -x USE_EXPAND_VALUES_KERNEL="AIX Cygwin Darwin FreeBSD freemint HPUX Interix linux NetBSD OpenBSD SunOS Winnt"
declare -x USE_EXPAND_VALUES_USERLAND="BSD GNU"
declare -x VIDEO_CARDS=""
declare -x XDG_CONFIG_DIRS="/etc/xdg"
declare -x XDG_CONFIG_HOME="/home/ragim/.config"
declare -x XDG_CURRENT_DESKTOP="LXDE"
declare -x XDG_DATA_DIRS="/usr/local/share:/usr/share"
declare -x XDG_MENU_PREFIX="lxde-"
declare -x XDG_SESSION_COOKIE="e5c4f2f5ac21ed98bff13352515f2e5a-1366477011.429093-691660839"
declare -x XTABLES_ADDONS="quota2 psd pknock lscan length2 ipv4options ipset ipp2p iface geoip fuzzy condition tee tarpit sysrq steal rawnat logmark ipmark dhcpmac delude chaos account"
declare -x _E_DOCDESTTREE_=""
declare -x _E_EXEDESTTREE_=""
declare -x _LXSESSION_PID="2064"
declare -- __ELT_NOTED_TMP="true"
declare -a __ESTACK_eshopts__='()'
declare -- ___ECLASS_ONCE_EUTILS="recur -_+^+_- spank"
declare -- ___ECLASS_ONCE_FLAG_O_MATIC="recur -_+^+_- spank"
declare -- ___ECLASS_ONCE_LIBTOOL="recur -_+^+_- spank"
declare -- ___ECLASS_ONCE_MULTILIB="recur -_+^+_- spank"
declare -- ___ECLASS_ONCE_PAX_UTILS="recur -_+^+_- spank"
declare -- ___ECLASS_ONCE_TOOLCHAIN_FUNCS="recur -_+^+_- spank"
declare -- ___ECLASS_ONCE_USER="recur -_+^+_- spank"
declare -- ___ECLASS_ONCE_VERSIONATOR="recur -_+^+_- spank"
declare -- phase_func
ELT_libtool_version ()
{
( unset VERSION;
eval $(grep -e '^[[:space:]]*VERSION=' "$1");
echo "${VERSION:-0}" )
}
ELT_try_and_apply_patch ()
{
local ret=0;
local file=$1;
local patch=$2;
local src=$3;
local disp="${src} patch";
local log="${T}/elibtool.log";
if [[ -z ${__ELT_NOTED_TMP} ]]; then
__ELT_NOTED_TMP=true;
printf 'temp patch: %s\n' "${patch}" > "${log}";
fi;
printf '\nTrying %s\n' "${disp}" >> "${log}";
if patch -p0 --dry-run "${file}" "${patch}" >> "${log}" 2>&1; then
einfo " Applying ${disp} ...";
patch -p0 -g0 --no-backup-if-mismatch "${file}" "${patch}" >> "${log}" 2>&1;
ret=$?;
export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${src}";
else
ret=1;
fi;
return "${ret}"
}
ELT_walk_patches ()
{
local patch tmp;
local ret=1;
local file=$1;
local patch_set=$2;
local patch_dir="$(elt_patch_dir)/${patch_set}";
local rem_int_dep=$3;
[[ -z ${patch_set} ]] && return 1;
[[ ! -d ${patch_dir} ]] && return 1;
local sed_args=(-e "s:@GENTOO_LIBDIR@:$(get_libdir):g");
if [[ -n ${rem_int_dep} ]]; then
sed_args+=(-e "s|@REM_INT_DEP@|${rem_int_dep}|g");
fi;
pushd "$(elt_patch_dir)" > /dev/null || die;
for patch in $(find "${patch_set}" -maxdepth 1 -type f | LC_ALL=C sort -r);
do
tmp="${T}/libtool-elt.patch";
sed "${sed_args[@]}" "${patch}" > "${tmp}" || die;
if ELT_try_and_apply_patch "${file}" "${tmp}" "${patch}"; then
ret=0;
break;
fi;
done;
popd > /dev/null;
return ${ret}
}
VER_major ()
{
[[ -z $1 ]] && return 1;
local VER=$@;
echo "${VER%%[^[:digit:]]*}"
}
VER_micro ()
{
[[ -z $1 ]] && return 1;
local VER=$@;
VER=${VER#*.*.};
echo "${VER%%[^[:digit:]]*}"
}
VER_minor ()
{
[[ -z $1 ]] && return 1;
local VER=$@;
VER=${VER#*.};
echo "${VER%%[^[:digit:]]*}"
}
VER_to_int ()
{
[[ -z $1 ]] && return 1;
local VER_MAJOR=$(VER_major "$1");
local VER_MINOR=$(VER_minor "$1");
local VER_MICRO=$(VER_micro "$1");
local VER_int=$(( VER_MAJOR * 65536 + VER_MINOR * 256 + VER_MICRO ));
if [[ ${VER_int} -ge 65536 ]]; then
echo "${VER_int}";
return 0;
fi;
echo 1;
return 1
}
XGCC ()
{
get_make_var GCC_FOR_TARGET
}
__do_sed_fix ()
{
einfo " - fixed $1";
sed -i -e 's/head \+-\([0-9]\)/head -n \1/g' -e 's/tail \+\([-+][0-9]\+\)c/tail -c \1/g' -e 's/tail \+\([-+][0-9]\)/tail -n \1/g' ${1} || die "sed ${1} failed"
}
_assert_pkg_ebuild_phase ()
{
case ${EBUILD_PHASE} in
setup | preinst | postinst)
;;
*)
eerror "'$1()' called from '${EBUILD_PHASE}' phase which is not OK:";
eerror "You may only call from pkg_{setup,preinst,postinst} functions.";
eerror "Package fails at QA and at life. Please file a bug.";
die "Bad package! $1 is only for use in some pkg_* functions!"
;;
esac
}
_epatch_draw_line ()
{
[[ -z $1 ]] && set "$(printf "%65s" '')";
echo "${1//?/=}"
}
_filter-hardened ()
{
local f;
for f in "$@";
do
case "${f}" in
-fPIC | -fpic | -fPIE | -fpie | -Wl,pie | -pie)
gcc-specs-pie || continue;
is-flagq -nopie || append-flags -nopie
;;
-fstack-protector)
gcc-specs-ssp || continue;
is-flagq -fno-stack-protector || append-flags $(test-flags -fno-stack-protector)
;;
-fstack-protector-all)
gcc-specs-ssp-to-all || continue;
is-flagq -fno-stack-protector-all || append-flags $(test-flags -fno-stack-protector-all)
;;
-fno-strict-overflow)
gcc-specs-nostrict || continue;
is-flagq -fstrict-overflow || append-flags $(test-flags -fstrict-overflow)
;;
esac;
done
}
_filter-var ()
{
local f x var=$1 new=();
shift;
for f in ${!var};
do
for x in "$@";
do
[[ ${f} == ${x} ]] && continue 2;
done;
new+=("${f}");
done;
eval export ${var}=\""${new[*]}"\"
}
_gcc-install-dir ()
{
echo "$(LC_ALL=C $(tc-getCC) -print-search-dirs 2> /dev/null | awk '$1=="install:" {print $2}')"
}
_gcc-specs-directive_raw ()
{
local cc=$(tc-getCC);
local specfiles=$(LC_ALL=C ${cc} -v 2>&1 | awk '$1=="Reading" {print $NF}');
${cc} -dumpspecs 2> /dev/null | cat - ${specfiles} | awk -v directive=$1 'BEGIN { pspec=""; spec=""; outside=1 }
$1=="*"directive":" { pspec=spec; spec=""; outside=0; next }
outside || NF==0 || ( substr($1,1,1)=="*" && substr($1,length($1),1)==":" ) { outside=1; next }
spec=="" && substr($0,1,1)=="+" { spec=pspec " " substr($0,2); next }
{ spec=spec $0 }
END { print spec }';
return 0
}
_gcc-specs-exists ()
{
[[ -f $(_gcc-install-dir)/$1 ]]
}
_gcc_fullversion ()
{
local ver="$1";
shift;
set -- `$(tc-getCPP "$@") -E -P - <<<"__GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__"`;
eval echo "$ver"
}
_iconins ()
{
( local funcname=$1;
shift;
local size dir;
local context=apps;
local theme=hicolor;
while [[ $# -gt 0 ]]; do
case $1 in
-s | --size)
if [[ ${2%%x*}x${2%%x*} == "$2" ]]; then
size=${2%%x*};
else
size=${2};
fi;
case ${size} in
16 | 22 | 24 | 32 | 36 | 48 | 64 | 72 | 96 | 128 | 192 | 256)
size=${size}x${size}
;;
scalable)
;;
*)
eerror "${size} is an unsupported icon size!";
exit 1
;;
esac;
shift 2
;;
-t | --theme)
theme=${2};
shift 2
;;
-c | --context)
context=${2};
shift 2
;;
*)
if [[ -z ${size} ]]; then
insinto /usr/share/pixmaps;
else
insinto /usr/share/icons/${theme}/${size}/${context};
fi;
if [[ ${funcname} == doicon ]]; then
if [[ -f $1 ]]; then
doins "${1}";
else
if [[ -d $1 ]]; then
shopt -s nullglob;
doins "${1}"/*.{png,svg};
shopt -u nullglob;
else
eerror "${1} is not a valid file/directory!";
exit 1;
fi;
fi;
else
break;
fi;
shift 1
;;
esac;
done;
if [[ ${funcname} == newicon ]]; then
newins "$@";
fi ) || die
}
_is_flagq ()
{
local x var;
eval var=\""\${$1[*]}"\";
for x in ${var};
do
[[ ${x} == $2 ]] && return 0;
done;
return 1
}
_pax_list_files ()
{
local f cmd;
cmd=$1;
shift;
for f in "$@";
do
${cmd} " ${f}";
done
}
_tc-getPROG ()
{
local tuple=$1;
local v var vars=$2;
local prog=$3;
var=${vars%% *};
for v in ${vars};
do
if [[ -n ${!v} ]]; then
export ${var}="${!v}";
echo "${!v}";
return 0;
fi;
done;
local search=;
[[ -n $4 ]] && search=$(type -p "$4-${prog}");
[[ -z ${search} && -n ${!tuple} ]] && search=$(type -p "${!tuple}-${prog}");
[[ -n ${search} ]] && prog=${search##*/};
export ${var}=${prog};
echo "${!var}"
}
all-flag-vars ()
{
echo {C,CPP,CXX,CCAS,F,FC,LD}FLAGS
}
append-cflags ()
{
[[ $# -eq 0 ]] && return 0;
export CFLAGS=$(test-flags-CC ${CFLAGS} "$@");
return 0
}
append-cppflags ()
{
[[ $# -eq 0 ]] && return 0;
export CPPFLAGS="${CPPFLAGS} $*";
return 0
}
append-cxxflags ()
{
[[ $# -eq 0 ]] && return 0;
export CXXFLAGS=$(test-flags-CXX ${CXXFLAGS} "$@");
return 0
}
append-fflags ()
{
[[ $# -eq 0 ]] && return 0;
export FFLAGS=$(test-flags-F77 ${FFLAGS} "$@");
export FCFLAGS=$(test-flags-FC ${FCFLAGS} "$@");
return 0
}
append-flags ()
{
[[ $# -eq 0 ]] && return 0;
case " $* " in
*' '-[DIU]*)
eqawarn 'please use append-cppflags for preprocessor flags'
;;
*' '-L* | *' '-Wl,*)
eqawarn 'please use append-ldflags for linker flags'
;;
esac;
append-cflags "$@";
append-cxxflags "$@";
append-fflags "$@";
return 0
}
append-ldflags ()
{
[[ $# -eq 0 ]] && return 0;
local flag;
for flag in "$@";
do
[[ ${flag} == -l* ]] && eqawarn "Appending a library link instruction (${flag}); libraries to link to should not be passed through LDFLAGS";
done;
export LDFLAGS="${LDFLAGS} $*";
return 0
}
append-lfs-flags ()
{
[[ $# -ne 0 ]] && die "append-lfs-flags takes no arguments";
append-cppflags -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
}
append-libs ()
{
[[ $# -eq 0 ]] && return 0;
local flag;
for flag in "$@";
do
[[ ${flag} == -l* ]] && flag=${flag#-l};
export LIBS="${LIBS} -l${flag}";
done;
return 0
}
built_with_use ()
{
local hidden="no";
if [[ $1 == "--hidden" ]]; then
hidden="yes";
shift;
fi;
local missing_action="die";
if [[ $1 == "--missing" ]]; then
missing_action=$2;
shift;
shift;
case ${missing_action} in
true | false | die)
;;
*)
die "unknown action '${missing_action}'"
;;
esac;
fi;
local opt=$1;
[[ ${opt:0:1} = "-" ]] && shift || opt="-a";
local PKG=$(best_version $1);
[[ -z ${PKG} ]] && die "Unable to resolve $1 to an installed package";
shift;
local USEFILE=${ROOT}/var/db/pkg/${PKG}/USE;
local IUSEFILE=${ROOT}/var/db/pkg/${PKG}/IUSE;
if [[ ! -e ${USEFILE} ]] || [[ ! -e ${IUSEFILE} && ${hidden} == "no" ]]; then
case ${missing_action} in
true)
return 0
;;
false)
return 1
;;
die)
die "Unable to determine what USE flags $PKG was built with"
;;
esac;
fi;
if [[ ${hidden} == "no" ]]; then
local IUSE_BUILT=($(<"${IUSEFILE}"));
local expand;
for expand in $(echo ${USE_EXPAND} | tr '[:upper:]' '[:lower:]');
do
if [[ $1 == ${expand}_* ]]; then
expand="";
break;
fi;
done;
if [[ -n ${expand} ]]; then
if ! has $1 ${IUSE_BUILT[@]#[-+]}; then
case ${missing_action} in
true)
return 0
;;
false)
return 1
;;
die)
die "$PKG does not actually support the $1 USE flag!"
;;
esac;
fi;
fi;
fi;
local USE_BUILT=$(<${USEFILE});
while [[ $# -gt 0 ]]; do
if [[ ${opt} = "-o" ]]; then
has $1 ${USE_BUILT} && return 0;
else
has $1 ${USE_BUILT} || return 1;
fi;
shift;
done;
[[ ${opt} = "-a" ]]
}
check_license ()
{
die "you no longer need this as portage supports ACCEPT_LICENSE itself"
}
copy_minispecs_gcc_specs ()
{
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};
doins "${WORKDIR}"/specs/*.specs || die "failed to install 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
}
create_gcc_env_entry ()
{
dodir /etc/env.d/gcc;
local gcc_envd_base="/etc/env.d/gcc/${CTARGET}-${GCC_CONFIG_VER}";
local gcc_specs_file;
local gcc_envd_file="${D}${gcc_envd_base}";
if [[ -z $1 ]]; then
gcc_specs_file="";
else
gcc_envd_file+="-$1";
gcc_specs_file="${LIBPATH}/$1.specs";
fi;
local ldpaths mosdirs;
if tc_version_is_at_least 3.2; then
local mdir mosdir abi ldpath;
for abi in $(get_all_abis TARGET);
do
mdir=$($(XGCC) $(get_abi_CFLAGS ${abi}) --print-multi-directory);
ldpath=${LIBPATH};
[[ ${mdir} != "." ]] && ldpath+="/${mdir}";
ldpaths="${ldpath}${ldpaths:+:${ldpaths}}";
mosdir=$($(XGCC) $(get_abi_CFLAGS ${abi}) -print-multi-os-directory);
mosdirs="${mosdir}${mosdirs:+:${mosdirs}}";
done;
else
ldpaths=${LIBPATH};
fi;
cat > ${gcc_envd_file} <<-EOF
PATH="${BINPATH}"
ROOTPATH="${BINPATH}"
GCC_PATH="${BINPATH}"
LDPATH="${ldpaths}"
MANPATH="${DATAPATH}/man"
INFOPATH="${DATAPATH}/info"
STDCXX_INCDIR="${STDCXX_INCDIR##*/}"
CTARGET="${CTARGET}"
GCC_SPECS="${gcc_specs_file}"
MULTIOSDIRS="${mosdirs}"
EOF
}
darwintoolize ()
{
die "Use elibtoolize"
}
delete_all_version_separators ()
{
replace_all_version_separators "" "${1}"
}
delete_version_separator ()
{
replace_version_separator "${1}" "" "${2}"
}
do_gcc_HTB_patches ()
{
use_if_iuse boundschecking || return 0;
epatch "${WORKDIR}/bounds-checking-gcc-${HTB_GCC_VER}-${HTB_VER}.patch";
BRANDING_GCC_PKGVERSION="${BRANDING_GCC_PKGVERSION}, HTB-${HTB_GCC_VER}-${HTB_VER}"
}
do_gcc_PIE_patches ()
{
want_pie || return 0;
use vanilla && return 0;
if tc_version_is_at_least 4.3.2; then
guess_patch_type_in_dir "${WORKDIR}"/piepatch/;
EPATCH_MULTI_MSG="Applying pie patches ..." epatch "${WORKDIR}"/piepatch/;
else
guess_patch_type_in_dir "${WORKDIR}"/piepatch/upstream;
EPATCH_MULTI_MSG="Applying upstream pie patches ..." epatch "${WORKDIR}"/piepatch/upstream;
EPATCH_MULTI_MSG="Applying non-default pie patches ..." epatch "${WORKDIR}"/piepatch/nondef;
EPATCH_MULTI_MSG="Applying default pie patches ..." epatch "${WORKDIR}"/piepatch/def;
fi;
sed -e '/^ALL_CFLAGS/iHARD_CFLAGS = ' -e 's|^ALL_CFLAGS = |ALL_CFLAGS = $(HARD_CFLAGS) |' -i "${S}"/gcc/Makefile.in;
if tc_version_is_at_least 4.7.0; then
sed -e '/^ALL_CXXFLAGS/iHARD_CFLAGS = ' -e 's|^ALL_CXXFLAGS = |ALL_CXXFLAGS = $(HARD_CFLAGS) |' -i "${S}"/gcc/Makefile.in;
fi;
BRANDING_GCC_PKGVERSION="${BRANDING_GCC_PKGVERSION}, pie-${PIE_VER}"
}
do_gcc_config ()
{
if ! should_we_gcc_config; then
env -i ROOT="${ROOT}" gcc-config --use-old --force;
return 0;
fi;
local current_gcc_config="" current_specs="" use_specs="";
current_gcc_config=$(env -i ROOT="${ROOT}" gcc-config -c ${CTARGET} 2>/dev/null);
if [[ -n ${current_gcc_config} ]]; then
current_specs=$(gcc-config -S ${current_gcc_config} | awk '{print $3}');
[[ -n ${current_specs} ]] && use_specs=-${current_specs};
fi;
if [[ -n ${use_specs} ]] && [[ ! -e ${ROOT}/etc/env.d/gcc/${CTARGET}-${GCC_CONFIG_VER}${use_specs} ]]; then
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 "config will be used, and the previous preference forgotten.";
ebeep;
epause;
use_specs="";
fi;
gcc-config ${CTARGET}-${GCC_CONFIG_VER}${use_specs}
}
do_gcc_rename_java_bins ()
{
einfo "Renaming jdk executables rmic and rmiregistry to grmic and grmiregistry.";
for manfile in rmic rmiregistry;
do
[[ -f ${S}/gcc/doc/${manfile}.1 ]] || continue;
mv "${S}"/gcc/doc/${manfile}.1 "${S}"/gcc/doc/g${manfile}.1;
done;
for jfile in gcc/doc/gcj.info gcc/doc/grmic.1 gcc/doc/grmiregistry.1 gcc/java/gcj.texi;
do
[[ -f ${S}/${jfile} ]] || continue;
sed -i -e 's:rmiregistry:grmiregistry:g' "${S}"/${jfile} || die "Failed to fixup file ${jfile} for rename to grmiregistry";
sed -i -e 's:rmic:grmic:g' "${S}"/${jfile} || die "Failed to fixup file ${jfile} for rename to grmic";
done;
for jfile in libjava/Makefile.am libjava/Makefile.in gcc/java/Make-lang.in;
do
sed -i -e 's:rmiregistry:grmiregistry:g' "${S}"/${jfile} || die "Failed to fixup file ${jfile} for rename to grmiregistry";
sed -i -e 's:rmic\([$_ ]\):grmic\1:g' "${S}"/${jfile} || die "Failed to fixup file ${jfile} for rename to grmic";
done
}
doicon ()
{
_iconins ${FUNCNAME} "$@"
}
domenu ()
{
( local i j ret=0;
insinto /usr/share/applications;
for i in "$@";
do
if [[ -f ${i} ]]; then
doins "${i}";
((ret+=$?));
else
if [[ -d ${i} ]]; then
for j in "${i}"/*.desktop;
do
doins "${j}";
((ret+=$?));
done;
else
((++ret));
fi;
fi;
done;
exit ${ret} )
}
ebeep ()
{
local n;
if [[ -z ${EBEEP_IGNORE} ]]; then
for ((n=1 ; n <= ${1:-5} ; n++))
do
echo -ne "\a";
sleep 0.1 &>/dev/null;
sleep 0,1 &>/dev/null;
echo -ne "\a";
sleep 1;
done;
fi
}
econf_build ()
{
tc-env_build econf --build=${CBUILD:-${CHOST}} "$@"
}
ecvs_clean ()
{
[[ -z $* ]] && set -- .;
find "$@" -type d -name 'CVS' -prune -print0 | xargs -0 rm -rf;
find "$@" -type f -name '.cvs*' -print0 | xargs -0 rm -rf
}
edos2unix ()
{
[[ $# -eq 0 ]] && return 0;
sed -i 's/\r$//' -- "$@" || die
}
egetent ()
{
local db=$1 key=$2;
[[ $# -ge 3 ]] && die "usage: egetent <database> <key>";
case ${db} in
passwd | group)
;;
*)
die "sorry, database '${db}' not yet supported; file a bug"
;;
esac;
case ${CHOST} in
*-darwin[678])
case ${key} in
*[!0-9]*)
nidump ${db} . | awk -F: "(\$1 ~ /^${key}\$/) {print;exit;}"
;;
*)
nidump ${db} . | awk -F: "(\$3 == ${key}) {print;exit;}"
;;
esac
;;
*-darwin*)
local mykey;
case ${db} in
passwd)
db="Users" mykey="UniqueID"
;;
group)
db="Groups" mykey="PrimaryGroupID"
;;
esac;
case ${key} in
*[!0-9]*)
dscl . -read /${db}/${key} 2> /dev/null | grep RecordName
;;
*)
dscl . -search /${db} ${mykey} ${key} 2> /dev/null
;;
esac
;;
*-freebsd* | *-dragonfly*)
case ${db} in
passwd)
db="user"
;;
*)
;;
esac;
local opts;
if [[ ${key} == [[:digit:]]* ]]; then
[[ ${db} == "user" ]] && opts="-u" || opts="-g";
fi;
pw show ${db} ${opts} "${key}" -q
;;
*-netbsd* | *-openbsd*)
grep "${key}:\*:" /etc/${db}
;;
*)
nscd -i "${db}" 2> /dev/null;
getent "${db}" "${key}"
;;
esac
}
egethome ()
{
local pos;
[[ $# -eq 1 ]] || die "usage: egethome <user>";
case ${CHOST} in
*-darwin* | *-freebsd* | *-dragonfly*)
pos=9
;;
*)
pos=6
;;
esac;
egetent passwd "$1" | cut -d: -f${pos}
}
egetshell ()
{
local pos;
[[ $# -eq 1 ]] || die "usage: egetshell <user>";
case ${CHOST} in
*-darwin* | *-freebsd* | *-dragonfly*)
pos=10
;;
*)
pos=7
;;
esac;
egetent passwd "$1" | cut -d: -f${pos}
}
elibtoolize ()
{
local x;
local do_portage="no";
local do_reversedeps="no";
local do_only_patches="no";
local do_uclibc="yes";
local deptoremove=;
local do_shallow="no";
local force="false";
local elt_patches="install-sh ltmain portage relink max_cmd_len sed test tmp cross as-needed";
for x in "$@";
do
case ${x} in
--portage)
do_portage="yes"
;;
--reverse-deps)
do_reversedeps="yes";
elt_patches+=" fix-relink"
;;
--patch-only)
do_only_patches="yes"
;;
--remove-internal-dep=*)
deptoremove=${x#--remove-internal-dep=};
[[ -n ${deptoremove} ]] && elt_patches+=" rem-int-dep"
;;
--shallow)
do_shallow="yes"
;;
--no-uclibc)
do_uclibc="no"
;;
--force)
force="true"
;;
*)
eerror "Invalid elibtoolize option: ${x}";
die "elibtoolize called with ${x} ??"
;;
esac;
done;
[[ ${do_uclibc} == "yes" ]] && elt_patches+=" uclibc-conf uclibc-ltconf";
case ${CHOST} in
*-aix*)
elt_patches+=" hardcode aixrtl aix-noundef"
;;
*-darwin*)
elt_patches+=" darwin-ltconf darwin-ltmain darwin-conf"
;;
*-solaris*)
elt_patches+=" sol2-conf sol2-ltmain"
;;
*-freebsd*)
elt_patches+=" fbsd-conf fbsd-ltconf"
;;
*-hpux*)
elt_patches+=" hpux-conf deplibs hc-flag-ld hardcode hardcode-relink relink-prog no-lc"
;;
*-irix*)
elt_patches+=" irix-ltmain"
;;
*-mint*)
elt_patches+=" mint-conf"
;;
esac;
if $(tc-getLD) --version 2>&1 | grep -qs 'GNU gold'; then
elt_patches+=" gold-conf";
fi;
set --;
if [[ ${do_shallow} == "yes" ]]; then
[[ -f ${S}/ltmain.sh ]] && set -- "${S}";
else
set -- $(find "${S}" -name ltmain.sh -printf '%h ');
fi;
local d p;
for d in "$@";
do
export ELT_APPLIED_PATCHES=;
if [[ -f ${d}/.elibtoolized ]]; then
${force} || continue;
fi;
local outfunc="einfo";
[[ -f ${d}/.elibtoolized ]] && outfunc="ewarn";
${outfunc} "Running elibtoolize in: ${d#${WORKDIR}/}/";
if [[ ${outfunc} == "ewarn" ]]; then
ewarn " We've already been run in this tree; you should";
ewarn " avoid this if possible (perhaps by filing a bug)";
fi;
for p in ${elt_patches};
do
local ret=0;
case ${p} in
portage)
if ! grep -qs 'We do not want portage' "${d}/ltmain.sh"; then
ELT_walk_patches "${d}/ltmain.sh" "${p}";
ret=$?;
fi
;;
rem-int-dep)
ELT_walk_patches "${d}/ltmain.sh" "${p}" "${deptoremove}";
ret=$?
;;
fix-relink)
if grep -qs 'inst_prefix_dir' "${d}/ltmain.sh"; then
ELT_walk_patches "${d}/ltmain.sh" "${p}";
ret=$?;
fi
;;
max_cmd_len)
if grep -qs 'max_cmd_len' "${d}/ltmain.sh"; then
ELT_walk_patches "${d}/ltmain.sh" "${p}";
ret=$?;
fi
;;
as-needed)
ELT_walk_patches "${d}/ltmain.sh" "${p}";
ret=$?
;;
uclibc-conf)
if grep -qs 'Transform linux' "${d}/configure"; then
ELT_walk_patches "${d}/configure" "${p}";
ret=$?;
else
if [[ ! -e ${d}/configure ]] && grep -qs 'Transform linux' "${d}/../configure"; then
ELT_walk_patches "${d}/../configure" "${p}";
ret=$?;
fi;
fi
;;
uclibc-ltconf)
if [[ -s ${d}/ltconfig ]]; then
ELT_walk_patches "${d}/ltconfig" "${p}";
ret=$?;
fi
;;
fbsd-conf)
if grep -qs 'version_type=freebsd-' "${d}/configure"; then
ELT_walk_patches "${d}/configure" "${p}";
ret=$?;
else
if [[ ! -e ${d}/configure ]] && grep -qs 'version_type=freebsd-' "${d}/../configure"; then
ELT_walk_patches "${d}/../configure" "${p}";
ret=$?;
fi;
fi
;;
fbsd-ltconf)
if [[ -s ${d}/ltconfig ]]; then
ELT_walk_patches "${d}/ltconfig" "${p}";
ret=$?;
fi
;;
darwin-conf)
if grep -qs '&& echo \.so ||' "${d}/configure"; then
ELT_walk_patches "${d}/configure" "${p}";
ret=$?;
else
if [[ ! -e ${d}/configure ]] && grep -qs '&& echo \.so ||' "${d}/../configure"; then
ELT_walk_patches "${d}/../configure" "${p}";
ret=$?;
fi;
fi
;;
darwin-ltconf)
if [[ -s ${d}/ltconfig ]]; then
ELT_walk_patches "${d}/ltconfig" "${p}";
ret=$?;
fi
;;
darwin-ltmain)
if [[ -e ${d}/ltmain.sh ]] && ! grep -qs 'verstring="-compatibility_version' "${d}/ltmain.sh"; then
ELT_walk_patches "${d}/ltmain.sh" "${p}";
ret=$?;
fi
;;
aixrtl | hpux-conf)
ret=1;
local subret=0;
while [[ $subret -eq 0 ]]; do
subret=1;
if [[ -e ${d}/configure ]]; then
ELT_walk_patches "${d}/configure" "${p}";
subret=$?;
else
if [[ ! -e ${d}/configure && -e ${d}/../configure ]]; then
ELT_walk_patches "${d}/../configure" "${p}";
subret=$?;
fi;
fi;
if [[ $subret -eq 0 ]]; then
ret=0;
fi;
done
;;
mint-conf | gold-conf | sol2-conf)
ret=1;
local subret=1;
if [[ -e ${d}/configure ]]; then
ELT_walk_patches "${d}/configure" "${p}";
subret=$?;
else
if [[ -e ${d}/../configure ]]; then
ELT_walk_patches "${d}/../configure" "${p}";
subret=$?;
else
if [[ -e ${d}/../../configure ]]; then
ELT_walk_patches "${d}/../../configure" "${p}";
subret=$?;
fi;
fi;
fi;
if [[ $subret -eq 0 ]]; then
ret=0;
fi
;;
install-sh)
ELT_walk_patches "${d}/install-sh" "${p}";
ret=$?
;;
cross)
if tc-is-cross-compiler; then
ELT_walk_patches "${d}/ltmain.sh" "${p}";
ret=$?;
fi
;;
*)
ELT_walk_patches "${d}/ltmain.sh" "${p}";
ret=$?
;;
esac;
if [[ ${ret} -ne 0 ]]; then
case ${p} in
relink)
local version=$(ELT_libtool_version "${d}/ltmain.sh");
if ! grep -qs 'inst_prefix_dir' "${d}/ltmain.sh" && [[ $(VER_to_int "${version}") -ge $(VER_to_int "1.4.0") ]]; then
ewarn " Could not apply relink.patch!";
fi
;;
portage)
if [[ ${do_portage} == "yes" ]]; then
if ! grep -qs 'We do not want portage' "${d}/ltmain.sh"; then
echo;
eerror "Portage patch requested, but failed to apply!";
eerror "Please file a bug report to add a proper patch.";
die "Portage patch requested, but failed to apply!";
fi;
else
if grep -qs 'We do not want portage' "${d}/ltmain.sh"; then
:;
else
local version=$(ELT_libtool_version "${d}"/ltmain.sh);
echo;
eerror "Portage patch failed to apply (ltmain.sh version ${version})!";
eerror "Please file a bug report to add a proper patch.";
die "Portage patch failed to apply!";
fi;
ELT_APPLIED_PATCHES="portage";
fi
;;
uclibc-*)
[[ ${CHOST} == *-uclibc ]] && ewarn " uClibc patch set '${p}' failed to apply!"
;;
fbsd-*)
if [[ ${CHOST} == *-freebsd* ]]; then
if [[ -z $(grep 'Handle Gentoo/FreeBSD as it was Linux' "${d}/configure" "${d}/../configure" 2>/dev/null) ]]; then
eerror " FreeBSD patch set '${p}' failed to apply!";
die "FreeBSD patch set '${p}' failed to apply!";
fi;
fi
;;
darwin-*)
[[ ${CHOST} == *"-darwin"* ]] && ewarn " Darwin patch set '${p}' failed to apply!"
;;
esac;
fi;
done;
if [[ -z ${ELT_APPLIED_PATCHES} ]]; then
if [[ ${do_portage} == "no" && ${do_reversedeps} == "no" && ${do_only_patches} == "no" && ${deptoremove} == "" ]]; then
ewarn "Cannot apply any patches, please file a bug about this";
die;
fi;
fi;
rm -f "${d}/libtool";
> "${d}/.elibtoolized";
done
}
elt_patch_dir ()
{
local d="${ECLASSDIR}/ELT-patches";
if [[ ! -d ${d} ]]; then
d="${ECLASSDIR_LOCAL}/ELT-patches";
fi;
echo "${d}"
}
emktemp ()
{
local exe="touch";
[[ $1 == -d ]] && exe="mkdir" && shift;
local topdir=$1;
if [[ -z ${topdir} ]]; then
[[ -z ${T} ]] && topdir="/tmp" || topdir=${T};
fi;
if ! type -P mktemp > /dev/null; then
local tmp=/;
while [[ -e ${tmp} ]]; do
tmp=${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM};
done;
${exe} "${tmp}" || ${exe} -p "${tmp}";
echo "${tmp}";
else
if [[ ${exe} == "touch" ]]; then
TMPDIR="${topdir}" mktemp -t tmp.XXXXXXXXXX;
else
TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX;
fi;
fi
}
enewgroup ()
{
_assert_pkg_ebuild_phase ${FUNCNAME};
local egroup=$1;
shift;
if [[ -z ${egroup} ]]; then
eerror "No group specified !";
die "Cannot call enewgroup without a group";
fi;
if [[ -n $(egetent group "${egroup}") ]]; then
return 0;
fi;
einfo "Adding group '${egroup}' to your system ...";
local egid=$1;
shift;
if [[ ! -z ${egid} ]]; then
if [[ ${egid} -gt 0 ]]; then
if [[ -n $(egetent group ${egid}) ]]; then
egid="next available; requested gid taken";
fi;
else
eerror "Groupid given but is not greater than 0 !";
die "${egid} is not a valid GID";
fi;
else
egid="next available";
fi;
einfo " - Groupid: ${egid}";
if [[ $# -gt 0 ]]; then
die "extra arguments no longer supported; please file a bug";
fi;
function _enewgroup_next_gid ()
{
if [[ ${egid} == *[!0-9]* ]]; then
for ((egid = 101; egid <= 999; egid++))
do
[[ -z $(egetent group ${egid}) ]] && break;
done;
fi
};
case ${CHOST} in
*-darwin*)
_enewgroup_next_gid;
dscl . create "/groups/${egroup}" gid ${egid};
dscl . create "/groups/${egroup}" passwd '*'
;;
*-freebsd* | *-dragonfly*)
_enewgroup_next_gid;
pw groupadd "${egroup}" -g ${egid} || die
;;
*-netbsd*)
_enewgroup_next_gid;
groupadd -g ${egid} "${egroup}" || die
;;
*)
local opts;
if [[ ${egid} == *[!0-9]* ]]; then
opts="";
else
opts="-g ${egid}";
fi;
groupadd -r ${opts} "${egroup}" || die
;;
esac
}
enewuser ()
{
_assert_pkg_ebuild_phase ${FUNCNAME};
local euser=$1;
shift;
if [[ -z ${euser} ]]; then
eerror "No username specified !";
die "Cannot call enewuser without a username";
fi;
if [[ -n $(egetent passwd "${euser}") ]]; then
return 0;
fi;
einfo "Adding user '${euser}' to your system ...";
local opts=();
local euid=$1;
shift;
if [[ -n ${euid} && ${euid} != -1 ]]; then
if [[ ${euid} -gt 0 ]]; then
if [[ -n $(egetent passwd ${euid}) ]]; then
euid="next";
fi;
else
eerror "Userid given but is not greater than 0 !";
die "${euid} is not a valid UID";
fi;
else
euid="next";
fi;
if [[ ${euid} == "next" ]]; then
for ((euid = 101; euid <= 999; euid++))
do
[[ -z $(egetent passwd ${euid}) ]] && break;
done;
fi;
opts+=(-u ${euid});
einfo " - Userid: ${euid}";
local eshell=$1;
shift;
if [[ ! -z ${eshell} ]] && [[ ${eshell} != "-1" ]]; then
if [[ ! -e ${ROOT}${eshell} ]]; then
eerror "A shell was specified but it does not exist !";
die "${eshell} does not exist in ${ROOT}";
fi;
if [[ ${eshell} == */false || ${eshell} == */nologin ]]; then
eerror "Do not specify ${eshell} yourself, use -1";
die "Pass '-1' as the shell parameter";
fi;
else
for eshell in /sbin/nologin /usr/sbin/nologin /bin/false /usr/bin/false /dev/null;
do
[[ -x ${ROOT}${eshell} ]] && break;
done;
if [[ ${eshell} == "/dev/null" ]]; then
eerror "Unable to identify the shell to use, proceeding with userland default.";
case ${USERLAND} in
GNU)
eshell="/bin/false"
;;
BSD)
eshell="/sbin/nologin"
;;
Darwin)
eshell="/usr/sbin/nologin"
;;
*)
die "Unable to identify the default shell for userland ${USERLAND}"
;;
esac;
fi;
fi;
einfo " - Shell: ${eshell}";
opts+=(-s "${eshell}");
local ehome=$1;
shift;
if [[ -z ${ehome} ]] || [[ ${ehome} == "-1" ]]; then
ehome="/dev/null";
fi;
einfo " - Home: ${ehome}";
opts+=(-d "${ehome}");
local egroups=$1;
shift;
local g egroups_arr;
IFS="," read -r -a egroups_arr <<< "${egroups}";
shift;
if [[ ${#egroups_arr[@]} -gt 0 ]]; then
local defgroup exgroups;
for g in "${egroups_arr[@]}";
do
if [[ -z $(egetent group "${g}") ]]; then
eerror "You must add group ${g} to the system first";
die "${g} is not a valid GID";
fi;
if [[ -z ${defgroup} ]]; then
defgroup=${g};
else
exgroups+=",${g}";
fi;
done;
opts+=(-g "${defgroup}");
if [[ ! -z ${exgroups} ]]; then
opts+=(-G "${exgroups:1}");
fi;
fi;
einfo " - Groups: ${egroups:-(none)}";
if [[ $# -gt 0 ]]; then
die "extra arguments no longer supported; please file a bug";
else
local comment="added by portage for ${PN}";
opts+=(-c "${comment}");
einfo " - GECOS: ${comment}";
fi;
case ${CHOST} in
*-darwin*)
dscl . create "/users/${euser}" uid ${euid};
dscl . create "/users/${euser}" shell "${eshell}";
dscl . create "/users/${euser}" home "${ehome}";
dscl . create "/users/${euser}" realname "added by portage for ${PN}";
for g in "${egroups_arr[@]}";
do
dscl . merge "/groups/${g}" users "${euser}";
done
;;
*-freebsd* | *-dragonfly*)
pw useradd "${euser}" "${opts[@]}" || die
;;
*-netbsd*)
useradd "${opts[@]}" "${euser}" || die
;;
*-openbsd*)
useradd -u ${euid} -s "${eshell}" -d "${ehome}" -g "${egroups}" "${euser}" || die
;;
*)
useradd -r "${opts[@]}" "${euser}" || die
;;
esac;
if [[ ! -e ${ROOT}/${ehome} ]]; then
einfo " - Creating ${ehome} in ${ROOT}";
mkdir -p "${ROOT}/${ehome}";
chown "${euser}" "${ROOT}/${ehome}";
chmod 755 "${ROOT}/${ehome}";
fi
}
epatch ()
{
function _epatch_draw_line ()
{
[[ -z $1 ]] && set "$(printf "%65s" '')";
echo "${1//?/=}"
};
unset P4CONFIG P4PORT P4USER;
local EPATCH_OPTS=(${EPATCH_OPTS[*]});
while [[ $# -gt 0 ]]; do
case $1 in
-*)
EPATCH_OPTS+=("$1")
;;
*)
break
;;
esac;
shift;
done;
if [[ $# -gt 1 ]]; then
local m;
for m in "$@";
do
epatch "${m}";
done;
return 0;
fi;
local SINGLE_PATCH="no";
[[ $# -eq 0 ]] && set -- "${EPATCH_SOURCE}";
if [[ -f $1 ]]; then
SINGLE_PATCH="yes";
set -- "$1";
local EPATCH_SUFFIX=$1;
else
if [[ -d $1 ]]; then
set -- "$1"/*${EPATCH_SUFFIX:+."${EPATCH_SUFFIX}"};
else
if [[ -f ${EPATCH_SOURCE}/$1 ]]; then
epatch "${EPATCH_SOURCE}/$1";
return $?;
else
[[ $# -ne 0 ]] && EPATCH_SOURCE=$1;
echo;
eerror "Cannot find \$EPATCH_SOURCE! Value for \$EPATCH_SOURCE is:";
eerror;
eerror " ${EPATCH_SOURCE}";
eerror " ( ${EPATCH_SOURCE##*/} )";
echo;
die "Cannot find \$EPATCH_SOURCE!";
fi;
fi;
fi;
EPATCH_OPTS="${EPATCH_COMMON_OPTS} ${EPATCH_OPTS[*]}";
local PIPE_CMD;
case ${EPATCH_SUFFIX##*\.} in
xz)
PIPE_CMD="xz -dc"
;;
lzma)
PIPE_CMD="lzma -dc"
;;
bz2)
PIPE_CMD="bzip2 -dc"
;;
gz | Z | z)
PIPE_CMD="gzip -dc"
;;
ZIP | zip)
PIPE_CMD="unzip -p"
;;
*)
;;
esac;
[[ ${SINGLE_PATCH} == "no" ]] && einfo "${EPATCH_MULTI_MSG}";
local x;
for x in "$@";
do
[[ ! -f ${x} ]] && continue;
local patchname=${x##*/};
local a=${patchname#*_};
a=${a%%_*};
if ! [[ ${SINGLE_PATCH} == "yes" || ${EPATCH_FORCE} == "yes" || ${a} == all || ${a} == ${ARCH} ]]; then
continue;
fi;
if [[ -n ${EPATCH_EXCLUDE} ]]; then
eshopts_push -o noglob;
local ex;
for ex in ${EPATCH_EXCLUDE};
do
if [[ ${patchname} == ${ex} ]]; then
einfo " Skipping ${patchname} due to EPATCH_EXCLUDE ...";
eshopts_pop;
continue 2;
fi;
done;
for ex in ${EPATCH_USER_EXCLUDE};
do
if [[ ${patchname} == ${ex} ]]; then
einfo " Skipping ${patchname} due to EPATCH_USER_EXCLUDE ...";
eshopts_pop;
continue 2;
fi;
done;
eshopts_pop;
fi;
if [[ ${SINGLE_PATCH} == "yes" ]]; then
if [[ -n ${EPATCH_SINGLE_MSG} ]]; then
einfo "${EPATCH_SINGLE_MSG}";
else
einfo "Applying ${patchname} ...";
fi;
else
einfo " ${patchname} ...";
fi;
local STDERR_TARGET="${T}/${patchname}.out";
if [[ -e ${STDERR_TARGET} ]]; then
STDERR_TARGET="${T}/${patchname}-$$.out";
fi;
printf "***** %s *****\nPWD: %s\n\n" "${patchname}" "${PWD}" > "${STDERR_TARGET}";
local count=0;
local PATCH_TARGET;
if [[ -n ${PIPE_CMD} ]]; then
PATCH_TARGET="${T}/$$.patch";
echo "PIPE_COMMAND: ${PIPE_CMD} ${x} > ${PATCH_TARGET}" >> "${STDERR_TARGET}";
if ! ( ${PIPE_CMD} "${x}" > "${PATCH_TARGET}" ) >> "${STDERR_TARGET}" 2>&1; then
echo;
eerror "Could not extract patch!";
count=5;
break;
fi;
else
PATCH_TARGET=${x};
fi;
local abs_paths=$(egrep -n '^[-+]{3} /' "${PATCH_TARGET}" | awk '$2 != "/dev/null" { print }');
if [[ -n ${abs_paths} ]]; then
count=1;
printf "NOTE: skipping -p0 due to absolute paths in patch:\n%s\n" "${abs_paths}" >> "${STDERR_TARGET}";
fi;
local rel_paths=$(egrep -n '^[-+]{3} [^ ]*[.][.]/' "${PATCH_TARGET}");
if [[ -n ${rel_paths} ]]; then
eqawarn "QA Notice: Your patch uses relative paths '../'.";
eqawarn " In the future this will cause a failure.";
eqawarn "${rel_paths}";
fi;
local patch_cmd;
while [[ ${count} -lt 5 ]]; do
patch_cmd="${BASH_ALIASES[patch]:-patch} -p${count} ${EPATCH_OPTS}";
( _epatch_draw_line "***** ${patchname} *****";
echo;
echo "PATCH COMMAND: ${patch_cmd} < '${PATCH_TARGET}'";
echo;
_epatch_draw_line "***** ${patchname} *****";
${patch_cmd} --dry-run -f < "${PATCH_TARGET}" 2>&1;
ret=$?;
echo;
echo "patch program exited with status ${ret}";
exit ${ret} ) >> "${STDERR_TARGET}";
if [ $? -eq 0 ]; then
( _epatch_draw_line "***** ${patchname} *****";
echo;
echo "ACTUALLY APPLYING ${patchname} ...";
echo;
_epatch_draw_line "***** ${patchname} *****";
${patch_cmd} < "${PATCH_TARGET}" 2>&1;
ret=$?;
echo;
echo "patch program exited with status ${ret}";
exit ${ret} ) >> "${STDERR_TARGET}";
if [ $? -ne 0 ]; then
echo;
eerror "A dry-run of patch command succeeded, but actually";
eerror "applying the patch failed!";
count=5;
fi;
break;
fi;
: $(( count++ ));
done;
if [[ -n ${PIPE_CMD} ]]; then
rm -f "${PATCH_TARGET}";
fi;
if [[ ${count} -ge 5 ]]; then
echo;
eerror "Failed Patch: ${patchname} !";
eerror " ( ${PATCH_TARGET} )";
eerror;
eerror "Include in your bugreport the contents of:";
eerror;
eerror " ${STDERR_TARGET}";
echo;
die "Failed Patch: ${patchname}!";
fi;
rm -f "${STDERR_TARGET}";
cat >> "${T}/epatch.log" <<-EOF
PATCH: ${x}
CMD: ${patch_cmd}
PWD: ${PWD}
EOF
eend 0;
done;
[[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching";
:
}
epatch_user ()
{
[[ $# -ne 0 ]] && die "epatch_user takes no options";
local applied="${T}/epatch_user.log";
[[ -e ${applied} ]] && return 2;
local EPATCH_SOURCE check base=${PORTAGE_CONFIGROOT%/}/etc/portage/patches;
for check in ${CATEGORY}/{${P}-${PR},${P},${PN}}{,:${SLOT}};
do
EPATCH_SOURCE=${base}/${CTARGET}/${check};
[[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${CHOST}/${check};
[[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${base}/${check};
if [[ -d ${EPATCH_SOURCE} ]]; then
EPATCH_SOURCE=${EPATCH_SOURCE} EPATCH_SUFFIX="patch" EPATCH_FORCE="yes" EPATCH_MULTI_MSG="Applying user patches from ${EPATCH_SOURCE} ..." epatch;
echo "${EPATCH_SOURCE}" > "${applied}";
return 0;
fi;
done;
echo "none" > "${applied}";
return 1
}
epause ()
{
[[ -z ${EPAUSE_IGNORE} ]] && sleep ${1:-5}
}
epunt_cxx ()
{
local dir=$1;
[[ -z ${dir} ]] && dir=${S};
ebegin "Removing useless C++ checks";
local f p any_found;
while IFS= read -r -d '' f; do
for p in "${PORTDIR}"/eclass/ELT-patches/nocxx/*.patch;
do
if patch --no-backup-if-mismatch -p1 "${f}" "${p}" > /dev/null; then
any_found=1;
break;
fi;
done;
done < <(find "${dir}" -name configure -print0);
if [[ -z ${any_found} ]]; then
eqawarn "epunt_cxx called unnecessarily (no C++ checks to punt).";
fi;
eend 0
}
esethome ()
{
_assert_pkg_ebuild_phase ${FUNCNAME};
local euser=$1;
shift;
if [[ -z ${euser} ]]; then
eerror "No username specified !";
die "Cannot call esethome without a username";
fi;
if [[ -z $(egetent passwd "${euser}") ]]; then
ewarn "User does not exist, cannot set home dir -- skipping.";
return 1;
fi;
local ehome=$1;
shift;
if [[ -z ${ehome} ]]; then
eerror "No home directory specified !";
die "Cannot call esethome without a home directory or '-1'";
fi;
if [[ ${ehome} == "-1" ]]; then
ehome="/dev/null";
fi;
if [[ $(egethome "${euser}") == ${ehome} ]]; then
return 0;
fi;
einfo "Updating home for user '${euser}' ...";
einfo " - Home: ${ehome}";
if [[ ! -e ${ROOT}/${ehome} ]]; then
einfo " - Creating ${ehome} in ${ROOT}";
mkdir -p "${ROOT}/${ehome}";
chown "${euser}" "${ROOT}/${ehome}";
chmod 755 "${ROOT}/${ehome}";
fi;
case ${CHOST} in
*-darwin*)
dscl . change "/users/${euser}" home "${ehome}"
;;
*-freebsd* | *-dragonfly*)
pw usermod "${euser}" -d "${ehome}" && return 0;
[[ $? == 8 ]] && eerror "${euser} is in use, cannot update home";
eerror "There was an error when attempting to update the home directory for ${euser}";
eerror "Please update it manually on your system:";
eerror "\t pw usermod \"${euser}\" -d \"${ehome}\""
;;
*)
usermod -d "${ehome}" "${euser}" && return 0;
[[ $? == 8 ]] && eerror "${euser} is in use, cannot update home";
eerror "There was an error when attempting to update the home directory for ${euser}";
eerror "Please update it manually on your system (as root):";
eerror "\t usermod -d \"${ehome}\" \"${euser}\""
;;
esac
}
eshopts_pop ()
{
local s;
estack_pop eshopts s || die "${FUNCNAME}: unbalanced push";
if [[ ${s} == "shopt -"* ]]; then
eval "${s}" || die "${FUNCNAME}: sanity: invalid shopt options: ${s}";
else
set +$- || die "${FUNCNAME}: sanity: invalid shell settings: $-";
set -${s} || die "${FUNCNAME}: sanity: unable to restore saved shell settings: ${s}";
fi
}
eshopts_push ()
{
if [[ $1 == -[su] ]]; then
estack_push eshopts "$(shopt -p)";
[[ $# -eq 0 ]] && return 0;
shopt "$@" || die "${FUNCNAME}: bad options to shopt: $*";
else
estack_push eshopts $-;
[[ $# -eq 0 ]] && return 0;
set "$@" || die "${FUNCNAME}: bad options to set: $*";
fi
}
estack_pop ()
{
[[ $# -eq 0 || $# -gt 2 ]] && die "estack_pop: incorrect # of arguments";
local __estack_name="__ESTACK_$1__";
shift;
local __estack_retvar=$1;
shift;
eval local __estack_i=\${#${__estack_name}\[@\]};
[[ $(( --__estack_i )) -eq -1 ]] && return 1;
if [[ -n ${__estack_retvar} ]]; then
eval ${__estack_retvar}=\"\${${__estack_name}\[${__estack_i}\]}\";
fi;
eval unset ${__estack_name}\[${__estack_i}\]
}
estack_push ()
{
[[ $# -eq 0 ]] && die "estack_push: incorrect # of arguments";
local stack_name="__ESTACK_$1__";
shift;
eval ${stack_name}+=\( \"\$@\" \)
}
esvn_clean ()
{
[[ -z $* ]] && set -- .;
find "$@" -type d -name '.svn' -prune -print0 | xargs -0 rm -rf
}
eumask_pop ()
{
[[ $# -eq 0 ]] || die "${FUNCNAME}: we take no options";
local s;
estack_pop eumask s || die "${FUNCNAME}: unbalanced push";
umask ${s} || die "${FUNCNAME}: sanity: could not restore umask: ${s}"
}
eumask_push ()
{
estack_push eumask "$(umask)";
umask "$@" || die "${FUNCNAME}: bad options to umask: $*"
}
filter-flags ()
{
_filter-hardened "$@";
local v;
for v in $(all-flag-vars);
do
_filter-var ${v} "$@";
done;
return 0
}
filter-ldflags ()
{
_filter-var LDFLAGS "$@";
return 0
}
filter-lfs-flags ()
{
[[ $# -ne 0 ]] && die "filter-lfs-flags takes no arguments";
filter-flags -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
}
filter-mfpmath ()
{
local orig_mfpmath new_math prune_math;
orig_mfpmath=$(get-flag -mfpmath);
new_math=$(get-flag mfpmath);
new_math=" ${new_math//,/ } ";
prune_math="";
for prune_math in "$@";
do
new_math=${new_math/ ${prune_math} / };
done;
new_math=$(echo ${new_math});
new_math=${new_math// /,};
if [[ -z ${new_math} ]]; then
filter-flags ${orig_mfpmath};
else
replace-flags ${orig_mfpmath} -mfpmath=${new_math};
fi;
return 0
}
fix_libtool_libdir_paths ()
{
pushd "${D}" > /dev/null;
pushd "./${1}" > /dev/null;
local dir="${PWD#${D%/}}";
local allarchives=$(echo *.la);
allarchives="\(${allarchives// /\\|}\)";
popd > /dev/null;
sed -i -e "/^libdir=/s:=.*:='${dir}':" ./${dir}/*.la;
sed -i -e "/^dependency_libs=/s:/[^ ]*/${allarchives}:${LIBPATH}/\1:g" $(find ./${PREFIX}/lib* -maxdepth 3 -name '*.la') ./${dir}/*.la;
popd > /dev/null
}
gcc-abi-map ()
{
local map=();
case ${CTARGET} in
mips*)
map=("o32 32" "n32 n32" "n64 64")
;;
x86_64*)
map=("amd64 m64" "x86 m32" "x32 mx32")
;;
esac;
local m;
for m in "${map[@]}";
do
l=(${m});
[[ $1 == ${l[0]} ]] && echo ${l[1]} && break;
done
}
gcc-compiler-configure ()
{
gcc-multilib-configure;
if tc_version_is_at_least "4.0"; then
if in_iuse mudflap; then
confgcc+=" $(use_enable mudflap libmudflap)";
else
confgcc+=" --disable-libmudflap";
fi;
if use_if_iuse libssp; then
confgcc+=" --enable-libssp";
else
export gcc_cv_libc_provides_ssp=yes;
confgcc+=" --disable-libssp";
fi;
if tc_version_is_at_least 4.4 && want_minispecs; then
confgcc+=" $(use_enable hardened esp)";
fi;
if tc_version_is_at_least "4.2"; then
if in_iuse openmp; then
if ! is_crosscompile || $(tc-getCPP ${CTARGET}) -E - <<< "#include <pthread.h>" &>/dev/null; then
confgcc+=" $(use_enable openmp libgomp)";
else
confgcc+=" --disable-libgomp";
fi;
else
confgcc+=" --disable-libgomp";
fi;
fi;
if tc_version_is_at_least "4.4"; then
confgcc+=" --with-python-dir=${DATAPATH/$PREFIX/}/python";
fi;
fi;
is_crosscompile && confgcc+=" --enable-poison-system-directories";
if tc_version_is_at_least 4 || [[ -n ${GCC_CHECKS_LIST} ]]; then
confgcc+=" --enable-checking=${GCC_CHECKS_LIST:-release}";
else
confgcc+=" --disable-checking";
fi;
if ! is_gcj; then
confgcc+=" --disable-libgcj";
else
if use gtk; then
confgcc+=" --enable-java-awt=gtk";
fi;
fi;
if tc_version_is_at_least 4.4 && is_cxx; then
confgcc+=" --enable-libstdcxx-time";
fi;
if tc_version_is_at_least 4.7 && ! is_cxx; then
confgcc+=" --disable-build-with-cxx --disable-build-poststage1-with-cxx";
fi;
if tc_version_is_at_least 4.6 && ! is_fortran; then
confgcc+=" --disable-libquadmath";
fi;
local with_abi_map=();
case $(tc-arch) in
arm)
local a arm_arch=${CTARGET%%-*};
for a in e{b,l} {b,l}e b l;
do
if [[ ${arm_arch} == *${a} ]]; then
arm_arch=${arm_arch%${a}};
break;
fi;
done;
[[ ${arm_arch} == armv7? ]] && arm_arch=${arm_arch/7/7-};
if ( srcdir=${S}/gcc target=${CTARGET} with_arch=${arm_arch};
. "${srcdir}"/config.gcc ) &>/dev/null; then
confgcc+=" --with-arch=${arm_arch}";
fi;
if [[ $(tc-is-softfloat) == "no" ]] && [[ ${CTARGET} == armv[67]* ]] && tc_version_is_at_least "4.5"; then
confgcc+=" --with-float=hard";
case ${CTARGET} in
armv6*)
confgcc+=" --with-fpu=vfp"
;;
armv7*)
confgcc+=" --with-fpu=vfpv3-d16"
;;
esac;
fi
;;
mips)
confgcc+=" --with-abi=$(gcc-abi-map ${TARGET_DEFAULT_ABI})"
;;
amd64)
if tc_version_is_at_least 4.7 && has x32 $(get_all_abis TARGET); then
confgcc+=" --with-abi=$(gcc-abi-map ${TARGET_DEFAULT_ABI})";
fi
;;
x86)
confgcc+=" --with-arch=${CTARGET%%-*}"
;;
hppa)
[[ ${GCCMAJOR} == "3" ]] && confgcc+=" --enable-sjlj-exceptions"
;;
ppc)
is-flagq -mfloat-gprs=double && confgcc+=" --enable-e500-double";
[[ ${CTARGET//_/-} == *-e500v2-* ]] && confgcc+=" --enable-e500-double"
;;
esac;
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";
if tc_version_is_at_least "4.0"; then
use objc-gc && confgcc+=" --enable-objc-gc";
fi;
is_objcxx && GCC_LANG+=",obj-c++";
fi;
is_treelang && GCC_LANG+=",treelang";
is_fortran && GCC_LANG+=",fortran";
is_f77 && GCC_LANG+=",f77";
is_f95 && GCC_LANG+=",f95";
einfo "configuring for GCC_LANG: ${GCC_LANG}";
confgcc+=" --enable-languages=${GCC_LANG}"
}
gcc-fullversion ()
{
_gcc_fullversion '$1.$2.$3' "$@"
}
gcc-lang-supported ()
{
grep ^language=\"${1}\" "${S}"/gcc/*/config-lang.in > /dev/null || return 1;
[[ -z ${TOOLCHAIN_ALLOWED_LANGS} ]] && return 0;
has $1 ${TOOLCHAIN_ALLOWED_LANGS}
}
gcc-major-version ()
{
_gcc_fullversion '$1' "$@"
}
gcc-micro-version ()
{
_gcc_fullversion '$3' "$@"
}
gcc-minor-version ()
{
_gcc_fullversion '$2' "$@"
}
gcc-multilib-configure ()
{
if ! is_multilib; then
confgcc+=" --disable-multilib";
else
confgcc+=" --enable-multilib";
fi;
local abi list;
for abi in $(get_all_abis TARGET);
do
local l=$(gcc-abi-map ${abi});
[[ -n ${l} ]] && list+=",${l}";
done;
if [[ -n ${list} ]]; then
case ${CTARGET} in
x86_64*)
tc_version_is_at_least 4.7 && confgcc+=" --with-multilib-list=${list:1}"
;;
esac;
fi
}
gcc-specs-directive ()
{
local directive subdname subdirective;
directive="$(_gcc-specs-directive_raw $1)";
while [[ ${directive} == *%\(*\)* ]]; do
subdname=${directive/*%\(};
subdname=${subdname/\)*};
subdirective="$(_gcc-specs-directive_raw ${subdname})";
directive="${directive//\%(${subdname})/${subdirective}}";
done;
echo "${directive}";
return 0
}
gcc-specs-nostrict ()
{
local directive;
directive=$(gcc-specs-directive cc1);
return $([[ "${directive/\{!fstrict-overflow:}" != "${directive}" ]])
}
gcc-specs-now ()
{
local directive;
directive=$(gcc-specs-directive link_command);
return $([[ "${directive/\{!nonow:}" != "${directive}" ]])
}
gcc-specs-pie ()
{
local directive;
directive=$(gcc-specs-directive cc1);
return $([[ "${directive/\{!nopie:}" != "${directive}" ]])
}
gcc-specs-relro ()
{
local directive;
directive=$(gcc-specs-directive link_command);
return $([[ "${directive/\{!norelro:}" != "${directive}" ]])
}
gcc-specs-ssp ()
{
local directive;
directive=$(gcc-specs-directive cc1);
return $([[ "${directive/\{!fno-stack-protector:}" != "${directive}" ]])
}
gcc-specs-ssp-to-all ()
{
local directive;
directive=$(gcc-specs-directive cc1);
return $([[ "${directive/\{!fno-stack-protector-all:}" != "${directive}" ]])
}
gcc-version ()
{
_gcc_fullversion '$1.$2' "$@"
}
gcc_do_configure ()
{
local confgcc;
confgcc+=" --prefix=${PREFIX} --bindir=${BINPATH} --includedir=${INCLUDEPATH} --datadir=${DATAPATH} --mandir=${DATAPATH}/man --infodir=${DATAPATH}/info --with-gxx-include-dir=${STDCXX_INCDIR}";
[[ ${CTARGET} == *-darwin* ]] && confgcc+=" --enable-version-specific-runtime-libs";
confgcc+=" --host=${CHOST}";
if is_crosscompile || tc-is-cross-compiler; then
confgcc+=" --target=${CTARGET}";
fi;
[[ -n ${CBUILD} ]] && confgcc+=" --build=${CBUILD}";
confgcc+=" $(use_enable altivec)";
tc_version_is_at_least "4.3" && confgcc+=" $(use_enable fixed-point)";
if tc_version_is_at_least "4.4"; then
confgcc+=" $(use_with graphite ppl)";
confgcc+=" $(use_with graphite cloog)";
if use graphite; then
if tc_version_is_at_least "4.8"; then
confgcc+=" --disable-isl-version-check";
confgcc+=" --with-cloog";
else
confgcc+=" --disable-ppl-version-check";
confgcc+=" --with-cloog-include=/usr/include/cloog-ppl";
fi;
fi;
fi;
if tc_version_is_at_least "4.6"; then
confgcc+=" --enable-lto";
else
if tc_version_is_at_least "4.5"; then
confgcc+=" $(use_enable lto)";
fi;
fi;
case $(tc-is-softfloat) in
yes)
confgcc+=" --with-float=soft"
;;
softfp)
confgcc+=" --with-float=softfp"
;;
*)
[[ ${CTARGET//_/-} == *-hardfloat-* ]] && confgcc+=" --with-float=hard"
;;
esac;
if use nls; then
confgcc+=" --enable-nls --without-included-gettext";
else
confgcc+=" --disable-nls";
fi;
confgcc+=" --with-system-zlib --enable-obsolete --disable-werror --enable-secureplt";
gcc-compiler-configure || die;
if is_crosscompile; then
local needed_libc="";
case ${CTARGET} in
*-linux)
needed_libc=no-fucking-clue
;;
*-dietlibc)
needed_libc=dietlibc
;;
*-elf | *-eabi)
needed_libc=newlib
;;
*-freebsd*)
needed_libc=freebsd-lib
;;
*-gnu*)
needed_libc=glibc
;;
*-klibc)
needed_libc=klibc
;;
*-uclibc*)
if ! echo '#include <features.h>' | $(tc-getCPP ${CTARGET}) -E -dD - 2> /dev/null | grep -q __HAVE_SHARED__; then
confgcc+=" --disable-shared";
fi;
needed_libc=uclibc
;;
*-cygwin)
needed_libc=cygwin
;;
x86_64-*-mingw* | *-w64-mingw*)
needed_libc=mingw64-runtime
;;
mingw* | *-mingw*)
needed_libc=mingw-runtime
;;
avr)
confgcc+=" --enable-shared --disable-threads"
;;
esac;
if [[ -n ${needed_libc} ]]; then
if ! has_version ${CATEGORY}/${needed_libc}; then
confgcc+=" --disable-shared --disable-threads --without-headers";
else
if built_with_use --hidden --missing false ${CATEGORY}/${needed_libc} crosscompile_opts_headers-only; then
confgcc+=" --disable-shared --with-sysroot=${PREFIX}/${CTARGET}";
else
confgcc+=" --with-sysroot=${PREFIX}/${CTARGET}";
fi;
fi;
fi;
tc_version_is_at_least 4.2 && confgcc+=" --disable-bootstrap";
else
if tc-is-static-only; then
confgcc+=" --disable-shared";
else
confgcc+=" --enable-shared";
fi;
case ${CHOST} in
mingw* | *-mingw* | *-cygwin)
confgcc+=" --enable-threads=win32"
;;
*)
confgcc+=" --enable-threads=posix"
;;
esac;
fi;
case ${CTARGET} in
*-uclibc*)
confgcc+=" --disable-__cxa_atexit $(use_enable nptl tls)";
[[ ${GCCMAJOR}.${GCCMINOR} == 3.3 ]] && confgcc+=" --enable-sjlj-exceptions";
if tc_version_is_at_least 3.4 && ! tc_version_is_at_least 4.3; then
confgcc+=" --enable-clocale=uclibc";
fi
;;
*-elf | *-eabi)
confgcc+=" --with-newlib"
;;
*-gnu*)
confgcc+=" --enable-__cxa_atexit";
confgcc+=" --enable-clocale=gnu"
;;
*-freebsd*)
confgcc+=" --enable-__cxa_atexit"
;;
*-solaris*)
confgcc+=" --enable-__cxa_atexit"
;;
esac;
tc_version_is_at_least 3.4 || confgcc+=" --disable-libunwind-exceptions";
case $(tc-arch) in
ppc | ppc64)
tc_version_is_at_least 3.4 && 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;
tc_version_is_at_least 4.3 && set -- "$@" --with-bugurl=http://bugs.gentoo.org/ --with-pkgversion="${BRANDING_GCC_PKGVERSION}";
set -- ${confgcc} "$@" ${EXTRA_ECONF};
export gcc_cv_prog_makeinfo_modern=no;
export ac_cv_have_x='have_x=yes ac_x_includes= ac_x_libraries=';
echo;
einfo "PREFIX: ${PREFIX}";
einfo "BINPATH: ${BINPATH}";
einfo "LIBPATH: ${LIBPATH}";
einfo "DATAPATH: ${DATAPATH}";
einfo "STDCXX_INCDIR: ${STDCXX_INCDIR}";
echo;
einfo "Configuring GCC with: ${@//--/\n\t--}";
echo;
mkdir -p "${WORKDIR}"/build;
pushd "${WORKDIR}"/build > /dev/null;
addwrite /dev/zero;
echo "${S}"/configure "$@";
"${S}"/configure "$@" || die "failed to run configure";
popd > /dev/null
}
gcc_do_filter_flags ()
{
strip-flags;
replace-flags -O? -O2;
strip-unsupported-flags;
filter-flags '-mabi*' -m31 -m32 -m64;
case ${GCC_BRANCH_VER} in
3.2 | 3.3)
replace-cpu-flags k8 athlon64 opteron i686 x86-64;
replace-cpu-flags pentium-m pentium3m pentium3;
case $(tc-arch) in
amd64 | x86)
filter-flags '-mtune=*'
;;
ppc64)
filter-flags "-mcpu=*"
;;
esac;
case $(tc-arch) in
amd64)
replace-cpu-flags core2 nocona
;;
x86)
replace-cpu-flags core2 prescott
;;
esac;
replace-cpu-flags G3 750;
replace-cpu-flags G4 7400;
replace-cpu-flags G5 7400;
filter-flags -f{no-,}unit-at-a-time -f{no-,}web -mno-tls-direct-seg-refs;
filter-flags -f{no-,}stack-protector{,-all};
filter-flags -fvisibility-inlines-hidden -fvisibility=hidden
;;
3.4 | 4.*)
case $(tc-arch) in
x86 | amd64)
filter-flags '-mcpu=*'
;;
*-macos)
[[ ${GCC_BRANCH_VER} == 4.0 || ${GCC_BRANCH_VER} == 4.1 ]] && filter-flags '-mcpu=*' '-march=*' '-mtune=*'
;;
esac
;;
esac;
case ${GCC_BRANCH_VER} in
4.6)
replace-cpu-flags c3-2 pentium2 pentium3 pentium3m pentium-m i686
;;
esac;
if is_crosscompile; then
CFLAGS="-O2 -pipe";
FFLAGS=${CFLAGS};
FCFLAGS=${CFLAGS};
local VAR="CFLAGS_"${CTARGET//-/_};
CXXFLAGS=${!VAR};
fi;
export GCJFLAGS=${GCJFLAGS:-${CFLAGS}}
}
gcc_do_make ()
{
[[ -n $1 ]] && GCC_MAKE_TARGET=$1;
if is_crosscompile || tc-is-cross-compiler; then
GCC_MAKE_TARGET=${GCC_MAKE_TARGET-all};
else
GCC_MAKE_TARGET=${GCC_MAKE_TARGET-bootstrap-lean};
fi;
if [[ ${GCC_MAKE_TARGET} == "profiledbootstrap" ]] || use_if_iuse boundschecking; then
export MAKEOPTS="${MAKEOPTS} -j1";
fi;
if [[ ${GCC_MAKE_TARGET} == "all" ]]; then
STAGE1_CFLAGS=${STAGE1_CFLAGS-"${CFLAGS}"};
else
if [[ $(gcc-version) == "3.4" && ${GCC_BRANCH_VER} == "3.4" ]] && gcc-specs-ssp; then
STAGE1_CFLAGS=${STAGE1_CFLAGS-"-O2"};
fi;
fi;
if is_crosscompile; then
BOOT_CFLAGS=${BOOT_CFLAGS-"-O2"};
else
BOOT_CFLAGS=${BOOT_CFLAGS-"$(get_abi_CFLAGS ${TARGET_DEFAULT_ABI}) ${CFLAGS}"};
fi;
pushd "${WORKDIR}"/build > /dev/null;
emake LDFLAGS="${LDFLAGS}" STAGE1_CFLAGS="${STAGE1_CFLAGS}" LIBPATH="${LIBPATH}" BOOT_CFLAGS="${BOOT_CFLAGS}" ${GCC_MAKE_TARGET} || die "emake failed with ${GCC_MAKE_TARGET}";
if ! is_crosscompile && use cxx && 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 || ewarn "failed to make docs";
else
if tc_version_is_at_least 3.0; then
cd "${CTARGET}"/libstdc++-v3;
emake doxygen-man || ewarn "failed to make docs";
fi;
fi;
else
ewarn "Skipping libstdc++ manpage generation since you don't have doxygen installed";
fi;
fi;
popd > /dev/null
}
gcc_movelibs ()
{
tc_version_is_at_least 3.2 || return 0;
local x multiarg removedirs="";
for multiarg in $($(XGCC) -print-multi-lib);
do
multiarg=${multiarg#*;};
multiarg=${multiarg//@/ -};
local OS_MULTIDIR=$($(XGCC) ${multiarg} --print-multi-os-directory);
local MULTIDIR=$($(XGCC) ${multiarg} --print-multi-directory);
local TODIR=${D}${LIBPATH}/${MULTIDIR};
local FROMDIR=;
[[ -d ${TODIR} ]] || mkdir -p ${TODIR};
for FROMDIR in ${LIBPATH}/${OS_MULTIDIR} ${LIBPATH}/../${MULTIDIR} ${PREFIX}/lib/${OS_MULTIDIR} ${PREFIX}/${CTARGET}/lib/${OS_MULTIDIR};
do
removedirs="${removedirs} ${FROMDIR}";
FROMDIR=${D}${FROMDIR};
if [[ ${FROMDIR} != "${TODIR}" && -d ${FROMDIR} ]]; then
local files=$(find "${FROMDIR}" -maxdepth 1 ! -type d 2>/dev/null);
if [[ -n ${files} ]]; then
mv ${files} "${TODIR}";
fi;
fi;
done;
fix_libtool_libdir_paths "${LIBPATH}/${MULTIDIR}";
FROMDIR="${PREFIX}/lib/${OS_MULTIDIR}";
for x in "${D}${FROMDIR}"/pkgconfig/libgcj*.pc;
do
[[ -f ${x} ]] || continue;
sed -i "/^libdir=/s:=.*:=${LIBPATH}/${MULTIDIR}:" "${x}";
mv "${x}" "${D}${FROMDIR}"/pkgconfig/libgcj-${GCC_PV}.pc || die;
done;
done;
for FROMDIR in ${removedirs};
do
rmdir "${D}"${FROMDIR} &>/dev/null;
done;
find "${D}" -type d | xargs rmdir &>/dev/null
}
gcc_pkg_setup ()
{
toolchain_pkg_setup
}
gcc_quick_unpack ()
{
pushd "${WORKDIR}" > /dev/null;
export PATCH_GCC_VER=${PATCH_GCC_VER:-${GCC_RELEASE_VER}};
export UCLIBC_GCC_VER=${UCLIBC_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}};
if [[ -n ${GCC_A_FAKEIT} ]]; then
unpack ${GCC_A_FAKEIT};
else
if [[ -n ${PRERELEASE} ]]; then
unpack gcc-${PRERELEASE}.tar.bz2;
else
if [[ -n ${SNAPSHOT} ]]; then
unpack gcc-${SNAPSHOT}.tar.bz2;
else
if [[ ${PV} != *9999* ]]; then
unpack gcc-${GCC_RELEASE_VER}.tar.bz2;
if [[ -n ${BRANCH_UPDATE} ]]; then
pushd "${S}" > /dev/null;
epatch "${DISTDIR}"/gcc-${GCC_RELEASE_VER}-branch-update-${BRANCH_UPDATE}.patch.bz2;
popd > /dev/null;
fi;
fi;
fi;
fi;
fi;
if [[ -n ${D_VER} ]] && use d; then
pushd "${S}"/gcc > /dev/null;
unpack gdc-${D_VER}-src.tar.bz2;
cd ..;
ebegin "Adding support for the D language";
./gcc/d/setup-gcc.sh &>"${T}"/dgcc.log;
if ! eend $?; then
eerror "The D gcc package failed to apply";
eerror "Please include this log file when posting a bug report:";
eerror " ${T}/dgcc.log";
die "failed to include the D language";
fi;
popd > /dev/null;
fi;
[[ -n ${PATCH_VER} ]] && unpack gcc-${PATCH_GCC_VER}-patches-${PATCH_VER}.tar.bz2;
[[ -n ${UCLIBC_VER} ]] && unpack gcc-${UCLIBC_GCC_VER}-uclibc-patches-${UCLIBC_VER}.tar.bz2;
if want_pie; then
if [[ -n ${PIE_CORE} ]]; then
unpack ${PIE_CORE};
else
unpack gcc-${PIE_GCC_VER}-piepatches-v${PIE_VER}.tar.bz2;
fi;
[[ -n ${SPECS_VER} ]] && unpack gcc-${SPECS_GCC_VER}-specs-${SPECS_VER}.tar.bz2;
fi;
use_if_iuse boundschecking && unpack "bounds-checking-gcc-${HTB_GCC_VER}-${HTB_VER}.patch.bz2";
popd > /dev/null
}
gcc_slot_java ()
{
local x;
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}/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}/security;
mv -f "${D}"${PREFIX}/lib*/security/* "${D}"${LIBPATH}/security;
rm -rf "${D}"${PREFIX}/lib*/security;
fi;
for x in libgcj.spec logging.properties;
do
x="${D}${PREFIX}/lib/${x}";
[[ -f ${x} ]] && mv -f "${x}" "${D}"${LIBPATH}/;
done;
cd "${D}"${BINPATH};
[[ -f jar ]] && mv -f jar gcj-jar
}
gcc_src_compile ()
{
toolchain_src_compile
}
gcc_src_test ()
{
toolchain_src_test
}
gcc_src_unpack ()
{
toolchain_src_unpack
}
gcc_version_patch ()
{
tc_version_is_at_least 4.3 && return 0;
local version_string=${GCC_CONFIG_VER};
[[ -n ${BRANCH_UPDATE} ]] && version_string+=" ${BRANCH_UPDATE}";
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
}
gen_usr_ldscript ()
{
local lib libdir=$(get_libdir) output_format="" auto=false suffix=$(get_libname);
[[ -z ${ED+set} ]] && local ED=${D%/}${EPREFIX}/;
tc-is-static-only && return;
case ${CTARGET:-${CHOST}} in
*-darwin*)
;;
*linux* | *-freebsd* | *-openbsd* | *-netbsd*)
use prefix && return 0
;;
*)
return 0
;;
esac;
dodir /usr/${libdir};
if [[ $1 == "-a" ]]; then
auto=true;
shift;
dodir /${libdir};
fi;
output_format=$($(tc-getCC) ${CFLAGS} ${LDFLAGS} -Wl,--verbose 2>&1 | sed -n 's/^OUTPUT_FORMAT("\([^"]*\)",.*/\1/p');
[[ -n ${output_format} ]] && output_format="OUTPUT_FORMAT ( ${output_format} )";
for lib in "$@";
do
local tlib;
if ${auto}; then
lib="lib${lib}${suffix}";
else
[[ -r ${ED}/${libdir}/${lib} ]] || continue;
fi;
case ${CTARGET:-${CHOST}} in
*-darwin*)
if ${auto}; then
tlib=$(scanmacho -qF'%S#F' "${ED}"/usr/${libdir}/${lib});
else
tlib=$(scanmacho -qF'%S#F' "${ED}"/${libdir}/${lib});
fi;
[[ -z ${tlib} ]] && die "unable to read install_name from ${lib}";
tlib=${tlib##*/};
if ${auto}; then
mv "${ED}"/usr/${libdir}/${lib%${suffix}}.*${suffix#.} "${ED}"/${libdir}/ || die;
if [[ ${tlib} != ${lib%${suffix}}.*${suffix#.} ]]; then
mv "${ED}"/usr/${libdir}/${tlib%${suffix}}.*${suffix#.} "${ED}"/${libdir}/ || die;
fi;
rm -f "${ED}"/${libdir}/${lib};
fi;
if [[ ! -w "${ED}/${libdir}/${tlib}" ]]; then
chmod u+w "${ED}${libdir}/${tlib}";
local nowrite=yes;
fi;
install_name_tool -id "${EPREFIX}"/${libdir}/${tlib} "${ED}"/${libdir}/${tlib} || die "install_name_tool failed";
[[ -n ${nowrite} ]] && chmod u-w "${ED}${libdir}/${tlib}";
pushd "${ED}/usr/${libdir}" > /dev/null;
ln -snf "../../${libdir}/${tlib}" "${lib}";
popd > /dev/null
;;
*)
if ${auto}; then
tlib=$(scanelf -qF'%S#F' "${ED}"/usr/${libdir}/${lib});
[[ -z ${tlib} ]] && die "unable to read SONAME from ${lib}";
mv "${ED}"/usr/${libdir}/${lib}* "${ED}"/${libdir}/ || die;
if [[ ${tlib} != ${lib}* ]]; then
mv "${ED}"/usr/${libdir}/${tlib}* "${ED}"/${libdir}/ || die;
fi;
rm -f "${ED}"/${libdir}/${lib};
else
tlib=${lib};
fi;
cat > "${ED}/usr/${libdir}/${lib}" <<-END_LDSCRIPT
/* GNU ld script
Since Gentoo has critical dynamic libraries in /lib, and the static versions
in /usr/lib, we need to have a "fake" dynamic lib in /usr/lib, otherwise we
run into linking problems. This "fake" dynamic lib is a linker script that
redirects the linker to the real lib. And yes, this works in the cross-
compiling scenario as the sysroot-ed linker will prepend the real path.
See bug http://bugs.gentoo.org/4411 for more info.
*/
${output_format}
GROUP ( ${EPREFIX}/${libdir}/${tlib} )
END_LDSCRIPT
;;
esac
fperms a+x "/usr/${libdir}/${lib}" || die "could not change perms on ${lib}";
done
}
gentoo_urls ()
{
local devspace="HTTP~vapier/dist/URI HTTP~dirtyepic/dist/URI
HTTP~halcy0n/patches/URI HTTP~zorry/patches/gcc/URI";
devspace=${devspace//HTTP/http:\/\/dev.gentoo.org\/};
echo mirror://gentoo/$1 ${devspace//URI/$1}
}
get-flag ()
{
local f var findflag="$1";
for var in $(all-flag-vars);
do
for f in ${!var};
do
if [ "${f/${findflag}}" != "${f}" ]; then
printf "%s\n" "${f/-${findflag}=}";
return 0;
fi;
done;
done;
return 1
}
get_abi_CFLAGS ()
{
get_abi_var CFLAGS "$@"
}
get_abi_CHOST ()
{
get_abi_var CHOST "$@"
}
get_abi_CTARGET ()
{
get_abi_var CTARGET "$@"
}
get_abi_FAKE_TARGETS ()
{
get_abi_var FAKE_TARGETS "$@"
}
get_abi_LDFLAGS ()
{
get_abi_var LDFLAGS "$@"
}
get_abi_LIBDIR ()
{
get_abi_var LIBDIR "$@"
}
get_abi_var ()
{
local flag=$1;
local abi=${2:-${ABI:-${DEFAULT_ABI:-default}}};
local var="${flag}_${abi}";
echo ${!var}
}
get_after_major_version ()
{
echo $(get_version_component_range 2- "${1:-${PV}}")
}
get_all_abis ()
{
local x order="" mvar dvar;
mvar="MULTILIB_ABIS";
dvar="DEFAULT_ABI";
if [[ -n $1 ]]; then
mvar="$1_${mvar}";
dvar="$1_${dvar}";
fi;
if [[ -z ${!mvar} ]]; then
echo "default";
return 0;
fi;
for x in ${!mvar};
do
if [[ ${x} != ${!dvar} ]]; then
order="${order:+${order} }${x}";
fi;
done;
order="${order:+${order} }${!dvar}";
echo ${order};
return 0
}
get_all_libdirs ()
{
local libdirs abi;
for abi in ${MULTILIB_ABIS};
do
libdirs+=" $(get_abi_LIBDIR ${abi})";
done;
[[ " ${libdirs} " != *" lib "* ]] && libdirs+=" lib";
echo "${libdirs}"
}
get_all_version_components ()
{
eshopts_push -s extglob;
local ver_str=${1:-${PV}} result;
result=();
if [[ ${VERSIONATOR_CACHE_VER_STR} == ${ver_str} ]]; then
echo ${VERSIONATOR_CACHE_RESULT};
eshopts_pop;
return;
fi;
export VERSIONATOR_CACHE_VER_STR=${ver_str};
while [[ -n $ver_str ]]; do
case "${ver_str::1}" in
[[:digit:]])
result+=("${ver_str%%[^[:digit:]]*}");
ver_str=${ver_str##+([[:digit:]])}
;;
[-_.])
result+=("${ver_str::1}");
ver_str=${ver_str:1}
;;
[[:alpha:]])
local not_match=${ver_str##+([[:alpha:]])*([[:digit:]])};
result+=("${ver_str::${#ver_str} - ${#not_match}}");
ver_str=${not_match}
;;
*)
result+=("${ver_str::1}");
ver_str=${ver_str:1}
;;
esac;
done;
export VERSIONATOR_CACHE_RESULT=${result[*]};
echo ${result[@]};
eshopts_pop
}
get_gcc_src_uri ()
{
export PATCH_GCC_VER=${PATCH_GCC_VER:-${GCC_RELEASE_VER}};
export UCLIBC_GCC_VER=${UCLIBC_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}};
if [[ -n ${PRERELEASE} ]]; then
GCC_SRC_URI="ftp://gcc.gnu.org/pub/gcc/prerelease-${PRERELEASE}/gcc-${PRERELEASE}.tar.bz2";
else
if [[ -n ${SNAPSHOT} ]]; then
GCC_SRC_URI="ftp://gcc.gnu.org/pub/gcc/snapshots/${SNAPSHOT}/gcc-${SNAPSHOT}.tar.bz2";
else
if [[ ${PV} != *9999* ]]; then
GCC_SRC_URI="mirror://gnu/gcc/gcc-${GCC_PV}/gcc-${GCC_RELEASE_VER}.tar.bz2";
[[ -n ${BRANCH_UPDATE} ]] && GCC_SRC_URI+=" $(gentoo_urls gcc-${GCC_RELEASE_VER}-branch-update-${BRANCH_UPDATE}.patch.bz2)";
fi;
fi;
fi;
[[ -n ${UCLIBC_VER} ]] && GCC_SRC_URI+=" $(gentoo_urls gcc-${UCLIBC_GCC_VER}-uclibc-patches-${UCLIBC_VER}.tar.bz2)";
[[ -n ${PATCH_VER} ]] && GCC_SRC_URI+=" $(gentoo_urls gcc-${PATCH_GCC_VER}-patches-${PATCH_VER}.tar.bz2)";
[[ -n ${PIE_VER} ]] && PIE_CORE=${PIE_CORE:-gcc-${PIE_GCC_VER}-piepatches-v${PIE_VER}.tar.bz2} && GCC_SRC_URI+=" $(gentoo_urls ${PIE_CORE})";
[[ -n ${SPECS_VER} ]] && GCC_SRC_URI+=" $(gentoo_urls gcc-${SPECS_GCC_VER}-specs-${SPECS_VER}.tar.bz2)";
if [[ -n ${HTB_VER} ]]; then
local HTBFILE="bounds-checking-gcc-${HTB_GCC_VER}-${HTB_VER}.patch.bz2";
GCC_SRC_URI+="
boundschecking? (
mirror://sourceforge/boundschecking/${HTBFILE}
$(gentoo_urls ${HTBFILE})
)";
fi;
[[ -n ${D_VER} ]] && GCC_SRC_URI+=" d? ( mirror://sourceforge/dgcc/gdc-${D_VER}-src.tar.bz2 )";
if [[ ${PN} != "kgcc64" && ${PN} != gcc-* ]]; then
if tc_version_is_at_least "4.5"; then
GCC_SRC_URI+=" gcj? ( ftp://sourceware.org/pub/java/ecj-4.5.jar )";
else
if tc_version_is_at_least "4.3"; then
GCC_SRC_URI+=" gcj? ( ftp://sourceware.org/pub/java/ecj-4.3.jar )";
fi;
fi;
fi;
echo "${GCC_SRC_URI}"
}
get_install_abis ()
{
local x order="";
if [[ -z ${MULTILIB_ABIS} ]]; then
echo "default";
return 0;
fi;
if [[ ${EMULTILIB_PKG} == "true" ]]; then
for x in ${MULTILIB_ABIS};
do
if [[ ${x} != "${DEFAULT_ABI}" ]]; then
has ${x} ${ABI_DENY} || order="${order} ${x}";
fi;
done;
has ${DEFAULT_ABI} ${ABI_DENY} || order="${order} ${DEFAULT_ABI}";
if [[ -n ${ABI_ALLOW} ]]; then
local ordera="";
for x in ${order};
do
if has ${x} ${ABI_ALLOW}; then
ordera="${ordera} ${x}";
fi;
done;
order=${ordera};
fi;
else
order=${DEFAULT_ABI};
fi;
if [[ -z ${order} ]]; then
die "The ABI list is empty. Are you using a proper multilib profile? Perhaps your USE flags or MULTILIB_ABIS are too restrictive for this package.";
fi;
echo ${order};
return 0
}
get_last_version_component_index ()
{
echo $(($(get_version_component_count "${1:-${PV}}" ) - 1))
}
get_libdir ()
{
local CONF_LIBDIR;
if [ -n "${CONF_LIBDIR_OVERRIDE}" ]; then
echo ${CONF_LIBDIR_OVERRIDE};
else
get_abi_LIBDIR;
fi
}
get_libname ()
{
local libname;
local ver=$1;
case ${CHOST} in
*-cygwin | mingw* | *-mingw*)
libname="dll"
;;
*-darwin*)
libname="dylib"
;;
*-mint*)
libname="irrelevant"
;;
hppa*-hpux*)
libname="sl"
;;
*)
libname="so"
;;
esac;
if [[ -z $* ]]; then
echo ".${libname}";
else
for ver in "$@";
do
case ${CHOST} in
*-darwin*)
echo ".${ver}.${libname}"
;;
*-mint*)
echo ".${libname}"
;;
*)
echo ".${libname}.${ver}"
;;
esac;
done;
fi
}
get_major_version ()
{
local c=($(get_all_version_components "${1:-${PV}}"));
echo ${c[0]}
}
get_make_var ()
{
local var=$1 makefile=${2:-${WORKDIR}/build/Makefile};
echo -e "e:\\n\\t@echo \$(${var})\\ninclude ${makefile}" | r=${makefile%/*} emake --no-print-directory -s -f - 2> /dev/null
}
get_modname ()
{
local modname;
local ver=$1;
case ${CHOST} in
*-darwin*)
modname="bundle"
;;
*)
modname="so"
;;
esac;
echo ".${modname}"
}
get_version_component_count ()
{
local a=($(get_version_components "${1:-${PV}}"));
echo ${#a[@]}
}
get_version_component_range ()
{
eshopts_push -s extglob;
local c v="${2:-${PV}}" range="${1}" range_start range_end;
local -i i=-1 j=0;
c=($(get_all_version_components "${v}"));
range_start=${range%-*};
range_start=${range_start:-1};
range_end=${range#*-};
range_end=${range_end:-${#c[@]}};
while ((j < range_start)); do
i+=1;
((i > ${#c[@]})) && eshopts_pop && return;
[[ -n "${c[i]//[-._]}" ]] && j+=1;
done;
while ((j <= range_end)); do
echo -n ${c[i]};
((i > ${#c[@]})) && eshopts_pop && return;
[[ -n "${c[i]//[-._]}" ]] && j+=1;
i+=1;
done;
eshopts_pop
}
get_version_components ()
{
local c=$(get_all_version_components "${1:-${PV}}");
echo ${c//[-._]/ }
}
gnuconfig_do_update ()
{
local configsubs_dir target targetlist file;
[[ $# -eq 0 ]] && die "do not call gnuconfig_do_update; use gnuconfig_update";
configsubs_dir=$(gnuconfig_findnewest);
einfo "Using GNU config files from ${configsubs_dir}";
for file in "$@";
do
if [[ ! -r ${configsubs_dir}/${file} ]]; then
eerror "Can't read ${configsubs_dir}/${file}, skipping..";
continue;
fi;
targetlist=$(find "${startdir}" -name "${file}");
if [[ -n ${targetlist} ]]; then
for target in ${targetlist};
do
[[ -L ${target} ]] && rm -f "${target}";
einfo " Updating ${target/$startdir\//}";
cp -f "${configsubs_dir}/${file}" "${target}";
eend $?;
done;
else
ewarn " No ${file} found in ${startdir}, skipping ...";
fi;
done;
return 0
}
gnuconfig_findnewest ()
{
local locations="
/usr/share/gnuconfig/config.sub
/usr/share/automake-1.9/config.sub
/usr/share/automake-1.8/config.sub
/usr/share/automake-1.7/config.sub
/usr/share/automake-1.6/config.sub
/usr/share/automake-1.5/config.sub
/usr/share/automake-1.4/config.sub
/usr/share/libtool/config.sub
";
grep -s '^timestamp' ${locations} | sort -n -t\' -k2 | tail -n 1 | sed 's,/config.sub:.*$,,'
}
gnuconfig_update ()
{
local startdir;
if [[ $1 == /* ]]; then
startdir=$1;
shift;
else
startdir=${S};
fi;
if [[ $# -gt 0 ]]; then
gnuconfig_do_update "$@";
else
gnuconfig_do_update config.sub config.guess;
fi;
return $?
}
guess_patch_type_in_dir ()
{
[[ -n $(ls "$1"/*.bz2 2>/dev/null) ]] && EPATCH_SUFFIX="patch.bz2" || EPATCH_SUFFIX="patch"
}
hardened_gcc_is_stable ()
{
local tocheck;
if [[ $1 == "pie" ]]; then
if [[ ${CTARGET} == *-uclibc* ]]; then
tocheck=${PIE_UCLIBC_STABLE};
else
tocheck=${PIE_GLIBC_STABLE};
fi;
else
if [[ $1 == "ssp" ]]; then
if [[ ${CTARGET} == *-uclibc* ]]; then
tocheck=${SSP_UCLIBC_STABLE};
else
tocheck=${SSP_STABLE};
fi;
else
die "hardened_gcc_stable needs to be called with pie or ssp";
fi;
fi;
has $(tc-arch) ${tocheck} && return 0;
return 1
}
hardened_gcc_works ()
{
if [[ $1 == "pie" ]]; then
[[ ${CTARGET} == *-freebsd* ]] && return 1;
want_pie || return 1;
use_if_iuse nopie && return 1;
hardened_gcc_is_stable pie;
return $?;
else
if [[ $1 == "ssp" ]]; then
[[ -n ${SPECS_VER} ]] || return 1;
use_if_iuse nossp && return 1;
hardened_gcc_is_stable ssp;
return $?;
else
hardened_gcc_works pie || return 1;
hardened_gcc_works ssp || return 1;
return 0;
fi;
fi
}
has_m32 ()
{
die "${FUNCNAME}: don't use this anymore"
}
has_m64 ()
{
eqawarn "${FUNCNAME}: don't use this anymore";
local temp="$(emktemp)";
echo "int main() { return(0); }" > "${temp}".c;
MY_CC=$(tc-getCC);
${MY_CC/ .*/} -m64 -o "$(emktemp)" "${temp}".c > /dev/null 2>&1;
local ret=$?;
rm -f "${temp}".c;
[[ ${ret} != 1 ]] && return 0;
return 1
}
has_multilib_profile ()
{
[ -n "${MULTILIB_ABIS}" -a "${MULTILIB_ABIS}" != "${MULTILIB_ABIS/ /}" ]
}
host-is-pax ()
{
grep -qs ^PaX: /proc/self/status
}
ht_fix_all ()
{
local MATCHES;
MATCHES=$(grep -l -s -i -R -e "head -[ 0-9]" -e "tail [+-][ 0-9]" * | sort -u);
[[ -n ${MATCHES} ]] && ht_fix_file ${MATCHES} || einfo "No need for ht_fix_all anymore !"
}
ht_fix_file ()
{
local i;
einfo "Replacing obsolete head/tail with POSIX compliant ones";
for i in "$@";
do
__do_sed_fix "$i";
done
}
in_iuse ()
{
debug-print-function ${FUNCNAME} "${@}";
[[ ${#} -eq 1 ]] || die "Invalid args to ${FUNCNAME}()";
local flag=${1};
local liuse=(${IUSE});
has "${flag}" "${liuse[@]#[+-]}"
}
is-flag ()
{
is-flagq "$@" && echo true
}
is-flagq ()
{
[[ -n $2 ]] && die "Usage: is-flag <flag>";
local var;
for var in $(all-flag-vars);
do
_is_flagq ${var} "$1" && return 0;
done;
return 1
}
is-ldflag ()
{
is-ldflagq "$@" && echo true
}
is-ldflagq ()
{
[[ -n $2 ]] && die "Usage: is-ldflag <flag>";
_is_flagq LDFLAGS $1
}
is_ada ()
{
gcc-lang-supported ada || return 1;
use ada
}
is_crosscompile ()
{
[[ ${CHOST} != ${CTARGET} ]]
}
is_cxx ()
{
gcc-lang-supported 'c++' || return 1;
use cxx
}
is_d ()
{
gcc-lang-supported d || return 1;
use_if_iuse d
}
is_f77 ()
{
gcc-lang-supported f77 || return 1;
use fortran
}
is_f95 ()
{
gcc-lang-supported f95 || return 1;
use fortran
}
is_final_abi ()
{
has_multilib_profile || return 0;
set -- $(get_install_abis);
local LAST_ABI=$#;
[[ ${!LAST_ABI} == ${ABI} ]]
}
is_fortran ()
{
gcc-lang-supported fortran || return 1;
use fortran
}
is_gcj ()
{
gcc-lang-supported java || return 1;
use cxx && use_if_iuse gcj
}
is_go ()
{
gcc-lang-supported go || return 1;
use cxx && use_if_iuse go
}
is_multilib ()
{
tc_version_is_at_least 3 || return 1;
use multilib
}
is_objc ()
{
gcc-lang-supported objc || return 1;
use_if_iuse objc
}
is_objcxx ()
{
gcc-lang-supported 'obj-c++' || return 1;
use cxx && use_if_iuse objc++
}
is_treelang ()
{
use_if_iuse boundschecking && return 1;
is_crosscompile && return 1;
gcc-lang-supported treelang || return 1;
return 0
}
list-paxables ()
{
file "$@" 2> /dev/null | grep -E 'ELF.*(executable|shared object)' | sed -e 's/: .*$//'
}
make_desktop_entry ()
{
[[ -z $1 ]] && die "make_desktop_entry: You must specify the executable";
local exec=${1};
local name=${2:-${PN}};
local icon=${3:-${PN}};
local type=${4};
local fields=${5};
if [[ -z ${type} ]]; then
local catmaj=${CATEGORY%%-*};
local catmin=${CATEGORY##*-};
case ${catmaj} in
app)
case ${catmin} in
accessibility)
type="Utility;Accessibility"
;;
admin)
type=System
;;
antivirus)
type=System
;;
arch)
type="Utility;Archiving"
;;
backup)
type="Utility;Archiving"
;;
cdr)
type="AudioVideo;DiscBurning"
;;
dicts)
type="Office;Dictionary"
;;
doc)
type=Documentation
;;
editors)
type="Utility;TextEditor"
;;
emacs)
type="Development;TextEditor"
;;
emulation)
type="System;Emulator"
;;
laptop)
type="Settings;HardwareSettings"
;;
office)
type=Office
;;
pda)
type="Office;PDA"
;;
vim)
type="Development;TextEditor"
;;
xemacs)
type="Development;TextEditor"
;;
esac
;;
dev)
type="Development"
;;
games)
case ${catmin} in
action | fps)
type=ActionGame
;;
arcade)
type=ArcadeGame
;;
board)
type=BoardGame
;;
emulation)
type=Emulator
;;
kids)
type=KidsGame
;;
puzzle)
type=LogicGame
;;
roguelike)
type=RolePlaying
;;
rpg)
type=RolePlaying
;;
simulation)
type=Simulation
;;
sports)
type=SportsGame
;;
strategy)
type=StrategyGame
;;
esac;
type="Game;${type}"
;;
gnome)
type="Gnome;GTK"
;;
kde)
type="KDE;Qt"
;;
mail)
type="Network;Email"
;;
media)
case ${catmin} in
gfx)
type=Graphics
;;
*)
case ${catmin} in
radio)
type=Tuner
;;
sound)
type=Audio
;;
tv)
type=TV
;;
video)
type=Video
;;
esac;
type="AudioVideo;${type}"
;;
esac
;;
net)
case ${catmin} in
dialup)
type=Dialup
;;
ftp)
type=FileTransfer
;;
im)
type=InstantMessaging
;;
irc)
type=IRCClient
;;
mail)
type=Email
;;
news)
type=News
;;
nntp)
type=News
;;
p2p)
type=FileTransfer
;;
voip)
type=Telephony
;;
esac;
type="Network;${type}"
;;
sci)
case ${catmin} in
astro*)
type=Astronomy
;;
bio*)
type=Biology
;;
calc*)
type=Calculator
;;
chem*)
type=Chemistry
;;
elec*)
type=Electronics
;;
geo*)
type=Geology
;;
math*)
type=Math
;;
physics)
type=Physics
;;
visual*)
type=DataVisualization
;;
esac;
type="Education;Science;${type}"
;;
sys)
type="System"
;;
www)
case ${catmin} in
client)
type=WebBrowser
;;
esac;
type="Network;${type}"
;;
*)
type=
;;
esac;
fi;
if [ "${SLOT}" == "0" ]; then
local desktop_name="${PN}";
else
local desktop_name="${PN}-${SLOT}";
fi;
local desktop="${T}/$(echo ${exec} | sed 's:[[:space:]/:]:_:g')-${desktop_name}.desktop";
type=${type%;}${type:+;};
eshopts_push -s extglob;
if [[ -n ${icon} && ${icon} != /* ]] && [[ ${icon} == *.xpm || ${icon} == *.png || ${icon} == *.svg ]]; then
ewarn "As described in the Icon Theme Specification, icon file extensions are not";
ewarn "allowed in .desktop files if the value is not an absolute path.";
icon=${icon%.@(xpm|png|svg)};
fi;
eshopts_pop;
cat > "${desktop}" <<-EOF
[Desktop Entry]
Name=${name}
Type=Application
Comment=${DESCRIPTION}
Exec=${exec}
TryExec=${exec%% *}
Icon=${icon}
Categories=${type}
EOF
if [[ ${fields:-=} != *=* ]]; then
ewarn "make_desktop_entry: update your 5th arg to read Path=${fields}";
fields="Path=${fields}";
fi;
[[ -n ${fields} ]] && printf '%b\n' "${fields}" >> "${desktop}";
( insinto /usr/share/applications;
doins "${desktop}" ) || die "installing desktop file failed"
}
make_gcc_hard ()
{
local gcc_hard_flags="-DEFAULT_RELRO -DEFAULT_BIND_NOW";
if hardened_gcc_works; then
einfo "Updating gcc to use automatic PIE + SSP building ...";
gcc_hard_flags+=" -DEFAULT_PIE_SSP";
else
if 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";
else
if 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
ewarn "hardened is not supported for this arch in this gcc version";
ebeep;
return 0;
fi;
fi;
fi;
sed -i -e "/^HARD_CFLAGS = /s|=|= ${gcc_hard_flags} |" "${S}"/gcc/Makefile.in || die;
BRANDING_GCC_PKGVERSION=${BRANDING_GCC_PKGVERSION/Gentoo/Gentoo Hardened}
}
make_session_desktop ()
{
[[ -z $1 ]] && eerror "$0: You must specify the title" && return 1;
[[ -z $2 ]] && eerror "$0: You must specify the command" && return 1;
local title=$1;
local command=$2;
local desktop=${T}/${wm:-${PN}}.desktop;
shift 2;
cat > "${desktop}" <<-EOF
[Desktop Entry]
Name=${title}
Comment=This session logs you into ${title}
Exec=${command} $*
TryExec=${command}
Type=XSession
EOF
( insinto /usr/share/xsessions;
doins "${desktop}" )
}
make_wrapper ()
{
local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5;
local tmpwrapper=$(emktemp);
( echo '#!/bin/sh';
[[ -n ${chdir} ]] && printf 'cd "%s"\n' "${chdir}";
if [[ -n ${libdir} ]]; then
cat <<-EOF
if [ "\${LD_LIBRARY_PATH+set}" = "set" ] ; then
export LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}:${libdir}"
else
export LD_LIBRARY_PATH="${libdir}"
fi
EOF
fi
printf 'exec %s "$@"\n' "${bin}" ) > "${tmpwrapper}";
chmod go+rx "${tmpwrapper}";
if [[ -n ${path} ]]; then
( exeinto "${path}";
newexe "${tmpwrapper}" "${wrapper}" ) || die;
else
newbin "${tmpwrapper}" "${wrapper}" || die;
fi
}
multilib_env ()
{
local CTARGET=${1:-${CTARGET}};
case ${CTARGET} in
x86_64*)
export CFLAGS_x86=${CFLAGS_x86--m32};
export CHOST_x86=${CTARGET/x86_64/i686};
CHOST_x86=${CHOST_x86/%-gnux32/-gnu};
export CTARGET_x86=${CHOST_x86};
if [[ ${SYMLINK_LIB} == "yes" ]]; then
export LIBDIR_x86="lib32";
else
export LIBDIR_x86="lib";
fi;
export CFLAGS_amd64=${CFLAGS_amd64--m64};
export CHOST_amd64=${CTARGET/%-gnux32/-gnu};
export CTARGET_amd64=${CHOST_amd64};
export LIBDIR_amd64="lib64";
export CFLAGS_x32=${CFLAGS_x32--mx32};
export CHOST_x32=${CTARGET/%-gnu/-gnux32};
export CTARGET_x32=${CHOST_x32};
export LIBDIR_x32="libx32";
case ${CTARGET} in
*-gnux32)
: ${MULTILIB_ABIS=x32 amd64 x86};
: ${DEFAULT_ABI=x32}
;;
*)
: ${MULTILIB_ABIS=amd64 x86};
: ${DEFAULT_ABI=amd64}
;;
esac
;;
mips64*)
export CFLAGS_o32=${CFLAGS_o32--mabi=32};
export CHOST_o32=${CTARGET/mips64/mips};
export CTARGET_o32=${CHOST_o32};
export LIBDIR_o32="lib";
export CFLAGS_n32=${CFLAGS_n32--mabi=n32};
export CHOST_n32=${CTARGET};
export CTARGET_n32=${CHOST_n32};
export LIBDIR_n32="lib32";
export CFLAGS_n64=${CFLAGS_n64--mabi=64};
export CHOST_n64=${CTARGET};
export CTARGET_n64=${CHOST_n64};
export LIBDIR_n64="lib64";
: ${MULTILIB_ABIS=n64 n32 o32};
: ${DEFAULT_ABI=n32}
;;
powerpc64*)
export CFLAGS_ppc=${CFLAGS_ppc--m32};
export CHOST_ppc=${CTARGET/powerpc64/powerpc};
export CTARGET_ppc=${CHOST_ppc};
export LIBDIR_ppc="lib";
export CFLAGS_ppc64=${CFLAGS_ppc64--m64};
export CHOST_ppc64=${CTARGET};
export CTARGET_ppc64=${CHOST_ppc64};
export LIBDIR_ppc64="lib64";
: ${MULTILIB_ABIS=ppc64 ppc};
: ${DEFAULT_ABI=ppc64}
;;
s390x*)
export CFLAGS_s390=${CFLAGS_s390--m31};
export CHOST_s390=${CTARGET/s390x/s390};
export CTARGET_s390=${CHOST_s390};
export LIBDIR_s390="lib";
export CFLAGS_s390x=${CFLAGS_s390x--m64};
export CHOST_s390x=${CTARGET};
export CTARGET_s390x=${CHOST_s390x};
export LIBDIR_s390x="lib64";
: ${MULTILIB_ABIS=s390x s390};
: ${DEFAULT_ABI=s390x}
;;
sparc64*)
export CFLAGS_sparc32=${CFLAGS_sparc32--m32};
export CHOST_sparc32=${CTARGET/sparc64/sparc};
export CTARGET_sparc32=${CHOST_sparc32};
export LIBDIR_sparc32="lib";
export CFLAGS_sparc64=${CFLAGS_sparc64--m64};
export CHOST_sparc64=${CTARGET};
export CTARGET_sparc64=${CHOST_sparc64};
export LIBDIR_sparc64="lib64";
: ${MULTILIB_ABIS=sparc64 sparc32};
: ${DEFAULT_ABI=sparc64}
;;
*)
: ${MULTILIB_ABIS=default};
: ${DEFAULT_ABI=default}
;;
esac;
export MULTILIB_ABIS DEFAULT_ABI
}
multilib_toolchain_setup ()
{
local v vv;
export ABI=$1;
if [[ ${__DEFAULT_ABI_SAVED} == "true" ]]; then
for v in CHOST CBUILD AS CC CXX LD PKG_CONFIG_{LIBDIR,PATH};
do
vv="__abi_saved_${v}";
export ${v}="${!vv}";
unset ${vv};
done;
unset __DEFAULT_ABI_SAVED;
fi;
if [[ ${ABI} != ${DEFAULT_ABI} ]]; then
for v in CHOST CBUILD AS CC CXX LD PKG_CONFIG_{LIBDIR,PATH};
do
export __abi_saved_${v}="${!v}";
done;
export __DEFAULT_ABI_SAVED="true";
export CHOST=$(get_abi_CHOST ${DEFAULT_ABI});
export CC="$(tc-getCC) $(get_abi_CFLAGS)";
export CXX="$(tc-getCXX) $(get_abi_CFLAGS)";
export LD="$(tc-getLD) $(get_abi_LDFLAGS)";
export CHOST=$(get_abi_CHOST $1);
export CBUILD=$(get_abi_CHOST $1);
export PKG_CONFIG_LIBDIR=${EPREFIX}/usr/$(get_libdir)/pkgconfig;
export PKG_CONFIG_PATH=${EPREFIX}/usr/share/pkgconfig;
fi
}
newicon ()
{
_iconins ${FUNCNAME} "$@"
}
newmenu ()
{
( insinto /usr/share/applications;
newins "$@" )
}
no-as-needed ()
{
case $($(tc-getLD) -v 2>&1 </dev/null) in
*GNU*)
echo "-Wl,--no-as-needed"
;;
esac
}
number_abis ()
{
set -- `get_install_abis`;
echo $#
}
path_exists ()
{
local opt=$1;
[[ ${opt} == -[ao] ]] && shift || opt="-a";
[[ $# -eq 0 ]] && return 1;
local p r=0;
for p in "$@";
do
[[ -e ${p} ]];
: $(( r += $? ));
done;
case ${opt} in
-a)
return $(( r != 0 ))
;;
-o)
return $(( r == $# ))
;;
esac
}
pax-mark ()
{
local f;
local flags;
local pt_fail=0 pt_failures="";
local xt_fail=0 xt_failures="";
local ret=0;
flags="${1//[!zPpEeMmRrSs]}";
[[ -n "${flags}" ]] || return 0;
shift;
local dodefault="";
[[ -n "${flags//[!z]}" ]] && dodefault="yes";
if has PT ${PAX_MARKINGS}; then
if type -p paxctl > /dev/null; then
einfo "PT PaX marking -${flags} with paxctl";
_pax_list_files einfo "$@";
for f in "$@";
do
paxctl -q${flags} "${f}" && continue;
paxctl -qC${flags} "${f}" && continue;
paxctl -qc${flags} "${f}" && continue;
pt_fail=1;
pt_failures="${pt_failures} ${f}";
done;
else
if type -p paxctl-ng > /dev/null && paxctl-ng -L; then
einfo "PT PaX marking -${flags} with paxctl-ng";
flags="${flags//z}";
_pax_list_files einfo "$@";
for f in "$@";
do
[[ ${dodefault} == "yes" ]] && paxctl-ng -L -z "${f}";
[[ -n "${flags}" ]] || continue;
paxctl-ng -L -${flags} "${f}" && continue;
pt_fail=1;
pt_failures="${pt_failures} ${f}";
done;
else
if type -p scanelf > /dev/null && [[ ${PAX_MARKINGS} != "none" ]]; then
einfo "Fallback PaX marking -${flags} with scanelf";
_pax_list_files einfo "$@";
scanelf -Xxz ${flags} "$@";
else
if [[ ${PAX_MARKINGS} != "none" ]]; then
pt_failures="$*";
pt_fail=1;
fi;
fi;
fi;
fi;
if [[ ${pt_fail} == 1 ]]; then
elog "Failed to set PT_PAX markings -${flags} for:";
_pax_list_files elog ${pt_failures};
ret=1;
fi;
fi;
if has XT ${PAX_MARKINGS}; then
flags="${flags//z}";
if type -p paxctl-ng > /dev/null && paxctl-ng -l; then
einfo "XT PaX marking -${flags} with paxctl-ng";
_pax_list_files einfo "$@";
for f in "$@";
do
[[ ${dodefault} == "yes" ]] && paxctl-ng -d "${f}";
[[ -n "${flags}" ]] || continue;
paxctl-ng -l -${flags} "${f}" && continue;
xt_fail=1;
xt_failures="${tx_failures} ${f}";
done;
else
if type -p setfattr > /dev/null; then
[[ -n "${flags//[!Ee]}" ]] || flags+="e";
einfo "XT PaX marking -${flags} with setfattr";
_pax_list_files einfo "$@";
for f in "$@";
do
[[ ${dodefault} == "yes" ]] && setfattr -x "user.pax.flags" "${f}";
setfattr -n "user.pax.flags" -v "${flags}" "${f}" && continue;
xt_fail=1;
xt_failures="${tx_failures} ${f}";
done;
else
if [[ ${PAX_MARKINGS} != "none" ]]; then
xt_failures="$*";
xt_fail=1;
fi;
fi;
fi;
if [[ ${xt_fail} == 1 ]]; then
elog "Failed to set XATTR_PAX markings -${flags} for:";
_pax_list_files elog ${xt_failures};
ret=1;
fi;
fi;
return ${ret}
}
pkg_nofetch ()
{
__eapi0_pkg_nofetch "$@"
}
pkg_postinst ()
{
toolchain_pkg_postinst "$@"
}
pkg_postrm ()
{
toolchain_pkg_postrm "$@"
}
pkg_setup ()
{
toolchain_pkg_setup;
ewarn;
ewarn "LTO support is still experimental and unstable.";
ewarn "Any bugs resulting from the use of LTO will not be fixed.";
ewarn
}
preserve_old_lib ()
{
if [[ ${EBUILD_PHASE} != "preinst" ]]; then
eerror "preserve_old_lib() must be called from pkg_preinst() only";
die "Invalid preserve_old_lib() usage";
fi;
[[ -z $1 ]] && die "Usage: preserve_old_lib <library to preserve> [more libraries to preserve]";
has preserve-libs ${FEATURES} && return 0;
local lib dir;
for lib in "$@";
do
[[ -e ${ROOT}/${lib} ]] || continue;
dir=${lib%/*};
dodir ${dir} || die "dodir ${dir} failed";
cp "${ROOT}"/${lib} "${D}"/${lib} || die "cp ${lib} failed";
touch "${D}"/${lib};
done
}
preserve_old_lib_notify ()
{
if [[ ${EBUILD_PHASE} != "postinst" ]]; then
eerror "preserve_old_lib_notify() must be called from pkg_postinst() only";
die "Invalid preserve_old_lib_notify() usage";
fi;
has preserve-libs ${FEATURES} && return 0;
local lib notice=0;
for lib in "$@";
do
[[ -e ${ROOT}/${lib} ]] || continue;
if [[ ${notice} -eq 0 ]]; then
notice=1;
ewarn "Old versions of installed libraries were detected on your system.";
ewarn "In order to avoid breaking packages that depend on these old libs,";
ewarn "the libraries are not being removed. You need to run revdep-rebuild";
ewarn "in order to remove these old dependencies. If you do not have this";
ewarn "helper program, simply emerge the 'gentoolkit' package.";
ewarn;
fi;
ewarn " # revdep-rebuild --library '${lib}' && rm '${lib}'";
done
}
prune_libtool_files ()
{
debug-print-function ${FUNCNAME} "$@";
local removing_all removing_modules opt;
for opt in "$@";
do
case "${opt}" in
--all)
removing_all=1;
removing_modules=1
;;
--modules)
removing_modules=1
;;
*)
die "Invalid argument to ${FUNCNAME}(): ${opt}"
;;
esac;
done;
local f;
local queue=();
while IFS= read -r -d '' f; do
local archivefile=${f/%.la/.a};
[[ ${f} != ${archivefile} ]] || die 'regex sanity check failed';
local reason pkgconfig_scanned;
if grep -q '^shouldnotlink=yes$' "${f}"; then
if [[ -f ${archivefile} ]]; then
einfo "Removing unnecessary ${archivefile#${D%/}} (static plugin)";
queue+=("${archivefile}");
fi;
if [[ -n ${removing_modules} ]]; then
reason='module';
fi;
else
if [[ -n ${removing_all} ]]; then
reason='requested';
else
if [[ ! -f ${archivefile} ]]; then
reason='no static archive';
else
if [[ ! -n $(sed -nre "s/^(dependency_libs|inherited_linker_flags)='(.*)'$/\2/p" "${f}") ]]; then
reason='no libs & flags';
else
if [[ ! -n ${pkgconfig_scanned} ]]; then
local pc_libs=();
if [[ ! -n ${removing_all} ]]; then
local pc;
local tf=${T}/prune-lt-files.pc;
local pkgconf=$(tc-getPKG_CONFIG);
while IFS= read -r -d '' pc; do
local arg libs;
if ${pkgconf} --exists "${pc}" &>/dev/null; then
sed -e '/^Requires:/d' "${pc}" > "${tf}";
libs=$(${pkgconf} --libs "${tf}");
else
libs=$(sed -ne 's/^Libs://p' "${pc}");
fi;
for arg in ${libs};
do
if [[ ${arg} == -l* ]]; then
if [[ ${arg} == '*$*' ]]; then
eqawarn "${FUNCNAME}: variable substitution likely failed in ${pc}";
eqawarn "(arg: ${arg})";
eqawarn "Most likely, you need to add virtual/pkgconfig to DEPEND.";
fi;
pc_libs+=(lib${arg#-l}.la);
fi;
done;
done < <(find "${D}" -type f -name '*.pc' -print0);
rm -f "${tf}";
fi;
pkgconfig_scanned=1;
fi;
has "${f##*/}" "${pc_libs[@]}" && reason='covered by .pc';
fi;
fi;
fi;
fi;
if [[ -n ${reason} ]]; then
einfo "Removing unnecessary ${f#${D%/}} (${reason})";
queue+=("${f}");
fi;
done < <(find "${D}" -xtype f -name '*.la' -print0);
if [[ -n ${queue[@]} ]]; then
rm -f "${queue[@]}";
fi
}
raw-ldflags ()
{
local x input="$@";
[[ -z ${input} ]] && input=${LDFLAGS};
set --;
for x in ${input};
do
case ${x} in
-Wl,*)
x=${x#-Wl,};
set -- "$@" ${x//,/ }
;;
*)
;;
esac;
done;
echo "$@"
}
replace-cpu-flags ()
{
local newcpu="$#";
newcpu="${!newcpu}";
while [ $# -gt 1 ]; do
replace-flags "-march=${1}" "-march=${newcpu}";
replace-flags "-mcpu=${1}" "-mcpu=${newcpu}";
replace-flags "-mtune=${1}" "-mtune=${newcpu}";
shift;
done;
return 0
}
replace-flags ()
{
[[ $# != 2 ]] && die "Usage: replace-flags <old flag> <new flag>";
local f var new;
for var in $(all-flag-vars);
do
new=();
for f in ${!var};
do
[[ ${f} == ${1} ]] && f=${2};
new+=("${f}");
done;
eval export ${var}=\""${new[*]}"\";
done;
return 0
}
replace-sparc64-flags ()
{
local SPARC64_CPUS="ultrasparc3 ultrasparc v9";
if [ "${CFLAGS/mtune}" != "${CFLAGS}" ]; then
for x in ${SPARC64_CPUS};
do
CFLAGS="${CFLAGS/-mcpu=${x}/-mcpu=v8}";
done;
else
for x in ${SPARC64_CPUS};
do
CFLAGS="${CFLAGS/-mcpu=${x}/-mcpu=v8 -mtune=${x}}";
done;
fi;
if [ "${CXXFLAGS/mtune}" != "${CXXFLAGS}" ]; then
for x in ${SPARC64_CPUS};
do
CXXFLAGS="${CXXFLAGS/-mcpu=${x}/-mcpu=v8}";
done;
else
for x in ${SPARC64_CPUS};
do
CXXFLAGS="${CXXFLAGS/-mcpu=${x}/-mcpu=v8 -mtune=${x}}";
done;
fi;
export CFLAGS CXXFLAGS
}
replace_all_version_separators ()
{
local c=($(get_all_version_components "${2:-${PV}}"));
c=${c[@]//[-._]/$1};
echo ${c// }
}
replace_version_separator ()
{
eshopts_push -s extglob;
local w c v="${3:-${PV}}";
declare -i i found=0;
w=${1:-1};
c=($(get_all_version_components ${v}));
if [[ ${w} != *[[:digit:]]* ]]; then
for ((i = 0; i < ${#c[@]}; i++))
do
if [[ ${c[i]} == ${w} ]]; then
c[i]=${2};
break;
fi;
done;
else
for ((i = 0; i < ${#c[@]}; i++))
do
if [[ -n "${c[i]//[^-._]}" ]]; then
found+=1;
if ((found == w)); then
c[i]=${2};
break;
fi;
fi;
done;
fi;
c=${c[*]};
echo ${c// };
eshopts_pop
}
setup-allowed-flags ()
{
ALLOWED_FLAGS="-pipe";
ALLOWED_FLAGS+=" -O -O1 -O2 -Os -mcpu -march -mtune";
ALLOWED_FLAGS+=" -fstack-protector -fstack-protector-all";
ALLOWED_FLAGS+=" -fbounds-checking -fno-strict-overflow";
ALLOWED_FLAGS+=" -fno-PIE -fno-pie -fno-unit-at-a-time";
ALLOWED_FLAGS+=" -g -g[0-9] -ggdb -ggdb[0-9] -gstabs -gstabs+";
ALLOWED_FLAGS+=" -fno-ident -fpermissive";
ALLOWED_FLAGS+=" -W* -w";
ALLOWED_FLAGS+=" -fno-stack-protector -fno-stack-protector-all -fno-strict-aliasing -fno-bounds-checking -fstrict-overflow -fno-omit-frame-pointer";
ALLOWED_FLAGS+=" -mregparm -mno-app-regs -mapp-regs -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-ssse3 -mno-sse4 -mno-sse4.1 -mno-sse4.2 -mno-avx -mno-aes -mno-pclmul -mno-sse4a -mno-3dnow -mno-popcnt -mno-abm -mips1 -mips2 -mips3 -mips4 -mips32 -mips64 -mips16 -mplt -msoft-float -mno-soft-float -mhard-float -mno-hard-float -mfpu -mieee -mieee-with-inexact -mschedule -mfloat-gprs -mspe -mno-spe -mtls-direct-seg-refs -mno-tls-direct-seg-refs -mflat -mno-flat -mno-faster-structs -mfaster-structs -m32 -m64 -mx32 -mabi -mlittle-endian -mbig-endian -EL -EB -fPIC -mlive-g0 -mcmodel -mstack-bias -mno-stack-bias -msecure-plt -m*-toc -mfloat-abi -D* -U*";
ALLOWED_FLAGS+=" -mno-fma4 -mno-movbe -mno-xop -mno-lwp";
ALLOWED_FLAGS+=" -mno-fsgsbase -mno-rdrnd -mno-f16c -mno-bmi -mno-tbm";
ALLOWED_FLAGS+=" -mno-avx2 -mno-bmi2 -mno-fma -mno-lzcnt";
ALLOWED_FLAGS+=" -I* -L* -R* -Wl,*";
export ALLOWED_FLAGS;
return 0
}
setup_minispecs_gcc_build_specs ()
{
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
}
setup_multilib_osdirnames ()
{
is_multilib || return 0;
local config;
local libdirs="../lib64 ../lib32";
case ${CTARGET} in
x86_64*-linux*)
config="i386"
;;
powerpc64*-linux*)
config="rs6000"
;;
sparc64*-linux*)
config="sparc"
;;
s390x*-linux*)
config="s390"
;;
*)
return 0
;;
esac;
config+="/t-linux64";
local sed_args=();
if tc_version_is_at_least 4.6; then
sed_args+=(-e 's:$[(]call if_multiarch[^)]*[)]::g');
fi;
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;
else
einfo "using upstream multilib; disabling lib32 autodetection";
sed_args+=(-r -e 's:[$][(]if.*,(.*)[)]:\1:');
fi;
sed -i "${sed_args[@]}" "${S}"/gcc/config/${config} || die
}
should_we_gcc_config ()
{
local curr_config;
curr_config=$(env -i ROOT="${ROOT}" gcc-config -c ${CTARGET} 2>&1) || return 0;
local curr_config_ver=$(env -i ROOT="${ROOT}" gcc-config -S ${curr_config} | awk '{print $2}');
local curr_branch_ver=$(get_version_component_range 1-2 ${curr_config_ver});
use multislot && return $([[ ${curr_config_ver} == ${GCC_CONFIG_VER} ]]);
if [[ ${curr_branch_ver} == ${GCC_BRANCH_VER} ]]; then
return 0;
else
if [[ ${EBUILD_PHASE} == *"inst" ]]; then
einfo "The current gcc config appears valid, so it will not be";
einfo "automatically switched for you. If you would like to";
einfo "switch to the newly installed gcc version, do the";
einfo "following:";
echo;
einfo "gcc-config ${CTARGET}-${GCC_CONFIG_VER}";
einfo "source /etc/profile";
echo;
fi;
return 1;
fi
}
src_compile ()
{
toolchain_src_compile "$@"
}
src_install ()
{
toolchain_src_install "$@"
}
src_test ()
{
toolchain_src_test "$@"
}
src_unpack ()
{
if has_version '<sys-libs/glibc-2.12'; then
ewarn "Your host glibc is too old; disabling automatic fortify.";
ewarn "Please rebuild gcc after upgrading to >=glibc-2.12 #362315";
EPATCH_EXCLUDE+=" 10_all_default-fortify-source.patch";
fi;
toolchain_src_unpack;
use vanilla && return 0;
[[ ${CHOST} == ${CTARGET} ]] && epatch "${FILESDIR}"/gcc-spec-env.patch
}
strip-flags ()
{
local x y var;
setup-allowed-flags;
set -f;
for var in $(all-flag-vars);
do
local new=();
for x in ${!var};
do
local flag=${x%%=*};
for y in ${ALLOWED_FLAGS};
do
if [[ -z ${flag%%${y}} ]]; then
new+=("${x}");
break;
fi;
done;
done;
if _is_flagq ${var} "-O*" && ! _is_flagq new "-O*"; then
new+=(-O2);
fi;
eval export ${var}=\""${new[*]}"\";
done;
set +f;
return 0
}
strip-linguas ()
{
local ls newls nols;
if [[ $1 == "-i" ]] || [[ $1 == "-u" ]]; then
local op=$1;
shift;
ls=$(find "$1" -name '*.po' -exec basename {} .po ';');
shift;
local d f;
for d in "$@";
do
if [[ ${op} == "-u" ]]; then
newls=${ls};
else
newls="";
fi;
for f in $(find "$d" -name '*.po' -exec basename {} .po ';');
do
if [[ ${op} == "-i" ]]; then
has ${f} ${ls} && newls="${newls} ${f}";
else
has ${f} ${ls} || newls="${newls} ${f}";
fi;
done;
ls=${newls};
done;
else
ls="$@";
fi;
nols="";
newls="";
for f in ${LINGUAS};
do
if has ${f} ${ls}; then
newls="${newls} ${f}";
else
nols="${nols} ${f}";
fi;
done;
[[ -n ${nols} ]] && einfo "Sorry, but ${PN} does not support the LINGUAS:" ${nols};
export LINGUAS=${newls:1}
}
strip-unsupported-flags ()
{
export CFLAGS=$(test-flags-CC ${CFLAGS});
export CXXFLAGS=$(test-flags-CXX ${CXXFLAGS});
export FFLAGS=$(test-flags-F77 ${FFLAGS});
export FCFLAGS=$(test-flags-FC ${FCFLAGS})
}
tc-arch ()
{
tc-ninja_magic_to_arch portage "$@"
}
tc-arch-kernel ()
{
tc-ninja_magic_to_arch kern "$@"
}
tc-endian ()
{
local host=$1;
[[ -z ${host} ]] && host=${CTARGET:-${CHOST}};
host=${host%%-*};
case ${host} in
aarch64*be)
echo big
;;
aarch64)
echo little
;;
alpha*)
echo big
;;
arm*b*)
echo big
;;
arm*)
echo little
;;
cris*)
echo little
;;
hppa*)
echo big
;;
i?86*)
echo little
;;
ia64*)
echo little
;;
m68*)
echo big
;;
mips*l*)
echo little
;;
mips*)
echo big
;;
powerpc*)
echo big
;;
s390*)
echo big
;;
sh*b*)
echo big
;;
sh*)
echo little
;;
sparc*)
echo big
;;
x86_64*)
echo little
;;
*)
echo wtf
;;
esac
}
tc-env_build ()
{
tc-export_build_env;
CFLAGS=${BUILD_CFLAGS} CXXFLAGS=${BUILD_CXXFLAGS} CPPFLAGS=${BUILD_CPPFLAGS} LDFLAGS=${BUILD_LDFLAGS} AR=$(tc-getBUILD_AR) AS=$(tc-getBUILD_AS) CC=$(tc-getBUILD_CC) CPP=$(tc-getBUILD_CPP) CXX=$(tc-getBUILD_CXX) LD=$(tc-getBUILD_LD) NM=$(tc-getBUILD_NM) PKG_CONFIG=$(tc-getBUILD_PKG_CONFIG) RANLIB=$(tc-getBUILD_RANLIB) "$@"
}
tc-export ()
{
local var;
for var in "$@";
do
[[ $(type -t tc-get${var}) != "function" ]] && die "tc-export: invalid export variable '${var}'";
eval tc-get${var} > /dev/null;
done
}
tc-export_build_env ()
{
tc-export "$@";
: ${BUILD_CFLAGS:=-O1 -pipe};
: ${BUILD_CXXFLAGS:=-O1 -pipe};
: ${BUILD_CPPFLAGS:=};
: ${BUILD_LDFLAGS:=};
export BUILD_{C,CXX,CPP,LD}FLAGS
}
tc-getAR ()
{
tc-getPROG AR ar "$@"
}
tc-getAS ()
{
tc-getPROG AS as "$@"
}
tc-getBUILD_AR ()
{
tc-getBUILD_PROG AR ar "$@"
}
tc-getBUILD_AS ()
{
tc-getBUILD_PROG AS as "$@"
}
tc-getBUILD_CC ()
{
tc-getBUILD_PROG CC gcc "$@"
}
tc-getBUILD_CPP ()
{
tc-getBUILD_PROG CPP cpp "$@"
}
tc-getBUILD_CXX ()
{
tc-getBUILD_PROG CXX g++ "$@"
}
tc-getBUILD_LD ()
{
tc-getBUILD_PROG LD ld "$@"
}
tc-getBUILD_NM ()
{
tc-getBUILD_PROG NM nm "$@"
}
tc-getBUILD_OBJCOPY ()
{
tc-getBUILD_PROG OBJCOPY objcopy "$@"
}
tc-getBUILD_PKG_CONFIG ()
{
tc-getBUILD_PROG PKG_CONFIG pkg-config "$@"
}
tc-getBUILD_PROG ()
{
_tc-getPROG CBUILD "BUILD_$1 $1_FOR_BUILD HOST$1" "${@:2}"
}
tc-getBUILD_RANLIB ()
{
tc-getBUILD_PROG RANLIB ranlib "$@"
}
tc-getBUILD_STRIP ()
{
tc-getBUILD_PROG STRIP strip "$@"
}
tc-getCC ()
{
tc-getPROG CC gcc "$@"
}
tc-getCPP ()
{
tc-getPROG CPP cpp "$@"
}
tc-getCXX ()
{
tc-getPROG CXX g++ "$@"
}
tc-getDLLWRAP ()
{
tc-getPROG DLLWRAP dllwrap "$@"
}
tc-getF77 ()
{
tc-getPROG F77 gfortran "$@"
}
tc-getFC ()
{
tc-getPROG FC gfortran "$@"
}
tc-getGCJ ()
{
tc-getPROG GCJ gcj "$@"
}
tc-getLD ()
{
tc-getPROG LD ld "$@"
}
tc-getNM ()
{
tc-getPROG NM nm "$@"
}
tc-getOBJCOPY ()
{
tc-getPROG OBJCOPY objcopy "$@"
}
tc-getPKG_CONFIG ()
{
tc-getPROG PKG_CONFIG pkg-config "$@"
}
tc-getPROG ()
{
_tc-getPROG CHOST "$@"
}
tc-getRANLIB ()
{
tc-getPROG RANLIB ranlib "$@"
}
tc-getRC ()
{
tc-getPROG RC windres "$@"
}
tc-getSTRIP ()
{
tc-getPROG STRIP strip "$@"
}
tc-has-openmp ()
{
local base="${T}/test-tc-openmp";
cat > "${base}.c" <<-EOF
#include <omp.h>
int main() {
int nthreads, tid, ret = 0;
#pragma omp parallel private(nthreads, tid)
{
tid = omp_get_thread_num();
nthreads = omp_get_num_threads(); ret += tid + nthreads;
}
return ret;
}
EOF
$(tc-getCC "$@") -fopenmp "${base}.c" -o "${base}" &>/dev/null;
local ret=$?;
rm -f "${base}"*;
return ${ret}
}
tc-has-tls ()
{
local base="${T}/test-tc-tls";
cat > "${base}.c" <<-EOF
int foo(int *i) {
static __thread int j = 0;
return *i ? j : *i;
}
EOF
local flags;
case $1 in
-s)
flags="-S"
;;
-c)
flags="-c"
;;
-l)
;;
-*)
die "Usage: tc-has-tls [-c|-l] [toolchain prefix]"
;;
esac;
: ${flags:=-fPIC -shared -Wl,-z,defs};
[[ $1 == -* ]] && shift;
$(tc-getCC "$@") ${flags} "${base}.c" -o "${base}" &>/dev/null;
local ret=$?;
rm -f "${base}"*;
return ${ret}
}
tc-is-cross-compiler ()
{
return $([[ ${CBUILD:-${CHOST}} != ${CHOST} ]])
}
tc-is-softfloat ()
{
local CTARGET=${CTARGET:-${CHOST}};
case ${CTARGET} in
bfin* | h8300*)
echo "only"
;;
*)
if [[ ${CTARGET//_/-} == *-softfloat-* ]]; then
echo "yes";
else
if [[ ${CTARGET//_/-} == *-softfp-* ]]; then
echo "softfp";
else
echo "no";
fi;
fi
;;
esac
}
tc-is-static-only ()
{
local host=${CTARGET:-${CHOST}};
return $([[ ${host} == *-mint* ]])
}
tc-ninja_magic_to_arch ()
{
function ninj ()
{
[[ ${type} == "kern" ]] && echo $1 || echo $2
};
local type=$1;
local host=$2;
[[ -z ${host} ]] && host=${CTARGET:-${CHOST}};
local KV=${KV:-${KV_FULL}};
[[ ${type} == "kern" ]] && [[ -z ${KV} ]] && ewarn "QA: Kernel version could not be determined, please inherit kernel-2 or linux-info";
case ${host} in
aarch64*)
ninj arm64 arm
;;
alpha*)
echo alpha
;;
arm*)
echo arm
;;
avr*)
ninj avr32 avr
;;
bfin*)
ninj blackfin bfin
;;
cris*)
echo cris
;;
hppa*)
ninj parisc hppa
;;
i?86*)
if [[ ${type} == "kern" ]] && [[ $(KV_to_int ${KV}) -lt $(KV_to_int 2.6.24) || ${host} == *freebsd* ]]; then
echo i386;
else
echo x86;
fi
;;
ia64*)
echo ia64
;;
m68*)
echo m68k
;;
mips*)
echo mips
;;
nios2*)
echo nios2
;;
nios*)
echo nios
;;
powerpc*)
if [[ ${type} == "kern" ]] && [[ $(KV_to_int ${KV}) -ge $(KV_to_int 2.6.16) ]]; then
echo powerpc;
else
if [[ ${type} == "kern" ]] && [[ $(KV_to_int ${KV}) -eq $(KV_to_int 2.6.15) ]]; then
if [[ ${host} == powerpc64* ]] || [[ ${PROFILE_ARCH} == "ppc64" ]]; then
echo powerpc;
else
echo ppc;
fi;
else
if [[ ${host} == powerpc64* ]]; then
echo ppc64;
else
if [[ ${PROFILE_ARCH} == "ppc64" ]]; then
ninj ppc64 ppc;
else
echo ppc;
fi;
fi;
fi;
fi
;;
s390*)
echo s390
;;
sh64*)
ninj sh64 sh
;;
sh*)
echo sh
;;
sparc64*)
ninj sparc64 sparc
;;
sparc*)
[[ ${PROFILE_ARCH} == "sparc64" ]] && ninj sparc64 sparc || echo sparc
;;
vax*)
echo vax
;;
x86_64*freebsd*)
echo amd64
;;
x86_64*)
if [[ ${type} == "kern" ]] && [[ $(KV_to_int ${KV}) -ge $(KV_to_int 2.6.24) ]]; then
echo x86;
else
ninj x86_64 amd64;
fi
;;
*)
echo unknown
;;
esac
}
tc_version_is_at_least ()
{
version_is_at_least "$1" "${2:-${GCC_RELEASE_VER}}"
}
test-flag-CC ()
{
test-flag-PROG "CC" c "$1"
}
test-flag-CXX ()
{
test-flag-PROG "CXX" c++ "$1"
}
test-flag-F77 ()
{
test-flag-PROG "F77" f77 "$1"
}
test-flag-FC ()
{
test-flag-PROG "FC" f95 "$1"
}
test-flag-PROG ()
{
local comp=$1;
local lang=$2;
local flag=$3;
[[ -z ${comp} || -z ${flag} ]] && return 1;
local PROG=$(tc-get${comp});
if ${PROG} -c -o /dev/null -x${lang} - < /dev/null > /dev/null 2>&1; then
${PROG} "${flag}" -c -o /dev/null -x${lang} - < /dev/null > /dev/null 2>&1;
else
${PROG} "${flag}" -c -o /dev/null /dev/null > /dev/null 2>&1;
fi
}
test-flags ()
{
test-flags-CC "$@"
}
test-flags-CC ()
{
test-flags-PROG "CC" "$@"
}
test-flags-CXX ()
{
test-flags-PROG "CXX" "$@"
}
test-flags-F77 ()
{
test-flags-PROG "F77" "$@"
}
test-flags-FC ()
{
test-flags-PROG "FC" "$@"
}
test-flags-PROG ()
{
local comp=$1;
local flags=();
local x;
shift;
[[ -z ${comp} ]] && return 1;
for x in "$@";
do
test-flag-${comp} "${x}" && flags+=("${x}");
done;
echo "${flags[*]}";
[[ ${#flags[@]} -gt 0 ]]
}
test_version_info ()
{
if [[ $($(tc-getCC) --version 2>&1) == *$1* ]]; then
return 0;
else
return 1;
fi
}
toolchain_death_notice ()
{
pushd "${WORKDIR}"/build > /dev/null;
tar jcf gcc-build-logs.tar.bz2 $(find -name config.log);
eerror;
eerror "Please include ${PWD}/gcc-build-logs.tar.bz2 in your bug report";
eerror;
popd > /dev/null
}
toolchain_pkg_postinst ()
{
do_gcc_config;
if ! is_crosscompile; then
echo;
ewarn "If you have issues with packages unable to locate libstdc++.la,";
ewarn "then try running 'fix_libtool_files.sh' on the old gcc versions.";
echo;
ewarn "You might want to review the GCC upgrade guide when moving between";
ewarn "major versions (like 4.2 to 4.3):";
ewarn "http://www.gentoo.org/doc/en/gcc-upgrading.xml";
echo;
fi;
if ! is_crosscompile; then
rm -f "${ROOT}"/*/rcscripts/awk/fixlafiles.awk "${ROOT}"/sbin/fix_libtool_files.sh;
rmdir "${ROOT}"/*/rcscripts{/awk,} 2> /dev/null;
mkdir -p "${ROOT}"/usr/{share/gcc-data,sbin,bin};
cp "${ROOT}/${DATAPATH}"/fixlafiles.awk "${ROOT}"/usr/share/gcc-data/ || die;
cp "${ROOT}/${DATAPATH}"/fix_libtool_files.sh "${ROOT}"/usr/sbin/ || die;
cp "${ROOT}/${DATAPATH}"/c{89,99} "${ROOT}"/usr/bin/ 2> /dev/null;
fi
}
toolchain_pkg_postrm ()
{
if is_crosscompile; then
if [[ -z $(ls "${ROOT}"/etc/env.d/gcc/${CTARGET}* 2>/dev/null) ]]; then
rm -f "${ROOT}"/etc/env.d/gcc/config-${CTARGET};
rm -f "${ROOT}"/etc/env.d/??gcc-${CTARGET};
rm -f "${ROOT}"/usr/bin/${CTARGET}-{gcc,{g,c}++}{,32,64};
fi;
return 0;
fi;
[[ ${ROOT} != "/" ]] && return 0;
if [[ ! -e ${LIBPATH}/libstdc++.so ]]; then
do_gcc_config;
einfo "Running 'fix_libtool_files.sh ${GCC_RELEASE_VER}'";
/usr/sbin/fix_libtool_files.sh ${GCC_RELEASE_VER};
if [[ -n ${BRANCH_UPDATE} ]]; then
einfo "Running 'fix_libtool_files.sh ${GCC_RELEASE_VER}-${BRANCH_UPDATE}'";
/usr/sbin/fix_libtool_files.sh ${GCC_RELEASE_VER}-${BRANCH_UPDATE};
fi;
fi;
return 0
}
toolchain_pkg_setup ()
{
if [[ -n ${PRERELEASE}${SNAPSHOT} || ${PV} == *9999* ]] && [[ -z ${I_PROMISE_TO_SUPPLY_PATCHES_WITH_BUGS} ]]; then
die "Please \`export I_PROMISE_TO_SUPPLY_PATCHES_WITH_BUGS=1\` or define it in your make.conf if you want to use this version." "This is to try and cut down on people filing bugs for a compiler we do not currently support.";
fi;
unset GCC_SPECS;
if ! use_if_iuse cxx; then
use_if_iuse go && ewarn 'Go requires a C++ compiler, disabled due to USE="-cxx"';
use_if_iuse objc++ && ewarn 'Obj-C++ requires a C++ compiler, disabled due to USE="-cxx"';
use_if_iuse gcj && ewarn 'GCJ requires a C++ compiler, disabled due to USE="-cxx"';
fi;
want_minispecs;
unset LANGUAGES
}
toolchain_src_compile ()
{
gcc_do_filter_flags;
einfo "CFLAGS=\"${CFLAGS}\"";
einfo "CXXFLAGS=\"${CXXFLAGS}\"";
export JAR=no;
if ! tc_version_is_at_least 4.4 && want_minispecs; then
setup_minispecs_gcc_build_specs;
fi;
mkdir -p "${WORKDIR}"/build;
pushd "${WORKDIR}"/build > /dev/null;
einfo "Configuring ${PN} ...";
gcc_do_configure;
touch "${S}"/gcc/c-gperf.h;
[[ ! -x /usr/bin/perl ]] && find "${WORKDIR}"/build -name '*.[17]' | xargs touch;
einfo "Compiling ${PN} ...";
gcc_do_make ${GCC_MAKE_TARGET};
popd > /dev/null
}
toolchain_src_install ()
{
local x=;
cd "${WORKDIR}"/build;
find gcc/include*/ -type l -delete;
mkdir -p gcc/doc;
cp "${S}"/gcc/doc/*.info* gcc/doc/ || die;
while read x; do
grep -q 'It has been auto-edited by fixincludes from' "${x}" && rm -f "${x}";
done < <(find gcc/include*/ -name '*.h');
S=${WORKDIR}/build emake -j1 DESTDIR="${D}" install || die;
find "${D}" -name install-tools -prune -type d -exec rm -rf "{}" \;;
find "${D}" -name libiberty.a -delete;
gcc_movelibs;
if ! is_crosscompile; then
local EXEEXT;
eval $(grep ^EXEEXT= "${WORKDIR}"/build/gcc/config.log);
[[ -r ${D}${BINPATH}/gcc${EXEEXT} ]] || die "gcc not found in ${D}";
fi;
dodir /etc/env.d/gcc;
create_gcc_env_entry;
if want_minispecs; then
copy_minispecs_gcc_specs;
fi;
gcc_slot_java;
dodir /usr/bin;
cd "${D}"${BINPATH};
for x in cpp gcc g++ c++ gcov g77 gcj gcjh gfortran gccgo;
do
[[ -f ${x} ]] && mv ${x} ${CTARGET}-${x};
if [[ -f ${CTARGET}-${x} ]]; then
if ! is_crosscompile; then
ln -sf ${CTARGET}-${x} ${x};
dosym ${BINPATH}/${CTARGET}-${x} /usr/bin/${x}-${GCC_CONFIG_VER};
fi;
dosym ${BINPATH}/${CTARGET}-${x} /usr/bin/${CTARGET}-${x}-${GCC_CONFIG_VER};
fi;
if [[ -f ${CTARGET}-${x}-${GCC_CONFIG_VER} ]]; then
rm -f ${CTARGET}-${x}-${GCC_CONFIG_VER};
ln -sf ${CTARGET}-${x} ${CTARGET}-${x}-${GCC_CONFIG_VER};
fi;
done;
env RESTRICT="" CHOST=${CHOST} prepstrip "${D}${BINPATH}";
env RESTRICT="" CHOST=${CTARGET} prepstrip "${D}${LIBPATH}";
[[ -d ${D}${PREFIX}/libexec/gcc ]] && env RESTRICT="" CHOST=${CHOST} prepstrip "${D}${PREFIX}/libexec/gcc/${CTARGET}/${GCC_CONFIG_VER}";
cd "${S}";
if is_crosscompile; then
rm -rf "${D}"/usr/share/{man,info};
rm -rf "${D}"${DATAPATH}/{man,info};
else
if tc_version_is_at_least 3.0; then
local cxx_mandir=$(find "${WORKDIR}/build/${CTARGET}/libstdc++-v3" -name man);
if [[ -d ${cxx_mandir} ]]; then
find "${cxx_mandir}" -name '*_build_*' -exec rm {} \;;
cp -r "${cxx_mandir}"/man? "${D}/${DATAPATH}"/man/;
fi;
fi;
has noinfo ${FEATURES} && rm -r "${D}/${DATAPATH}"/info || prepinfo "${DATAPATH}";
has noman ${FEATURES} && rm -r "${D}/${DATAPATH}"/man || prepman "${DATAPATH}";
fi;
find "${D}" -depth -type d -delete 2> /dev/null;
if use test; then
docinto testsuite;
find "${WORKDIR}"/build -type f -name "*.sum" -print0 | xargs -0 dodoc;
find "${WORKDIR}"/build -type f -path "*/testsuite/*.log" -print0 | xargs -0 dodoc;
fi;
if ! is_crosscompile; then
insinto "${DATAPATH}";
if tc_version_is_at_least 4.0; then
newins "${GCC_FILESDIR}"/awk/fixlafiles.awk-no_gcc_la fixlafiles.awk || die;
find "${D}/${LIBPATH}" -name libstdc++.la -type f -exec rm "{}" \;;
else
doins "${GCC_FILESDIR}"/awk/fixlafiles.awk || die;
fi;
exeinto "${DATAPATH}";
doexe "${GCC_FILESDIR}"/fix_libtool_files.sh || die;
doexe "${GCC_FILESDIR}"/c{89,99} || die;
fi;
chown -R root:0 "${D}"${LIBPATH} 2> /dev/null;
local py gdbdir=/usr/share/gdb/auto-load${LIBPATH/\/lib\//\/$(get_libdir)\/};
pushd "${D}"${LIBPATH} > /dev/null;
for py in $(find . -name '*-gdb.py');
do
local multidir=${py%/*};
insinto "${gdbdir}/${multidir}";
sed -i "/^libdir =/s:=.*:= '${LIBPATH}/${multidir}':" "${py}" || die;
doins "${py}" || die;
rm "${py}" || die;
done;
popd > /dev/null;
export QA_EXECSTACK="usr/lib*/go/*/*.gox";
export QA_WX_LOAD="usr/lib*/go/*/*.gox";
if tc_version_is_at_least 4.3; then
pax-mark -r "${D}${PREFIX}/libexec/gcc/${CTARGET}/${GCC_CONFIG_VER}/cc1";
pax-mark -r "${D}${PREFIX}/libexec/gcc/${CTARGET}/${GCC_CONFIG_VER}/cc1plus";
fi
}
toolchain_src_test ()
{
cd "${WORKDIR}"/build;
emake -k check || ewarn "check failed and that sucks :("
}
toolchain_src_unpack ()
{
[[ -z ${UCLIBC_VER} ]] && [[ ${CTARGET} == *-uclibc* ]] && die "Sorry, this version does not support uClibc";
if [[ ${PV} == *9999* ]]; then
git-2_src_unpack;
else
gcc_quick_unpack;
fi;
export BRANDING_GCC_PKGVERSION="Gentoo ${GCC_PVR}";
cd "${S}";
if ! use vanilla; then
if [[ -n ${PATCH_VER} ]]; then
guess_patch_type_in_dir "${WORKDIR}"/patch;
EPATCH_MULTI_MSG="Applying Gentoo patches ..." epatch "${WORKDIR}"/patch;
BRANDING_GCC_PKGVERSION="${BRANDING_GCC_PKGVERSION} p${PATCH_VER}";
fi;
if [[ -n ${UCLIBC_VER} ]]; then
guess_patch_type_in_dir "${WORKDIR}"/uclibc;
EPATCH_MULTI_MSG="Applying uClibc patches ..." epatch "${WORKDIR}"/uclibc;
fi;
fi;
do_gcc_HTB_patches;
do_gcc_PIE_patches;
epatch_user;
use hardened && make_gcc_hard;
if tc_version_is_at_least 4.5 && ! tc_version_is_at_least 4.7; then
sed -i '/^pythondir =/s:=.*:= $(datadir)/python:' "${S}"/libstdc++-v3/python/Makefile.in || die;
fi;
find "${S}" -name Makefile.in -exec sed -i '/^pkgconfigdir/s:=.*:=$(toolexeclibdir)/pkgconfig:' {} +;
if ! tc_version_is_at_least 4.3; then
fix_files="";
for x in contrib/test_summary libstdc++-v3/scripts/check_survey.in;
do
[[ -e ${x} ]] && fix_files="${fix_files} ${x}";
done;
ht_fix_file ${fix_files} */configure *.sh */Makefile.in;
fi;
setup_multilib_osdirnames;
gcc_version_patch;
if tc_version_is_at_least 4.1; then
if [[ -n ${SNAPSHOT} || -n ${PRERELEASE} ]]; then
echo ${PV/_/-} > "${S}"/gcc/BASE-VER;
fi;
fi;
if tc_version_is_at_least 4.3 && use 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
if tc_version_is_at_least "4.3"; then
einfo "Copying ecj-4.3.jar";
cp -pPR "${DISTDIR}/ecj-4.3.jar" "${S}/ecj.jar" || die;
fi;
fi;
fi;
if ! tc_version_is_at_least 3.4.4; then
sed -i -e s/HAVE_LD_AS_NEEDED/USE_LD_AS_NEEDED/g "${S}"/gcc/config.in;
fi;
if tc_version_is_at_least 3.3 && ! tc_version_is_at_least 4.0; then
do_gcc_rename_java_bins;
fi;
if tc_version_is_at_least 3.0; 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;
cd "${S}";
elibtoolize --portage --shallow --no-uclibc;
gnuconfig_update;
local f;
einfo "Fixing misc issues in configure files";
tc_version_is_at_least 4.1 && epatch "${GCC_FILESDIR}"/gcc-configure-texinfo.patch;
for f in $(grep -l 'autoconf version 2.13' $(find "${S}" -name configure));
do
ebegin " Updating ${f/${S}\/} [LANG]";
patch "${f}" "${GCC_FILESDIR}"/gcc-configure-LANG.patch &>"${T}"/configure-patch.log || eerror "Please file a bug about this";
eend $?;
done;
sed -i 's|A-Za-z0-9|[:alnum:]|g' "${S}"/gcc/*.awk;
if [[ -x contrib/gcc_update ]]; then
einfo "Touching generated files";
./contrib/gcc_update --touch | while read f; do
einfo " ${f%%...}";
done;
fi
}
uclibctoolize ()
{
die "Use elibtoolize"
}
use_if_iuse ()
{
in_iuse $1 || return 1;
use $1
}
usex ()
{
use "$1" && echo "${2-yes}$4" || echo "${3-no}$5"
}
validate_desktop_entries ()
{
if [[ -x /usr/bin/desktop-file-validate ]]; then
einfo "Checking desktop entry validity";
local directories="";
for d in /usr/share/applications $@;
do
[[ -d ${D}${d} ]] && directories="${directories} ${D}${d}";
done;
if [[ -n ${directories} ]]; then
for FILE in $(find ${directories} -name "*\.desktop" -not -path '*.hidden*' | sort -u 2>/dev/null);
do
local temp=$(desktop-file-validate ${FILE} | grep -v "warning:" | sed -e "s|error: ||" -e "s|${FILE}:|--|g" );
[[ -n $temp ]] && elog ${temp/--/${FILE/${D}/}:};
done;
fi;
echo "";
else
einfo "Passing desktop entry validity check. Install dev-util/desktop-file-utils, if you want to help to improve Gentoo.";
fi
}
version_compare ()
{
eshopts_push -s extglob;
local ver_a=${1} ver_b=${2} parts_a parts_b;
local cur_tok_a cur_tok_b num_part_a num_part_b;
local -i cur_idx_a=0 cur_idx_b=0 prev_idx_a prev_idx_b;
parts_a=($(get_all_version_components "${ver_a}" ));
parts_b=($(get_all_version_components "${ver_b}" ));
local -i inf_loop=0;
while true; do
inf_loop+=1;
((inf_loop > 20)) && die "versionator compare bug [numbers, ${ver_a}, ${ver_b}]";
prev_idx_a=cur_idx_a;
prev_idx_b=cur_idx_b;
cur_tok_a=${parts_a[cur_idx_a]};
cur_tok_b=${parts_b[cur_idx_b]};
if [[ -n ${cur_tok_a} ]] && [[ -z ${cur_tok_a//[[:digit:]]} ]]; then
cur_idx_a+=1;
[[ ${parts_a[cur_idx_a]} == . ]] && cur_idx_a+=1;
else
cur_tok_a=;
fi;
if [[ -n ${cur_tok_b} ]] && [[ -z ${cur_tok_b//[[:digit:]]} ]]; then
cur_idx_b+=1;
[[ ${parts_b[cur_idx_b]} == . ]] && cur_idx_b+=1;
else
cur_tok_b=;
fi;
[[ -z ${cur_tok_a} && -z ${cur_tok_b} ]] && break;
[[ -z ${cur_tok_a} ]] && eshopts_pop && return 1;
[[ -z ${cur_tok_b} ]] && eshopts_pop && return 3;
if (( prev_idx_a != 0 && prev_idx_b != 0 )) && [[ ${cur_tok_a} == 0* || ${cur_tok_b} == 0* ]]; then
cur_tok_a=${cur_tok_a%%+(0)};
cur_tok_b=${cur_tok_b%%+(0)};
[[ ${cur_tok_a} < ${cur_tok_b} ]] && eshopts_pop && return 1;
[[ ${cur_tok_a} > ${cur_tok_b} ]] && eshopts_pop && return 3;
else
cur_tok_a=${cur_tok_a##+(0)};
cur_tok_b=${cur_tok_b##+(0)};
: ${cur_tok_a:=0};
: ${cur_tok_b:=0};
((cur_tok_a < cur_tok_b)) && eshopts_pop && return 1;
((cur_tok_a > cur_tok_b)) && eshopts_pop && return 3;
fi;
done;
local letter_a=;
letter_a=${parts_a[cur_idx_a]};
if [[ ${#letter_a} -eq 1 && -z ${letter_a/[a-z]} ]]; then
cur_idx_a+=1;
else
letter_a=@;
fi;
local letter_b=;
letter_b=${parts_b[cur_idx_b]};
if [[ ${#letter_b} -eq 1 && -z ${letter_b/[a-z]} ]]; then
cur_idx_b+=1;
else
letter_b=@;
fi;
[[ ${letter_a} < ${letter_b} ]] && eshopts_pop && return 1;
[[ ${letter_a} > ${letter_b} ]] && eshopts_pop && return 3;
inf_loop=0;
while true; do
inf_loop+=1;
((inf_loop > 20)) && die "versionator compare bug [numbers, ${ver_a}, ${ver_b}]";
[[ ${parts_a[cur_idx_a]} == _ ]] && ((cur_idx_a++));
[[ ${parts_b[cur_idx_b]} == _ ]] && ((cur_idx_b++));
cur_tok_a=${parts_a[cur_idx_a]};
cur_tok_b=${parts_b[cur_idx_b]};
num_part_a=0;
num_part_b=0;
if has ${cur_tok_a%%+([0-9])} "alpha" "beta" "pre" "rc" "p"; then
cur_idx_a+=1;
num_part_a=${cur_tok_a##+([a-z])};
num_part_a=${num_part_a##+(0)};
: ${num_part_a:=0};
cur_tok_a=${cur_tok_a%%+([0-9])};
else
cur_tok_a=;
fi;
if has ${cur_tok_b%%+([0-9])} alpha beta pre rc p; then
cur_idx_b+=1;
num_part_b=${cur_tok_b##+([a-z])};
num_part_b=${num_part_b##+(0)};
: ${num_part_b:=0};
cur_tok_b=${cur_tok_b%%+([0-9])};
else
cur_tok_b=;
fi;
if [[ ${cur_tok_a} != ${cur_tok_b} ]]; then
local suffix;
for suffix in alpha beta pre rc "" p;
do
[[ ${cur_tok_a} == ${suffix} ]] && eshopts_pop && return 1;
[[ ${cur_tok_b} == ${suffix} ]] && eshopts_pop && return 3;
done;
else
if [[ -z ${cur_tok_a} && -z ${cur_tok_b} ]]; then
break;
else
((num_part_a < num_part_b)) && eshopts_pop && return 1;
((num_part_a > num_part_b)) && eshopts_pop && return 3;
fi;
fi;
done;
[[ ${parts_a[cur_idx_a]} == - ]] && ((cur_idx_a++));
[[ ${parts_b[cur_idx_b]} == - ]] && ((cur_idx_b++));
if [[ -n ${parts_a[cur_idx_a]/r+([0-9])} || -n ${parts_b[cur_idx_b]/r+([0-9])} ]]; then
die "versionator compare bug [revisions, ${ver_a}, ${ver_b}]";
fi;
num_part_a=${parts_a[cur_idx_a]#r};
num_part_a=${num_part_a##+(0)};
: ${num_part_a:=0};
num_part_b=${parts_b[cur_idx_b]#r};
num_part_b=${num_part_b##+(0)};
: ${num_part_b:=0};
((num_part_a < num_part_b)) && eshopts_pop && return 1;
((num_part_a > num_part_b)) && eshopts_pop && return 3;
eshopts_pop;
return 2
}
version_format_string ()
{
local fstr=$1;
shift;
set -- $(get_version_components "$@");
eval echo "${fstr}"
}
version_is_at_least ()
{
local want_s="$1" have_s="${2:-${PVR}}" r;
version_compare "${want_s}" "${have_s}";
r=$?;
case $r in
1 | 2)
return 0
;;
3)
return 1
;;
*)
die "versionator compare bug [atleast, ${want_s}, ${have_s}, ${r}]"
;;
esac
}
version_sort ()
{
eshopts_push -s extglob;
local items=;
local -i left=0;
items=("$@");
while ((left < ${#items[@]})); do
local -i lowest_idx=left;
local -i idx=lowest_idx+1;
while ((idx < ${#items[@]})); do
version_compare "${items[lowest_idx]}" "${items[idx]}";
[[ $? -eq 3 ]] && lowest_idx=idx;
idx+=1;
done;
local tmp=${items[lowest_idx]};
items[lowest_idx]=${items[left]};
items[left]=${tmp};
left+=1;
done;
echo ${items[@]};
eshopts_pop
}
want_minispecs ()
{
if tc_version_is_at_least 4.3.2 && use hardened; then
if ! want_pie; then
ewarn "PIE_VER or SPECS_VER is not defiend in the GCC ebuild.";
else
if use vanilla; then
ewarn "You will not get hardened features if you have the vanilla USE-flag.";
else
if use nopie && use nossp; then
ewarn "You will not get hardened features if you have the nopie and nossp USE-flag.";
else
if ! hardened_gcc_works; then
ewarn "Your $(tc-arch) arch is not supported.";
else
return 0;
fi;
fi;
fi;
fi;
ewarn "Hope you know what you are doing. Hardened will not work.";
return 0;
fi;
return 1
}
want_pie ()
{
! use hardened && [[ -n ${PIE_VER} ]] && use 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;
use !nopie && return 0;
return 1
}
[-- Attachment #3: build.log --]
[-- Type: application/octet-stream, Size: 260862 bytes --]
next reply other threads:[~2013-04-20 17:31 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-20 17:29 the guard [this message]
2013-04-20 17:54 ` [gentoo-user] bus error during compilation of gcc Nilesh Govindrajan
2013-04-20 17:58 ` [gentoo-user] Re[2]: " the guard
2013-04-20 17:59 ` Nilesh Govindrajan
2013-04-20 19:25 ` Forrest Schultz
2013-04-20 19:29 ` [gentoo-user] " the guard
2013-04-21 12:27 ` Mick
2013-04-25 16:36 ` [gentoo-user] Re[2]: " the guard
2013-04-20 19:56 ` [gentoo-user] " Grant Edwards
2013-04-20 20:44 ` [gentoo-user] " the guard
2013-04-21 19:42 ` Nuno J. Silva (aka njsg)
2013-04-22 6:16 ` [gentoo-user] Re[2]: " the guard
2013-04-22 11:35 ` [gentoo-user] " David Relson
2013-04-22 16:21 ` Nuno J. Silva (aka njsg)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1366478949.973562149@f243.mail.ru \
--to=the.guard@mail.ru \
--cc=gentoo-user@lists.gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox