* [gentoo-user] bus error during compilation of gcc
@ 2013-04-20 17:29 the guard
2013-04-20 17:54 ` Nilesh Govindrajan
2013-04-20 19:56 ` [gentoo-user] " Grant Edwards
0 siblings, 2 replies; 14+ messages in thread
From: the guard @ 2013-04-20 17:29 UTC (permalink / raw
To: gentoo-user
[-- 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 --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [gentoo-user] bus error during compilation of gcc
2013-04-20 17:29 [gentoo-user] bus error during compilation of gcc the guard
@ 2013-04-20 17:54 ` Nilesh Govindrajan
2013-04-20 17:58 ` [gentoo-user] Re[2]: " the guard
2013-04-20 19:56 ` [gentoo-user] " Grant Edwards
1 sibling, 1 reply; 14+ messages in thread
From: Nilesh Govindrajan @ 2013-04-20 17:54 UTC (permalink / raw
To: gentoo-user
[-- Attachment #1: Type: text/plain, Size: 388 bytes --]
On Saturday 20 April 2013 10:59:09 PM IST, the guard wrote:
> 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.
>
Quite interestingly, I had the *exactly* same problem few days ago and
I ended up reinstalling it totally.
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4210 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* [gentoo-user] Re[2]: [gentoo-user] bus error during compilation of gcc
2013-04-20 17:54 ` Nilesh Govindrajan
@ 2013-04-20 17:58 ` the guard
2013-04-20 17:59 ` Nilesh Govindrajan
0 siblings, 1 reply; 14+ messages in thread
From: the guard @ 2013-04-20 17:58 UTC (permalink / raw
To: gentoo-user
Суббота, 20 апреля 2013, 23:24 +05:30 от Nilesh Govindrajan <me@nileshgr.com>:
> On Saturday 20 April 2013 10:59:09 PM IST, the guard wrote:
> > 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.
> >
>
> Quite interestingly, I had the *exactly* same problem few days ago and
> I ended up reinstalling it totally.
>
>
>
Excuse me, but reinstalling what?
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [gentoo-user] Re[2]: [gentoo-user] bus error during compilation of gcc
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
0 siblings, 1 reply; 14+ messages in thread
From: Nilesh Govindrajan @ 2013-04-20 17:59 UTC (permalink / raw
To: gentoo-user
[-- Attachment #1: Type: text/plain, Size: 636 bytes --]
On Saturday 20 April 2013 11:28:06 PM IST, the guard wrote:
>
>
>
> Суббота, 20 апреля 2013, 23:24 +05:30 от Nilesh Govindrajan <me@nileshgr.com>:
>> On Saturday 20 April 2013 10:59:09 PM IST, the guard wrote:
>>> 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.
>>>
>>
>> Quite interestingly, I had the *exactly* same problem few days ago and
>> I ended up reinstalling it totally.
>>
>>
>>
> Excuse me, but reinstalling what?
Gentoo
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4210 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [gentoo-user] Re[2]: [gentoo-user] bus error during compilation of gcc
2013-04-20 17:59 ` Nilesh Govindrajan
@ 2013-04-20 19:25 ` Forrest Schultz
2013-04-20 19:29 ` [gentoo-user] " the guard
0 siblings, 1 reply; 14+ messages in thread
From: Forrest Schultz @ 2013-04-20 19:25 UTC (permalink / raw
To: gentoo-user
[-- Attachment #1: Type: text/plain, Size: 834 bytes --]
Doesn't lowering makeopts just reduce the number of parallel compilations?
On Sat, Apr 20, 2013 at 1:59 PM, Nilesh Govindrajan <me@nileshgr.com> wrote:
> On Saturday 20 April 2013 11:28:06 PM IST, the guard wrote:
>
>>
>>
>>
>> Суббота, 20 апреля 2013, 23:24 +05:30 от Nilesh Govindrajan <
>> me@nileshgr.com>:
>>
>>> On Saturday 20 April 2013 10:59:09 PM IST, the guard wrote:
>>>
>>>> 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.
>>>>
>>>>
>>> Quite interestingly, I had the *exactly* same problem few days ago and
>>> I ended up reinstalling it totally.
>>>
>>>
>>>
>>> Excuse me, but reinstalling what?
>>
>
> Gentoo
>
>
[-- Attachment #2: Type: text/html, Size: 1619 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* [gentoo-user] Re: [gentoo-user] bus error during compilation of gcc
2013-04-20 19:25 ` Forrest Schultz
@ 2013-04-20 19:29 ` the guard
2013-04-21 12:27 ` Mick
0 siblings, 1 reply; 14+ messages in thread
From: the guard @ 2013-04-20 19:29 UTC (permalink / raw
To: gentoo-user
Суббота, 20 апреля 2013, 15:25 -04:00 от Forrest Schultz <f.schultz0@gmail.com>:
>
> Doesn't lowering makeopts just reduce the number of parallel compilations?
>
yes, it does. I heard somewhere that bus error is caused by lack of sufficient amount of memory during compilations.I also tried to remove cflags.
^ permalink raw reply [flat|nested] 14+ messages in thread
* [gentoo-user] Re: bus error during compilation of gcc
2013-04-20 17:29 [gentoo-user] bus error during compilation of gcc the guard
2013-04-20 17:54 ` Nilesh Govindrajan
@ 2013-04-20 19:56 ` Grant Edwards
2013-04-20 20:44 ` [gentoo-user] " the guard
1 sibling, 1 reply; 14+ messages in thread
From: Grant Edwards @ 2013-04-20 19:56 UTC (permalink / raw
To: gentoo-user
On 2013-04-20, the guard <the.guard@mail.ru> wrote:
> 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.
Every time I've gotten bus errors when building things it turned out
to be a hardware problem.
Bad RAM, failing CPU, failing motherboard power supply capacitors, bad
disk controller card (obviously, that was a _long_ time ago).
If I were you, I'd start by running memtest86+ overnight.
--
Grant
^ permalink raw reply [flat|nested] 14+ messages in thread
* [gentoo-user] Re: [gentoo-user] Re: bus error during compilation of gcc
2013-04-20 19:56 ` [gentoo-user] " Grant Edwards
@ 2013-04-20 20:44 ` the guard
2013-04-21 19:42 ` Nuno J. Silva (aka njsg)
2013-04-22 11:35 ` [gentoo-user] " David Relson
0 siblings, 2 replies; 14+ messages in thread
From: the guard @ 2013-04-20 20:44 UTC (permalink / raw
To: gentoo-user
Суббота, 20 апреля 2013, 19:56 UTC от Grant Edwards <grant.b.edwards@gmail.com>:
> On 2013-04-20, the guard <the.guard@mail.ru> wrote:
>
> > 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.
>
> Every time I've gotten bus errors when building things it turned out
> to be a hardware problem.
>
> Bad RAM, failing CPU, failing motherboard power supply capacitors, bad
> disk controller card (obviously, that was a _long_ time ago).
>
> If I were you, I'd start by running memtest86+ overnight.
>
> --
> Grant
>
>
>
>
>
memtest revealed nothing
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [gentoo-user] Re: [gentoo-user] bus error during compilation of gcc
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
0 siblings, 1 reply; 14+ messages in thread
From: Mick @ 2013-04-21 12:27 UTC (permalink / raw
To: gentoo-user
[-- Attachment #1: Type: Text/Plain, Size: 701 bytes --]
On Saturday 20 Apr 2013 20:29:31 the guard wrote:
> Суббота, 20 апреля 2013, 15:25 -04:00 от Forrest Schultz
<f.schultz0@gmail.com>:
> > Doesn't lowering makeopts just reduce the number of parallel
> > compilations?
>
> yes, it does. I heard somewhere that bus error is caused by lack of
> sufficient amount of memory during compilations.I also tried to remove
> cflags.
Simplifying cflags to something like:
CFLAGS="-march=native -O2 -pipe"
may help and also setting makeopts to 1:
MAKEOPTS="-j1"
but none of the above will help if the problem is due to a bug. Have you done
the basics like revdep-rebuild and python-updater?
--
Regards,
Mick
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [gentoo-user] Re: bus error during compilation of gcc
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
1 sibling, 1 reply; 14+ messages in thread
From: Nuno J. Silva (aka njsg) @ 2013-04-21 19:42 UTC (permalink / raw
To: gentoo-user
On 2013-04-20, the guard <the.guard@mail.ru> wrote:
>
>
>
> Суббота, 20 апреля 2013, 19:56 UTC от Grant Edwards <grant.b.edwards@gmail.com>:
>> On 2013-04-20, the guard <the.guard@mail.ru> wrote:
>>
>> > 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.
>>
>> Every time I've gotten bus errors when building things it turned out
>> to be a hardware problem.
>>
>> Bad RAM, failing CPU, failing motherboard power supply capacitors, bad
>> disk controller card (obviously, that was a _long_ time ago).
>>
>> If I were you, I'd start by running memtest86+ overnight.
>>
>
> memtest revealed nothing
Which does not mean there's nothing there ;-)
--
Nuno Silva (aka njsg)
http://njsg.sdf-eu.org/
^ permalink raw reply [flat|nested] 14+ messages in thread
* [gentoo-user] Re[2]: [gentoo-user] Re: bus error during compilation of gcc
2013-04-21 19:42 ` Nuno J. Silva (aka njsg)
@ 2013-04-22 6:16 ` the guard
0 siblings, 0 replies; 14+ messages in thread
From: the guard @ 2013-04-22 6:16 UTC (permalink / raw
To: gentoo-user
Воскресенье, 21 апреля 2013, 19:42 UTC от "Nuno J. Silva (aka njsg)" <nunojsilva@ist.utl.pt>:
> On 2013-04-20, the guard <the.guard@mail.ru> wrote:
> >
> >
> >
> > Суббота, 20 апреля 2013, 19:56 UTC от Grant Edwards <grant.b.edwards@gmail.com>:
> >> On 2013-04-20, the guard <the.guard@mail.ru> wrote:
> >>
> >> > 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.
> >>
> >> Every time I've gotten bus errors when building things it turned out
> >> to be a hardware problem.
> >>
> >> Bad RAM, failing CPU, failing motherboard power supply capacitors, bad
> >> disk controller card (obviously, that was a _long_ time ago).
> >>
> >> If I were you, I'd start by running memtest86+ overnight.
> >>
> >
> > memtest revealed nothing
>
> Which does not mean there's nothing there ;-)
>
No, this isn't funny. Everything else compiles fine. My hardware is fine! It's a software problem. How do I fix it?
Should I file a bugreport?
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [gentoo-user] Re: [gentoo-user] Re: bus error during compilation of gcc
2013-04-20 20:44 ` [gentoo-user] " the guard
2013-04-21 19:42 ` Nuno J. Silva (aka njsg)
@ 2013-04-22 11:35 ` David Relson
2013-04-22 16:21 ` Nuno J. Silva (aka njsg)
1 sibling, 1 reply; 14+ messages in thread
From: David Relson @ 2013-04-22 11:35 UTC (permalink / raw
To: gentoo-user
On Sun, 21 Apr 2013 00:44:46 +0400
the guard wrote:
>
>
>
> Суббота, 20 апреля 2013, 19:56 UTC от Grant Edwards
> <grant.b.edwards@gmail.com>:
> > On 2013-04-20, the guard <the.guard@mail.ru> wrote:
> >
> > > 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.
> >
> > Every time I've gotten bus errors when building things it turned out
> > to be a hardware problem.
> >
> > Bad RAM, failing CPU, failing motherboard power supply capacitors,
> > bad disk controller card (obviously, that was a _long_ time ago).
> >
> > If I were you, I'd start by running memtest86+ overnight.
> >
> > --
> > Grant
> >
> >
> >
> >
> >
> memtest revealed nothing
We had an old QNX machine start giving bus errors during compilation of
a large application. Running memtest (for approx 40 hrs) showed
nothing, but a close visual examination of the motherboard showed
bulging capacitors, i.e. failing capacitors.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [gentoo-user] Re: bus error during compilation of gcc
2013-04-22 11:35 ` [gentoo-user] " David Relson
@ 2013-04-22 16:21 ` Nuno J. Silva (aka njsg)
0 siblings, 0 replies; 14+ messages in thread
From: Nuno J. Silva (aka njsg) @ 2013-04-22 16:21 UTC (permalink / raw
To: gentoo-user
On 2013-04-22, David Relson <relson@osagesoftware.com> wrote:
> On Sun, 21 Apr 2013 00:44:46 +0400
> the guard wrote:
>
>>
>>
>>
>> Суббота, 20 апреля 2013, 19:56 UTC от Grant Edwards
>> <grant.b.edwards@gmail.com>:
>> > On 2013-04-20, the guard <the.guard@mail.ru> wrote:
>> >
>> > > 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.
>> >
>> > Every time I've gotten bus errors when building things it turned out
>> > to be a hardware problem.
>> >
>> > Bad RAM, failing CPU, failing motherboard power supply capacitors,
>> > bad disk controller card (obviously, that was a _long_ time ago).
>> >
>> > If I were you, I'd start by running memtest86+ overnight.
>>
>>
>> memtest revealed nothing
>
> We had an old QNX machine start giving bus errors during compilation of
> a large application. Running memtest (for approx 40 hrs) showed
> nothing, but a close visual examination of the motherboard showed
> bulging capacitors, i.e. failing capacitors.
"Bad caps"? Those can really give all the kinds of problems, and look
really random.
I've also seen occasions where a certain northbridge was less tolerant
regarding voltages and would render the whole system unstable with a
specific brand of memories (the memories were OK, but the system would
still become unstable).
There was also a more serious case where I started getting random
segfaults with a computer, as I started leaving it on for longer and
compiling larger programs. Apparently, the memory modules were seated in
a less than optimal configuration, leading the motherboard to believe
there was *another* memory module. Thing is, for several months the
system was OK, because apparently it never needed more than the first
half of the memory, or if it did, it did not try to use the result of
addressing the second half. That was a lot of luck, I guess. (The less
lucky part are the emerge -e systems anf emerge -e worlds which
followed.)
--
Nuno Silva (aka njsg)
http://njsg.sdf-eu.org/
^ permalink raw reply [flat|nested] 14+ messages in thread
* [gentoo-user] Re[2]: [gentoo-user] Re: [gentoo-user] bus error during compilation of gcc
2013-04-21 12:27 ` Mick
@ 2013-04-25 16:36 ` the guard
0 siblings, 0 replies; 14+ messages in thread
From: the guard @ 2013-04-25 16:36 UTC (permalink / raw
To: gentoo-user
Воскресенье, 21 апреля 2013, 13:27 +01:00 от Mick <michaelkintzios@gmail.com>:
> On Saturday 20 Apr 2013 20:29:31 the guard wrote:
> > Суббота, 20 апреля 2013, 15:25 -04:00 от Forrest Schultz
> <f.schultz0@gmail.com>:
> > > Doesn't lowering makeopts just reduce the number of parallel
> > > compilations?
> >
> > yes, it does. I heard somewhere that bus error is caused by lack of
> > sufficient amount of memory during compilations.I also tried to remove
> > cflags.
>
> Simplifying cflags to something like:
>
> CFLAGS="-march=native -O2 -pipe"
>
> may help and also setting makeopts to 1:
>
> MAKEOPTS="-j1"
>
>
> but none of the above will help if the problem is due to a bug. Have you done
> the basics like revdep-rebuild and python-updater?
>
> --
> Regards,
> Mick
>
>
didn't help, Mick((((
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2013-04-25 16:36 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-20 17:29 [gentoo-user] bus error during compilation of gcc the guard
2013-04-20 17:54 ` 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)
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox