-
-
Save anonymous/18e5af8e4c8b4706ab41 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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