Skip to content

Instantly share code, notes, and snippets.

/info

Created March 6, 2016 10:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/18e5af8e4c8b4706ab41 to your computer and use it in GitHub Desktop.
Save anonymous/18e5af8e4c8b4706ab41 to your computer and use it in GitHub Desktop.
# emerge --info '=sys-devel/gcc-5.3.0::gentoo'
Portage 2.2.26 (python 2.7.10-final-0, default/linux/amd64/13.0/desktop, gcc-4.9.3, glibc-2.21-r2, 4.4.0-sabayon x86_64)
=================================================================
System Settings
=================================================================
System uname: Linux-4.4.0-sabayon-x86_64-Intel-R-_Core-TM-_i7-6700_CPU_@_3.40GHz-with-gentoo-2.2
KiB Mem: 16088436 total, 2927056 free
KiB Swap: 2366912 total, 2366912 free
Timestamp of repository gentoo: Sun, 06 Mar 2016 04:50:01 +0000
sh bash 4.3_p42-r1
ld GNU ld (Gentoo 2.25.1 p1.1) 2.25.1
app-shells/bash: 4.3_p42-r1::gentoo
dev-java/java-config: 2.2.0::gentoo
dev-lang/perl: 5.20.2::gentoo
dev-lang/python: 2.7.10-r1::gentoo, 3.4.3-r1::gentoo
dev-util/cmake: 3.4.3::gentoo
dev-util/pkgconfig: 0.29::gentoo
sys-apps/baselayout: 2.2-r1::sabayon-distro
sys-apps/sandbox: 2.10-r1::gentoo
sys-devel/autoconf: 2.69::gentoo
sys-devel/automake: 1.15::gentoo
sys-devel/binutils: 2.25.1-r1::gentoo
sys-devel/gcc: 4.9.3::sabayon-distro
sys-devel/gcc-config: 1.8-r1::sabayon-distro
sys-devel/libtool: 2.4.6::gentoo
sys-devel/make: 4.1-r1::gentoo
sys-kernel/linux-headers: 3.18::gentoo (virtual/os-headers)
sys-libs/glibc: 2.21-r2::gentoo
Repositories:
gentoo
location: /usr/portage
sync-type: rsync
sync-uri: rsync://rsync.europe.gentoo.org/gentoo-portage
priority: -1000
user_defined
location: /usr/local/portage
masters: gentoo
priority: 0
gentoo-zh
location: /var/lib/layman/gentoo-zh
masters: gentoo
priority: 50
sabayon
location: /var/lib/layman/sabayon
masters: gentoo
priority: 50
sabayon-distro
location: /var/lib/layman/sabayon-distro
masters: gentoo
priority: 50
ACCEPT_KEYWORDS="amd64 ~amd64"
ACCEPT_LICENSE="* -@EULA"
CBUILD="x86_64-pc-linux-gnu"
CFLAGS="-O2 -march=native -pipe"
CHOST="x86_64-pc-linux-gnu"
CONFIG_PROTECT="/etc /etc/conf.d /etc/entropy /etc/init.d /usr/share/config /usr/share/config/kdm /usr/share/gnupg/qualified.txt"
CONFIG_PROTECT_MASK="/etc/ca-certificates.conf /etc/dconf /etc/env.d /etc/fonts/fonts.conf /etc/gconf /etc/gentoo-release /etc/revdep-rebuild /etc/sandbox.d /etc/skel /etc/terminfo /lib/modules"
CXXFLAGS="-O2 -march=native -pipe"
DISTDIR="/usr/portage/distfiles"
FCFLAGS="-O2 -pipe"
FEATURES="assume-digests binpkg-logs compressdebug config-protect-if-modified distlocks ebuild-locks fixlafiles merge-sync news parallel-fetch preserve-libs protect-owned sandbox sfperms splitdebug strict unknown-features-warn unmerge-logs unmerge-orphans userfetch userpriv usersandbox usersync xattr"
FFLAGS="-O2 -pipe"
GENTOO_MIRRORS="ftp://ftp.spline.inf.fu-berlin.de/mirrors/gentoo/ http://archive.mmu.edu.my/gentoo rsync://gentoo.bloodhost.ru/gentoo-distfiles ftp://gentoo.mirrors.tds.net/gentoo ftp://ftp.halifax.rwth-aachen.de/gentoo/ rsync://mirror.neolabs.kz/gentoo http://ftp.gentoo.bg/ http://ftp.cc.uoc.gr/mirrors/linux/gentoo/ ftp://ftp.cc.uoc.gr/mirrors/linux/gentoo/ ftp://mirrors.tera-byte.com/pub/gentoo"
LANG="zh_TW.UTF-8"
LDFLAGS="-Wl,-O1 -Wl,--as-needed"
MAKEOPTS="-j16 -s"
PKGDIR="/usr/portage/packages"
PORTAGE_CONFIGROOT="/"
PORTAGE_RSYNC_OPTS="--recursive --links --safe-links --perms --times --omit-dir-times --compress --force --whole-file --delete --stats --human-readable --timeout=180 --exclude=/distfiles --exclude=/local --exclude=/packages"
PORTAGE_TMPDIR="/var/tmp"
USE="X a52 aac accessibility acl acpi aiglx aim alsa amd64 artswrappersuid audiofile avahi bash-completion berkdb bidi bluetooth bluray bzip2 cairo cdda cddb cdr cjk cli cpudetection cracklib crypt cups cxx dbus dga dri dts dv dvb dvd dvdr dvdread dvi emboss encode exif fam fame fat ffmpeg firefox flac foomatic-db fortran freetype gcj gdbm gif gimpprint glamor gmp gnutls gphoto2 gpm gsm gstreamer gtk hfs iconv icq ieee1394 imap inotify ipod ipv6 irc irda jabber jack jfs joystick jpeg kdeenablefinal kdehiddenvisibility kerberos lame lcd lcms ldap libav libnotify live lm_sensors logind lvm lzo mad mail matroska mjpeg mmx mmxext mng modules mozdevelop mp3 mp3rtp mp4 mpeg msn multilib musepack musicbrainz ncurses network nls nptl nsplugin ntfs ogg openal openexr opengl openmp pam pango pcmcia pcre pda pdf perl png policykit ppds pulseaudio python qt3support qt4 qt5 rar rdesktop readline real reiserfs rss scanner sdl seccomp session slp speex spell sse sse2 ssl startup-notification stream svg sysfs systemd tcpd theora tiff truetype udev udisks unicode upower usb v4l v4l2 vaapi vdpau visualization vorbis vpx wayland wifi win32codecs wmf wxwidgets x264 x265 xattr xcb xfs xine xinerama xml xpm xprint xulrunner xv xvid xvmc yahoo zeroconf zlib" ABI_X86="64 32" ALSA_CARDS="emu10k1x darla20 darla24 emu10k1 gina20 gina24 hdsp hdspm ice1712 indigo indigoio layla20 layla24 mia mixart mona pcxhr rme32 rme96 sb16 sbawe sscape usbusx2y vx222 usb-usx2y" 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" APACHE2_MPMS="prefork" CALLIGRA_FEATURES="kexi words flow plan sheets stage tables krita karbon braindump author" CAMERAS="agfa_cl20 casio_qv dimagev dimera3500 kodak_dc120 kodak_dc210 kodak_dc240 kodak_dc3200 kodak_ez200 konica_qm150 panasonic_coolshot panasonic_dc1000 panasonic_dc1580 panasonic_l859 polaroid_pdc320 polaroid_pdc640 polaroid_pdc700 ricoh_g3 sipix_blink sipix_blink2 sipix_web2 sony_dscf1 sony_dscf55 toshiba_pdrm11 adc65 aox barbie canon clicksmart310 digigr8 digita directory enigma13 fuji gsmart300 hp215 iclick jamcam jd11 konica largan lg_gsm mars mustek pccam300 pccam600 ptp2 ricoh samsung sierra smal sonix soundvision spca50x sq905 stv0674 stv0680 sx330z template" COLLECTD_PLUGINS="df interface irq load memory rrdtool swap syslog" CPU_FLAGS_X86="mmx mmxext sse sse2" ELIBC="glibc" 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 ublox ubx" GRUB_PLATFORMS="efi-32 efi-64 pc" INPUT_DEVICES="evdev void" KERNEL="linux" LCD_DEVICES="bayrad cfontz cfontz633 glk hd44780 lb216 lcdm001 mtxorb ncurses text" LIBREOFFICE_EXTENSIONS="presenter-console presenter-minimizer pdfimport wiki-publisher" LINGUAS="en en_US ja zh_CN zh_TW zh" LIRC_DEVICES="audio audio_alsa serial pctv" OFFICE_IMPLEMENTATION="libreoffice" PHP_TARGETS="php5-5" PYTHON_SINGLE_TARGET="python2_7" PYTHON_TARGETS="python2_7 python3_4" QEMU_SOFTMMU_TARGETS="x86_64 arm cris i386 m68k microblaze mips mips64 mips64el mipsel ppc ppc64 ppcemb sh4 sh4eb sparc sparc64" QEMU_USER_TARGETS="alpha arm armeb cris i386 m68k microblaze mips mipsel ppc ppc64 ppc64abi32 sh4 sh4eb sparc sparc32plus sparc64 x86_64" RUBY_TARGETS="ruby21" USERLAND="GNU" VIDEO_CARDS="intel i965" 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"
USE_PYTHON="2.7"
Unset: CC, CPPFLAGS, CTARGET, CXX, EMERGE_DEFAULT_OPTS, INSTALL_MASK, LC_ALL, PORTAGE_BUNZIP2_COMMAND, PORTAGE_COMPRESS, PORTAGE_COMPRESS_FLAGS, PORTAGE_RSYNC_EXTRA_OPTS
# cat /var/tmp/portage/sys-devel/gcc-5.3.0/temp/environment
declare -x ABI="amd64"
declare -x ABI_X86="64"
declare -x ALSA_CARDS=""
declare -x ANT_HOME="/usr/share/ant"
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 APACHE2_MPMS="prefork"
declare -x ARCH="amd64"
declare -- BINPATH="/usr/x86_64-pc-linux-gnu/gcc-bin/5.3.0"
declare -x BOOTSTRAP_USE="cxx unicode internal-glib python_targets_python3_4 python_targets_python2_7 multilib"
declare -- BRANCH_UPDATE=""
declare -x BRANDING_GCC_PKGVERSION="Gentoo Hardened 5.3.0 p1.0, pie-0.6.5"
declare -x CALLIGRA_FEATURES="kexi words flow plan sheets stage tables krita karbon braindump author"
declare -x CAMERAS="agfa_cl20 casio_qv dimagev dimera3500 kodak_dc120 kodak_dc210 kodak_dc240 kodak_dc3200 kodak_ez200 konica_qm150 panasonic_coolshot panasonic_dc1000 panasonic_dc1580 panasonic_l859 polaroid_pdc320 polaroid_pdc640 polaroid_pdc700 ricoh_g3 sipix_blink sipix_blink2 sipix_web2 sony_dscf1 sony_dscf55 toshiba_pdrm11 adc65 aox barbie canon clicksmart310 digigr8 digita directory enigma13 fuji gsmart300 hp215 iclick jamcam jd11 konica largan lg_gsm mars mustek pccam300 pccam600 ptp2 ricoh samsung sierra smal sonix soundvision spca50x sq905 stv0674 stv0680 sx330z template"
declare -x CBUILD="x86_64-pc-linux-gnu"
declare -x CCASFLAGS=""
declare -x CFLAGS="-O2 -march=native -pipe"
declare -x CFLAGS_amd64="-m64"
declare -x CFLAGS_default
declare -x CFLAGS_x32="-mx32"
declare -x CFLAGS_x86="-m32"
declare -x CHOST="x86_64-pc-linux-gnu"
declare -x CHOST_amd64="x86_64-pc-linux-gnu"
declare -x CHOST_default="x86_64-pc-linux-gnu"
declare -x CHOST_x32="x86_64-pc-linux-gnux32"
declare -x CHOST_x86="i686-pc-linux-gnu"
declare -x COLLECTD_PLUGINS="df interface irq load memory rrdtool swap syslog"
declare -x CPPFLAGS=""
declare -x CPU_FLAGS_X86="mmx mmxext sse sse2"
declare -x CTARGET="x86_64-pc-linux-gnu"
declare -x CTARGET_default="x86_64-pc-linux-gnu"
declare -x CXXFLAGS="-O2 -march=native -pipe"
declare -- DATAPATH="/usr/share/gcc-data/x86_64-pc-linux-gnu/5.3.0"
declare -x DEBUGBUILD="1"
declare -x DEFAULT_ABI="amd64"
declare -x DEFINED_PHASES=" compile configure install postinst postrm prepare pretend setup test unpack"
declare DEPEND="
elibc_glibc? ( >=sys-libs/glibc-2.8 )
>=sys-devel/binutils-2.20 >=sys-apps/sed-4 sys-devel/gnuconfig sys-libs/zlib
nls? ( virtual/libintl ) virtual/libiconv >=dev-libs/gmp-4.3.2:0 >=dev-libs/mpfr-2.4.2:0 >=dev-libs/mpc-0.8.1:0 graphite? ( >=dev-libs/isl-0.14 )
>=sys-devel/bison-1.875
>=sys-devel/flex-2.5.4
nls? ( sys-devel/gettext )
regression-test? (
>=dev-util/dejagnu-1.4.4
>=sys-devel/autogen-5.5.4
) gcj? ( awt? (
x11-libs/libXt
x11-libs/libX11
x11-libs/libXtst
x11-proto/xproto
x11-proto/xextproto
=x11-libs/gtk+-2*
virtual/pkgconfig
x11-libs/pango ) >=media-libs/libart_lgpl-2.1 app-arch/zip app-arch/unzip )"
declare DESCRIPTION="The GNU Compiler Collection"
declare -x DESTTREE="/usr"
declare -x DIROPTIONS="-m0755"
declare -x EAPI="4"
declare -- EBUILD_DEATH_HOOKS=" toolchain_death_notice"
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-5.3.0/work/patch"
declare -- EPATCH_SUFFIX="patch"
declare -- EPATCH_USER_SOURCE="/etc/portage/patches"
declare -x EXEOPTIONS="-m0755"
declare -- EXPORTED_FUNCTIONS="pkg_setup src_unpack src_compile src_test src_install pkg_postinst pkg_postrm pkg_pretend src_prepare src_configure"
declare -x FCFLAGS="-O2 -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} \\\${3}\\\" -avP \\\"\\\${host}:/\\\${x#*/}\\\" \\\"\\\$1\\\"\" rsync \"\${DISTDIR}/\${FILE}\" \"\${URI}\" \"\${PORTAGE_SSH_OPTS}\""
declare -x FFLAGS="-O2 -pipe"
declare -- GCCMAJOR="5"
declare -- GCCMICRO="0"
declare -- GCCMINOR="3"
declare -- GCC_BRANCH_VER="5.3"
declare -- GCC_CONFIG_VER="5.3.0"
declare -x GCC_FILESDIR="/usr/portage/sys-devel/gcc/files"
declare -- GCC_PV="5.3.0"
declare -- GCC_PVR="5.3.0"
declare -- GCC_RELEASE_VER="5.3.0"
declare -x GCJFLAGS="-O2 -march=native -pipe"
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
x11-libs/pango"
declare -- GMP_MPFR_DEPS=">=dev-libs/gmp-4.3.2:0 >=dev-libs/mpfr-2.4.2:0"
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 ublox ubx"
declare -x GRAPHITE="-floop-interchange -ftree-loop-distribution -floop-strip-mine -floop-block"
declare -x GRUB_PLATFORMS="efi-32 efi-64 pc"
declare -x GSETTINGS_BACKEND="dconf"
declare -x GUILE_LOAD_PATH="/usr/share/guile/1.8"
declare HDEPEND=""
declare HOMEPAGE="https://gcc.gnu.org/"
declare -x HTB_GCC_VER="5.3.0"
declare -- INCLUDEPATH="/usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/include"
declare -x INHERITED=" multilib toolchain-funcs eutils fixheadtails flag-o-matic gnuconfig libtool pax-utils versionator toolchain"
declare -x INPUT_DEVICES=""
declare -x INSDESTTREE=""
declare -x INSOPTIONS="-m0644"
declare IUSE="multislot regression-test vanilla altivec debug nopie nossp doc gcj awt hardened multilib objc objc-gc libssp objc++ fixed-point go graphite cilk jit +nls +nptl +cxx +fortran +openmp +sanitize"
declare -a IUSE_DEF='([0]="nls" [1]="nptl" [2]="cxx" [3]="fortran" [4]="openmp" [5]="sanitize")'
declare -x IUSE_IMPLICIT="abi_x86_64 prefix prefix-guest"
declare -x JAR="no"
declare -x JAVAC="/etc/java-config-2/current-system-vm/bin/javac"
declare -x JAVA_HOME="/etc/java-config-2/current-system-vm"
declare -x JDK_HOME="/etc/java-config-2/current-system-vm"
declare -x KERNEL="linux"
declare -x KERNEL_ABI="amd64"
declare -x KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~amd64-fbsd ~x86-fbsd"
declare -x LANG="zh_TW.UTF-8"
declare -x LANGUAGE="zh_TW.UTF-8"
declare -x LCD_DEVICES=""
declare -x LC_COLLATE="C"
declare -x LC_MEASUREMENT="zh_TW.UTF-8"
declare -x LC_MESSAGES="C"
declare -x LC_MONETARY="zh_TW.UTF-8"
declare -x LC_NUMERIC="zh_TW.UTF-8"
declare -x LC_TIME="zh_TW.UTF-8"
declare -x LDFLAGS="-Wl,-O1 -Wl,--as-needed"
declare -x LDFLAGS_amd64="-m elf_x86_64"
declare -x LDFLAGS_default
declare -x LDFLAGS_x32="-m elf32_x86_64"
declare -x LDFLAGS_x86="-m elf_i386"
declare -x LIBDIR_amd64="lib64"
declare -x LIBDIR_amd64_fbsd="lib64"
declare -x LIBDIR_arm="lib"
declare -x LIBDIR_arm64="lib64"
declare -x LIBDIR_default="lib"
declare -x LIBDIR_n32="lib32"
declare -x LIBDIR_n64="lib64"
declare -x LIBDIR_o32="lib"
declare -x LIBDIR_ppc="lib32"
declare -x LIBDIR_ppc64="lib64"
declare -x LIBDIR_s390="lib32"
declare -x LIBDIR_s390x="lib64"
declare -x LIBDIR_sparc32="lib32"
declare -x LIBDIR_sparc64="lib64"
declare -x LIBDIR_x32="libx32"
declare -x LIBDIR_x86="lib32"
declare -x LIBDIR_x86_fbsd="lib32"
declare -x LIBOPTIONS="-m0644"
declare -- LIBPATH="/usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0"
declare -x LIBREOFFICE_EXTENSIONS="presenter-console presenter-minimizer pdfimport wiki-publisher"
declare -x LICENSE="GPL-3+ LGPL-3+ || ( GPL-3+ libgcc libstdc++ gcc-runtime-library-exception-3.1 ) FDL-1.3+"
declare -x LINGUAS="en en_US ja zh_CN zh_TW zh"
declare -x LIRC_DEVICES="audio audio_alsa serial pctv"
declare -x MAKEOPTS="-j16 -s"
declare -x MANPAGER="manpager"
declare -x MULTILIB_ABIS="amd64 x86"
declare -x MULTILIB_STRICT_DENY="64-bit.*shared object"
declare -x MULTILIB_STRICT_DIRS="/lib32 /lib /usr/lib32 /usr/lib /usr/kde/*/lib32 /usr/kde/*/lib /usr/qt/*/lib32 /usr/qt/*/lib /usr/X11R6/lib32 /usr/X11R6/lib"
declare -x MULTILIB_STRICT_EXEMPT="(perl5|gcc|gcc-lib|binutils|eclipse-3|debug|portage|udev|systemd|clang|python-exec)"
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 OPENCL_PROFILE="nvidia"
declare -x OPENGL_PROFILE="xorg-x11"
declare -x PATCH_GCC_VER="5.3.0"
declare -- PATCH_VER="1.0"
declare -x PATH="/usr/lib/portage/python2.7/ebuild-helpers/xattr:/usr/lib/portage/python2.7/ebuild-helpers:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/4.9.3"
declare -- PAX_MARKINGS="PT XT"
declare PDEPEND=" elibc_glibc? ( >=sys-libs/glibc-2.8 ) >=sys-devel/gcc-config-1.7"
declare -x PHP_TARGETS=""
declare -x PIE_GCC_VER="5.3.0"
declare -- PIE_GLIBC_STABLE="x86 amd64 mips ppc ppc64 arm ia64"
declare -- PIE_UCLIBC_STABLE="x86 arm amd64 mips ppc ppc64"
declare -- PIE_VER="0.6.5"
declare -x PKG_CONFIG_PATH="/usr/lib64/pkgconfig"
declare -a PORTAGE_DOCOMPRESS='([0]="/usr/share/doc" [1]="/usr/share/info" [2]="/usr/share/man")'
declare -x PORTAGE_DOCOMPRESS_SIZE_LIMIT="128"
declare -a PORTAGE_DOCOMPRESS_SKIP='([0]="/usr/share/doc/gcc-5.3.0/html")'
declare -- PREFIX="/usr"
declare -x PRELINK_PATH_MASK="/usr/lib64/klibc"
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/entropy/lib"
declare -x PYTHON_SINGLE_TARGET=""
declare -x PYTHON_TARGETS=""
declare -x QEMU_SOFTMMU_TARGETS="x86_64 arm cris i386 m68k microblaze mips mips64 mips64el mipsel ppc ppc64 ppcemb sh4 sh4eb sparc sparc64"
declare -x QEMU_USER_TARGETS="alpha arm armeb cris i386 m68k microblaze mips mipsel ppc ppc64 ppc64abi32 sh4 sh4eb sparc sparc32plus sparc64 x86_64"
declare -x QT_GRAPHICSSYSTEM="raster"
declare RDEPEND="sys-libs/zlib
nls? ( virtual/libintl ) virtual/libiconv >=dev-libs/gmp-4.3.2:0 >=dev-libs/mpfr-2.4.2:0 >=dev-libs/mpc-0.8.1:0 graphite? ( >=dev-libs/isl-0.14 )"
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} \\\${3}\\\" -avP \\\"\\\${host}:/\\\${x#*/}\\\" \\\"\\\$1\\\"\" rsync \"\${DISTDIR}/\${FILE}\" \"\${URI}\" \"\${PORTAGE_SSH_OPTS}\""
declare -x RUBY_TARGETS=""
declare -x S="/var/tmp/portage/sys-devel/gcc-5.3.0/work/gcc-5.3.0"
declare -x SAB_BAD="-kdeprefix -arts -qt3 -beagle -gnome -evo -mono -eds -apm -oss -branding -esd"
declare -x SAB_BROWSER="nsplugin firefox mozdevelop xulrunner"
declare -x SAB_CODECS="x264 x265 gsm lame dv mp3 stream live openal theora ogg a52 win32codecs matroska xvid flac ffmpeg aac speex real dts musepack"
declare -x SAB_COMMS="jabber msn yahoo icq irc aim rss slp mail imap"
declare -x SAB_DESKTOP="kdehiddenvisibility gmp libnotify rdesktop pda zeroconf kdeenablefinal visualization avahi startup-notification accessibility"
declare -x SAB_FILESYS="fat hfs jfs xfs ntfs reiserfs sysfs inotify"
declare -x SAB_MEDIA="musicbrainz sdl pulseaudio wmf fame cdr dvi mp3rtp xine cddb alsa dvb dvd bluray network dvdread ipod audiofile artswrappersuid dvdr jack dri cdda libav mjpeg mmx joystick xvmc cpudetection v4l v4l2"
declare -x SAB_PRINT="cups ppds foomatic-db gimpprint freetype xprint scanner"
declare -x SAB_SYSTEM="cjk nls unicode gnutls nptl gcj udev systemd logind -consolekit kerberos acl dbus bash-completion lzo rar policykit xcb bzip2 bidi wifi lm_sensors acpi usb pcmcia bluetooth irda ieee1394 perl python"
declare -x SAB_XSYS="cairo X opengl vaapi vdpau png gif gtk qt4 qt3support xpm tiff xinerama aiglx svg gphoto2 dga lcd openexr wayland"
declare -x SANDBOX_DEBUG="0"
declare -x SANDBOX_DENY=""
declare -x SANDBOX_PREDICT="/var/tmp/portage/sys-devel/gcc-5.3.0/homedir:/dev/crypto:/dev/random:/proc/self/coredump_filter:/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/ptmx:/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-5.3.0/homedir/.bash_history:/dev/zero"
declare -x SHELL="/bin/bash"
declare -x SLOT="5"
declare -x SPECS_GCC_VER="4.4.3"
declare -- SPECS_VER="0.2.0"
declare SRC_URI="mirror://gnu/gcc/gcc-5.3.0/gcc-5.3.0.tar.bz2 mirror://gentoo/gcc-5.3.0-uclibc-patches-1.0.tar.bz2 https://dev.gentoo.org/~vapier/dist/gcc-5.3.0-uclibc-patches-1.0.tar.bz2 https://dev.gentoo.org/~rhill/dist/gcc-5.3.0-uclibc-patches-1.0.tar.bz2 https://dev.gentoo.org/~zorry/patches/gcc/gcc-5.3.0-uclibc-patches-1.0.tar.bz2 https://dev.gentoo.org/~blueness/dist/gcc-5.3.0-uclibc-patches-1.0.tar.bz2 mirror://gentoo/gcc-5.3.0-patches-1.0.tar.bz2 https://dev.gentoo.org/~vapier/dist/gcc-5.3.0-patches-1.0.tar.bz2 https://dev.gentoo.org/~rhill/dist/gcc-5.3.0-patches-1.0.tar.bz2 https://dev.gentoo.org/~zorry/patches/gcc/gcc-5.3.0-patches-1.0.tar.bz2 https://dev.gentoo.org/~blueness/dist/gcc-5.3.0-patches-1.0.tar.bz2 mirror://gentoo/gcc-5.3.0-piepatches-v0.6.5.tar.bz2 https://dev.gentoo.org/~vapier/dist/gcc-5.3.0-piepatches-v0.6.5.tar.bz2 https://dev.gentoo.org/~rhill/dist/gcc-5.3.0-piepatches-v0.6.5.tar.bz2 https://dev.gentoo.org/~zorry/patches/gcc/gcc-5.3.0-piepatches-v0.6.5.tar.bz2 https://dev.gentoo.org/~blueness/dist/gcc-5.3.0-piepatches-v0.6.5.tar.bz2 mirror://gentoo/gcc-4.4.3-specs-0.2.0.tar.bz2 https://dev.gentoo.org/~vapier/dist/gcc-4.4.3-specs-0.2.0.tar.bz2 https://dev.gentoo.org/~rhill/dist/gcc-4.4.3-specs-0.2.0.tar.bz2 https://dev.gentoo.org/~zorry/patches/gcc/gcc-4.4.3-specs-0.2.0.tar.bz2 https://dev.gentoo.org/~blueness/dist/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 mips ppc ppc64 arm"
declare -- STDCXX_INCDIR="/usr/lib/gcc/x86_64-pc-linux-gnu/5.3.0/include/g++-v5"
declare -x SUEXEC_UMASK="022"
declare -x SYMLINK_LIB="yes"
declare -- TARGET_ABI="amd64"
declare -- TARGET_DEFAULT_ABI="amd64"
declare -- TARGET_MULTILIB_ABIS="amd64 x86"
declare -x UCLIBC_GCC_VER="5.3.0"
declare -- UCLIBC_VER="1.0"
declare -x USE="abi_x86_64 amd64 cxx elibc_glibc fortran gcj go graphite hardened jit kernel_linux multilib nls nptl objc objc++ objc-gc openmp sanitize userland_GNU"
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 arm64 hppa hppa-hpux ia64 ia64-hpux ia64-linux m68k m68k-mint mips nios2 ppc ppc64 ppc64-linux ppc-aix ppc-macos ppc-openbsd riscv s390 sh sparc sparc64-freebsd sparc64-solaris sparc-fbsd sparc-solaris x64-cygwin 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 DragonFly FreeBSD glibc HPUX Interix mintlib musl NetBSD OpenBSD SunOS uclibc Winnt"
declare -x USE_EXPAND_VALUES_KERNEL="AIX Darwin FreeBSD freemint HPUX linux NetBSD OpenBSD SunOS Winnt"
declare -x USE_EXPAND_VALUES_USERLAND="BSD GNU"
declare -x USE_PYTHON="2.7"
declare -x VBOX_APP_HOME="/opt/VirtualBox"
declare -x VGL_READBACK="pbo"
declare -x VIDEO_CARDS=""
declare -x XDG_CONFIG_DIRS="/etc/xdg"
declare -x XDG_DATA_DIRS="/usr/local/share:/usr/share"
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 -- _ELT_NOTED_TMP="true"
declare -a _ESTACK_eshopts_='()'
declare -a _ESTACK_evar_='()'
declare -- _EUTILS_ECLASS="1"
declare -- _EUTILS_ECLASSDIR_LOCAL="/usr/portage/eclass"
declare -x _E_DOCDESTTREE_=""
declare -x _E_EXEDESTTREE_=""
declare -- _FLAG_O_MATIC_ECLASS="1"
declare -- _LIBTOOL_ECLASS="1"
declare -- _LIBTOOL_ECLASSDIR_LOCAL="/usr/portage/eclass"
declare -- _MULTILIB_ECLASS="1"
declare -- _PAX_UTILS_ECLASS="1"
declare -- _TOOLCHAIN_FUNCS_ECLASS="1"
declare -- _VERSIONATOR_ECLASS="1"
declare -x ac_cv_have_x="have_x=yes ac_x_includes= ac_x_libraries="
declare -x gcc_cv_libc_provides_ssp="yes"
declare -x gcc_cv_prog_makeinfo_modern="no"
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 [[ ! -e ${file} ]]; then
echo "File not found: ${file}" >> "${log}";
return 1;
fi;
local perms="$(find ${file} -maxdepth 0 -printf '%m')";
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;
chmod "${perms}" "${file}";
return "${ret}"
}
ELT_walk_patches ()
{
local patch tmp;
local ret=1;
local file=$1;
local patch_set=$2;
local patch_dir="$(libtool_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 "$(libtool_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
}
__eapi6_src_install ()
{
if [[ -f Makefile || -f GNUmakefile || -f makefile ]]; then
emake DESTDIR="${D}" install;
fi;
einstalldocs
}
__eapi6_src_prepare ()
{
if [[ $(declare -p PATCHES 2>/dev/null) == "declare -a"* ]]; then
eapply "${PATCHES[@]}";
else
if [[ -n ${PATCHES} ]]; then
eapply ${PATCHES};
fi;
fi;
eapply_user
}
_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"
}
_epatch_draw_line ()
{
[[ -z $1 ]] && set "$(printf "%65s" '')";
echo "${1//?/=}"
}
_eutils_eprefix_init ()
{
has "${EAPI:-0}" 0 1 2 && : ${ED:=${D}} ${EPREFIX:=} ${EROOT:=${ROOT}}
}
_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 | 512)
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+=" $*";
return 0
}
append-cppflags ()
{
[[ $# -eq 0 ]] && return 0;
export CPPFLAGS+=" $*";
return 0
}
append-cxxflags ()
{
[[ $# -eq 0 ]] && return 0;
export CXXFLAGS+=" $*";
return 0
}
append-fflags ()
{
[[ $# -eq 0 ]] && return 0;
export FFLAGS+=" $*";
export 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
if [[ -z "${flag// }" ]]; then
eqawarn "Appending an empty argument to LIBS is invalid! Skipping.";
continue;
fi;
case $flag in
-[lL]*)
export LIBS="${LIBS} ${flag}"
;;
-*)
eqawarn "Appending non-library to LIBS (${flag}); Other linker flags should be passed via LDFLAGS";
export LIBS="${LIBS} ${flag}"
;;
*)
export LIBS="${LIBS} -l${flag}"
;;
esac;
done;
return 0
}
built_with_use ()
{
_eutils_eprefix_init;
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=${EROOT}/var/db/pkg/${PKG}/USE;
local IUSEFILE=${EROOT}/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;
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.";
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} )
}
downgrade_arch_flags ()
{
local arch bver i isa myarch mytune rep ver;
bver=${1:-${GCC_BRANCH_VER}};
[[ $(gcc-version) < ${bver} ]] && return 0;
[[ $(tc-arch) != amd64 && $(tc-arch) != x86 ]] && return 0;
myarch=$(get-flag march);
mytune=$(get-flag mtune);
if [[ ${myarch} == native || ${mytune} == native ]]; then
if [[ ${bver} < 4.2 ]]; then
arch=$($(tc-getCC) -march=native -v -E -P - </dev/null 2>&1 | sed -rn "/cc1.*-march/s:.*-march=([^ ']*).*:\1:p");
replace-cpu-flags native ${arch};
fi;
fi;
[[ ${mytune} == intel && ${bver} < 4.9 ]] && replace-cpu-flags intel generic;
[[ ${mytune} == generic && ${bver} < 4.2 ]] && filter-flags '-mtune=*';
[[ ${mytune} == x86-64 ]] && filter-flags '-mtune=*';
[[ ${bver} < 3.4 ]] && filter-flags '-mtune=*';
local archlist=(4.9 bdver4 bdver3 4.9 bonnell atom 4.9 broadwell core-avx2 4.9 haswell core-avx2 4.9 ivybridge core-avx-i 4.9 nehalem corei7 4.9 sandybridge corei7-avx 4.9 silvermont corei7 4.9 westmere corei7 4.8 bdver3 bdver2 4.8 btver2 btver1 4.7 bdver2 bdver1 4.7 core-avx2 core-avx-i 4.6 bdver1 amdfam10 4.6 btver1 amdfam10 4.6 core-avx-i core2 4.6 corei7 core2 4.6 corei7-avx core2 4.5 atom core2 4.3 amdfam10 k8 4.3 athlon64-sse3 k8 4.3 barcelona k8 4.3 core2 nocona 4.3 geode k6-2 4.3 k8-sse3 k8 4.3 opteron-sse3 k8 3.4 athlon-fx x86-64 3.4 athlon64 x86-64 3.4 c3-2 c3 3.4 k8 x86-64 3.4 opteron x86-64 3.4 pentium-m pentium3 3.4 pentium3m pentium3 3.4 pentium4m pentium4);
for ((i = 0; i < ${#archlist[@]}; i += 3))
do
myarch=$(get-flag march);
mytune=$(get-flag mtune);
ver=${archlist[i]};
arch=${archlist[i + 1]};
rep=${archlist[i + 2]};
[[ ${myarch} != ${arch} && ${mytune} != ${arch} ]] && continue;
if [[ ${ver} > ${bver} ]]; then
einfo "Replacing ${myarch} (added in gcc ${ver}) with ${rep}...";
[[ ${myarch} == ${arch} ]] && replace-cpu-flags ${myarch} ${rep};
[[ ${mytune} == ${arch} ]] && replace-cpu-flags ${mytune} ${rep};
continue;
else
break;
fi;
done;
local isalist=(4.9 -mno-sha 4.9 -mno-avx512pf 4.9 -mno-avx512f 4.9 -mno-avx512er 4.9 -mno-avx512cd 4.8 -mno-xsaveopt 4.8 -mno-xsave 4.8 -mno-rtm 4.8 -mno-fxsr 4.7 -mno-lzcnt 4.7 -mno-bmi2 4.7 -mno-avx2 4.6 -mno-tbm 4.6 -mno-rdrnd 4.6 -mno-fsgsbase 4.6 -mno-f16c 4.6 -mno-bmi 4.5 -mno-xop 4.5 -mno-movbe 4.5 -mno-lwp 4.5 -mno-fma4 4.4 -mno-pclmul 4.4 -mno-fma 4.4 -mno-avx 4.4 -mno-aes 4.3 -mno-ssse3 4.3 -mno-sse4a 4.3 -mno-sse4 4.3 -mno-sse4.2 4.3 -mno-sse4.1 4.3 -mno-popcnt 4.3 -mno-abm);
for ((i = 0; i < ${#isalist[@]}; i += 2))
do
ver=${isalist[i]};
isa=${isalist[i + 1]};
[[ ${ver} > ${bver} ]] && filter-flags ${isa} ${isa/-m/-mno-};
done
}
ebeep ()
{
ewarn "QA Notice: ebeep is not defined in EAPI=${EAPI}, please file a bug at https://bugs.gentoo.org"
}
econf_build ()
{
local CBUILD=${CBUILD:-${CHOST}};
tc-env_build econf --build=${CBUILD} --host=${CBUILD} "$@"
}
ecvs_clean ()
{
[[ $# -eq 0 ]] && 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
}
egit_clean ()
{
[[ $# -eq 0 ]] && set -- .;
find "$@" -type d -name '.git*' -prune -print0 | xargs -0 rm -rf
}
einstalldocs ()
{
debug-print-function ${FUNCNAME} "${@}";
local dodoc_opts=-r;
has ${EAPI} 0 1 2 3 && dodoc_opts=;
if ! declare -p DOCS &> /dev/null; then
local d;
for d in README* ChangeLog AUTHORS NEWS TODO CHANGES THANKS BUGS FAQ CREDITS CHANGELOG;
do
if [[ -s ${d} ]]; then
dodoc "${d}" || die;
fi;
done;
else
if [[ $(declare -p DOCS) == "declare -a"* ]]; then
if [[ -n ${DOCS[@]} ]]; then
dodoc ${dodoc_opts} "${DOCS[@]}" || die;
fi;
else
if [[ -n ${DOCS} ]]; then
dodoc ${dodoc_opts} ${DOCS} || die;
fi;
fi;
fi;
if [[ $(declare -p HTML_DOCS 2>/dev/null) == "declare -a"* ]]; then
if [[ -n ${HTML_DOCS[@]} ]]; then
dohtml -r "${HTML_DOCS[@]}" || die;
fi;
else
if [[ -n ${HTML_DOCS} ]]; then
dohtml -r ${HTML_DOCS} || die;
fi;
fi;
return 0
}
elibtoolize ()
{
local x;
local dirs=();
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 target-nm";
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} ??"
;;
*)
dirs+=("${x}")
;;
esac;
done;
[[ ${do_uclibc} == "yes" ]] && elt_patches+=" uclibc-conf uclibc-ltconf";
case ${CHOST} in
*-aix*)
elt_patches+=" hardcode aixrtl"
;;
*-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;
if [[ ${do_shallow} == "yes" ]]; then
[[ ${#dirs[@]} -ne 0 ]] && die "Using --shallow with explicit dirs doesn't make sense";
[[ -f ${S}/ltmain.sh || -f ${S}/configure ]] && dirs+=("${S}");
else
[[ ${#dirs[@]} -eq 0 ]] && dirs+=("${S}");
dirs=($(find "${dirs[@]}" '(' -name ltmain.sh -o -name configure ')' -printf '%h\n' | sort -u));
fi;
local d p ret;
for d in "${dirs[@]}";
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;
[[ -f ${d}/ltmain.sh ]] && for p in ${elt_patches};
do
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-ltconf)
if [[ -s ${d}/ltconfig ]]; then
ELT_walk_patches "${d}/ltconfig" "${p}";
ret=$?;
fi
;;
fbsd-ltconf)
if [[ -s ${d}/ltconfig ]]; then
ELT_walk_patches "${d}/ltconfig" "${p}";
ret=$?;
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
;;
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
;;
darwin-*)
[[ ${CHOST} == *"-darwin"* ]] && ewarn " Darwin patch set '${p}' failed to apply!"
;;
esac;
fi;
done;
[[ -f ${d}/ltmain.sh ]] && 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;
[[ -f ${d}/configure ]] && for p in ${elt_patches};
do
ret=0;
case ${p} in
uclibc-conf)
if grep -qs 'Transform linux' "${d}/configure"; then
ELT_walk_patches "${d}/configure" "${p}";
ret=$?;
fi
;;
fbsd-conf)
if grep -qs 'version_type=freebsd-' "${d}/configure"; then
ELT_walk_patches "${d}/configure" "${p}";
ret=$?;
fi
;;
darwin-conf)
if grep -qs '&& echo \.so ||' "${d}/configure"; then
ELT_walk_patches "${d}/configure" "${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=$?;
fi;
if [[ $subret -eq 0 ]]; then
ret=0;
fi;
done
;;
mint-conf | gold-conf | sol2-conf)
ELT_walk_patches "${d}/configure" "${p}";
ret=$?
;;
target-nm)
ELT_walk_patches "${d}/configure" "${p}";
ret=$?
;;
*)
;;
esac;
if [[ ${ret} -ne 0 ]]; then
case ${p} in
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" 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;
rm -f "${d}/libtool";
> "${d}/.elibtoolized";
done
}
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
}
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
evar_push_set LC_COLLATE C;
set -- "$1"/*${EPATCH_SUFFIX:+."${EPATCH_SUFFIX}"};
evar_pop;
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}${EPATCH_USER_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 patch="patch";
eval $(alias patch 2>/dev/null | sed 's:^alias ::');
local STDERR_TARGET="${T}/${patchname}.out";
if [[ -e ${STDERR_TARGET} ]]; then
STDERR_TARGET="${T}/${patchname}-$$.out";
fi;
printf "***** %s *****\nPWD: %s\nPATCH TOOL: %s -> %s\nVERSION INFO:\n%s\n\n" "${patchname}" "${PWD}" "${patch}" "$(type -P "${patch}")" "$(${patch} --version)" > "${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
echo;
eerror "Rejected Patch: ${patchname} !";
eerror " ( ${PATCH_TARGET} )";
eerror;
eerror "Your patch uses relative paths '../':";
eerror "${rel_paths}";
echo;
die "you need to fix the relative paths in patch";
fi;
local patch_cmd;
while [[ ${count} -lt 5 ]]; do
patch_cmd="${patch} -p${count} ${EPATCH_OPTS}";
( _epatch_draw_line "***** ${patchname} *****";
echo;
echo "PATCH COMMAND: ${patch_cmd} --dry-run -f < '${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 "PATCH COMMAND: ${patch_cmd} < '${PATCH_TARGET}'";
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;
for check in ${CATEGORY}/{${P}-${PR},${P},${PN}}{,:${SLOT%/*}};
do
EPATCH_SOURCE=${EPATCH_USER_SOURCE}/${CTARGET}/${check};
[[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${EPATCH_USER_SOURCE}/${CHOST}/${check};
[[ -r ${EPATCH_SOURCE} ]] || EPATCH_SOURCE=${EPATCH_USER_SOURCE}/${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}";
has epatch_user_death_notice ${EBUILD_DEATH_HOOKS} || EBUILD_DEATH_HOOKS+=" epatch_user_death_notice";
return 0;
fi;
done;
echo "none" > "${applied}";
return 1
}
epatch_user_death_notice ()
{
ewarn "!!! User patches were applied to this build!"
}
epause ()
{
ewarn "QA Notice: epause is not defined in EAPI=${EAPI}, please file a bug at https://bugs.gentoo.org"
}
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 "$(eutils_elt_patch_dir)"/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
}
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 ()
{
[[ $# -eq 0 ]] && 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: $*"
}
eutils_elt_patch_dir ()
{
local d="${ECLASSDIR}/ELT-patches";
if [[ ! -d ${d} ]]; then
d="${_EUTILS_ECLASSDIR_LOCAL}/ELT-patches";
fi;
echo "${d}"
}
evar_pop ()
{
local cnt=${1:-bad};
case $# in
0)
cnt=1
;;
1)
isdigit "${cnt}" || die "${FUNCNAME}: first arg must be a number: $*"
;;
*)
die "${FUNCNAME}: only accepts one arg: $*"
;;
esac;
local var val;
while (( cnt-- )); do
estack_pop evar val || die "${FUNCNAME}: unbalanced push";
estack_pop evar var || die "${FUNCNAME}: unbalanced push";
[[ ${val} == "unset_76fc3c462065bb4ca959f939e6793f94" ]] && unset ${var} || printf -v "${var}" '%s' "${val}";
done
}
evar_push ()
{
local var val;
for var in "$@";
do
[[ ${!var+set} == "set" ]] && val=${!var} || val="unset_76fc3c462065bb4ca959f939e6793f94";
estack_push evar "${var}" "${val}";
done
}
evar_push_set ()
{
local var=$1;
evar_push ${var};
case $# in
1)
unset ${var}
;;
2)
printf -v "${var}" '%s' "$2"
;;
*)
die "${FUNCNAME}: incorrect # of args: $*"
;;
esac
}
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/both/387,sse};
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 ()
{
local libpath="$1";
pushd "${D}" > /dev/null;
pushd "./${libpath}" > /dev/null;
local dir="${PWD#${D%/}}";
local allarchives=$(echo *.la);
allarchives="\(${allarchives// /\\|}\)";
popd > /dev/null;
find "./${dir}" -maxdepth 1 -name '*.la' -exec sed -i -e "/^libdir=/s:=.*:='${dir}':" {} + || die;
find "./${PREFIX}"/lib* -maxdepth 3 -name '*.la' -exec sed -i -e "/^dependency_libs=/s:/[^ ]*/${allarchives}:${libpath}/\1:g" {} + || die;
find "./${dir}/" -maxdepth 1 -name '*.la' -exec sed -i -e "/^dependency_libs=/s:/[^ ]*/${allarchives}:${libpath}/\1:g" {} + || die;
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-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.8 && 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);
[[ "${directive/\{!fstrict-overflow:}" != "${directive}" ]]
}
gcc-specs-now ()
{
local directive;
directive=$(gcc-specs-directive link_command);
[[ "${directive/\{!nonow:}" != "${directive}" ]]
}
gcc-specs-pie ()
{
local directive;
directive=$(gcc-specs-directive cc1);
[[ "${directive/\{!nopie:}" != "${directive}" ]]
}
gcc-specs-relro ()
{
local directive;
directive=$(gcc-specs-directive link_command);
[[ "${directive/\{!norelro:}" != "${directive}" ]]
}
gcc-specs-ssp ()
{
local directive;
directive=$(gcc-specs-directive cc1);
[[ "${directive/\{!fno-stack-protector:}" != "${directive}" ]]
}
gcc-specs-ssp-to-all ()
{
local directive;
directive=$(gcc-specs-directive cc1);
[[ "${directive/\{!fno-stack-protector-all:}" != "${directive}" ]]
}
gcc-specs-stack-check ()
{
local directive;
directive=$(gcc-specs-directive cc1);
[[ "${directive/\{!fno-stack-check:}" != "${directive}" ]]
}
gcc-version ()
{
_gcc_fullversion '$1.$2' "$@"
}
gcc_do_filter_flags ()
{
strip-flags;
replace-flags -O? -O2;
filter-flags '-mabi*' -m31 -m32 -m64;
filter-flags -frecord-gcc-switches;
filter-flags -mno-rtm -mno-htm;
if tc_version_is_between 3.2 3.4; then
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;
fi;
if tc_version_is_at_least 3.4; then
case $(tc-arch) in
amd64 | x86)
filter-flags '-mcpu=*';
tc_version_is_between 4.4 4.5 && append-flags -mno-avx;
if tc_version_is_between 4.6 4.7; then
replace-cpu-flags c3-2 pentium2 pentium3 pentium3m pentium-m i686;
fi
;;
alpha)
append-ldflags -Wl,--no-relax
;;
sparc)
tc_version_is_between 4.6 4.8 && MAKEOPTS+=" -j1"
;;
*-macos)
tc_version_is_between 4.0 4.2 && filter-flags '-mcpu=*' '-march=*' '-mtune=*'
;;
esac;
fi;
strip-unsupported-flags;
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
! tc_version_is_at_least 4.6 && 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;
einfo "Compiling ${PN} (${GCC_MAKE_TARGET})...";
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;
find -name '*_build_*' -delete;
find -name '*_.3' -exec grep -l ' Directory Reference ' {} + | xargs rm -f;
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;
if tc_version_is_at_least 5 && is_crosscompile; then
dodir "${HOSTLIBPATH}";
mv "${D}"/usr/$(get_libdir)/libcc1* "${D}${HOSTLIBPATH}" || die;
fi;
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}" || die;
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}" || die;
mv "${x}" "${D}${FROMDIR}"/pkgconfig/libgcj-${GCC_PV}.pc || die;
done;
done;
for FROMDIR in ${removedirs};
do
rmdir "${D}"${FROMDIR} &> /dev/null;
done;
find -depth "${D}" -type d -exec rmdir {} + &> /dev/null
}
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_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*)
;;
*-android*)
return 0
;;
*linux* | *-freebsd* | *-openbsd* | *-netbsd*)
use prefix && return 0
;;
*)
return 0
;;
esac;
dodir /usr/${libdir};
if [[ $1 == "-a" ]]; then
auto=true;
shift;
dodir /${libdir};
fi;
local flags=(${CFLAGS} ${LDFLAGS} -Wl,--verbose);
if $(tc-getLD) --version | grep -q 'GNU gold'; then
local d="${T}/bfd-linker";
mkdir -p "${d}";
ln -sf $(which ${CHOST}-ld.bfd) "${d}"/ld;
flags+=(-B"${d}");
fi;
output_format=$($(tc-getCC) "${flags[@]}" 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 https://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~rhill/dist/URI
HTTP~zorry/patches/gcc/URI HTTP~blueness/dist/URI";
devspace=${devspace//HTTP/https:\/\/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 [[ ${PV} == *9999* ]]; then
:;
else
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
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 in_iuse gcj; 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=("${EPREFIX}"/usr/share/misc/config.sub "${EPREFIX}"/usr/share/gnuconfig/config.sub "${EPREFIX}"/usr/share/automake*/config.sub "${EPREFIX}"/usr/share/libtool/config.sub);
grep -s '^timestamp' "${locations[@]}" | sort -r -n -t\' -k2 | sed -n '1{s,/config.sub:.*$,,;p;q}'
}
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
if [[ ${CTARGET} == *-gnu* ]]; then
tocheck=${SSP_STABLE};
fi;
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;
! is_crosscompile && tc_version_is_at_least 4.8 && return 0;
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_jit ()
{
gcc-lang-supported jit || return 1;
use_if_iuse jit
}
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++
}
isdigit ()
{
local d;
for d in "$@";
do
[[ ${d:-bad} == *[!0-9]* ]] && return 1;
done;
return 0
}
libtool_elt_patch_dir ()
{
local d="${ECLASSDIR}/ELT-patches";
if [[ ! -d ${d} ]]; then
d="${_LIBTOOL_ECLASSDIR_LOCAL}/ELT-patches";
fi;
echo "${d}"
}
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;
local slot=${SLOT%/*};
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 ()
{
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; then
sed -e '/^ALL_CXXFLAGS/iHARD_CFLAGS = ' -e 's|^ALL_CXXFLAGS = |ALL_CXXFLAGS = $(HARD_CFLAGS) |' -i "${S}"/gcc/Makefile.in;
fi;
local gcc_hard_flags="";
if use hardened; then
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";
return 0;
fi;
fi;
fi;
BRANDING_GCC_PKGVERSION=${BRANDING_GCC_PKGVERSION/Gentoo/Gentoo Hardened};
else
if hardened_gcc_works ssp; then
einfo "Updating gcc to use automatic SSP building ...";
gcc_hard_flags+=" -DEFAULT_SSP";
fi;
fi;
sed -i -e "/^HARD_CFLAGS = /s|=|= ${gcc_hard_flags} |" "${S}"/gcc/Makefile.in || die
}
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 ()
{
_eutils_eprefix_init;
local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5;
local tmpwrapper=$(emktemp);
( echo '#!/bin/sh';
[[ -n ${chdir} ]] && printf 'cd "%s"\n' "${EPREFIX}${chdir}";
if [[ -n ${libdir} ]]; then
local var;
if [[ ${CHOST} == *-darwin* ]]; then
var=DYLD_LIBRARY_PATH;
else
var=LD_LIBRARY_PATH;
fi;
cat <<-EOF
if [ "\${${var}+set}" = "set" ] ; then
export ${var}="\${${var}}:${EPREFIX}${libdir}"
else
export ${var}="${EPREFIX}${libdir}"
fi
EOF
fi
printf 'exec %s "$@"\n' "${bin/#\//${EPREFIX}/}" ) > "${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}};
local cpu=${CTARGET%%*-};
case ${cpu} in
aarch64*)
export CFLAGS_arm=${CFLAGS_arm-};
case ${cpu} in
aarch64*be)
export CHOST_arm="armv8b-${CTARGET#*-}"
;;
*)
export CHOST_arm="armv8l-${CTARGET#*-}"
;;
esac;
CHOST_arm=${CHOST_arm/%-gnu/-gnueabi};
export CTARGET_arm=${CHOST_arm};
export LIBDIR_arm="lib";
export CFLAGS_arm64=${CFLAGS_arm64-};
export CHOST_arm64=${CTARGET};
export CTARGET_arm64=${CHOST_arm64};
export LIBDIR_arm64="lib64";
: ${MULTILIB_ABIS=arm64};
: ${DEFAULT_ABI=arm64}
;;
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 F77 FC LD PKG_CONFIG_{LIBDIR,PATH};
do
vv="_abi_saved_${v}";
[[ ${!vv+set} == "set" ]] && export ${v}="${!vv}" || unset ${v};
unset ${vv};
done;
unset _DEFAULT_ABI_SAVED;
fi;
if [[ ${ABI} != ${DEFAULT_ABI} ]]; then
for v in CHOST CBUILD AS CC CXX F77 FC LD PKG_CONFIG_{LIBDIR,PATH};
do
vv="_abi_saved_${v}";
[[ ${!v+set} == "set" ]] && export ${vv}="${!v}" || unset ${vv};
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 F77="$(tc-getF77) $(get_abi_CFLAGS)";
export FC="$(tc-getFC) $(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 $#
}
optfeature ()
{
debug-print-function ${FUNCNAME} "$@";
local i j msg;
local desc=$1;
local flag=0;
shift;
for i in "$@";
do
for j in ${i};
do
if has_version "${j}"; then
flag=1;
else
flag=0;
break;
fi;
done;
if [[ ${flag} -eq 1 ]]; then
break;
fi;
done;
if [[ ${flag} -eq 0 ]]; then
for i in "$@";
do
msg=" ";
for j in ${i};
do
msg+=" ${j} and";
done;
msg="${msg:0: -4} for ${desc}";
elog "${msg}";
done;
fi
}
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 ret=0;
flags="${1//[!zPpEeMmRrSs]}";
[[ -n "${flags}" ]] || return 0;
shift;
local dodefault="";
[[ -n "${flags//[!z]}" ]] && dodefault="yes";
if has PT ${PAX_MARKINGS}; then
for f in "$@";
do
if type -p paxctl > /dev/null; then
einfo "PT_PAX marking -${flags} ${f} with paxctl";
paxctl -q${flags} "${f}" > /dev/null 2>&1 && continue;
paxctl -qC${flags} "${f}" > /dev/null 2>&1 && continue;
paxctl -qc${flags} "${f}" > /dev/null 2>&1 && continue;
fi;
if type -p paxctl-ng > /dev/null && paxctl-ng -L; then
einfo "PT_PAX marking -${flags} ${f} with paxctl-ng";
flags="${flags//z}";
[[ ${dodefault} == "yes" ]] && paxctl-ng -L -z "${f}" > /dev/null 2>&1;
[[ -n "${flags}" ]] || continue;
paxctl-ng -L -${flags} "${f}" > /dev/null 2>&1 && continue;
fi;
if type -p scanelf > /dev/null && [[ ${PAX_MARKINGS} != "none" ]]; then
einfo "PT_PAX marking -${flags} ${f} with scanelf";
scanelf -Xxz ${flags} "$f" > /dev/null 2>&1;
else
if [[ ${PAX_MARKINGS} != "none" ]]; then
elog "Failed to set PT_PAX markings -${flags} ${f}.";
ret=1;
fi;
fi;
done;
fi;
if has XT ${PAX_MARKINGS}; then
flags="${flags//z}";
for f in "$@";
do
if type -p paxctl-ng > /dev/null && paxctl-ng -l; then
einfo "XATTR_PAX marking -${flags} ${f} with paxctl-ng";
[[ ${dodefault} == "yes" ]] && paxctl-ng -d "${f}" > /dev/null 2>&1;
[[ -n "${flags}" ]] || continue;
paxctl-ng -l -${flags} "${f}" > /dev/null 2>&1 && continue;
fi;
if type -p setfattr > /dev/null; then
[[ -n "${flags//[!Ee]}" ]] || flags+="e";
einfo "XATTR_PAX marking -${flags} ${f} with setfattr";
[[ ${dodefault} == "yes" ]] && setfattr -x "user.pax.flags" "${f}" > /dev/null 2>&1;
setfattr -n "user.pax.flags" -v "${flags}" "${f}" > /dev/null 2>&1 && continue;
fi;
if [[ ${PAX_MARKINGS} != "none" ]]; then
elog "Failed to set XATTR_PAX markings -${flags} ${f}.";
ret=1;
fi;
done;
fi;
return ${ret}
}
pkg_nofetch ()
{
default
}
pkg_postinst ()
{
toolchain_pkg_postinst "$@"
}
pkg_postrm ()
{
toolchain_pkg_postrm "$@"
}
pkg_pretend ()
{
toolchain_pkg_pretend "$@"
}
pkg_setup ()
{
toolchain_pkg_setup "$@"
}
preserve_old_lib ()
{
_eutils_eprefix_init;
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 ${EROOT}/${lib} ]] || continue;
dir=${lib%/*};
dodir ${dir} || die "dodir ${dir} failed";
cp "${EROOT}"/${lib} "${ED}"/${lib} || die "cp ${lib} failed";
touch "${ED}"/${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;
_eutils_eprefix_init;
local lib notice=0;
for lib in "$@";
do
[[ -e ${EROOT}/${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;
_eutils_eprefix_init;
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};
if ! sed -n -e '/^# Generated by .*libtool/q0;4q1' "${f}"; then
continue;
fi;
[[ ${f} != ${archivefile} ]] || die 'regex sanity check failed';
local reason= pkgconfig_scanned=;
local snotlink=$(sed -n -e 's:^shouldnotlink=::p' "${f}");
if [[ ${snotlink} == yes ]]; 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 "${ED}" -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 -O '-O[12sg]' -mcpu -march -mtune '-fstack-protector*' '-fsanitize*' -fbounds-check -fbounds-checking -fno-strict-overflow -fno-PIE -fno-pie -nopie -fno-unit-at-a-time -g '-g[0-9]' -ggdb '-ggdb[0-9]' '-gdwarf-*' gstabs -gstabs+ -fno-ident -fpermissive -frecord-gcc-switches '-fdiagnostics*' '-W*' -w '-[DUILR]*' '-Wl,*');
ALLOWED_FLAGS+=('-fno-stack-protector*' '-fabi-version=*' -fno-strict-aliasing -fno-bounds-check -fno-bounds-checking -fstrict-overflow -fno-omit-frame-pointer '-fno-builtin*');
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 -mfix-r10000 -mno-fix-r10000 -mno-fma4 -mno-movbe -mno-xop -mno-lwp -mno-fsgsbase -mno-rdrnd -mno-f16c -mno-bmi -mno-tbm -mno-avx2 -mno-bmi2 -mno-fma -mno-lzcnt -mno-fxsr -mno-hle -mno-rtm -mno-xsave -mno-xsaveopt -mno-avx512cd -mno-avx512er -mno-avx512f -mno-avx512pf -mno-sha)
}
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_configure ()
{
toolchain_src_configure "$@"
}
src_install ()
{
toolchain_src_install "$@"
}
src_prepare ()
{
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;
is_crosscompile && EPATCH_EXCLUDE+=" 05_all_gcc-spec-env.patch";
toolchain_src_prepare
}
src_test ()
{
toolchain_src_test "$@"
}
src_unpack ()
{
toolchain_src_unpack "$@"
}
strip-flags ()
{
local x y var;
local ALLOWED_FLAGS;
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;
if [[ ${!var} != "${new[*]}" ]]; then
einfo "strip-flags: ${var}: changed '${!var}' to '${new[*]}'";
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*le)
echo little
;;
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;
local v;
for v in BUILD_{C,CXX,CPP,LD}FLAGS;
do
export ${v#BUILD_}_FOR_BUILD="${!v}";
done
}
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-getGO ()
{
tc-getPROG GO gccgo "$@"
}
tc-getLD ()
{
tc-getPROG LD ld "$@"
}
tc-getNM ()
{
tc-getPROG NM nm "$@"
}
tc-getOBJCOPY ()
{
tc-getPROG OBJCOPY objcopy "$@"
}
tc-getOBJDUMP ()
{
tc-getPROG OBJDUMP objdump "$@"
}
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 ()
{
[[ ${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}};
[[ ${host} == *-mint* ]]
}
tc-ld-disable-gold ()
{
if ! tc-ld-is-gold "$@"; then
return;
fi;
ewarn "Forcing usage of the BFD linker instead of GOLD";
local ld=$(tc-getLD "$@");
local bfd_ld="${ld%% *}.bfd";
local path_ld=$(which "${bfd_ld}" 2>/dev/null);
[[ -e ${path_ld} ]] && export LD=${bfd_ld};
local major=$(gcc-major-version "$@");
local minor=$(gcc-minor-version "$@");
if [[ ${major} -lt 4 ]] || [[ ${major} -eq 4 && ${minor} -lt 8 ]]; then
if [[ -e ${path_ld} ]]; then
local d="${T}/bfd-linker";
mkdir -p "${d}";
ln -sf "${path_ld}" "${d}"/ld;
export LDFLAGS="${LDFLAGS} -B${d}";
else
die "unable to locate a BFD linker to bypass gold";
fi;
else
export LDFLAGS="${LDFLAGS} -fuse-ld=bfd";
fi
}
tc-ld-is-gold ()
{
local out;
out=$($(tc-getLD "$@") --version 2>&1);
if [[ ${out} == *"GNU gold"* ]]; then
return 0;
fi;
local base="${T}/test-tc-gold";
cat > "${base}.c" <<-EOF
int main() { return 0; }
EOF
out=$($(tc-getCC "$@") ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} -Wl,--version "${base}.c" -o "${base}" 2>&1);
rm -f "${base}"*;
if [[ ${out} == *"GNU gold"* ]]; then
return 0;
fi;
return 1
}
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*)
echo arm64
;;
alpha*)
echo alpha
;;
arm*)
echo arm
;;
avr*)
ninj avr32 avr
;;
bfin*)
ninj blackfin bfin
;;
c6x*)
echo c6x
;;
cris*)
echo cris
;;
frv*)
echo frv
;;
hexagon*)
echo hexagon
;;
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
;;
metag*)
echo metag
;;
microblaze*)
echo microblaze
;;
mips*)
echo mips
;;
nios2*)
echo nios2
;;
nios*)
echo nios
;;
or32*)
echo openrisc
;;
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
;;
riscv*)
echo riscv
;;
s390*)
echo s390
;;
score*)
echo score
;;
sh64*)
ninj sh64 sh
;;
sh*)
echo sh
;;
sparc64*)
ninj sparc64 sparc
;;
sparc*)
[[ ${PROFILE_ARCH} == "sparc64" ]] && ninj sparc64 sparc || echo sparc
;;
tile*)
echo tile
;;
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
;;
xtensa*)
echo xtensa
;;
*)
echo unknown
;;
esac
}
tc_version_is_at_least ()
{
version_is_at_least "$1" "${2:-${GCC_RELEASE_VER}}"
}
tc_version_is_between ()
{
tc_version_is_at_least "${1}" && ! tc_version_is_at_least "${2}"
}
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 cmdline=($(tc-get${comp}) -Werror -c -o /dev/null);
if "${cmdline[@]}" -x${lang} - < /dev/null > /dev/null 2>&1; then
"${cmdline[@]}" "${flag}" -x${lang} - < /dev/null > /dev/null 2>&1;
else
"${cmdline[@]}" "${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 ()
{
if [[ -e "${WORKDIR}"/build ]]; then
pushd "${WORKDIR}"/build > /dev/null;
( echo '' | $(tc-getCC ${CTARGET}) ${CFLAGS} -v -E - 2>&1 ) > gccinfo.log;
[[ -e "${T}"/build.log ]] && cp "${T}"/build.log .;
tar jcf "${WORKDIR}"/gcc-build-logs.tar.bz2 gccinfo.log build.log $(find -name config.log);
rm gccinfo.log build.log;
eerror;
eerror "Please include ${WORKDIR}/gcc-build-logs.tar.bz2 in your bug report.";
eerror;
popd > /dev/null;
fi
}
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 "https://wiki.gentoo.org/wiki/Upgrading_GCC";
echo;
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;
if use regression-test; then
elog "Testsuite results have been installed into /usr/share/doc/${PF}/testsuite";
echo;
fi;
if [[ -n ${PRERELEASE}${SNAPSHOT} ]]; then
einfo "This GCC ebuild is provided for your convenience, and the use";
einfo "of this compiler is not supported by the Gentoo Developers.";
einfo "Please report bugs to upstream at http://gcc.gnu.org/bugzilla/";
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_pretend ()
{
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.";
fi;
[[ -z ${UCLIBC_VER} ]] && [[ ${CTARGET} == *-uclibc* ]] && die "Sorry, this version does not support uClibc";
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
}
toolchain_pkg_setup ()
{
case ${EAPI} in
2 | 3)
toolchain_pkg_pretend
;;
esac;
unset GCC_SPECS;
unset LANGUAGES
}
toolchain_src_compile ()
{
touch "${S}"/gcc/c-gperf.h;
[[ ! -x /usr/bin/perl ]] && find "${WORKDIR}"/build -name '*.[17]' -exec touch {} +;
gcc_do_make ${GCC_MAKE_TARGET}
}
toolchain_src_configure ()
{
downgrade_arch_flags;
gcc_do_filter_flags;
einfo "CFLAGS=\"${CFLAGS}\"";
einfo "CXXFLAGS=\"${CXXFLAGS}\"";
einfo "LDFLAGS=\"${LDFLAGS}\"";
export JAR=no;
if ! tc_version_is_at_least 4.4 && want_minispecs; then
setup_minispecs_gcc_build_specs;
fi;
local confgcc=(--host=${CHOST});
if is_crosscompile || tc-is-cross-compiler; then
confgcc+=(--target=${CTARGET});
fi;
[[ -n ${CBUILD} ]] && confgcc+=(--build=${CBUILD});
confgcc+=(--prefix="${PREFIX}" --bindir="${BINPATH}" --includedir="${INCLUDEPATH}" --datadir="${DATAPATH}" --mandir="${DATAPATH}/man" --infodir="${DATAPATH}/info" --with-gxx-include-dir="${STDCXX_INCDIR}");
if tc_version_is_at_least 4.4; then
confgcc+=(--with-python-dir=${DATAPATH/$PREFIX/}/python);
fi;
local GCC_LANG="c";
is_cxx && GCC_LANG+=",c++";
is_d && GCC_LANG+=",d";
is_gcj && GCC_LANG+=",java";
is_go && GCC_LANG+=",go";
is_jit && GCC_LANG+=",jit";
if is_objc || is_objcxx; then
GCC_LANG+=",objc";
if tc_version_is_at_least 4; then
use objc-gc && confgcc+=(--enable-objc-gc);
fi;
is_objcxx && GCC_LANG+=",obj-c++";
fi;
is_fortran && GCC_LANG+=",fortran";
is_f77 && GCC_LANG+=",f77";
is_f95 && GCC_LANG+=",f95";
confgcc+=(--enable-languages=${GCC_LANG});
confgcc+=(--enable-obsolete --enable-secureplt --disable-werror --with-system-zlib);
if use nls; then
confgcc+=(--enable-nls --without-included-gettext);
else
confgcc+=(--disable-nls);
fi;
tc_version_is_at_least 3.4 || confgcc+=(--disable-libunwind-exceptions);
if tc_version_is_at_least 3.4; then
local off=$(tc_version_is_at_least 4.0 && echo release || echo no);
confgcc+=(--enable-checking="${GCC_CHECKS_LIST:-$(usex debug yes ${off})}");
fi;
tc_version_is_at_least 4.3 && confgcc+=(--with-bugurl=https://bugs.gentoo.org/ --with-pkgversion="${BRANDING_GCC_PKGVERSION}");
if tc_version_is_at_least 4.4 && want_minispecs; then
confgcc+=($(use_enable hardened esp));
fi;
if tc_version_is_at_least 4.4 && is_cxx; then
confgcc+=(--enable-libstdcxx-time);
fi;
is_jit && confgcc+=(--enable-host-shared);
if tc_version_is_between 4.7 4.8 && ! is_cxx; then
confgcc+=(--disable-build-with-cxx --disable-build-poststage1-with-cxx);
fi;
if is_crosscompile; then
confgcc+=(--enable-poison-system-directories);
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
;;
*-musl*)
needed_libc=musl
;;
*-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
local confgcc_no_libc=(--disable-shared);
tc_version_is_at_least 4.8 && confgcc_no_libc+=(--disable-libatomic);
if ! has_version ${CATEGORY}/${needed_libc}; then
confgcc+=("${confgcc_no_libc[@]}" --disable-threads --without-headers);
else
if built_with_use --hidden --missing false ${CATEGORY}/${needed_libc} crosscompile_opts_headers-only; then
confgcc+=("${confgcc_no_libc[@]}" --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));
tc_version_is_between 3.3 3.4 && confgcc+=(--enable-sjlj-exceptions);
if tc_version_is_between 3.4 4.3; then
confgcc+=(--enable-clocale=uclibc);
fi
;;
*-elf | *-eabi)
confgcc+=(--with-newlib)
;;
*-gnu*)
confgcc+=(--enable-__cxa_atexit --enable-clocale=gnu)
;;
*-freebsd*)
confgcc+=(--enable-__cxa_atexit)
;;
*-solaris*)
confgcc+=(--enable-__cxa_atexit)
;;
esac;
gcc-multilib-configure;
confgcc+=($(use_enable altivec));
tc_version_is_at_least 4.3 && confgcc+=($(use_enable fixed-point));
case $(tc-is-softfloat) in
yes)
confgcc+=(--with-float=soft)
;;
softfp)
confgcc+=(--with-float=softfp)
;;
*)
case ${CTARGET//_/-} in
*-hardfloat-* | *eabihf)
confgcc+=(--with-float=hard)
;;
esac
;;
esac;
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;
[[ ${arm_arch} == *-m ]] && confgcc+=(--with-mode=thumb);
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.8 && 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;
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;
[[ ${CTARGET} == *-darwin* ]] && confgcc+=(--enable-version-specific-runtime-libs);
if ! is_gcj; then
confgcc+=(--disable-libgcj);
else
if use awt; then
confgcc+=(--enable-java-awt=gtk);
fi;
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.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
if hardened_gcc_is_stable ssp; then
export gcc_cv_libc_provides_ssp=yes;
fi;
confgcc+=(--disable-libssp);
fi;
fi;
if in_iuse cilk; then
confgcc+=($(use_enable cilk libcilkrts));
fi;
if tc_version_is_at_least 4.6 && ! is_fortran; then
confgcc+=(--disable-libquadmath);
fi;
if tc_version_is_at_least 4.6; then
confgcc+=(--enable-lto);
else
if tc_version_is_at_least 4.5; then
confgcc+=(--disable-lto);
fi;
fi;
if tc_version_is_at_least 5.0; then
confgcc+=($(use_with graphite isl));
use graphite && confgcc+=(--disable-isl-version-check);
else
if tc_version_is_at_least 4.8; then
confgcc+=($(use_with graphite cloog));
use graphite && confgcc+=(--disable-isl-version-check);
else
if tc_version_is_at_least 4.4; then
confgcc+=(--without-{cloog,ppl});
fi;
fi;
fi;
if tc_version_is_at_least 4.8; then
confgcc+=($(use_enable sanitize libsanitizer));
fi;
if tc_version_is_at_least 6.0; then
confgcc+=($(use_enable pie default-pie) $(use_enable ssp default-ssp));
fi;
export gcc_cv_prog_makeinfo_modern=no;
export ac_cv_have_x='have_x=yes ac_x_includes= ac_x_libraries=';
confgcc+=("$@" ${EXTRA_ECONF});
echo;
einfo "PREFIX: ${PREFIX}";
einfo "BINPATH: ${BINPATH}";
einfo "LIBPATH: ${LIBPATH}";
einfo "DATAPATH: ${DATAPATH}";
einfo "STDCXX_INCDIR: ${STDCXX_INCDIR}";
echo;
einfo "Languages: ${GCC_LANG}";
echo;
einfo "Configuring GCC with: ${confgcc[@]//--/\n\t--}";
echo;
mkdir -p "${WORKDIR}"/build;
pushd "${WORKDIR}"/build > /dev/null;
addwrite /dev/zero;
echo "${S}"/configure "${confgcc[@]}";
CONFIG_SHELL="/bin/bash" bash "${S}"/configure "${confgcc[@]}" || die "failed to run configure";
popd > /dev/null
}
toolchain_src_install ()
{
cd "${WORKDIR}"/build;
find gcc/include*/ -type l -delete;
mkdir -p gcc/doc;
local x=;
for x in "${S}"/gcc/doc/*.info*;
do
if [[ -f ${x} ]]; then
cp "${x}" gcc/doc/ || die;
fi;
done;
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;
want_minispecs && copy_minispecs_gcc_specs;
gcc_slot_java;
dodir /usr/bin;
cd "${D}"${BINPATH};
for x in cpp gcc g++ c++ gcov g77 gcj gcjh gfortran gccgo;
do
if [[ -f ${x} ]]; then
rm -f ${CTARGET}-${x};
mv ${x} ${CTARGET}-${x};
fi;
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;
if tc_version_is_at_least 5 && is_go; then
rm -f go gofmt;
fi;
env RESTRICT="" CHOST=${CHOST} prepstrip "${D}${BINPATH}";
is_crosscompile && env RESTRICT="" CHOST=${CHOST} prepstrip "${D}/${HOSTLIBPATH}";
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
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 regression-test; then
docinto testsuite;
find "${WORKDIR}"/build -type f -name "*.sum" -exec dodoc {} +;
find "${WORKDIR}"/build -type f -path "*/testsuite/*.log" -exec dodoc {} +;
fi;
if ! is_crosscompile; then
insinto "${DATAPATH}";
newins "${GCC_FILESDIR}"/awk/fixlafiles.awk-no_gcc_la fixlafiles.awk || die;
find "${D}/${LIBPATH}" -name libstdc++.la -type f -delete;
find "${D}/${LIBPATH}" -name 'lib*san.la' -type f -delete;
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_prepare ()
{
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;
if ( tc_version_is_at_least 4.8.2 || use hardened ) && ! use vanilla; then
make_gcc_hard;
fi;
if tc_version_is_between 4.5 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
einfo "Copying ecj-4.3.jar";
cp -pPR "${DISTDIR}/ecj-4.3.jar" "${S}/ecj.jar" || die;
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_between 3.3 4.0; then
do_gcc_rename_java_bins;
fi;
if tc_version_is_between 3.0 4.8; 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;
elibtoolize --portage --shallow --no-uclibc;
gnuconfig_update;
local f;
einfo "Fixing misc issues in configure files";
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;
tc_version_is_at_least 4.1 && epatch "${GCC_FILESDIR}"/gcc-configure-texinfo.patch;
if [[ -x contrib/gcc_update ]]; then
einfo "Touching generated files";
./contrib/gcc_update --touch | while read f; do
einfo " ${f%%...}";
done;
fi
}
toolchain_src_test ()
{
if use regression-test; then
cd "${WORKDIR}"/build;
emake -k check;
fi
}
toolchain_src_unpack ()
{
if [[ ${PV} == *9999* ]]; then
git-2_src_unpack;
else
gcc_quick_unpack;
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 ()
{
_eutils_eprefix_init;
if [[ -x "${EPREFIX}"/usr/bin/desktop-file-validate ]]; then
einfo "Checking desktop entry validity";
local directories="";
for d in /usr/share/applications $@;
do
[[ -d ${ED}${d} ]] && directories="${directories} ${ED}${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/${ED}/}:};
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 defined 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
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment