Created
June 11, 2020 16:56
-
-
Save xxc3nsoredxx/42b013975f731b2c036e11658faf5710 to your computer and use it in GitHub Desktop.
ff_environment_20200611
This file contains hidden or 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
declare -x ABI="amd64" | |
declare -x ABI_MIPS="" | |
declare -x ABI_PPC="" | |
declare -x ABI_RISCV="" | |
declare -x ABI_S390="" | |
declare -x ABI_X86="64" | |
declare -x ADAFLAGS="" | |
declare -x ADA_TARGET="" | |
declare -x ALDFLAGS="-Wl,-O1 -Wl,--as-needed" | |
declare -a ALL_AUTOTOOLS_MACROS=([0]="AC_PROG_LIBTOOL" [1]="AM_PROG_LIBTOOL" [2]="LT_INIT" [3]="LT_CONFIG_LTDL_DIR" [4]="AC_CONFIG_HEADERS" [5]="AC_CONFIG_HEADER" [6]="AM_CONFIG_HEADERS" [7]="AM_CONFIG_HEADER" [8]="AC_CONFIG_SUBDIRS" [9]="AC_CONFIG_AUX_DIR" [10]="AC_CONFIG_MACRO_DIR" [11]="AM_INIT_AUTOMAKE" [12]="AM_GLIB_GNU_GETTEXT" [13]="AM_GNU_GETTEXT_VERSION" [14]="AM_GNU_GETTEXT_REQUIRE_VERSION" [15]="AC_PROG_INTLTOOL" [16]="IT_PROG_INTLTOOL" [17]="GTK_DOC_CHECK" [18]="GNOME_DOC_INIT") | |
declare -x ALSA_CARDS="" | |
declare -x APACHE2_MODULES="" | |
declare -x APACHE2_MPMS="" | |
declare -x AR="x86_64-pc-linux-gnu-ar" | |
declare -x ARCH="amd64" | |
declare -- AT_M4DIR="" | |
declare -- AT_SYS_M4DIR="" | |
declare -- AUTOTOOLS_AUTO_DEPEND="yes" | |
declare -- AUTOTOOLS_DEPEND="|| ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) | |
~sys-devel/autoconf-2.13 | |
>=sys-devel/libtool-2.4" | |
declare BDEPEND="" | |
declare -x BOOTSTRAP_USE="unicode internal-glib pkg-config split-usr python_targets_python3_7 python_targets_python2_7 multilib hardened pic xtpax -jit -orc" | |
declare -- BUILD_OBJ_DIR="/var/tmp/portage/www-client/firefox-77.0.1/work/firefox-77.0.1/ff" | |
declare -x BUILD_OPT="1" | |
declare -x CALLIGRA_FEATURES="" | |
declare -x CAMERAS="" | |
declare -x CBUILD="x86_64-pc-linux-gnu" | |
declare -x CC="x86_64-pc-linux-gnu-gcc" | |
declare -x CCASFLAGS="" | |
declare -- CDEPEND=" | |
>=dev-libs/nss-3.52.1 | |
>=dev-libs/nspr-4.25 | |
dev-libs/atk | |
dev-libs/expat | |
>=x11-libs/cairo-1.10[X] | |
>=x11-libs/gtk+-2.18:2 | |
>=x11-libs/gtk+-3.4.0:3[X] | |
x11-libs/gdk-pixbuf | |
>=x11-libs/pango-1.22.0 | |
>=media-libs/libpng-1.6.35:0=[apng] | |
>=media-libs/mesa-10.2:* | |
media-libs/fontconfig | |
>=media-libs/freetype-2.4.10 | |
kernel_linux? ( !pulseaudio? ( media-libs/alsa-lib ) ) | |
virtual/freedesktop-icon-theme | |
sys-apps/dbus | |
dev-libs/dbus-glib | |
startup-notification? ( >=x11-libs/startup-notification-0.8 ) | |
>=x11-libs/pixman-0.19.2 | |
>=dev-libs/glib-2.26:2 | |
>=sys-libs/zlib-1.2.3 | |
>=dev-libs/libffi-3.0.10:= | |
media-video/ffmpeg | |
x11-libs/libX11 | |
x11-libs/libXcomposite | |
x11-libs/libXdamage | |
x11-libs/libXext | |
x11-libs/libXfixes | |
x11-libs/libXrender | |
x11-libs/libXt | |
system-av1? ( | |
>=media-libs/dav1d-0.3.0:= | |
>=media-libs/libaom-1.0.0:= | |
) | |
system-harfbuzz? ( >=media-libs/harfbuzz-2.6.4:0= >=media-gfx/graphite2-1.3.13 ) | |
system-icu? ( >=dev-libs/icu-64.1:= ) | |
system-jpeg? ( >=media-libs/libjpeg-turbo-1.2.1 ) | |
system-libevent? ( >=dev-libs/libevent-2.0:0=[threads] ) | |
system-libvpx? ( >=media-libs/libvpx-1.8.2:0=[postproc] ) | |
system-webp? ( >=media-libs/libwebp-1.1.0:0= ) | |
wifi? ( | |
kernel_linux? ( | |
net-misc/networkmanager | |
) | |
) | |
jack? ( virtual/jack ) | |
selinux? ( sec-policy/selinux-mozilla )" | |
declare -x CFLAGS="-march=silvermont -mtune=generic" | |
declare -x CFLAGS_amd64="-m64" | |
declare -x CFLAGS_default | |
declare -x CFLAGS_x32="-mx32" | |
declare -x CFLAGS_x86="-m32" | |
declare -- CHECKREQS_DISK_BUILD="4G" | |
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="" | |
declare -x CPPFLAGS="" | |
declare -x CPU_FLAGS_ARM="" | |
declare -x CPU_FLAGS_PPC="" | |
declare -x CPU_FLAGS_X86="" | |
declare -x CTARGET_default="x86_64-pc-linux-gnu" | |
declare -x CURL_SSL="" | |
declare -x CXX="x86_64-pc-linux-gnu-g++" | |
declare -x CXXFLAGS="-march=silvermont -mtune=generic -flifetime-dse=1" | |
declare -x DEFAULT_ABI="amd64" | |
declare -x DEFINED_PHASES=" compile configure install postinst postrm preinst prepare pretend setup unpack" | |
declare DEPEND=" | |
>=dev-libs/nss-3.52.1 | |
>=dev-libs/nspr-4.25 | |
dev-libs/atk | |
dev-libs/expat | |
>=x11-libs/cairo-1.10[X] | |
>=x11-libs/gtk+-2.18:2 | |
>=x11-libs/gtk+-3.4.0:3[X] | |
x11-libs/gdk-pixbuf | |
>=x11-libs/pango-1.22.0 | |
>=media-libs/libpng-1.6.35:0=[apng] | |
>=media-libs/mesa-10.2:* | |
media-libs/fontconfig | |
>=media-libs/freetype-2.4.10 | |
kernel_linux? ( !pulseaudio? ( media-libs/alsa-lib ) ) | |
virtual/freedesktop-icon-theme | |
sys-apps/dbus | |
dev-libs/dbus-glib | |
startup-notification? ( >=x11-libs/startup-notification-0.8 ) | |
>=x11-libs/pixman-0.19.2 | |
>=dev-libs/glib-2.26:2 | |
>=sys-libs/zlib-1.2.3 | |
>=dev-libs/libffi-3.0.10:= | |
media-video/ffmpeg | |
x11-libs/libX11 | |
x11-libs/libXcomposite | |
x11-libs/libXdamage | |
x11-libs/libXext | |
x11-libs/libXfixes | |
x11-libs/libXrender | |
x11-libs/libXt | |
system-av1? ( | |
>=media-libs/dav1d-0.3.0:= | |
>=media-libs/libaom-1.0.0:= | |
) | |
system-harfbuzz? ( >=media-libs/harfbuzz-2.6.4:0= >=media-gfx/graphite2-1.3.13 ) | |
system-icu? ( >=dev-libs/icu-64.1:= ) | |
system-jpeg? ( >=media-libs/libjpeg-turbo-1.2.1 ) | |
system-libevent? ( >=dev-libs/libevent-2.0:0=[threads] ) | |
system-libvpx? ( >=media-libs/libvpx-1.8.2:0=[postproc] ) | |
system-webp? ( >=media-libs/libwebp-1.1.0:0= ) | |
wifi? ( | |
kernel_linux? ( | |
net-misc/networkmanager | |
) | |
) | |
jack? ( virtual/jack ) | |
selinux? ( sec-policy/selinux-mozilla ) | |
app-arch/zip | |
app-arch/unzip | |
>=dev-util/cbindgen-0.14.1 | |
>=net-libs/nodejs-10.19.0 | |
>=sys-devel/binutils-2.30 | |
sys-apps/findutils | |
|| ( | |
( | |
sys-devel/clang:10 | |
!clang? ( sys-devel/llvm:10 ) | |
clang? ( | |
=sys-devel/lld-10* | |
sys-devel/llvm:10[gold] | |
pgo? ( =sys-libs/compiler-rt-sanitizers-10*[profile] ) | |
) | |
) | |
( | |
sys-devel/clang:9 | |
!clang? ( sys-devel/llvm:9 ) | |
clang? ( | |
=sys-devel/lld-9* | |
sys-devel/llvm:9[gold] | |
pgo? ( =sys-libs/compiler-rt-sanitizers-9*[profile] ) | |
) | |
) | |
( | |
sys-devel/clang:8 | |
!clang? ( sys-devel/llvm:8 ) | |
clang? ( | |
=sys-devel/lld-8* | |
sys-devel/llvm:8[gold] | |
pgo? ( =sys-libs/compiler-rt-sanitizers-8*[profile] ) | |
) | |
) | |
( | |
sys-devel/clang:7 | |
!clang? ( sys-devel/llvm:7 ) | |
clang? ( | |
=sys-devel/lld-7* | |
sys-devel/llvm:7[gold] | |
pgo? ( =sys-libs/compiler-rt-sanitizers-7*[profile] ) | |
) | |
) | |
) | |
pulseaudio? ( | |
|| ( | |
media-sound/pulseaudio | |
>=media-sound/apulse-0.1.12-r4[sdk] | |
) | |
) | |
>=virtual/rust-1.41.0 | |
wayland? ( >=x11-libs/gtk+-3.11:3[wayland] ) | |
amd64? ( >=dev-lang/yasm-1.1 virtual/opengl ) | |
x86? ( >=dev-lang/yasm-1.1 virtual/opengl ) | |
!system-av1? ( | |
amd64? ( >=dev-lang/nasm-2.13 ) | |
x86? ( >=dev-lang/nasm-2.13 ) | |
) !!sys-devel/llvm:0 virtual/pkgconfig | |
dev-lang/python:2.7[ncurses,sqlite,ssl,threads(+)] | |
|| ( dev-lang/python:3.8[ncurses,sqlite,ssl,threads(+)] dev-lang/python:3.7[ncurses,sqlite,ssl,threads(+)] dev-lang/python:3.6[ncurses,sqlite,ssl,threads(+)] ) >=app-portage/elt-patches-20170815 || ( >=sys-devel/automake-1.16.1:1.16 >=sys-devel/automake-1.15.1:1.15 ) | |
~sys-devel/autoconf-2.13 | |
>=sys-devel/libtool-2.4 app-arch/unzip pgo? ( | |
!prefix? ( x11-base/xorg-server[xvfb] ) | |
x11-apps/xhost | |
)" | |
declare DESCRIPTION="Firefox Web Browser" | |
declare -- DESKTOP_DATABASE_DIR="/usr/share/applications" | |
declare -x DESTTREE="/usr" | |
declare -x DIROPTIONS="-m0755" | |
declare -x EAPI="6" | |
declare -x ELIBC="glibc" | |
declare -x ENLIGHTENMENT_MODULES="" | |
declare -x ENV_UNSET="DBUS_SESSION_BUS_ADDRESS DISPLAY GOBIN GOPATH PERL5LIB PERL5OPT PERLPREFIX PERL_CORE PERL_MB_OPT PERL_MM_OPT XAUTHORITY XDG_CACHE_HOME XDG_CONFIG_HOME XDG_DATA_HOME XDG_RUNTIME_DIR" | |
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/www-client/firefox-77.0.1/work/patch" | |
declare -- EPATCH_SUFFIX="patch.bz2" | |
declare -- EPOCHREALTIME="1591803921.084291" | |
declare -- EPOCHSECONDS="1591803921" | |
declare -x EPYTHON="python2.7" | |
declare -x EXEOPTIONS="-m0755" | |
declare -x FCFLAGS="-pipe" | |
declare -x FETCHCOMMAND_SSH="bash -c \"x=\\\${2#ssh://} ; host=\\\${x%%/*} ; port=\\\${host##*:} ; host=\\\${host%:*} ; [[ \\\${host} = \\\${port} ]] && port= ; exec rsync --rsh=\\\"ssh \\\${port:+-p\\\${port}} \\\${3}\\\" -avP \\\"\\\${host}:/\\\${x#*/}\\\" \\\"\\\$1\\\"\" rsync \"\${DISTDIR}/\${FILE}\" \"\${URI}\" \"\${PORTAGE_SSH_OPTS}\"" | |
declare -x FFLAGS="-pipe" | |
declare -x FFTOOLS="" | |
declare -x GCC_SPECS="" | |
declare -- GCONFTOOL_BIN="/usr/bin/gconftool-2" | |
declare -- GLIB_COMPILE_SCHEMAS="/usr/bin/glib-compile-schemas" | |
declare -a GMP_PLUGIN_LIST=([0]="gmp-gmpopenh264" [1]="gmp-widevinecdm") | |
declare -x GPSD_PROTOCOLS="" | |
declare -x GRUB_PLATFORMS="" | |
declare HOMEPAGE="https://www.mozilla.com/firefox" | |
declare -x HOST_CC="x86_64-pc-linux-gnu-gcc" | |
declare -x HOST_CXX="x86_64-pc-linux-gnu-g++" | |
declare -x INHERITED=" check-reqs eapi7-ver desktop estack epatch toolchain-funcs multilib ltprune preserve-libs vcs-clean eutils flag-o-matic xdg-utils gnome2-utils llvm python-utils-r1 python-any-r1 versionator mozcoreconf-v6 multiprocessing pax-utils libtool autotools mozextension mozlinguas-v2 virtualx" | |
declare -x INPUT_DEVICES="" | |
declare -x INSDESTTREE="" | |
declare -x INSOPTIONS="-m0644" | |
declare IUSE="bindist clang cpu_flags_x86_avx2 debug eme-free geckodriver | |
+gmp-autoupdate hardened hwaccel jack lto cpu_flags_arm_neon pgo | |
pulseaudio +screenshot selinux startup-notification +system-av1 | |
+system-harfbuzz +system-icu +system-jpeg +system-libevent +system-libvpx | |
+system-webp test wayland wifi custom-cflags custom-optimization l10n_ach l10n_af l10n_an l10n_ar l10n_ast l10n_az l10n_be l10n_bg l10n_bn l10n_br l10n_bs l10n_ca l10n_cak l10n_cs l10n_cy l10n_da l10n_de l10n_dsb l10n_el l10n_en-CA l10n_en-GB l10n_eo l10n_es-AR l10n_es-CL l10n_es-ES l10n_es-MX l10n_et l10n_eu l10n_fa l10n_ff l10n_fi l10n_fr l10n_fy l10n_ga l10n_gd l10n_gl l10n_gn l10n_gu l10n_he l10n_hi l10n_hr l10n_hsb l10n_hu l10n_hy l10n_ia l10n_id l10n_is l10n_it l10n_ja l10n_ka l10n_kab l10n_kk l10n_km l10n_kn l10n_ko l10n_lij l10n_lt l10n_lv l10n_mk l10n_mr l10n_ms l10n_my l10n_nb l10n_nl l10n_nn l10n_oc l10n_pa l10n_pl l10n_pt-BR l10n_pt-PT l10n_rm l10n_ro l10n_ru l10n_si l10n_sk l10n_sl l10n_son l10n_sq l10n_sr l10n_sv l10n_ta l10n_te l10n_th l10n_tr l10n_uk l10n_ur l10n_uz l10n_vi l10n_xh l10n_zh-CN l10n_zh-TW pgo" | |
declare -x IUSE_EFFECTIVE="abi_x86_64 alpha amd64 amd64-fbsd amd64-linux arm arm64 bindist clang cpu_flags_arm_neon cpu_flags_x86_avx2 custom-cflags custom-optimization debug elibc_AIX elibc_Cygwin elibc_Darwin elibc_DragonFly elibc_FreeBSD elibc_HPUX elibc_Interix elibc_NetBSD elibc_OpenBSD elibc_SunOS elibc_Winnt elibc_bionic elibc_glibc elibc_mingw elibc_mintlib elibc_musl elibc_uclibc eme-free geckodriver gmp-autoupdate hardened hppa hwaccel ia64 jack kernel_AIX kernel_Darwin kernel_FreeBSD kernel_HPUX kernel_NetBSD kernel_OpenBSD kernel_SunOS kernel_Winnt kernel_freemint kernel_linux l10n_ach l10n_af l10n_an l10n_ar l10n_ast l10n_az l10n_be l10n_bg l10n_bn l10n_br l10n_bs l10n_ca l10n_cak l10n_cs l10n_cy l10n_da l10n_de l10n_dsb l10n_el l10n_en-CA l10n_en-GB l10n_eo l10n_es-AR l10n_es-CL l10n_es-ES l10n_es-MX l10n_et l10n_eu l10n_fa l10n_ff l10n_fi l10n_fr l10n_fy l10n_ga l10n_gd l10n_gl l10n_gn l10n_gu l10n_he l10n_hi l10n_hr l10n_hsb l10n_hu l10n_hy l10n_ia l10n_id l10n_is l10n_it l10n_ja l10n_ka l10n_kab l10n_kk l10n_km l10n_kn l10n_ko l10n_lij l10n_lt l10n_lv l10n_mk l10n_mr l10n_ms l10n_my l10n_nb l10n_nl l10n_nn l10n_oc l10n_pa l10n_pl l10n_pt-BR l10n_pt-PT l10n_rm l10n_ro l10n_ru l10n_si l10n_sk l10n_sl l10n_son l10n_sq l10n_sr l10n_sv l10n_ta l10n_te l10n_th l10n_tr l10n_uk l10n_ur l10n_uz l10n_vi l10n_xh l10n_zh-CN l10n_zh-TW lto m68k m68k-mint mips pgo ppc ppc-aix ppc-macos ppc64 ppc64-linux prefix prefix-guest prefix-stack pulseaudio riscv s390 screenshot selinux sparc sparc-solaris sparc64-solaris startup-notification system-av1 system-harfbuzz system-icu system-jpeg system-libevent system-libvpx system-webp test userland_BSD userland_GNU wayland wifi x64-cygwin x64-macos x64-solaris x64-winnt x86 x86-cygwin x86-fbsd x86-linux x86-macos x86-solaris x86-winnt" | |
declare -x IUSE_IMPLICIT="abi_x86_64 prefix prefix-guest prefix-stack" | |
declare -x KERNEL="linux" | |
declare -x KERNEL_ABI="amd64" | |
declare -x KEYWORDS="~amd64 ~arm64 ~ppc64 ~x86" | |
declare -x L10N="" | |
declare -x LANG="C" | |
declare -x LCD_DEVICES="" | |
declare -x LC_ALL="C" | |
declare -x LC_COLLATE="C" | |
declare -x LC_CTYPE="C" | |
declare -x LC_MESSAGES="C" | |
declare -x LD="x86_64-pc-linux-gnu-ld" | |
declare -x LDFLAGS="-Wl,-O1 -Wl,--as-needed -Wl,-rpath=/usr/lib64/firefox,--enable-new-dtags -Wl,-z,now -Wl,--compress-debug-sections=zlib" | |
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_default="lib" | |
declare -x LIBDIR_x32="libx32" | |
declare -x LIBDIR_x86="lib" | |
declare -x LIBOPTIONS="-m0644" | |
declare -x LIBREOFFICE_EXTENSIONS="" | |
declare -x LICENSE="MPL-2.0 GPL-2 LGPL-2.1" | |
declare -x LIRC_DEVICES="" | |
declare -- LLVM_MAX_SLOT="10" | |
declare -x LLVM_TARGETS="" | |
declare -x MAIL="/var/mail/root" | |
declare -x MAKEOPTS="-j3 -l 4.5" | |
declare -x MANPAGER="manpager" | |
declare -- MEXTENSIONS="default" | |
declare -- MIMEINFO_DATABASE_DIR="/usr/share/mime" | |
declare -x MONKEYD_PLUGINS="" | |
declare -- MOZEXTENSION_TARGET="" | |
declare -x MOZILLA_CLIENT="1" | |
declare -x MOZILLA_FIVE_HOME="/usr/lib64/firefox" | |
declare -- MOZ_ESR="" | |
declare -- MOZ_FORCE_UPSTREAM_L10N="" | |
declare -- MOZ_FTP_URI="" | |
declare -- MOZ_GENERATE_LANGPACKS="" | |
declare -- MOZ_HTTP_URI="https://archive.mozilla.org/pub/firefox/releases" | |
declare -- MOZ_INSTALL_L10N_XPIFILE="" | |
declare -- MOZ_L10N_SOURCEDIR="/var/tmp/portage/www-client/firefox-77.0.1/work/l10n-sources" | |
declare -- MOZ_L10N_URI_PREFIX="" | |
declare -- MOZ_L10N_URI_SUFFIX=".tar.xz" | |
declare -- MOZ_LANGPACK_HTTP_URI="https://archive.mozilla.org/pub/firefox/releases" | |
declare -- MOZ_LANGPACK_PREFIX="77.0.1/linux-i686/xpi/" | |
declare -- MOZ_LANGPACK_SUFFIX=".xpi" | |
declare -- MOZ_LANGPACK_UNOFFICIAL="" | |
declare -a MOZ_LANGS=([0]="ach" [1]="af" [2]="an" [3]="ar" [4]="ast" [5]="az" [6]="be" [7]="bg" [8]="bn" [9]="br" [10]="bs" [11]="ca" [12]="cak" [13]="cs" [14]="cy" [15]="da" [16]="de" [17]="dsb" [18]="el" [19]="en" [20]="en-CA" [21]="en-GB" [22]="en-US" [23]="eo" [24]="es-AR" [25]="es-CL" [26]="es-ES" [27]="es-MX" [28]="et" [29]="eu" [30]="fa" [31]="ff" [32]="fi" [33]="fr" [34]="fy-NL" [35]="ga-IE" [36]="gd" [37]="gl" [38]="gn" [39]="gu-IN" [40]="he" [41]="hi-IN" [42]="hr" [43]="hsb" [44]="hu" [45]="hy-AM" [46]="ia" [47]="id" [48]="is" [49]="it" [50]="ja" [51]="ka" [52]="kab" [53]="kk" [54]="km" [55]="kn" [56]="ko" [57]="lij" [58]="lt" [59]="lv" [60]="mk" [61]="mr" [62]="ms" [63]="my" [64]="nb-NO" [65]="nl" [66]="nn-NO" [67]="oc" [68]="pa-IN" [69]="pl" [70]="pt-BR" [71]="pt-PT" [72]="rm" [73]="ro" [74]="ru" [75]="si" [76]="sk" [77]="sl" [78]="son" [79]="sq" [80]="sr" [81]="sv-SE" [82]="ta" [83]="te" [84]="th" [85]="tr" [86]="uk" [87]="ur" [88]="uz" [89]="vi" [90]="xh" [91]="zh-CN" [92]="zh-TW") | |
declare -- MOZ_P="firefox-77.0.1" | |
declare -- MOZ_PN="firefox" | |
declare -- MOZ_PV="77.0.1" | |
declare -- MOZ_SRC_URI="https://archive.mozilla.org/pub/firefox/releases/77.0.1/source/firefox-77.0.1.source.tar.xz" | |
declare -a MOZ_TOO_REGIONALIZED_FOR_L10N=([0]="fy-NL" [1]="ga-IE" [2]="gu-IN" [3]="hi-IN" [4]="hy-AM" [5]="nb-NO" [6]="nn-NO" [7]="pa-IN" [8]="sv-SE") | |
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|llvm)" | |
declare -x NGINX_MODULES_HTTP="" | |
declare -x NGINX_MODULES_MAIL="" | |
declare -x NGINX_MODULES_STREAM="" | |
declare -x NO_STATIC_LIB="1" | |
declare -x OFED_DRIVERS="" | |
declare -x OFFICE_IMPLEMENTATION="" | |
declare -x OPENMPI_FABRICS="" | |
declare -x OPENMPI_OFED_FEATURES="" | |
declare -x OPENMPI_RM="" | |
declare -- PATCH="firefox-77.0-patches-01_pre7" | |
declare -a PATCH_URIS=([0]="https://dev.gentoo.org/~whissi/mozilla/patchsets/firefox-77.0-patches-01_pre7.tar.xz" [1]="https://dev.gentoo.org/~polynomial-c/mozilla/patchsets/firefox-77.0-patches-01_pre7.tar.xz" [2]="https://dev.gentoo.org/~axs/mozilla/patchsets/firefox-77.0-patches-01_pre7.tar.xz") | |
declare -x PATH="/var/tmp/portage/www-client/firefox-77.0.1/temp/python3.8/bin:/usr/lib/portage/python3.7/ebuild-helpers/xattr:/usr/lib/portage/python3.7/ebuild-helpers:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/lib/llvm/9/bin" | |
declare -x PAX_MARKINGS="none" | |
declare PDEPEND="" | |
declare -x PHP_TARGETS="" | |
declare -x PKG_CONFIG="x86_64-pc-linux-gnu-pkg-config" | |
declare -x PKG_CONFIG_PATH="/var/tmp/portage/www-client/firefox-77.0.1/temp/python3.8/pkgconfig" | |
declare -x PORTAGE_COMPRESSION_COMMAND="bzip2" | |
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/firefox-77.0.1/html") | |
declare -a PORTAGE_DOSTRIP=([0]="/") | |
declare -a PORTAGE_DOSTRIP_SKIP=() | |
declare -x POSTGRES_TARGETS="" | |
declare -x PROFILE_IS_HARDENED="1" | |
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 PYTHON="/usr/bin/python2.7" | |
declare -x PYTHON3="/usr/bin/python3.8" | |
declare -x PYTHONDONTWRITEBYTECODE="1" | |
declare -a PYTHON_COMPAT=([0]="python3_6" [1]="python3_7" [2]="python3_8") | |
declare -- PYTHON_DEPS="|| ( dev-lang/python:3.8[ncurses,sqlite,ssl,threads(+)] dev-lang/python:3.7[ncurses,sqlite,ssl,threads(+)] dev-lang/python:3.6[ncurses,sqlite,ssl,threads(+)] )" | |
declare -- PYTHON_REQUIRED_USE="I-DO-NOT-EXIST-IN-PYTHON-ANY-R1" | |
declare -- PYTHON_REQ_USE="ncurses,sqlite,ssl,threads(+)" | |
declare -x PYTHON_SINGLE_TARGET="" | |
declare -x PYTHON_TARGETS="" | |
declare -x QA_CONFIGURE_OPTIONS=".*" | |
declare -- QA_PRESTRIPPED="usr/lib*/firefox/firefox" | |
declare -x QEMU_SOFTMMU_TARGETS="" | |
declare -x QEMU_USER_TARGETS="" | |
declare -x RANLIB="x86_64-pc-linux-gnu-ranlib" | |
declare RDEPEND=" | |
>=dev-libs/nss-3.52.1 | |
>=dev-libs/nspr-4.25 | |
dev-libs/atk | |
dev-libs/expat | |
>=x11-libs/cairo-1.10[X] | |
>=x11-libs/gtk+-2.18:2 | |
>=x11-libs/gtk+-3.4.0:3[X] | |
x11-libs/gdk-pixbuf | |
>=x11-libs/pango-1.22.0 | |
>=media-libs/libpng-1.6.35:0=[apng] | |
>=media-libs/mesa-10.2:* | |
media-libs/fontconfig | |
>=media-libs/freetype-2.4.10 | |
kernel_linux? ( !pulseaudio? ( media-libs/alsa-lib ) ) | |
virtual/freedesktop-icon-theme | |
sys-apps/dbus | |
dev-libs/dbus-glib | |
startup-notification? ( >=x11-libs/startup-notification-0.8 ) | |
>=x11-libs/pixman-0.19.2 | |
>=dev-libs/glib-2.26:2 | |
>=sys-libs/zlib-1.2.3 | |
>=dev-libs/libffi-3.0.10:= | |
media-video/ffmpeg | |
x11-libs/libX11 | |
x11-libs/libXcomposite | |
x11-libs/libXdamage | |
x11-libs/libXext | |
x11-libs/libXfixes | |
x11-libs/libXrender | |
x11-libs/libXt | |
system-av1? ( | |
>=media-libs/dav1d-0.3.0:= | |
>=media-libs/libaom-1.0.0:= | |
) | |
system-harfbuzz? ( >=media-libs/harfbuzz-2.6.4:0= >=media-gfx/graphite2-1.3.13 ) | |
system-icu? ( >=dev-libs/icu-64.1:= ) | |
system-jpeg? ( >=media-libs/libjpeg-turbo-1.2.1 ) | |
system-libevent? ( >=dev-libs/libevent-2.0:0=[threads] ) | |
system-libvpx? ( >=media-libs/libvpx-1.8.2:0=[postproc] ) | |
system-webp? ( >=media-libs/libwebp-1.1.0:0= ) | |
wifi? ( | |
kernel_linux? ( | |
net-misc/networkmanager | |
) | |
) | |
jack? ( virtual/jack ) | |
selinux? ( sec-policy/selinux-mozilla ) | |
jack? ( virtual/jack ) | |
pulseaudio? ( | |
|| ( | |
media-sound/pulseaudio | |
>=media-sound/apulse-0.1.12-r4 | |
) | |
) | |
selinux? ( sec-policy/selinux-mozilla ) " | |
declare REPOSITORY | |
declare REQUIRED_USE="pgo? ( lto ) " | |
declare -x RESTRICT="bindist test" | |
declare -x RESUMECOMMAND_SSH="bash -c \"x=\\\${2#ssh://} ; host=\\\${x%%/*} ; port=\\\${host##*:} ; host=\\\${host%:*} ; [[ \\\${host} = \\\${port} ]] && port= ; exec rsync --rsh=\\\"ssh \\\${port:+-p\\\${port}} \\\${3}\\\" -avP \\\"\\\${host}:/\\\${x#*/}\\\" \\\"\\\$1\\\"\" rsync \"\${DISTDIR}/\${FILE}\" \"\${URI}\" \"\${PORTAGE_SSH_OPTS}\"" | |
declare -x ROS_MESSAGES="" | |
declare -x RUBY_TARGETS="" | |
declare -x S="/var/tmp/portage/www-client/firefox-77.0.1/work/firefox-77.0.1" | |
declare -x SANDBOX_DEBUG="0" | |
declare -x SANDBOX_DENY="" | |
declare -x SANDBOX_PREDICT="/dev/crypto:/proc/self/oom_score_adj:/var/cache/fontconfig:/var/cache/man:/var/tmp/portage/www-client/firefox-77.0.1/homedir" | |
declare -x SANDBOX_READ="/:/var/tmp/portage" | |
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/portage:/var/tmp/portage/www-client/firefox-77.0.1/homedir/.bash_history" | |
declare -x SANE_BACKENDS="" | |
declare -- SCROLLKEEPER_DIR="/var/lib/scrollkeeper" | |
declare -- SCROLLKEEPER_UPDATE_BIN="/usr/bin/scrollkeeper-update" | |
declare -x SHELL="/bin/bash" | |
declare -x SLOT="0" | |
declare SRC_URI=" l10n_ach? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/ach.xpi -> firefox-77.0.1-ach.xpi ) l10n_af? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/af.xpi -> firefox-77.0.1-af.xpi ) l10n_an? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/an.xpi -> firefox-77.0.1-an.xpi ) l10n_ar? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/ar.xpi -> firefox-77.0.1-ar.xpi ) l10n_ast? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/ast.xpi -> firefox-77.0.1-ast.xpi ) l10n_az? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/az.xpi -> firefox-77.0.1-az.xpi ) l10n_be? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/be.xpi -> firefox-77.0.1-be.xpi ) l10n_bg? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/bg.xpi -> firefox-77.0.1-bg.xpi ) l10n_bn? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/bn.xpi -> firefox-77.0.1-bn.xpi ) l10n_br? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/br.xpi -> firefox-77.0.1-br.xpi ) l10n_bs? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/bs.xpi -> firefox-77.0.1-bs.xpi ) l10n_ca? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/ca.xpi -> firefox-77.0.1-ca.xpi ) l10n_cak? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/cak.xpi -> firefox-77.0.1-cak.xpi ) l10n_cs? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/cs.xpi -> firefox-77.0.1-cs.xpi ) l10n_cy? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/cy.xpi -> firefox-77.0.1-cy.xpi ) l10n_da? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/da.xpi -> firefox-77.0.1-da.xpi ) l10n_de? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/de.xpi -> firefox-77.0.1-de.xpi ) l10n_dsb? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/dsb.xpi -> firefox-77.0.1-dsb.xpi ) l10n_el? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/el.xpi -> firefox-77.0.1-el.xpi ) l10n_en-CA? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/en-CA.xpi -> firefox-77.0.1-en-CA.xpi ) l10n_en-GB? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/en-GB.xpi -> firefox-77.0.1-en-GB.xpi ) l10n_eo? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/eo.xpi -> firefox-77.0.1-eo.xpi ) l10n_es-AR? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/es-AR.xpi -> firefox-77.0.1-es-AR.xpi ) l10n_es-CL? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/es-CL.xpi -> firefox-77.0.1-es-CL.xpi ) l10n_es-ES? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/es-ES.xpi -> firefox-77.0.1-es-ES.xpi ) l10n_es-MX? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/es-MX.xpi -> firefox-77.0.1-es-MX.xpi ) l10n_et? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/et.xpi -> firefox-77.0.1-et.xpi ) l10n_eu? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/eu.xpi -> firefox-77.0.1-eu.xpi ) l10n_fa? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/fa.xpi -> firefox-77.0.1-fa.xpi ) l10n_ff? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/ff.xpi -> firefox-77.0.1-ff.xpi ) l10n_fi? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/fi.xpi -> firefox-77.0.1-fi.xpi ) l10n_fr? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/fr.xpi -> firefox-77.0.1-fr.xpi ) l10n_fy? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/fy-NL.xpi -> firefox-77.0.1-fy-NL.xpi ) l10n_ga? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/ga-IE.xpi -> firefox-77.0.1-ga-IE.xpi ) l10n_gd? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/gd.xpi -> firefox-77.0.1-gd.xpi ) l10n_gl? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/gl.xpi -> firefox-77.0.1-gl.xpi ) l10n_gn? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/gn.xpi -> firefox-77.0.1-gn.xpi ) l10n_gu? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/gu-IN.xpi -> firefox-77.0.1-gu-IN.xpi ) l10n_he? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/he.xpi -> firefox-77.0.1-he.xpi ) l10n_hi? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/hi-IN.xpi -> firefox-77.0.1-hi-IN.xpi ) l10n_hr? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/hr.xpi -> firefox-77.0.1-hr.xpi ) l10n_hsb? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/hsb.xpi -> firefox-77.0.1-hsb.xpi ) l10n_hu? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/hu.xpi -> firefox-77.0.1-hu.xpi ) l10n_hy? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/hy-AM.xpi -> firefox-77.0.1-hy-AM.xpi ) l10n_ia? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/ia.xpi -> firefox-77.0.1-ia.xpi ) l10n_id? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/id.xpi -> firefox-77.0.1-id.xpi ) l10n_is? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/is.xpi -> firefox-77.0.1-is.xpi ) l10n_it? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/it.xpi -> firefox-77.0.1-it.xpi ) l10n_ja? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/ja.xpi -> firefox-77.0.1-ja.xpi ) l10n_ka? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/ka.xpi -> firefox-77.0.1-ka.xpi ) l10n_kab? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/kab.xpi -> firefox-77.0.1-kab.xpi ) l10n_kk? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/kk.xpi -> firefox-77.0.1-kk.xpi ) l10n_km? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/km.xpi -> firefox-77.0.1-km.xpi ) l10n_kn? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/kn.xpi -> firefox-77.0.1-kn.xpi ) l10n_ko? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/ko.xpi -> firefox-77.0.1-ko.xpi ) l10n_lij? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/lij.xpi -> firefox-77.0.1-lij.xpi ) l10n_lt? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/lt.xpi -> firefox-77.0.1-lt.xpi ) l10n_lv? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/lv.xpi -> firefox-77.0.1-lv.xpi ) l10n_mk? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/mk.xpi -> firefox-77.0.1-mk.xpi ) l10n_mr? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/mr.xpi -> firefox-77.0.1-mr.xpi ) l10n_ms? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/ms.xpi -> firefox-77.0.1-ms.xpi ) l10n_my? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/my.xpi -> firefox-77.0.1-my.xpi ) l10n_nb? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/nb-NO.xpi -> firefox-77.0.1-nb-NO.xpi ) l10n_nl? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/nl.xpi -> firefox-77.0.1-nl.xpi ) l10n_nn? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/nn-NO.xpi -> firefox-77.0.1-nn-NO.xpi ) l10n_oc? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/oc.xpi -> firefox-77.0.1-oc.xpi ) l10n_pa? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/pa-IN.xpi -> firefox-77.0.1-pa-IN.xpi ) l10n_pl? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/pl.xpi -> firefox-77.0.1-pl.xpi ) l10n_pt-BR? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/pt-BR.xpi -> firefox-77.0.1-pt-BR.xpi ) l10n_pt-PT? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/pt-PT.xpi -> firefox-77.0.1-pt-PT.xpi ) l10n_rm? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/rm.xpi -> firefox-77.0.1-rm.xpi ) l10n_ro? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/ro.xpi -> firefox-77.0.1-ro.xpi ) l10n_ru? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/ru.xpi -> firefox-77.0.1-ru.xpi ) l10n_si? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/si.xpi -> firefox-77.0.1-si.xpi ) l10n_sk? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/sk.xpi -> firefox-77.0.1-sk.xpi ) l10n_sl? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/sl.xpi -> firefox-77.0.1-sl.xpi ) l10n_son? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/son.xpi -> firefox-77.0.1-son.xpi ) l10n_sq? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/sq.xpi -> firefox-77.0.1-sq.xpi ) l10n_sr? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/sr.xpi -> firefox-77.0.1-sr.xpi ) l10n_sv? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/sv-SE.xpi -> firefox-77.0.1-sv-SE.xpi ) l10n_ta? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/ta.xpi -> firefox-77.0.1-ta.xpi ) l10n_te? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/te.xpi -> firefox-77.0.1-te.xpi ) l10n_th? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/th.xpi -> firefox-77.0.1-th.xpi ) l10n_tr? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/tr.xpi -> firefox-77.0.1-tr.xpi ) l10n_uk? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/uk.xpi -> firefox-77.0.1-uk.xpi ) l10n_ur? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/ur.xpi -> firefox-77.0.1-ur.xpi ) l10n_uz? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/uz.xpi -> firefox-77.0.1-uz.xpi ) l10n_vi? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/vi.xpi -> firefox-77.0.1-vi.xpi ) l10n_xh? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/xh.xpi -> firefox-77.0.1-xh.xpi ) l10n_zh-CN? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/zh-CN.xpi -> firefox-77.0.1-zh-CN.xpi ) l10n_zh-TW? ( | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/linux-i686/xpi/zh-TW.xpi -> firefox-77.0.1-zh-TW.xpi ) | |
https://archive.mozilla.org/pub/firefox/releases/77.0.1/source/firefox-77.0.1.source.tar.xz | |
https://dev.gentoo.org/~whissi/mozilla/patchsets/firefox-77.0-patches-01_pre7.tar.xz https://dev.gentoo.org/~polynomial-c/mozilla/patchsets/firefox-77.0-patches-01_pre7.tar.xz https://dev.gentoo.org/~axs/mozilla/patchsets/firefox-77.0-patches-01_pre7.tar.xz" | |
declare -x SUDO_COMMAND="/bin/su" | |
declare -x SUDO_GID="1000" | |
declare -x SUDO_UID="1000" | |
declare -x SUDO_USER="oskari" | |
declare -x SYMLINK_LIB="no" | |
declare -x TWISTED_DISABLE_WRITING_OF_PLUGIN_CACHE="1" | |
declare -x USE="abi_x86_64 amd64 elibc_glibc hardened kernel_linux screenshot system-av1 system-harfbuzz system-icu system-jpeg system-libevent system-libvpx system-webp 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 arm64 hppa ia64 m68k m68k-mint mips ppc ppc64 ppc64-linux ppc-aix ppc-macos riscv s390 sparc sparc64-solaris sparc-solaris x64-cygwin x64-macos x64-solaris x64-winnt x86 x86-cygwin x86-fbsd x86-linux x86-macos x86-solaris x86-winnt" | |
declare -x USE_EXPAND_VALUES_ELIBC="AIX bionic Cygwin Darwin DragonFly FreeBSD glibc HPUX Interix mingw 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_PTHREADS="1" | |
declare -x UWSGI_PLUGINS="" | |
declare -x VIDEO_CARDS="" | |
declare -- VIRTUALX_COMMAND="emake" | |
declare -- VIRTUALX_DEPEND=" | |
!prefix? ( x11-base/xorg-server[xvfb] ) | |
x11-apps/xhost | |
" | |
declare -- VIRTUALX_REQUIRED="pgo" | |
declare -x VISUAL="/usr/bin/vi" | |
declare -x VOICEMAIL_STORAGE="" | |
declare -x WANT_AUTOCONF="2.1" | |
declare -x WANT_AUTOMAKE="1.16" | |
declare -x WANT_LIBTOOL="latest" | |
declare -x XFCE_PLUGINS="" | |
declare -x XTABLES_ADDONS="" | |
declare -- _AUTOTOOLS_ECLASS="1" | |
declare -- _CHECK_REQS_ECLASS_="1" | |
declare -- _DESKTOP_ECLASS="1" | |
declare -- _EPATCH_ECLASS="1" | |
declare -- _ESTACK_ECLASS="1" | |
declare -- _EUTILS_ECLASS="1" | |
declare -x _E_DOCDESTTREE_="" | |
declare -x _E_EXEDESTTREE_="" | |
declare -- _FLAG_O_MATIC_ECLASS="1" | |
declare -a _LATEST_AUTOMAKE=([0]="1.16.1:1.16" [1]="1.15.1:1.15") | |
declare -- _LIBTOOL_ECLASS="1" | |
declare -- _LLVM_ECLASS="1" | |
declare -a _LLVM_KNOWN_SLOTS=([0]="11" [1]="10" [2]="9" [3]="8") | |
declare -- _LTPRUNE_ECLASS="1" | |
declare -- _MOZCORECONF="1" | |
declare -- _MOZEXTENSION="1" | |
declare -- _MULTILIB_ECLASS="1" | |
declare -- _MULTIPROCESSING_ECLASS="1" | |
declare -- _PAX_UTILS_ECLASS="1" | |
declare -- _PRESERVE_LIBS_ECLASS="1" | |
declare -a _PYTHON_ALL_IMPLS=([0]="pypy3" [1]="python2_7" [2]="python3_6" [3]="python3_7" [4]="python3_8" [5]="python3_9") | |
declare -- _PYTHON_ANY_R1="1" | |
declare -a _PYTHON_SUPPORTED_IMPLS=([0]="python3_6" [1]="python3_7" [2]="python3_8") | |
declare -a _PYTHON_UNSUPPORTED_IMPLS=([0]="pypy3" [1]="python2_7" [2]="python3_9") | |
declare -- _PYTHON_UTILS_R1="1" | |
declare -- _TOOLCHAIN_FUNCS_ECLASS="1" | |
declare -- _VERSIONATOR_ECLASS="1" | |
declare -- _VIRTUAL_X="1" | |
declare -- __AUTOTOOLS_AUTO_DEPEND="yes" | |
declare -- _google_api_key="AIzaSyDEAOvatFo0eTgsV_ZlEzx0ObmepsMzfAc" | |
declare -- _libtool_atom=">=sys-devel/libtool-2.4" | |
declare -a mozlinguas=() | |
PYTHON () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#.24.28PYTHON.29.2C_.24.7BEPYTHON.7D" | |
} | |
Xeconf () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
[[ ${EAPI} == [45] ]] || die "${FUNCNAME} is unsupported in EAPI > 5, please use 'virtx econf ....'"; | |
VIRTUALX_COMMAND="econf" virtualmake "$@" | |
} | |
Xemake () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
[[ ${EAPI} == [45] ]] || die "${FUNCNAME} is unsupported in EAPI > 5, please use 'virtx emake ....'"; | |
VIRTUALX_COMMAND="emake" virtualmake "$@" | |
} | |
Xmake () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
[[ ${EAPI} == [45] ]] || die "${FUNCNAME} is unsupported in EAPI > 5, please use 'virtx emake -j1 ....'"; | |
eqawarn "you should not execute make directly"; | |
eqawarn "rather execute Xemake -j1 if you have issues with parallel make"; | |
VIRTUALX_COMMAND="emake -j1" virtualmake "$@" | |
} | |
__eapi6_src_install () | |
{ | |
if [[ -f Makefile || -f GNUmakefile || -f makefile ]]; then | |
emake DESTDIR="${D}" install; | |
fi; | |
einstalldocs | |
} | |
__eapi6_src_prepare () | |
{ | |
if ___is_indexed_array_var PATCHES; then | |
[[ ${#PATCHES[@]} -gt 0 ]] && eapply "${PATCHES[@]}"; | |
else | |
if [[ -n ${PATCHES} ]]; then | |
eapply ${PATCHES}; | |
fi; | |
fi; | |
eapply_user | |
} | |
_at_uses_autoheader () | |
{ | |
_at_uses_pkg A{C,M}_CONFIG_HEADER{S,} | |
} | |
_at_uses_automake () | |
{ | |
_at_uses_pkg AM_INIT_AUTOMAKE | |
} | |
_at_uses_gettext () | |
{ | |
_at_uses_pkg AM_GNU_GETTEXT_{,REQUIRE_}VERSION | |
} | |
_at_uses_glibgettext () | |
{ | |
_at_uses_pkg AM_GLIB_GNU_GETTEXT | |
} | |
_at_uses_gnomedoc () | |
{ | |
_at_uses_pkg GNOME_DOC_INIT | |
} | |
_at_uses_gtkdoc () | |
{ | |
_at_uses_pkg GTK_DOC_CHECK | |
} | |
_at_uses_intltool () | |
{ | |
_at_uses_pkg {AC,IT}_PROG_INTLTOOL | |
} | |
_at_uses_libltdl () | |
{ | |
_at_uses_pkg LT_CONFIG_LTDL_DIR | |
} | |
_at_uses_libtool () | |
{ | |
_at_uses_pkg A{C,M}_PROG_LIBTOOL LT_INIT | |
} | |
_at_uses_pkg () | |
{ | |
if [[ -n $(autotools_check_macro "$@") ]]; then | |
return 0; | |
else | |
local macro args=(); | |
for macro in "$@"; | |
do | |
args+=(-e "^[[:space:]]*${macro}\>"); | |
done; | |
egrep -q "${args[@]}" configure.??; | |
fi | |
} | |
_automake_version () | |
{ | |
autotools_run_tool --at-output automake --version 2> /dev/null | sed -n -e '1{s:.*(GNU automake) ::p;q}' | |
} | |
_autotools_m4dir_include () | |
{ | |
local x include_opts flag; | |
[[ ${WANT_AUTOCONF} == "2.1" ]] && flag="l" || flag="I"; | |
for x in "$@"; | |
do | |
case ${x} in | |
-${flag}) | |
;; | |
*) | |
[[ ! -d ${x} ]] && ewarn "autotools.eclass: '${x}' does not exist"; | |
include_opts+=" -${flag} ${x}" | |
;; | |
esac; | |
done; | |
echo ${include_opts} | |
} | |
_clang_fullversion () | |
{ | |
local ver="$1"; | |
shift; | |
set -- $($(tc-getCPP "$@") -E -P - <<<"__clang_major__ __clang_minor__ __clang_patchlevel__"); | |
eval echo "$ver" | |
} | |
_eapply_get_files () | |
{ | |
local LC_ALL=POSIX; | |
local prev_shopt=$(shopt -p nullglob); | |
shopt -s nullglob; | |
local f; | |
for f in "${1}"/*; | |
do | |
if [[ ${f} == *.diff || ${f} == *.patch ]]; then | |
files+=("${f}"); | |
fi; | |
done; | |
${prev_shopt} | |
} | |
_eapply_patch () | |
{ | |
local f=${1}; | |
local prefix=${2}; | |
ebegin "${prefix:-Applying }${f##*/}"; | |
local all_opts=(-p1 -f -g0 --no-backup-if-mismatch "${patch_options[@]}"); | |
if ${patch_cmd} "${all_opts[@]}" --dry-run -s -F0 < "${f}" &> /dev/null; then | |
all_opts+=(-s -F0); | |
fi; | |
${patch_cmd} "${all_opts[@]}" < "${f}"; | |
failed=${?}; | |
if ! eend "${failed}"; then | |
__helpers_die "patch -p1 ${patch_options[*]} failed with ${f}"; | |
fi | |
} | |
_elibtoolize () | |
{ | |
local LIBTOOLIZE=${LIBTOOLIZE:-$(type -P glibtoolize > /dev/null && echo glibtoolize || echo libtoolize)}; | |
if [[ $1 == "--auto-ltdl" ]]; then | |
shift; | |
_at_uses_libltdl && set -- "$@" --ltdl; | |
fi; | |
[[ -f GNUmakefile.am || -f Makefile.am ]] && set -- "$@" --automake; | |
autotools_run_tool ${LIBTOOLIZE} "$@" | |
} | |
_filter-hardened () | |
{ | |
local f; | |
for f in "$@"; | |
do | |
case "${f}" in | |
-fPIC | -fpic | -fPIE | -fpie | -Wl,pie | -pie) | |
gcc-specs-pie || continue; | |
if ! is-flagq -nopie && ! is-flagq -no-pie; then | |
if test-flags -nopie > /dev/null; then | |
append-flags -nopie; | |
else | |
append-flags -no-pie; | |
fi; | |
fi | |
;; | |
-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; | |
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 () | |
{ | |
( insopts -m 0644; | |
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="$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 | |
} | |
_python_EPYTHON_supported () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local EPYTHON=${1}; | |
local i=${EPYTHON/./_}; | |
case "${i}" in | |
python* | jython* | pypy*) | |
;; | |
*) | |
ewarn "Invalid EPYTHON: ${EPYTHON}"; | |
return 1 | |
;; | |
esac; | |
if has "${i}" "${_PYTHON_SUPPORTED_IMPLS[@]}"; then | |
if python_is_installed "${i}"; then | |
if declare -f python_check_deps > /dev/null; then | |
local PYTHON_USEDEP="python_targets_${i}(-),python_single_target_${i}(+)"; | |
python_check_deps; | |
return ${?}; | |
fi; | |
return 0; | |
fi; | |
else | |
if ! has "${i}" "${_PYTHON_ALL_IMPLS[@]}"; then | |
ewarn "Invalid EPYTHON: ${EPYTHON}"; | |
fi; | |
fi; | |
return 1 | |
} | |
_python_check_dead_variables () | |
{ | |
local v; | |
for v in PYTHON_DEPEND PYTHON_USE_WITH{,_OR,_OPT} {RESTRICT,SUPPORT}_PYTHON_ABIS; | |
do | |
if [[ -n ${!v} ]]; then | |
die "${v} is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#Ebuild_head"; | |
fi; | |
done; | |
for v in PYTHON_{CPPFLAGS,CFLAGS,CXXFLAGS,LDFLAGS}; | |
do | |
if [[ -n ${!v} ]]; then | |
die "${v} is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#PYTHON_CFLAGS"; | |
fi; | |
done; | |
for v in PYTHON_TESTS_RESTRICTED_ABIS PYTHON_EXPORT_PHASE_FUNCTIONS PYTHON_VERSIONED_{SCRIPTS,EXECUTABLES} PYTHON_NONVERSIONED_EXECUTABLES; | |
do | |
if [[ -n ${!v} ]]; then | |
die "${v} is invalid for python-r1 suite"; | |
fi; | |
done; | |
for v in DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES DISTUTILS_SETUP_FILES DISTUTILS_GLOBAL_OPTIONS DISTUTILS_SRC_TEST PYTHON_MODNAME; | |
do | |
if [[ -n ${!v} ]]; then | |
die "${v} is invalid for distutils-r1, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#${v}"; | |
fi; | |
done; | |
if [[ -n ${DISTUTILS_DISABLE_TEST_DEPENDENCY} ]]; then | |
die "${v} is invalid for distutils-r1, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#DISTUTILS_SRC_TEST"; | |
fi; | |
for v in PYTHON_BDEPEND PYTHON_MULTIPLE_ABIS PYTHON_ABI_TYPE PYTHON_RESTRICTED_ABIS PYTHON_TESTS_FAILURES_TOLERANT_ABIS PYTHON_CFFI_MODULES_GENERATION_COMMANDS; | |
do | |
if [[ -n ${!v} ]]; then | |
die "${v} is invalid for python-r1 suite"; | |
fi; | |
done | |
} | |
_python_check_locale_sanity () | |
{ | |
local -x LC_ALL=${1}; | |
local IFS=; | |
local lc=({a..z}); | |
local uc=({A..Z}); | |
local input="${lc[*]}${uc[*]}"; | |
local output=$(tr '[:lower:][:upper:]' '[:upper:][:lower:]' <<<"${input}"); | |
[[ ${output} == "${uc[*]}${lc[*]}" ]] | |
} | |
_python_export () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local impl var; | |
case "${1}" in | |
python* | jython*) | |
impl=${1/_/.}; | |
shift | |
;; | |
pypy | pypy3) | |
impl=${1}; | |
shift | |
;; | |
*) | |
impl=${EPYTHON}; | |
if [[ -z ${impl} ]]; then | |
die "_python_export called without a python implementation and EPYTHON is unset"; | |
fi | |
;; | |
esac; | |
debug-print "${FUNCNAME}: implementation: ${impl}"; | |
for var in "$@"; | |
do | |
case "${var}" in | |
EPYTHON) | |
export EPYTHON=${impl}; | |
debug-print "${FUNCNAME}: EPYTHON = ${EPYTHON}" | |
;; | |
PYTHON) | |
export PYTHON=${EPREFIX}/usr/bin/${impl}; | |
debug-print "${FUNCNAME}: PYTHON = ${PYTHON}" | |
;; | |
PYTHON_SITEDIR) | |
[[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it"; | |
PYTHON_SITEDIR=$("${PYTHON}" -c 'import distutils.sysconfig; print(distutils.sysconfig.get_python_lib())') || die; | |
export PYTHON_SITEDIR; | |
debug-print "${FUNCNAME}: PYTHON_SITEDIR = ${PYTHON_SITEDIR}" | |
;; | |
PYTHON_INCLUDEDIR) | |
[[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it"; | |
PYTHON_INCLUDEDIR=$("${PYTHON}" -c 'import distutils.sysconfig; print(distutils.sysconfig.get_python_inc())') || die; | |
export PYTHON_INCLUDEDIR; | |
debug-print "${FUNCNAME}: PYTHON_INCLUDEDIR = ${PYTHON_INCLUDEDIR}"; | |
if [[ ! -d ${PYTHON_INCLUDEDIR} ]]; then | |
die "${impl} does not install any header files!"; | |
fi | |
;; | |
PYTHON_LIBPATH) | |
[[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it"; | |
PYTHON_LIBPATH=$("${PYTHON}" -c 'import os.path, sysconfig; print(os.path.join(sysconfig.get_config_var("LIBDIR"), sysconfig.get_config_var("LDLIBRARY")) if sysconfig.get_config_var("LDLIBRARY") else "")') || die; | |
export PYTHON_LIBPATH; | |
debug-print "${FUNCNAME}: PYTHON_LIBPATH = ${PYTHON_LIBPATH}"; | |
if [[ ! -n ${PYTHON_LIBPATH} ]]; then | |
die "${impl} lacks a (usable) dynamic library"; | |
fi | |
;; | |
PYTHON_CFLAGS) | |
local val; | |
case "${impl}" in | |
python*) | |
val=$($(tc-getPKG_CONFIG) --cflags ${impl/n/n-}) || die | |
;; | |
*) | |
die "${impl}: obtaining ${var} not supported" | |
;; | |
esac; | |
export PYTHON_CFLAGS=${val}; | |
debug-print "${FUNCNAME}: PYTHON_CFLAGS = ${PYTHON_CFLAGS}" | |
;; | |
PYTHON_LIBS) | |
local val; | |
case "${impl}" in | |
python2* | python3.6 | python3.7*) | |
val=$($(tc-getPKG_CONFIG) --libs ${impl/n/n-}) || die | |
;; | |
python*) | |
val=$($(tc-getPKG_CONFIG) --libs ${impl/n/n-}-embed) || die | |
;; | |
*) | |
die "${impl}: obtaining ${var} not supported" | |
;; | |
esac; | |
export PYTHON_LIBS=${val}; | |
debug-print "${FUNCNAME}: PYTHON_LIBS = ${PYTHON_LIBS}" | |
;; | |
PYTHON_CONFIG) | |
local flags val; | |
case "${impl}" in | |
python*) | |
[[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it"; | |
flags=$("${PYTHON}" -c 'import sysconfig; print(sysconfig.get_config_var("ABIFLAGS") or "")') || die; | |
val=${PYTHON}${flags}-config | |
;; | |
*) | |
die "${impl}: obtaining ${var} not supported" | |
;; | |
esac; | |
export PYTHON_CONFIG=${val}; | |
debug-print "${FUNCNAME}: PYTHON_CONFIG = ${PYTHON_CONFIG}" | |
;; | |
PYTHON_PKG_DEP) | |
local d; | |
case ${impl} in | |
python2.7) | |
PYTHON_PKG_DEP='>=dev-lang/python-2.7.5-r2:2.7' | |
;; | |
python*) | |
PYTHON_PKG_DEP="dev-lang/python:${impl#python}" | |
;; | |
pypy) | |
PYTHON_PKG_DEP='>=dev-python/pypy-7.3.0:0=' | |
;; | |
pypy3) | |
PYTHON_PKG_DEP='>=dev-python/pypy3-7.3.0:0=' | |
;; | |
*) | |
die "Invalid implementation: ${impl}" | |
;; | |
esac; | |
if [[ -n ${PYTHON_REQ_USE} ]]; then | |
PYTHON_PKG_DEP+=[${PYTHON_REQ_USE}]; | |
fi; | |
export PYTHON_PKG_DEP; | |
debug-print "${FUNCNAME}: PYTHON_PKG_DEP = ${PYTHON_PKG_DEP}" | |
;; | |
PYTHON_SCRIPTDIR) | |
local dir; | |
export PYTHON_SCRIPTDIR=${EPREFIX}/usr/lib/python-exec/${impl}; | |
debug-print "${FUNCNAME}: PYTHON_SCRIPTDIR = ${PYTHON_SCRIPTDIR}" | |
;; | |
*) | |
die "_python_export: unknown variable ${var}" | |
;; | |
esac; | |
done | |
} | |
_python_impl_matches () | |
{ | |
[[ ${#} -ge 1 ]] || die "${FUNCNAME}: takes at least 1 parameter"; | |
[[ ${#} -eq 1 ]] && return 0; | |
local impl=${1} pattern; | |
shift; | |
for pattern in "$@"; | |
do | |
if [[ ${pattern} == -2 ]]; then | |
python_is_python3 "${impl}" || return 0; | |
else | |
if [[ ${pattern} == -3 ]]; then | |
python_is_python3 "${impl}" && return 0; | |
return; | |
else | |
if [[ ${impl/./_} == ${pattern/./_} ]]; then | |
return 0; | |
fi; | |
fi; | |
fi; | |
done; | |
return 1 | |
} | |
_python_impl_supported () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ ${#} -eq 1 ]] || die "${FUNCNAME}: takes exactly 1 argument (impl)."; | |
local impl=${1}; | |
case "${impl}" in | |
python2_7 | python3_[6789] | pypy3) | |
return 0 | |
;; | |
jython2_7 | pypy | pypy1_[89] | pypy2_0 | python2_[56] | python3_[12345]) | |
return 1 | |
;; | |
*) | |
[[ -n ${PYTHON_COMPAT_NO_STRICT} ]] && return 1; | |
die "Invalid implementation in PYTHON_COMPAT: ${impl}" | |
;; | |
esac | |
} | |
_python_ln_rel () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local target=${1}; | |
local symname=${2}; | |
local tgpath=${target%/*}/; | |
local sympath=${symname%/*}/; | |
local rel_target=; | |
while [[ -n ${sympath} ]]; do | |
local tgseg= symseg=; | |
while [[ ! -n ${tgseg} && -n ${tgpath} ]]; do | |
tgseg=${tgpath%%/*}; | |
tgpath=${tgpath#${tgseg}/}; | |
done; | |
while [[ ! -n ${symseg} && -n ${sympath} ]]; do | |
symseg=${sympath%%/*}; | |
sympath=${sympath#${symseg}/}; | |
done; | |
if [[ ${tgseg} != ${symseg} ]]; then | |
rel_target=../${rel_target}${tgseg:+${tgseg}/}; | |
fi; | |
done; | |
rel_target+=${tgpath}${target##*/}; | |
debug-print "${FUNCNAME}: ${symname} -> ${target}"; | |
debug-print "${FUNCNAME}: rel_target = ${rel_target}"; | |
ln -fs "${rel_target}" "${symname}" | |
} | |
_python_set_impls () | |
{ | |
local i; | |
if ! declare -p PYTHON_COMPAT &> /dev/null; then | |
die 'PYTHON_COMPAT not declared.'; | |
fi; | |
if [[ $(declare -p PYTHON_COMPAT) != "declare -a"* ]]; then | |
die 'PYTHON_COMPAT must be an array.'; | |
fi; | |
for i in "${PYTHON_COMPAT[@]}"; | |
do | |
_python_impl_supported "${i}"; | |
done; | |
local supp=() unsupp=(); | |
for i in "${_PYTHON_ALL_IMPLS[@]}"; | |
do | |
if has "${i}" "${PYTHON_COMPAT[@]}"; then | |
supp+=("${i}"); | |
else | |
unsupp+=("${i}"); | |
fi; | |
done; | |
if [[ ! -n ${supp[@]} ]]; then | |
die "No supported implementation in PYTHON_COMPAT."; | |
fi; | |
if [[ -n ${_PYTHON_SUPPORTED_IMPLS[@]} ]]; then | |
if [[ ${_PYTHON_SUPPORTED_IMPLS[@]} != ${supp[@]} ]]; then | |
eerror "Supported impls (PYTHON_COMPAT) changed between inherits!"; | |
eerror "Before: ${_PYTHON_SUPPORTED_IMPLS[*]}"; | |
eerror "Now : ${supp[*]}"; | |
die "_PYTHON_SUPPORTED_IMPLS integrity check failed"; | |
fi; | |
if [[ ${_PYTHON_UNSUPPORTED_IMPLS[@]} != ${unsupp[@]} ]]; then | |
eerror "Unsupported impls changed between inherits!"; | |
eerror "Before: ${_PYTHON_UNSUPPORTED_IMPLS[*]}"; | |
eerror "Now : ${unsupp[*]}"; | |
die "_PYTHON_UNSUPPORTED_IMPLS integrity check failed"; | |
fi; | |
else | |
_PYTHON_SUPPORTED_IMPLS=("${supp[@]}"); | |
_PYTHON_UNSUPPORTED_IMPLS=("${unsupp[@]}"); | |
readonly _PYTHON_SUPPORTED_IMPLS _PYTHON_UNSUPPORTED_IMPLS; | |
fi | |
} | |
_python_wrapper_setup () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local workdir=${1:-${T}/${EPYTHON}}; | |
local impl=${2:-${EPYTHON}}; | |
[[ -n ${workdir} ]] || die "${FUNCNAME}: no workdir specified."; | |
[[ -n ${impl} ]] || die "${FUNCNAME}: no impl nor EPYTHON specified."; | |
if [[ ! -x ${workdir}/bin/python ]]; then | |
_python_check_dead_variables; | |
mkdir -p "${workdir}"/{bin,pkgconfig} || die; | |
rm -f "${workdir}"/bin/python{,2,3}{,-config} || die; | |
rm -f "${workdir}"/bin/2to3 || die; | |
rm -f "${workdir}"/pkgconfig/python{2,3}{,-embed}.pc || die; | |
local EPYTHON PYTHON; | |
_python_export "${impl}" EPYTHON PYTHON; | |
local pyver pyother; | |
if python_is_python3; then | |
pyver=3; | |
pyother=2; | |
else | |
pyver=2; | |
pyother=3; | |
fi; | |
cat > "${workdir}/bin/python" <<-_EOF_ || | |
#!/bin/sh | |
exec "${PYTHON}" "\${@}" | |
_EOF_ | |
die | |
cp "${workdir}/bin/python" "${workdir}/bin/python${pyver}" || die; | |
chmod +x "${workdir}/bin/python" "${workdir}/bin/python${pyver}" || die; | |
local nonsupp=("python${pyother}" "python${pyother}-config"); | |
if [[ ${EPYTHON} == python* ]]; then | |
cat > "${workdir}/bin/python-config" <<-_EOF_ || | |
#!/bin/sh | |
exec "${PYTHON}-config" "\${@}" | |
_EOF_ | |
die | |
cp "${workdir}/bin/python-config" "${workdir}/bin/python${pyver}-config" || die; | |
chmod +x "${workdir}/bin/python-config" "${workdir}/bin/python${pyver}-config" || die; | |
ln -s "${PYTHON/python/2to3-}" "${workdir}"/bin/2to3 || die; | |
ln -s "${EPREFIX}"/usr/$(get_libdir)/pkgconfig/${EPYTHON/n/n-}.pc "${workdir}"/pkgconfig/python${pyver}.pc || die; | |
if [[ ${EPYTHON} != python[23].[67] ]]; then | |
ln -s "${EPREFIX}"/usr/$(get_libdir)/pkgconfig/${EPYTHON/n/n-}-embed.pc "${workdir}"/pkgconfig/python${pyver}-embed.pc || die; | |
fi; | |
else | |
nonsupp+=(2to3 python-config "python${pyver}-config"); | |
fi; | |
local x; | |
for x in "${nonsupp[@]}"; | |
do | |
cat > "${workdir}"/bin/${x} <<-_EOF_ || | |
#!/bin/sh | |
echo "${ECLASS}: ${FUNCNAME}: ${x} is not supported by ${EPYTHON} (PYTHON_COMPAT)" >&2 | |
exit 127 | |
_EOF_ | |
die | |
chmod +x "${workdir}"/bin/${x} || die; | |
done; | |
fi; | |
if [[ ${PATH##:*} != ${workdir}/bin ]]; then | |
PATH=${workdir}/bin${PATH:+:${PATH}}; | |
fi; | |
if [[ ${PKG_CONFIG_PATH##:*} != ${workdir}/pkgconfig ]]; then | |
PKG_CONFIG_PATH=${workdir}/pkgconfig${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}; | |
fi; | |
export PATH PKG_CONFIG_PATH | |
} | |
_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[0]}); | |
[[ -z ${search} && -n ${!tuple} ]] && search=$(type -p ${!tuple}-${prog[0]}); | |
[[ -n ${search} ]] && prog[0]=${search##*/}; | |
export ${var}="${prog[*]}"; | |
echo "${!var}" | |
} | |
_ver_compare () | |
{ | |
local va=${1} vb=${2} a an al as ar b bn bl bs br re LC_ALL=C; | |
re="^([0-9]+(\.[0-9]+)*)([a-z]?)((_(alpha|beta|pre|rc|p)[0-9]*)*)(-r[0-9]+)?$"; | |
[[ ${va} =~ ${re} ]] || die "${FUNCNAME}: invalid version: ${va}"; | |
an=${BASH_REMATCH[1]}; | |
al=${BASH_REMATCH[3]}; | |
as=${BASH_REMATCH[4]}; | |
ar=${BASH_REMATCH[7]}; | |
[[ ${vb} =~ ${re} ]] || die "${FUNCNAME}: invalid version: ${vb}"; | |
bn=${BASH_REMATCH[1]}; | |
bl=${BASH_REMATCH[3]}; | |
bs=${BASH_REMATCH[4]}; | |
br=${BASH_REMATCH[7]}; | |
_ver_compare_int "${an%%.*}" "${bn%%.*}" || return; | |
while [[ ${an} == *.* && ${bn} == *.* ]]; do | |
an=${an#*.}; | |
bn=${bn#*.}; | |
a=${an%%.*}; | |
b=${bn%%.*}; | |
if [[ ${a} == 0* || ${b} == 0* ]]; then | |
[[ ${a} =~ 0+$ ]] && a=${a%"${BASH_REMATCH[0]}"}; | |
[[ ${b} =~ 0+$ ]] && b=${b%"${BASH_REMATCH[0]}"}; | |
[[ ${a} > ${b} ]] && return 3; | |
[[ ${a} < ${b} ]] && return 1; | |
else | |
_ver_compare_int "${a}" "${b}" || return; | |
fi; | |
done; | |
[[ ${an} == *.* ]] && return 3; | |
[[ ${bn} == *.* ]] && return 1; | |
[[ ${al} > ${bl} ]] && return 3; | |
[[ ${al} < ${bl} ]] && return 1; | |
as=${as#_}${as:+_}; | |
bs=${bs#_}${bs:+_}; | |
while [[ -n ${as} && -n ${bs} ]]; do | |
a=${as%%_*}; | |
b=${bs%%_*}; | |
if [[ ${a%%[0-9]*} == "${b%%[0-9]*}" ]]; then | |
_ver_compare_int "${a##*[a-z]}" "${b##*[a-z]}" || return; | |
else | |
[[ ${a%%[0-9]*} == p ]] && return 3; | |
[[ ${b%%[0-9]*} == p ]] && return 1; | |
[[ ${a} > ${b} ]] && return 3 || return 1; | |
fi; | |
as=${as#*_}; | |
bs=${bs#*_}; | |
done; | |
if [[ -n ${as} ]]; then | |
[[ ${as} == p[_0-9]* ]] && return 3 || return 1; | |
else | |
if [[ -n ${bs} ]]; then | |
[[ ${bs} == p[_0-9]* ]] && return 1 || return 3; | |
fi; | |
fi; | |
_ver_compare_int "${ar#-r}" "${br#-r}" || return; | |
return 2 | |
} | |
_ver_compare_int () | |
{ | |
local a=$1 b=$2 d=$(( ${#1}-${#2} )); | |
if [[ ${d} -gt 0 ]]; then | |
printf -v b "%0${d}d%s" 0 "${b}"; | |
else | |
if [[ ${d} -lt 0 ]]; then | |
printf -v a "%0$(( -d ))d%s" 0 "${a}"; | |
fi; | |
fi; | |
[[ ${a} > ${b} ]] && return 3; | |
[[ ${a} == "${b}" ]] | |
} | |
_ver_parse_range () | |
{ | |
local range=${1}; | |
local max=${2}; | |
[[ ${range} == [0-9]* ]] || die "${FUNCNAME}: range must start with a number"; | |
start=${range%-*}; | |
[[ ${range} == *-* ]] && end=${range#*-} || end=${start}; | |
if [[ -n ${end} ]]; then | |
[[ ${start} -le ${end} ]] || die "${FUNCNAME}: end of range must be >= start"; | |
[[ ${end} -le ${max} ]] || end=${max}; | |
else | |
end=${max}; | |
fi | |
} | |
_ver_split () | |
{ | |
local v=${1} LC_ALL=C; | |
comp=(); | |
local s c; | |
while [[ -n ${v} ]]; do | |
s=${v%%[a-zA-Z0-9]*}; | |
v=${v:${#s}}; | |
[[ ${v} == [0-9]* ]] && c=${v%%[^0-9]*} || c=${v%%[^a-zA-Z]*}; | |
v=${v:${#c}}; | |
comp+=("${s}" "${c}"); | |
done | |
} | |
all-flag-vars () | |
{ | |
echo {ADA,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 | |
} | |
autotools_check_macro () | |
{ | |
[[ -f configure.ac || -f configure.in ]] || return 0; | |
local trace_file=".__autoconf_trace_data"; | |
if [[ ! -e ${trace_file} ]] || [[ ! aclocal.m4 -ot ${trace_file} ]]; then | |
WANT_AUTOCONF="2.5" autoconf $(autotools_m4dir_include) ${ALL_AUTOTOOLS_MACROS[@]/#/--trace=} > ${trace_file} 2> /dev/null; | |
fi; | |
local macro args=(); | |
for macro in "$@"; | |
do | |
has ${macro} ${ALL_AUTOTOOLS_MACROS[@]} || die "internal error: add ${macro} to ALL_AUTOTOOLS_MACROS"; | |
args+=(-e ":${macro}:"); | |
done; | |
grep "${args[@]}" ${trace_file} | |
} | |
autotools_check_macro_val () | |
{ | |
local macro scan_out; | |
for macro in "$@"; | |
do | |
autotools_check_macro "${macro}" | gawk -v macro="${macro}" '($0 !~ /^[[:space:]]*(#|dnl)/) { | |
if (match($0, macro ":(.*)$", res)) | |
print res[1] | |
}' | uniq; | |
done; | |
return 0 | |
} | |
autotools_env_setup () | |
{ | |
if [[ ${WANT_AUTOMAKE} == "latest" ]]; then | |
local pv; | |
for pv in ${_LATEST_AUTOMAKE[@]/#*:}; | |
do | |
local hv_args=""; | |
case ${EAPI:-0} in | |
5 | 6) | |
hv_args="--host-root" | |
;; | |
7) | |
hv_args="-b" | |
;; | |
esac; | |
ROOT=/ has_version ${hv_args} "=sys-devel/automake-${pv}*" && export WANT_AUTOMAKE="${pv}" && break; | |
done; | |
[[ ${WANT_AUTOMAKE} == "latest" ]] && die "Cannot find the latest automake! Tried ${_LATEST_AUTOMAKE[*]}"; | |
fi; | |
[[ ${WANT_AUTOCONF} == "latest" ]] && export WANT_AUTOCONF=2.5 | |
} | |
autotools_m4dir_include () | |
{ | |
_autotools_m4dir_include ${AT_M4DIR} | |
} | |
autotools_m4sysdir_include () | |
{ | |
local paths=($(eval echo ${AT_SYS_M4DIR})); | |
if [[ ${#paths[@]} -eq 0 && -n ${SYSROOT} ]]; then | |
local path="${SYSROOT}/usr/share/aclocal"; | |
[[ -d ${path} ]] && paths+=("${path}"); | |
fi; | |
_autotools_m4dir_include "${paths[@]}" | |
} | |
autotools_run_tool () | |
{ | |
local autofail=true m4flags=false missing_ok=false return_output=false; | |
while [[ -n $1 ]]; do | |
case $1 in | |
--at-no-fail) | |
autofail=false | |
;; | |
--at-m4flags) | |
m4flags=true | |
;; | |
--at-missing) | |
missing_ok=true | |
;; | |
--at-output) | |
return_output=true | |
;; | |
*) | |
break | |
;; | |
esac; | |
shift; | |
done; | |
if [[ ${EBUILD_PHASE} != "unpack" && ${EBUILD_PHASE} != "prepare" ]]; then | |
ewarn "QA Warning: running $1 in ${EBUILD_PHASE} phase"; | |
fi; | |
if ${missing_ok} && ! type -P ${1} > /dev/null; then | |
einfo "Skipping '$*' due $1 not installed"; | |
return 0; | |
fi; | |
autotools_env_setup; | |
local STDERR_TARGET="${T}/${1##*/}.out"; | |
if [[ -e ${STDERR_TARGET} ]]; then | |
local i=1; | |
while :; do | |
STDERR_TARGET="${T}/${1##*/}-${i}.out"; | |
[[ -e ${STDERR_TARGET} ]] || break; | |
: $(( i++ )); | |
done; | |
fi; | |
if ${m4flags}; then | |
set -- "${1}" $(autotools_m4dir_include) $(autotools_m4sysdir_include) "${@:2}"; | |
fi; | |
if ${return_output}; then | |
"$@"; | |
return; | |
fi; | |
printf "***** $1 *****\n***** PWD: ${PWD}\n***** $*\n\n" > "${STDERR_TARGET}"; | |
ebegin "Running $@"; | |
"$@" >> "${STDERR_TARGET}" 2>&1; | |
if ! eend $? && ${autofail}; then | |
echo; | |
eerror "Failed Running $1 !"; | |
eerror; | |
eerror "Include in your bugreport the contents of:"; | |
eerror; | |
eerror " ${STDERR_TARGET}"; | |
echo; | |
die "Failed Running $1 !"; | |
fi | |
} | |
build_sphinx () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ ${#} -eq 1 ]] || die "${FUNCNAME} takes 1 arg: <directory>"; | |
local dir=${1}; | |
sed -i -e 's:^intersphinx_mapping:disabled_&:' "${dir}"/conf.py || die; | |
sphinx-build -b html -d "${dir}"/_build/doctrees "${dir}" "${dir}"/_build/html || die; | |
HTML_DOCS+=("${dir}/_build/html/.") | |
} | |
check-reqs_disk () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
[[ -z ${2} ]] && die "Usage: ${FUNCNAME} [path] [size]"; | |
local path=${1}; | |
local size=${2}; | |
local space_kbi; | |
check-reqs_start_phase ${size} "disk space at \"${path}\""; | |
space_kbi=$(df -Pk "${1}" 2>/dev/null | awk 'FNR == 2 {print $4}'); | |
if [[ $? == 0 && -n ${space_kbi} ]]; then | |
if [[ ${space_kbi} -lt $(check-reqs_get_kibibytes ${size}) ]]; then | |
eend 1; | |
check-reqs_unsatisfied ${size} "disk space at \"${path}\""; | |
else | |
eend 0; | |
fi; | |
else | |
eend 1; | |
ewarn "Couldn't determine disk space, skipping..."; | |
fi | |
} | |
check-reqs_get_kibibytes () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
[[ -z ${1} ]] && die "Usage: ${FUNCNAME} [size]"; | |
local unit=${1:(-1)}; | |
local size=${1%[GMT]}; | |
case ${unit} in | |
M) | |
echo $((1024 * size)) | |
;; | |
G) | |
echo $((1024 * 1024 * size)) | |
;; | |
T) | |
echo $((1024 * 1024 * 1024 * size)) | |
;; | |
*) | |
die "${FUNCNAME}: Unknown unit: ${unit}" | |
;; | |
esac | |
} | |
check-reqs_get_number () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
[[ -z ${1} ]] && die "Usage: ${FUNCNAME} [size]"; | |
local size=${1%[GMT]}; | |
[[ ${size} == ${1} ]] && die "${FUNCNAME}: Missing unit: ${1}"; | |
echo ${size} | |
} | |
check-reqs_get_unit () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
[[ -z ${1} ]] && die "Usage: ${FUNCNAME} [size]"; | |
local unit=${1:(-1)}; | |
case ${unit} in | |
M) | |
echo "MiB" | |
;; | |
G) | |
echo "GiB" | |
;; | |
T) | |
echo "TiB" | |
;; | |
*) | |
die "${FUNCNAME}: Unknown unit: ${unit}" | |
;; | |
esac | |
} | |
check-reqs_memory () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
[[ -z ${1} ]] && die "Usage: ${FUNCNAME} [size]"; | |
local size=${1}; | |
local actual_memory; | |
local actual_swap; | |
check-reqs_start_phase ${size} "RAM"; | |
if [[ -r /proc/meminfo ]]; then | |
actual_memory=$(awk '/MemTotal/ { print $2 }' /proc/meminfo); | |
actual_swap=$(awk '/SwapTotal/ { print $2 }' /proc/meminfo); | |
else | |
actual_memory=$(sysctl hw.physmem 2>/dev/null); | |
[[ $? -eq 0 ]] && actual_memory=$(echo "${actual_memory}" | sed -e 's/^[^:=]*[:=][[:space:]]*//'); | |
actual_swap=$(sysctl vm.swap_total 2>/dev/null); | |
[[ $? -eq 0 ]] && actual_swap=$(echo "${actual_swap}" | sed -e 's/^[^:=]*[:=][[:space:]]*//'); | |
fi; | |
if [[ -n ${actual_memory} ]]; then | |
if [[ ${actual_memory} -ge $(check-reqs_get_kibibytes ${size}) ]]; then | |
eend 0; | |
else | |
if [[ -n ${actual_swap} && $((${actual_memory} + ${actual_swap})) -ge $(check-reqs_get_kibibytes ${size}) ]]; then | |
ewarn "Amount of main memory is insufficient, but amount"; | |
ewarn "of main memory combined with swap is sufficient."; | |
ewarn "Build process may make computer very slow!"; | |
eend 0; | |
else | |
eend 1; | |
check-reqs_unsatisfied ${size} "RAM"; | |
fi; | |
fi; | |
else | |
eend 1; | |
ewarn "Couldn't determine amount of memory, skipping..."; | |
fi | |
} | |
check-reqs_output () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
local msg="ewarn"; | |
[[ ${EBUILD_PHASE} == "pretend" && -z ${I_KNOW_WHAT_I_AM_DOING} ]] && msg="eerror"; | |
if [[ -n ${CHECKREQS_FAILED} ]]; then | |
${msg}; | |
${msg} "Space constraints set in the ebuild were not met!"; | |
${msg} "The build will most probably fail, you should enhance the space"; | |
${msg} "as per failed tests."; | |
${msg}; | |
[[ ${EBUILD_PHASE} == "pretend" && -z ${I_KNOW_WHAT_I_AM_DOING} ]] && die "Build requirements not met!"; | |
fi | |
} | |
check-reqs_pkg_pretend () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
check-reqs_pkg_setup "$@" | |
} | |
check-reqs_pkg_setup () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
check-reqs_prepare; | |
check-reqs_run; | |
check-reqs_output | |
} | |
check-reqs_prepare () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
if [[ -z ${CHECKREQS_MEMORY} && -z ${CHECKREQS_DISK_BUILD} && -z ${CHECKREQS_DISK_USR} && -z ${CHECKREQS_DISK_VAR} ]]; then | |
eerror "Set some check-reqs eclass variables if you want to use it."; | |
eerror "If you are user and see this message file a bug against the package."; | |
die "${FUNCNAME}: check-reqs eclass called but not actually used!"; | |
fi | |
} | |
check-reqs_run () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
unset CHECKREQS_FAILED; | |
if [[ ${MERGE_TYPE} != binary ]]; then | |
[[ -n ${CHECKREQS_MEMORY} ]] && check-reqs_memory ${CHECKREQS_MEMORY}; | |
[[ -n ${CHECKREQS_DISK_BUILD} ]] && check-reqs_disk "${T}" "${CHECKREQS_DISK_BUILD}"; | |
fi; | |
if [[ ${MERGE_TYPE} != buildonly ]]; then | |
[[ -n ${CHECKREQS_DISK_USR} ]] && check-reqs_disk "${EROOT%/}/usr" "${CHECKREQS_DISK_USR}"; | |
[[ -n ${CHECKREQS_DISK_VAR} ]] && check-reqs_disk "${EROOT%/}/var" "${CHECKREQS_DISK_VAR}"; | |
fi | |
} | |
check-reqs_start_phase () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
[[ -z ${2} ]] && die "Usage: ${FUNCNAME} [size] [location]"; | |
local size=${1}; | |
local location=${2}; | |
local sizeunit="$(check-reqs_get_number ${size}) $(check-reqs_get_unit ${size})"; | |
ebegin "Checking for at least ${sizeunit} ${location}" | |
} | |
check-reqs_unsatisfied () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
[[ -z ${2} ]] && die "Usage: ${FUNCNAME} [size] [location]"; | |
local msg="ewarn"; | |
local size=${1}; | |
local location=${2}; | |
local sizeunit="$(check-reqs_get_number ${size}) $(check-reqs_get_unit ${size})"; | |
[[ ${EBUILD_PHASE} == "pretend" && -z ${I_KNOW_WHAT_I_AM_DOING} ]] && msg="eerror"; | |
${msg} "There is NOT at least ${sizeunit} ${location}"; | |
CHECKREQS_FAILED="true" | |
} | |
check_reqs () | |
{ | |
eerror "Package calling old ${FUNCNAME} function."; | |
eerror "It should call check-reqs_pkg_pretend and check-reqs_pkg_setup."; | |
die "${FUNCNAME} is banned" | |
} | |
clang-fullversion () | |
{ | |
_clang_fullversion '$1.$2.$3' "$@" | |
} | |
clang-major-version () | |
{ | |
_clang_fullversion '$1' "$@" | |
} | |
clang-micro-version () | |
{ | |
_clang_fullversion '$3' "$@" | |
} | |
clang-minor-version () | |
{ | |
_clang_fullversion '$2' "$@" | |
} | |
clang-version () | |
{ | |
_clang_fullversion '$1.$2' "$@" | |
} | |
config_rpath_update () | |
{ | |
local dst src=$(type -P gettext | sed 's:bin/gettext:share/gettext/config.rpath:'); | |
[[ $# -eq 0 ]] && set -- $(find -name config.rpath); | |
[[ $# -eq 0 ]] && return 0; | |
einfo "Updating all config.rpath files"; | |
for dst in "$@"; | |
do | |
einfo " ${dst}"; | |
cp "${src}" "${dst}" || die; | |
done | |
} | |
darwintoolize () | |
{ | |
die "Use elibtoolize" | |
} | |
delete_all_version_separators () | |
{ | |
replace_all_version_separators "" "${1}" | |
} | |
delete_version_separator () | |
{ | |
replace_version_separator "${1}" "" "${2}" | |
} | |
doicon () | |
{ | |
_iconins ${FUNCNAME} "$@" | |
} | |
domenu () | |
{ | |
( local i ret=0; | |
insopts -m 0644; | |
insinto /usr/share/applications; | |
for i in "$@"; | |
do | |
if [[ -d ${i} ]]; then | |
doins "${i}"/*.desktop; | |
((ret|=$?)); | |
else | |
doins "${i}"; | |
((ret|=$?)); | |
fi; | |
done; | |
exit ${ret} ) | |
} | |
eaclocal () | |
{ | |
[[ ! -f aclocal.m4 || -n $(grep -e 'generated.*by aclocal' aclocal.m4) ]] && autotools_run_tool --at-m4flags aclocal "$@" $(eaclocal_amflags) | |
} | |
eaclocal_amflags () | |
{ | |
local aclocal_opts amflags_file; | |
for amflags_file in GNUmakefile.am Makefile.am GNUmakefile.in Makefile.in; | |
do | |
[[ -e ${amflags_file} ]] || continue; | |
autotools_env_setup; | |
aclocal_opts=$(sed -n "/^ACLOCAL_AMFLAGS[[:space:]]*=/{ # match the first line | |
s:[^=]*=::p; # then gobble up all escaped lines | |
: nextline /\\\\$/{ n; p; b nextline; } }" ${amflags_file}); | |
eval aclocal_opts=\""${aclocal_opts}"\"; | |
break; | |
done; | |
echo ${aclocal_opts} | |
} | |
eapply () | |
{ | |
local failed patch_cmd=patch; | |
local -x LC_COLLATE=POSIX; | |
type -P gpatch > /dev/null && patch_cmd=gpatch; | |
function _eapply_patch () | |
{ | |
local f=${1}; | |
local prefix=${2}; | |
ebegin "${prefix:-Applying }${f##*/}"; | |
local all_opts=(-p1 -f -g0 --no-backup-if-mismatch "${patch_options[@]}"); | |
if ${patch_cmd} "${all_opts[@]}" --dry-run -s -F0 < "${f}" &> /dev/null; then | |
all_opts+=(-s -F0); | |
fi; | |
${patch_cmd} "${all_opts[@]}" < "${f}"; | |
failed=${?}; | |
if ! eend "${failed}"; then | |
__helpers_die "patch -p1 ${patch_options[*]} failed with ${f}"; | |
fi | |
}; | |
local patch_options=() files=(); | |
local i found_doublehyphen; | |
for ((i = 1; i <= ${#@}; ++i )) | |
do | |
if [[ ${@:i:1} == -- ]]; then | |
patch_options=("${@:1:i-1}"); | |
files=("${@:i+1}"); | |
found_doublehyphen=1; | |
break; | |
fi; | |
done; | |
if [[ -z ${found_doublehyphen} ]]; then | |
for ((i = 1; i <= ${#@}; ++i )) | |
do | |
if [[ ${@:i:1} != -* ]]; then | |
patch_options=("${@:1:i-1}"); | |
files=("${@:i}"); | |
break; | |
fi; | |
done; | |
for i in "${files[@]}"; | |
do | |
if [[ ${i} == -* ]]; then | |
die "eapply: all options must be passed before non-options"; | |
fi; | |
done; | |
fi; | |
if [[ ${#files[@]} -eq 0 ]]; then | |
die "eapply: no files specified"; | |
fi; | |
local f; | |
for f in "${files[@]}"; | |
do | |
if [[ -d ${f} ]]; then | |
function _eapply_get_files () | |
{ | |
local LC_ALL=POSIX; | |
local prev_shopt=$(shopt -p nullglob); | |
shopt -s nullglob; | |
local f; | |
for f in "${1}"/*; | |
do | |
if [[ ${f} == *.diff || ${f} == *.patch ]]; then | |
files+=("${f}"); | |
fi; | |
done; | |
${prev_shopt} | |
}; | |
local files=(); | |
_eapply_get_files "${f}"; | |
[[ ${#files[@]} -eq 0 ]] && die "No *.{patch,diff} files in directory ${f}"; | |
einfo "Applying patches from ${f} ..."; | |
local f2; | |
for f2 in "${files[@]}"; | |
do | |
_eapply_patch "${f2}" ' '; | |
[[ ${failed} -ne 0 ]] && return "${failed}"; | |
done; | |
else | |
_eapply_patch "${f}"; | |
[[ ${failed} -ne 0 ]] && return "${failed}"; | |
fi; | |
done; | |
return 0 | |
} | |
eapply_user () | |
{ | |
[[ ${EBUILD_PHASE} == prepare ]] || die "eapply_user() called during invalid phase: ${EBUILD_PHASE}"; | |
local tagfile=${T}/.portage_user_patches_applied; | |
[[ -f ${tagfile} ]] && return; | |
>> "${tagfile}"; | |
local basedir=${PORTAGE_CONFIGROOT%/}/etc/portage/patches; | |
local applied d f; | |
local -A _eapply_user_patches; | |
local prev_shopt=$(shopt -p nullglob); | |
shopt -s nullglob; | |
for d in "${basedir}"/${CATEGORY}/{${P}-${PR},${P},${PN}}{:${SLOT%/*},}; | |
do | |
for f in "${d}"/*; | |
do | |
if [[ ( ${f} == *.diff || ${f} == *.patch ) && -z ${_eapply_user_patches[${f##*/}]} ]]; then | |
_eapply_user_patches[${f##*/}]=${f}; | |
fi; | |
done; | |
done; | |
if [[ ${#_eapply_user_patches[@]} -gt 0 ]]; then | |
while read -r -d '' f; do | |
f=${_eapply_user_patches[${f}]}; | |
if [[ -s ${f} ]]; then | |
eapply "${f}"; | |
applied=1; | |
fi; | |
done < <(printf -- '%s\0' "${!_eapply_user_patches[@]}" | | |
LC_ALL=C sort -z); | |
fi; | |
${prev_shopt}; | |
[[ -n ${applied} ]] && ewarn "User patches applied." | |
} | |
eautoconf () | |
{ | |
if [[ ! -f configure.ac && ! -f configure.in ]]; then | |
echo; | |
eerror "No configure.{ac,in} present in '${PWD}'!"; | |
echo; | |
die "No configure.{ac,in} present!"; | |
fi; | |
if [[ ${WANT_AUTOCONF} != "2.1" && -e configure.in ]]; then | |
eqawarn "This package has a configure.in file which has long been deprecated. Please"; | |
eqawarn "update it to use configure.ac instead as newer versions of autotools will die"; | |
eqawarn "when it finds this file. See https://bugs.gentoo.org/426262 for details."; | |
fi; | |
autotools_run_tool --at-m4flags autoconf "$@" | |
} | |
eautoheader () | |
{ | |
_at_uses_autoheader || return 0; | |
autotools_run_tool --at-no-fail --at-m4flags autoheader "$@" | |
} | |
eautomake () | |
{ | |
local extra_opts=(); | |
local makefile_name; | |
for makefile_name in {GNUmakefile,{M,m}akefile}.am ""; | |
do | |
[[ -f ${makefile_name} ]] && break; | |
done; | |
function _automake_version () | |
{ | |
autotools_run_tool --at-output automake --version 2> /dev/null | sed -n -e '1{s:.*(GNU automake) ::p;q}' | |
}; | |
if [[ -z ${makefile_name} ]]; then | |
_at_uses_automake || return 0; | |
else | |
if [[ -z ${FROM_EAUTORECONF} && -f ${makefile_name%.am}.in ]]; then | |
local used_automake; | |
local installed_automake; | |
installed_automake=$(WANT_AUTOMAKE= _automake_version); | |
used_automake=$(head -n 1 < ${makefile_name%.am}.in | sed -e 's:.*by automake \(.*\) from .*:\1:'); | |
if [[ ${installed_automake} != ${used_automake} ]]; then | |
ewarn "Automake used for the package (${used_automake}) differs from" "the installed version (${installed_automake})."; | |
ewarn "Forcing a full rebuild of the autotools to workaround."; | |
eautoreconf; | |
return 0; | |
fi; | |
fi; | |
fi; | |
[[ -f INSTALL && -f AUTHORS && -f ChangeLog && -f NEWS && -f README ]] || extra_opts+=(--foreign); | |
case $(_automake_version) in | |
1.4 | 1.4[.-]*) | |
;; | |
*) | |
extra_opts+=(--force-missing) | |
;; | |
esac; | |
autotools_run_tool automake --add-missing --copy "${extra_opts[@]}" "$@" | |
} | |
eautopoint () | |
{ | |
autotools_run_tool autopoint "$@" | |
} | |
eautoreconf () | |
{ | |
local x g; | |
if [[ -z ${AT_NO_RECURSIVE} ]]; then | |
for x in $(autotools_check_macro_val AC_CONFIG_SUBDIRS); | |
do | |
if [[ -d ${x} ]]; then | |
pushd "${x}" > /dev/null; | |
AT_NOELIBTOOLIZE="yes" eautoreconf || die; | |
popd > /dev/null; | |
fi; | |
done; | |
fi; | |
einfo "Running eautoreconf in '${PWD}' ..."; | |
local m4dirs=$(autotools_check_macro_val AC_CONFIG_{AUX,MACRO}_DIR); | |
[[ -n ${m4dirs} ]] && mkdir -p ${m4dirs}; | |
local i tools=(glibgettext false "autotools_run_tool glib-gettextize --copy --force" gettext false "autotools_run_tool --at-missing autopoint --force" intltool false "autotools_run_tool intltoolize --automake --copy --force" gtkdoc false "autotools_run_tool --at-missing gtkdocize --copy" gnomedoc false "autotools_run_tool --at-missing gnome-doc-prepare --copy --force" libtool false "_elibtoolize --auto-ltdl --install --copy --force"); | |
for ((i = 0; i < ${#tools[@]}; i += 3 )) | |
do | |
if _at_uses_${tools[i]}; then | |
tools[i+1]=true; | |
${tools[i+2]}; | |
fi; | |
done; | |
local rerun_aclocal=false; | |
eaclocal; | |
for ((i = 0; i < ${#tools[@]}; i += 3 )) | |
do | |
if ! ${tools[i+1]} && _at_uses_${tools[i]}; then | |
${tools[i+2]}; | |
rerun_aclocal=true; | |
fi; | |
done; | |
${rerun_aclocal} && eaclocal; | |
if [[ ${WANT_AUTOCONF} = 2.1 ]]; then | |
eautoconf; | |
else | |
eautoconf --force; | |
fi; | |
eautoheader; | |
[[ ${AT_NOEAUTOMAKE} != "yes" ]] && FROM_EAUTORECONF="yes" eautomake ${AM_OPTS}; | |
if [[ ${AT_NOELIBTOOLIZE} != "yes" ]]; then | |
elibtoolize --force "${PWD}"; | |
fi; | |
return 0 | |
} | |
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 -o -type f -name '.cvs*' ')' -exec rm -rf '{}' + | |
} | |
edos2unix () | |
{ | |
[[ $# -eq 0 ]] && return 0; | |
sed -i 's/\r$//' -- "$@" || die | |
} | |
egit_clean () | |
{ | |
[[ $# -eq 0 ]] && set -- .; | |
find "$@" -type d -name '.git*' -prune -exec rm -rf '{}' + | |
} | |
einstalldocs () | |
{ | |
( if [[ $(declare -p DOCS 2>/dev/null) != *=* ]]; then | |
local d; | |
for d in README* ChangeLog AUTHORS NEWS TODO CHANGES THANKS BUGS FAQ CREDITS CHANGELOG; | |
do | |
[[ -f ${d} && -s ${d} ]] && docinto / && dodoc "${d}"; | |
done; | |
else | |
if ___is_indexed_array_var DOCS; then | |
[[ ${#DOCS[@]} -gt 0 ]] && docinto / && dodoc -r "${DOCS[@]}"; | |
else | |
[[ -n ${DOCS} ]] && docinto / && dodoc -r ${DOCS}; | |
fi; | |
fi ); | |
( if ___is_indexed_array_var HTML_DOCS; then | |
[[ ${#HTML_DOCS[@]} -gt 0 ]] && docinto html && dodoc -r "${HTML_DOCS[@]}"; | |
else | |
[[ -n ${HTML_DOCS} ]] && docinto html && dodoc -r ${HTML_DOCS}; | |
fi ) | |
} | |
elibtoolize () | |
{ | |
type -P eltpatch &> /dev/null || die "eltpatch not found; is app-portage/elt-patches installed?"; | |
ELT_LOGDIR=${T} LD=$(tc-getLD) eltpatch "${@}" || die "eltpatch failed" | |
} | |
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; | |
(( EPATCH_N_APPLIED_PATCHES++ )); | |
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 <<-EOF >> "${T}/epatch.log" | |
PATCH: ${x} | |
CMD: ${patch_cmd} | |
PWD: ${PWD} | |
EOF | |
eend 0; | |
done; | |
[[ ${SINGLE_PATCH} == "no" ]] && einfo "Done with patching"; | |
: | |
} | |
eshopts_pop () | |
{ | |
local s; | |
estack_pop eshopts s || die "${FUNCNAME}: unbalanced push"; | |
eval "${s}" || die "${FUNCNAME}: sanity: invalid shopt options: ${s}" | |
} | |
eshopts_push () | |
{ | |
estack_push eshopts "$(shopt -p -o) $(shopt -p)"; | |
if [[ $1 == -[su] ]]; then | |
[[ $# -le 1 ]] && return 0; | |
shopt "$@" || die "${FUNCNAME}: bad options to shopt: $*"; | |
else | |
[[ $# -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 -exec 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: $*" | |
} | |
evar_pop () | |
{ | |
local cnt=${1:-bad}; | |
case $# in | |
0) | |
cnt=1 | |
;; | |
1) | |
[[ -z ${cnt//[0-9]} ]] || 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 | |
} | |
gcc-fullversion () | |
{ | |
_gcc_fullversion '$1.$2.$3' "$@" | |
} | |
gcc-major-version () | |
{ | |
_gcc_fullversion '$1' "$@" | |
} | |
gcc-micro-version () | |
{ | |
_gcc_fullversion '$3' "$@" | |
} | |
gcc-minor-version () | |
{ | |
_gcc_fullversion '$2' "$@" | |
} | |
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' "$@" | |
} | |
gen_usr_ldscript () | |
{ | |
ewarn "${FUNCNAME}: Please migrate to usr-ldscript.eclass"; | |
local lib libdir=$(get_libdir) output_format="" auto=false suffix=$(get_libname); | |
[[ -z ${ED+set} ]] && local ED=${D%/}${EPREFIX}/; | |
tc-is-static-only && return; | |
if [[ $(type -t multilib_is_native_abi) == "function" ]]; then | |
multilib_is_native_abi || return 0; | |
fi; | |
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 | |
} | |
get-flag () | |
{ | |
[[ $# -ne 1 ]] && die "usage: <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_exeext () | |
{ | |
case ${CHOST} in | |
*-cygwin* | mingw* | *-mingw*) | |
echo ".exe" | |
;; | |
esac | |
} | |
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 libdir_var="LIBDIR_${ABI}"; | |
local libdir="lib"; | |
[[ -n ${ABI} && -n ${!libdir_var} ]] && libdir=${!libdir_var}; | |
echo "${libdir}" | |
} | |
get_libname () | |
{ | |
local libname; | |
local ver=$1; | |
case ${CHOST} in | |
*-cygwin*) | |
libname="dll.a" | |
;; | |
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 | |
*-cygwin*) | |
echo ".${ver}.${libname}" | |
;; | |
*-darwin*) | |
echo ".${ver}.${libname}" | |
;; | |
*-mint*) | |
echo ".${libname}" | |
;; | |
*) | |
echo ".${libname}.${ver}" | |
;; | |
esac; | |
done; | |
fi | |
} | |
get_llvm_prefix () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local hv_switch=-d; | |
while [[ ${1} == -* ]]; do | |
case ${1} in | |
-b | -d) | |
hv_switch=${1} | |
;; | |
*) | |
break | |
;; | |
esac; | |
shift; | |
done; | |
local prefix=; | |
if [[ ${EAPI} != 6 ]]; then | |
case ${hv_switch} in | |
-b) | |
prefix=${BROOT} | |
;; | |
-d) | |
prefix=${ESYSROOT} | |
;; | |
esac; | |
else | |
case ${hv_switch} in | |
-b) | |
die "${FUNCNAME} -b is not supported in EAPI ${EAPI}" | |
;; | |
-d) | |
prefix=${EPREFIX}; | |
hv_switch= | |
;; | |
esac; | |
fi; | |
local max_slot=${1}; | |
local slot; | |
for slot in "${_LLVM_KNOWN_SLOTS[@]}"; | |
do | |
if [[ -n ${max_slot} ]]; then | |
if [[ ${max_slot} == ${slot} ]]; then | |
max_slot=; | |
else | |
continue; | |
fi; | |
fi; | |
if declare -f llvm_check_deps > /dev/null; then | |
local LLVM_SLOT=${slot}; | |
llvm_check_deps || continue; | |
else | |
has_version ${hv_switch} "sys-devel/llvm:${slot}" || continue; | |
fi; | |
echo "${prefix}/usr/lib/llvm/${slot}"; | |
return; | |
done; | |
if [[ -n ${max_slot} ]]; then | |
die "${FUNCNAME}: invalid max_slot=${max_slot}"; | |
fi; | |
die "No LLVM slot${1:+ <= ${1}} found installed!" | |
} | |
get_major_version () | |
{ | |
local c=($(get_all_version_components "${1:-${PV}}")); | |
echo ${c[0]} | |
} | |
get_modname () | |
{ | |
local modname; | |
local ver=$1; | |
case ${CHOST} in | |
*-darwin*) | |
modname="bundle" | |
;; | |
*) | |
modname="so" | |
;; | |
esac; | |
echo ".${modname}" | |
} | |
get_nproc () | |
{ | |
local nproc; | |
if type -P nproc &> /dev/null; then | |
nproc=$(nproc); | |
fi; | |
if [[ -z ${nproc} ]] && type -P sysctl &> /dev/null; then | |
nproc=$(sysctl -n hw.ncpu 2>/dev/null); | |
fi; | |
if [[ -z ${nproc} ]] && type -P python &> /dev/null; then | |
nproc=$(python -c 'import multiprocessing; print(multiprocessing.cpu_count());' 2>/dev/null); | |
fi; | |
if [[ -n ${nproc} ]]; then | |
echo "${nproc}"; | |
else | |
echo "${1:-1}"; | |
fi | |
} | |
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//[-._]/ } | |
} | |
gnome2_disable_deprecation_warning () | |
{ | |
local retval=0; | |
local fails=(); | |
local makefile; | |
ebegin "Disabling deprecation warnings"; | |
while read makefile; do | |
if ! grep -qE "(DISABLE_DEPRECATED|GSEAL_ENABLE)" "${makefile}"; then | |
continue; | |
fi; | |
LC_ALL=C sed -r -i -e 's:-D[A-Z_]+_DISABLE_DEPRECATED:$(/bin/true):g' -e 's:-DGSEAL_ENABLE(=[A-Za-z0-9_]*)?:$(/bin/true):g' -i "${makefile}"; | |
if [[ $? -ne 0 ]]; then | |
fails+=("${makefile}"); | |
retval=2; | |
fi; | |
done < <(find "${S}" -name "Makefile.in" -o -name "Makefile.am" -o -name "Makefile.decl" | sort; [[ -f "${S}"/configure ]] && echo configure); | |
eend ${retval}; | |
for makefile in "${fails[@]}"; | |
do | |
ewarn "Failed to disable deprecation warnings in ${makefile}"; | |
done | |
} | |
gnome2_environment_reset () | |
{ | |
xdg_environment_reset; | |
export G_HOME="${T}"; | |
export GST_REGISTRY="${T}/registry.xml"; | |
export GSETTINGS_BACKEND="memory"; | |
if has ${EAPI:-0} 6 7; then | |
export GST_INSPECT="$(type -P true)"; | |
unset DISPLAY; | |
fi | |
} | |
gnome2_gconf_install () | |
{ | |
has ${EAPI:-0} 0 1 2 && ! use prefix && EROOT="${ROOT}"; | |
local updater="${EROOT%/}${GCONFTOOL_BIN}"; | |
if [[ ! -x "${updater}" ]]; then | |
debug-print "${updater} is not executable"; | |
return; | |
fi; | |
if [[ -z "${GNOME2_ECLASS_SCHEMAS}" ]]; then | |
debug-print "No GNOME 2 GConf schemas found"; | |
return; | |
fi; | |
unset GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL; | |
export GCONF_CONFIG_SOURCE="$("${updater}" --get-default-source | sed "s;:/;:${ROOT%/}/;")"; | |
einfo "Installing GNOME 2 GConf schemas"; | |
local F; | |
for F in ${GNOME2_ECLASS_SCHEMAS}; | |
do | |
if [[ -e "${EROOT%/}/${F}" ]]; then | |
debug-print "Installing schema: ${F}"; | |
"${updater}" --makefile-install-rule "${EROOT%/}/${F}" > /dev/null; | |
fi; | |
done; | |
pids=$(pgrep -x gconfd-2); | |
if [[ $? == 0 ]]; then | |
ebegin "Reloading GConf schemas"; | |
kill -HUP ${pids}; | |
eend $?; | |
fi | |
} | |
gnome2_gconf_savelist () | |
{ | |
has ${EAPI:-0} 0 1 2 && ! use prefix && ED="${D}"; | |
pushd "${ED}" > /dev/null || die; | |
export GNOME2_ECLASS_SCHEMAS=$(find 'etc/gconf/schemas/' -name '*.schemas' 2> /dev/null); | |
popd > /dev/null || die | |
} | |
gnome2_gconf_uninstall () | |
{ | |
has ${EAPI:-0} 0 1 2 && ! use prefix && EROOT="${ROOT}"; | |
local updater="${EROOT%/}${GCONFTOOL_BIN}"; | |
if [[ ! -x "${updater}" ]]; then | |
debug-print "${updater} is not executable"; | |
return; | |
fi; | |
if [[ -z "${GNOME2_ECLASS_SCHEMAS}" ]]; then | |
debug-print "No GNOME 2 GConf schemas found"; | |
return; | |
fi; | |
unset GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL; | |
export GCONF_CONFIG_SOURCE="$("${updater}" --get-default-source | sed "s;:/;:${ROOT%/}/;")"; | |
einfo "Uninstalling GNOME 2 GConf schemas"; | |
local F; | |
for F in ${GNOME2_ECLASS_SCHEMAS}; | |
do | |
if [[ -e "${EROOT%/}/${F}" ]]; then | |
debug-print "Uninstalling gconf schema: ${F}"; | |
"${updater}" --makefile-uninstall-rule "${EROOT%/}/${F}" > /dev/null; | |
fi; | |
done; | |
pids=$(pgrep -x gconfd-2); | |
if [[ $? == 0 ]]; then | |
ebegin "Reloading GConf schemas"; | |
kill -HUP ${pids}; | |
eend $?; | |
fi | |
} | |
gnome2_gdk_pixbuf_savelist () | |
{ | |
has ${EAPI:-0} 0 1 2 && ! use prefix && ED="${D}"; | |
pushd "${ED}" > /dev/null || die; | |
export GNOME2_ECLASS_GDK_PIXBUF_LOADERS=$(find usr/lib*/gdk-pixbuf-2.0 -type f 2>/dev/null); | |
popd > /dev/null || die | |
} | |
gnome2_gdk_pixbuf_update () | |
{ | |
has ${EAPI:-0} 0 1 2 && ! use prefix && EROOT="${ROOT}"; | |
local updater="${EROOT%/}/usr/bin/${CHOST}-gdk-pixbuf-query-loaders"; | |
if [[ ! -x ${updater} ]]; then | |
updater="${EROOT%/}/usr/bin/gdk-pixbuf-query-loaders"; | |
fi; | |
if [[ ! -x ${updater} ]]; then | |
debug-print "${updater} is not executable"; | |
return; | |
fi; | |
if [[ -z ${GNOME2_ECLASS_GDK_PIXBUF_LOADERS} ]]; then | |
debug-print "gdk-pixbuf loader cache does not need an update"; | |
return; | |
fi; | |
ebegin "Updating gdk-pixbuf loader cache"; | |
local tmp_file=$(emktemp); | |
${updater} > "${tmp_file}" && chmod 0644 "${tmp_file}" && cp -f "${tmp_file}" "${EROOT%/}/usr/$(get_libdir)/gdk-pixbuf-2.0/2.10.0/loaders.cache" && rm "${tmp_file}"; | |
eend $? | |
} | |
gnome2_giomodule_cache_update () | |
{ | |
has ${EAPI:-0} 0 1 2 && ! use prefix && EROOT="${ROOT}"; | |
local updater="${EROOT%/}/usr/bin/${CHOST}-gio-querymodules"; | |
if [[ ! -x ${updater} ]]; then | |
updater="${EROOT%/}/usr/bin/gio-querymodules"; | |
fi; | |
if [[ ! -x ${updater} ]]; then | |
debug-print "${updater} is not executable"; | |
return; | |
fi; | |
ebegin "Updating GIO modules cache"; | |
${updater} "${EROOT%/}"/usr/$(get_libdir)/gio/modules; | |
eend $? | |
} | |
gnome2_icon_cache_update () | |
{ | |
xdg_icon_cache_update | |
} | |
gnome2_icon_savelist () | |
{ | |
has ${EAPI:-0} 0 1 2 && ! use prefix && ED="${D}"; | |
pushd "${ED}" > /dev/null || die; | |
export GNOME2_ECLASS_ICONS=$(find 'usr/share/icons' -maxdepth 1 -mindepth 1 -type d 2> /dev/null); | |
popd > /dev/null || die | |
} | |
gnome2_omf_fix () | |
{ | |
local omf_makefiles filename; | |
omf_makefiles="$@"; | |
if [[ -f ${S}/omf.make ]]; then | |
omf_makefiles="${omf_makefiles} ${S}/omf.make"; | |
fi; | |
if [[ -f ${S}/gnome-doc-utils.make ]]; then | |
omf_makefiles="${omf_makefiles} ${S}/gnome-doc-utils.make"; | |
fi; | |
for filename in $(find "${S}" -name "Makefile.in" -o -name "Makefile.am" |sort); | |
do | |
omf_makefiles="${omf_makefiles} ${filename}"; | |
done; | |
ebegin "Fixing OMF Makefiles"; | |
local retval=0; | |
local fails=(); | |
for omf in ${omf_makefiles}; | |
do | |
sed -i -e 's:scrollkeeper-update:true:' "${omf}"; | |
retval=$?; | |
if [[ $retval -ne 0 ]]; then | |
debug-print "updating of ${omf} failed"; | |
fails[$(( ${#fails[@]} + 1 ))]=$omf; | |
retval=2; | |
fi; | |
done; | |
eend $retval; | |
for f in "${fails[@]}"; | |
do | |
eerror "Failed to update OMF Makefile $f"; | |
done | |
} | |
gnome2_query_immodules_gtk2 () | |
{ | |
local updater=${EPREFIX}/usr/bin/${CHOST}-gtk-query-immodules-2.0; | |
[[ ! -x ${updater} ]] && updater=${EPREFIX}/usr/bin/gtk-query-immodules-2.0; | |
ebegin "Updating gtk2 input method module cache"; | |
GTK_IM_MODULE_FILE="${EROOT%/}/usr/$(get_libdir)/gtk-2.0/2.10.0/immodules.cache" "${updater}" --update-cache; | |
eend $? | |
} | |
gnome2_query_immodules_gtk3 () | |
{ | |
local updater=${EPREFIX}/usr/bin/${CHOST}-gtk-query-immodules-3.0; | |
[[ ! -x ${updater} ]] && updater=${EPREFIX}/usr/bin/gtk-query-immodules-3.0; | |
ebegin "Updating gtk3 input method module cache"; | |
GTK_IM_MODULE_FILE="${EROOT%/}/usr/$(get_libdir)/gtk-3.0/3.0.0/immodules.cache" "${updater}" --update-cache; | |
eend $? | |
} | |
gnome2_schemas_savelist () | |
{ | |
has ${EAPI:-0} 0 1 2 && ! use prefix && ED="${D}"; | |
pushd "${ED}" > /dev/null || die; | |
export GNOME2_ECLASS_GLIB_SCHEMAS=$(find 'usr/share/glib-2.0/schemas' -name '*.gschema.xml' 2>/dev/null); | |
popd > /dev/null || die | |
} | |
gnome2_schemas_update () | |
{ | |
has ${EAPI:-0} 0 1 2 && ! use prefix && EROOT="${ROOT}"; | |
local updater="${EROOT%/}${GLIB_COMPILE_SCHEMAS}"; | |
if [[ ! -x ${updater} ]]; then | |
debug-print "${updater} is not executable"; | |
return; | |
fi; | |
ebegin "Updating GSettings schemas"; | |
${updater} --allow-any-name "$@" "${EROOT%/}/usr/share/glib-2.0/schemas" &> /dev/null; | |
eend $? | |
} | |
gnome2_scrollkeeper_savelist () | |
{ | |
has ${EAPI:-0} 0 1 2 && ! use prefix && ED="${D}"; | |
pushd "${ED}" > /dev/null || die; | |
export GNOME2_ECLASS_SCROLLS=$(find 'usr/share/omf' -type f -name "*.omf" 2> /dev/null); | |
popd > /dev/null || die | |
} | |
gnome2_scrollkeeper_update () | |
{ | |
has ${EAPI:-0} 0 1 2 && ! use prefix && EROOT="${ROOT}"; | |
local updater="${EROOT%/}${SCROLLKEEPER_UPDATE_BIN}"; | |
if [[ ! -x "${updater}" ]]; then | |
debug-print "${updater} is not executable"; | |
return; | |
fi; | |
if [[ -z "${GNOME2_ECLASS_SCROLLS}" ]]; then | |
debug-print "No scroll cache to update"; | |
return; | |
fi; | |
ebegin "Updating scrollkeeper database ..."; | |
"${updater}" -q -p "${EROOT%/}${SCROLLKEEPER_DIR}"; | |
eend $? | |
} | |
has_multilib_profile () | |
{ | |
[ -n "${MULTILIB_ABIS}" -a "${MULTILIB_ABIS}" != "${MULTILIB_ABIS/ /}" ] | |
} | |
host-is-pax () | |
{ | |
grep -qs ^PaX: /proc/self/status | |
} | |
in_iuse () | |
{ | |
local use=${1}; | |
if [[ -z "${use}" ]]; then | |
echo "!!! in_iuse() called without a parameter." 1>&2; | |
echo "!!! in_iuse <USEFLAG>" 1>&2; | |
die "in_iuse() called without a parameter"; | |
fi; | |
local liuse=(${IUSE_EFFECTIVE}); | |
has "${use}" "${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_final_abi () | |
{ | |
has_multilib_profile || return 0; | |
set -- $(get_install_abis); | |
local LAST_ABI=$#; | |
[[ ${!LAST_ABI} == ${ABI} ]] | |
} | |
list-paxables () | |
{ | |
file "$@" 2> /dev/null | grep -E 'ELF.*(executable|shared object)' | sed -e 's/: .*$//' | |
} | |
llvm_check_deps () | |
{ | |
if ! has_version --host-root "sys-devel/clang:${LLVM_SLOT}"; then | |
ewarn "sys-devel/clang:${LLVM_SLOT} is missing! Cannot use LLVM slot ${LLVM_SLOT} ..." 1>&2; | |
return 1; | |
fi; | |
if use clang; then | |
if ! has_version --host-root "=sys-devel/lld-${LLVM_SLOT}*"; then | |
ewarn "=sys-devel/lld-${LLVM_SLOT}* is missing! Cannot use LLVM slot ${LLVM_SLOT} ..." 1>&2; | |
return 1; | |
fi; | |
if use pgo; then | |
if ! has_version --host-root "=sys-libs/compiler-rt-sanitizers-${LLVM_SLOT}*"; then | |
ewarn "=sys-libs/compiler-rt-sanitizers-${LLVM_SLOT}* is missing! Cannot use LLVM slot ${LLVM_SLOT} ..." 1>&2; | |
return 1; | |
fi; | |
fi; | |
fi; | |
einfo "Will use LLVM slot ${LLVM_SLOT}!" 1>&2 | |
} | |
llvm_pkg_setup () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
if [[ ${MERGE_TYPE} != binary ]]; then | |
local llvm_path=$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin; | |
local IFS=:; | |
local split_path=(${PATH}); | |
local new_path=(); | |
local x added=; | |
for x in "${split_path[@]}"; | |
do | |
if [[ ${x} == */usr/lib/llvm/*/bin ]]; then | |
if [[ ${x} != ${llvm_path} ]]; then | |
new_path+=("${llvm_path}"); | |
else | |
if [[ -n ${added} && ${x} == ${llvm_path} ]]; then | |
continue; | |
fi; | |
fi; | |
added=1; | |
fi; | |
new_path+=("${x}"); | |
done; | |
[[ -n ${added} ]] || new_path+=("${llvm_path}"); | |
export PATH=${new_path[*]}; | |
fi | |
} | |
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="${exec%%[[:space:]]*}"; | |
desktop="${T}/${desktop##*/}-${desktop_name}.desktop"; | |
type=${type%;}${type:+;}; | |
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%.*}; | |
fi; | |
cat <<-EOF > "${desktop}" || | |
[Desktop Entry] | |
Name=${name} | |
Type=Application | |
Comment=${DESCRIPTION} | |
Exec=${exec} | |
TryExec=${exec%% *} | |
Icon=${icon} | |
Categories=${type} | |
EOF | |
die | |
if [[ ${fields:-=} != *=* ]]; then | |
ewarn "make_desktop_entry: update your 5th arg to read Path=${fields}"; | |
fields="Path=${fields}"; | |
fi; | |
if [[ -n ${fields} ]]; then | |
printf '%b\n' "${fields}" >> "${desktop}" || die; | |
fi; | |
( insopts -m 0644; | |
insinto /usr/share/applications; | |
doins "${desktop}" ) || die "installing desktop file failed" | |
} | |
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 <<-EOF > "${desktop}" || | |
[Desktop Entry] | |
Name=${title} | |
Comment=This session logs you into ${title} | |
Exec=${command} $* | |
TryExec=${command} | |
Type=XSession | |
EOF | |
die | |
( insopts -m 0644; | |
insinto /usr/share/xsessions; | |
doins "${desktop}" ) | |
} | |
make_wrapper () | |
{ | |
local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5; | |
local tmpwrapper=$(emktemp); | |
has "${EAPI:-0}" 0 1 2 && local EPREFIX=""; | |
( echo '#!/bin/sh'; | |
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 | |
[[ -n ${chdir} ]] && printf 'cd "%s" &&\n' "${EPREFIX}${chdir}"; | |
printf 'exec %s "$@"\n' "${bin/#\//${EPREFIX}/}" ) > "${tmpwrapper}"; | |
chmod go+rx "${tmpwrapper}"; | |
if [[ -n ${path} ]]; then | |
( exeopts -m 0755; | |
exeinto "${path}"; | |
newexe "${tmpwrapper}" "${wrapper}" ) || die; | |
else | |
newbin "${tmpwrapper}" "${wrapper}" || die; | |
fi | |
} | |
makeopts_jobs () | |
{ | |
[[ $# -eq 0 ]] && set -- "${MAKEOPTS}"; | |
local jobs=$(echo " $* " | sed -r -n -e 's:.*[[:space:]](-[a-z]*j|--jobs[=[:space:]])[[:space:]]*([0-9]+).*:\2:p' -e "s:.*[[:space:]](-[a-z]*j|--jobs)[[:space:]].*:${2:-999}:p"); | |
echo ${jobs:-1} | |
} | |
makeopts_loadavg () | |
{ | |
[[ $# -eq 0 ]] && set -- "${MAKEOPTS}"; | |
local lavg=$(echo " $* " | sed -r -n -e 's:.*[[:space:]](-[a-z]*l|--(load-average|max-load)[=[:space:]])[[:space:]]*([0-9]+(\.[0-9]+)?)[[:space:]].*:\3:p' -e "s:.*[[:space:]](-[a-z]*l|--(load-average|max-load))[[:space:]].*:${2:-999}:p"); | |
echo ${lavg:-${2:-999}} | |
} | |
moz_pkgsetup () | |
{ | |
export LANG="C"; | |
export LC_ALL="C"; | |
export LC_MESSAGES="C"; | |
export LC_CTYPE="C"; | |
export HOST_CC="$(tc-getBUILD_CC)"; | |
export HOST_CXX="$(tc-getBUILD_CXX)"; | |
tc-export CC CXX LD PKG_CONFIG AR RANLIB; | |
export MOZILLA_CLIENT=1; | |
export BUILD_OPT=1; | |
export NO_STATIC_LIB=1; | |
export USE_PTHREADS=1; | |
export ALDFLAGS=${LDFLAGS}; | |
unset MOZCONFIG; | |
export MOZILLA_FIVE_HOME="/usr/$(get_libdir)/${PN}"; | |
export QA_CONFIGURE_OPTIONS=".*"; | |
python-any-r1_pkg_setup; | |
if [[ "${PYTHON_COMPAT[@]}" != "${PYTHON_COMPAT[@]#python3*}" ]]; then | |
export PYTHON3=${PYTHON}; | |
python_export python2_7 PYTHON EPYTHON; | |
fi | |
} | |
mozconfig_annotate () | |
{ | |
declare reason=$1 x; | |
shift; | |
[[ $# -gt 0 ]] || die "mozconfig_annotate missing flags for ${reason}\!"; | |
for x in ${*}; | |
do | |
echo "ac_add_options ${x} # ${reason}" >> .mozconfig; | |
done | |
} | |
mozconfig_final () | |
{ | |
declare ac opt hash reason; | |
if [[ -n ${EXTRA_ECONF} ]]; then | |
IFS=\! read -a ac <<< ${EXTRA_ECONF// --/\!}; | |
for opt in "${ac[@]}"; | |
do | |
mozconfig_annotate "EXTRA_ECONF" --${opt#--}; | |
done; | |
fi; | |
echo; | |
echo "=========================================================="; | |
echo "Building ${PF} with the following configuration"; | |
grep ^ac_add_options .mozconfig | while read ac opt hash reason; do | |
[[ -z ${hash} || ${hash} == \# ]] || die "error reading mozconfig: ${ac} ${opt} ${hash} ${reason}"; | |
printf " %-30s %s\n" "${opt}" "${reason:-mozilla.org default}"; | |
done; | |
echo "=========================================================="; | |
echo; | |
declare exts=$(sed -n 's/^ac_add_options --enable-extensions=\([^ ]*\).*/\1/p' .mozconfig | xargs); | |
sed -i '/^ac_add_options --enable-extensions/d' .mozconfig; | |
echo "ac_add_options --enable-extensions=${exts// /,}" >> .mozconfig | |
} | |
mozconfig_init () | |
{ | |
declare enable_optimize pango_version myext x; | |
declare XUL=$([[ ${PN} == xulrunner ]] && echo true || echo false); | |
declare FF=$([[ ${PN} == firefox ]] && echo true || echo false); | |
declare SM=$([[ ${PN} == seamonkey ]] && echo true || echo false); | |
declare TB=$([[ ${PN} == thunderbird ]] && echo true || echo false); | |
declare TRB=$([[ ${PN} == torbrowser ]] && echo true || echo false); | |
case ${PN} in | |
*xulrunner) | |
cp xulrunner/config/mozconfig .mozconfig || die "cp xulrunner/config/mozconfig failed" | |
;; | |
*firefox) | |
cp browser/config/mozconfig .mozconfig || die "cp browser/config/mozconfig failed" | |
;; | |
*torbrowser) | |
cp browser/config/mozconfig .mozconfig || die "cp browser/config/mozconfig failed" | |
;; | |
seamonkey) | |
: > .mozconfig || die "initial mozconfig creation failed"; | |
mozconfig_annotate "" --enable-application=comm/suite | |
;; | |
*thunderbird) | |
: > .mozconfig || die "initial mozconfig creation failed"; | |
mozconfig_annotate "" --enable-application=comm/mail | |
;; | |
esac; | |
if [[ $(gcc-major-version) -eq 7 ]]; then | |
mozconfig_annotate "Workaround known breakage" --enable-optimize=-O2; | |
else | |
if [[ ${ARCH} == hppa ]]; then | |
mozconfig_annotate "more than -O0 causes a segfault on hppa" --enable-optimize=-O0; | |
else | |
if [[ ${ARCH} == x86 ]]; then | |
mozconfig_annotate "less than -O2 causes a segfault on x86" --enable-optimize=-O2; | |
else | |
if [[ ${ARCH} == arm ]] && [[ $(gcc-major-version) -ge 6 ]]; then | |
mozconfig_annotate "less than -O2 causes a breakage on arm with gcc-6" --enable-optimize=-O2; | |
else | |
if use custom-optimization || [[ ${ARCH} =~ (alpha|ia64) ]]; then | |
if is-flag -O0; then | |
mozconfig_annotate "from CFLAGS" --enable-optimize=-O0; | |
else | |
if [[ ${ARCH} == ppc ]] && has_version '>=sys-libs/glibc-2.8'; then | |
mozconfig_annotate "more than -O1 segfaults on ppc with glibc-2.8" --enable-optimize=-O1; | |
else | |
if is-flag -O4; then | |
mozconfig_annotate "from CFLAGS" --enable-optimize=-O4; | |
else | |
if is-flag -O3; then | |
mozconfig_annotate "from CFLAGS" --enable-optimize=-O3; | |
else | |
if is-flag -O1; then | |
mozconfig_annotate "from CFLAGS" --enable-optimize=-O1; | |
else | |
if is-flag -Os; then | |
mozconfig_annotate "from CFLAGS" --enable-optimize=-Os; | |
else | |
mozconfig_annotate "Gentoo's default optimization" --enable-optimize=-O2; | |
fi; | |
fi; | |
fi; | |
fi; | |
fi; | |
fi; | |
else | |
mozconfig_annotate "mozilla default" --enable-optimize; | |
fi; | |
fi; | |
fi; | |
fi; | |
fi; | |
filter-flags '-O*'; | |
if is-flagq '-g*'; then | |
mozconfig_annotate 'elf-hack broken with -g* flags' --disable-elf-hack; | |
fi; | |
use custom-cflags || strip-flags; | |
case "${ARCH}" in | |
arm | ppc64) | |
if [[ "${PN}" != seamonkey ]] && use clang; then | |
:; | |
else | |
if tc-ld-is-gold; then | |
append-ldflags -Wl,--no-keep-memory; | |
else | |
append-ldflags -Wl,--no-keep-memory -Wl,--reduce-memory-overheads; | |
fi; | |
fi | |
;; | |
alpha) | |
append-flags -fPIC -mieee | |
;; | |
ia64) | |
append-flags -fPIC | |
;; | |
esac; | |
if [[ $(gcc-major-version) -ge 6 ]]; then | |
append-cxxflags -flifetime-dse=1; | |
fi; | |
append-ldflags -Wl,-rpath="${MOZILLA_FIVE_HOME}",--enable-new-dtags; | |
mozconfig_annotate disable_update_strip --disable-updater --disable-strip --disable-install-strip; | |
! has_version ">=sys-libs/glibc-2.4" && mozconfig_annotate "we have old glibc" --disable-jemalloc | |
} | |
mozconfig_use_enable () | |
{ | |
declare flag=$(use_enable "$@"); | |
mozconfig_annotate "$(use $1 && echo +$1 || echo -$1)" "${flag}" | |
} | |
mozconfig_use_extension () | |
{ | |
declare minus=$(use $1 || echo -); | |
mozconfig_annotate "${minus:-+}$1" --enable-extensions=${minus}${2} | |
} | |
mozconfig_use_with () | |
{ | |
declare flag=$(use_with "$@"); | |
mozconfig_annotate "$(use $1 && echo +$1 || echo -$1)" "${flag}" | |
} | |
mozlinguas-v2_src_compile () | |
{ | |
mozlinguas_src_compile | |
} | |
mozlinguas-v2_src_install () | |
{ | |
mozlinguas_src_install | |
} | |
mozlinguas-v2_src_unpack () | |
{ | |
mozlinguas_src_unpack | |
} | |
mozlinguas_export () | |
{ | |
if [[ ${PN} == seamonkey ]]; then | |
[[ ${PV} =~ alpha ]] && ! [[ -n ${MOZ_GENERATE_LANGPACKS} ]] && return; | |
else | |
[[ ${PV} =~ alpha|beta ]] && ! [[ -n ${MOZ_GENERATE_LANGPACKS} ]] && return; | |
fi; | |
local lingua lflag; | |
mozlinguas=(); | |
for lingua in "${MOZ_LANGS[@]}"; | |
do | |
if has ${lingua} en en-US; then | |
continue; | |
else | |
if has ${lingua} "${MOZ_TOO_REGIONALIZED_FOR_L10N[@]}"; then | |
lflag=${lingua%%-*}; | |
else | |
lflag=${lingua}; | |
fi; | |
fi; | |
use l10n_${lflag/[_@]/-} && mozlinguas+=(${lingua}); | |
done; | |
for lingua in ${LINGUAS}; | |
do | |
if has ${lingua//[_@]/-} en en-US; then | |
continue; | |
else | |
if has ${lingua} "${MOZ_LANGS[@]//-/_}"; then | |
has ${lingua//[_@]/-} "${mozlinguas[@]//[_@]/-}" || ewarn "LINGUAS value ${lingua} is not enabled using L10N use flags"; | |
continue; | |
else | |
:; | |
fi; | |
fi; | |
einfo "Sorry, but ${P} does not support the ${lingua} locale in LINGUAS"; | |
done | |
} | |
mozlinguas_mozconfig () | |
{ | |
if [[ -n ${MOZ_GENERATE_LANGPACKS} ]]; then | |
if declare -f mozconfig_annotate > /dev/null; then | |
mozconfig_annotate 'for building locales' --with-l10n-base=${MOZ_L10N_SOURCEDIR}; | |
else | |
die "Could not configure l10n-base, mozconfig_annotate not declared -- missing inherit?"; | |
fi; | |
fi | |
} | |
mozlinguas_src_compile () | |
{ | |
if [[ -n ${MOZ_GENERATE_LANGPACKS} ]]; then | |
local x y targets=("langpack") localedir="${BUILD_OBJ_DIR:-.}"; | |
case ${PN} in | |
*firefox) | |
localedir+="/browser/locales" | |
;; | |
seamonkey) | |
localedir+="/suite/locales" | |
;; | |
*thunderbird) | |
localedir+="/mail/locales"; | |
targets+=("calendar-langpack") | |
;; | |
*) | |
die "Building locales for ${PN} is not supported." | |
;; | |
esac; | |
pushd "${localedir}" > /dev/null || die; | |
mozlinguas_export; | |
for x in "${mozlinguas[@]}"; | |
do | |
for y in "${targets[@]}"; | |
do | |
emake ${y}-${x} LOCALE_MERGEDIR="./${y}-${x}"; | |
done; | |
done; | |
popd > /dev/null || die; | |
fi | |
} | |
mozlinguas_src_install () | |
{ | |
local x; | |
mozlinguas_export; | |
if [[ -n ${MOZ_GENERATE_LANGPACKS} ]] && [[ -n ${mozlinguas[*]} ]]; then | |
local repopath="${WORKDIR}/${PN}-generated-langpacks"; | |
mkdir -p "${repopath}" || die; | |
pushd "${BUILD_OBJ_DIR:-.}"/dist/*/xpi > /dev/null || die; | |
for x in "${mozlinguas[@]}"; | |
do | |
cp "${MOZ_P}.${x}.langpack.xpi" "${repopath}/${MOZ_P}-${x}${MOZ_LANGPACK_UNOFFICIAL:+.unofficial}.xpi" || die; | |
xpi_unpack "${repopath}/${MOZ_P}-${x}${MOZ_LANGPACK_UNOFFICIAL:+.unofficial}.xpi"; | |
done; | |
popd > /dev/null || die; | |
fi; | |
for x in "${mozlinguas[@]}"; | |
do | |
if [[ -n ${MOZ_INSTALL_L10N_XPIFILE} ]]; then | |
xpi_copy "${WORKDIR}/${MOZ_P}-${x}${MOZ_LANGPACK_UNOFFICIAL:+.unofficial}"; | |
else | |
xpi_install "${WORKDIR}/${MOZ_P}-${x}${MOZ_LANGPACK_UNOFFICIAL:+.unofficial}"; | |
fi; | |
done | |
} | |
mozlinguas_src_unpack () | |
{ | |
local x; | |
if ! [[ -n ${MOZ_GENERATE_LANGPACKS} ]]; then | |
mozlinguas_export; | |
for x in "${mozlinguas[@]}"; | |
do | |
xpi_unpack "${MOZ_P}-${x}${MOZ_LANGPACK_UNOFFICIAL:+.unofficial}.xpi"; | |
done; | |
if [[ "${mozlinguas[*]}" != "" && "${mozlinguas[*]}" != "en" ]]; then | |
einfo "Selected language packs (first will be default): ${mozlinguas[*]}"; | |
fi; | |
fi | |
} | |
mozlinguas_xpistage_langpacks () | |
{ | |
local l c modpath="${1}" srcprefix="${1}" modules=("${1##*/}"); | |
shift; | |
if [[ -n ${1} ]]; then | |
srcprefix="${1}"; | |
shift; | |
fi; | |
if [[ -n ${1} ]]; then | |
modules=($@); | |
fi; | |
mozlinguas_export; | |
mkdir -p "${modpath}/chrome" || die; | |
for l in "${mozlinguas[@]}"; | |
do | |
for c in "${modules[@]}"; | |
do | |
if [[ -e "${srcprefix}-${l}/chrome/${c}-${l}" ]]; then | |
cp -RLp -t "${modpath}/chrome" "${srcprefix}-${l}/chrome/${c}-${l}" || die; | |
grep "locale ${c} ${l} chrome/" "${srcprefix}-${l}/chrome.manifest" >> "${modpath}/chrome.manifest" || die; | |
else | |
if [[ -e "${srcprefix}/chrome/${c}-${l}" ]]; then | |
cp -RLp -t "${modpath}/chrome" "${srcprefix}/chrome/${c}-${l}" || die; | |
grep "locale ${c} ${l} chrome/" "${srcprefix}/chrome.manifest" >> "${modpath}/chrome.manifest" || die; | |
else | |
ewarn "Locale ${l} was not found for ${c}, skipping."; | |
fi; | |
fi; | |
done; | |
done | |
} | |
mozversion_extension_location () | |
{ | |
case ${PN} in | |
firefox | firefox-bin | palemoon) | |
if [[ $(get_version_component_range 1) -ge 21 ]]; then | |
return 0; | |
fi | |
;; | |
esac; | |
return 1 | |
} | |
multilib_env () | |
{ | |
local CTARGET=${1:-${CTARGET}}; | |
local cpu=${CTARGET%%*-}; | |
if [[ ${CTARGET} = *-musl* ]]; then | |
: ${MULTILIB_ABIS=default}; | |
: ${DEFAULT_ABI=default}; | |
export MULTILIB_ABIS DEFAULT_ABI; | |
return; | |
fi; | |
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* | mipsisa64*) | |
export CFLAGS_o32=${CFLAGS_o32--mabi=32}; | |
export CHOST_o32=${CTARGET/mips64/mips}; | |
export CHOST_o32=${CHOST_o32/mipsisa64/mipsisa32}; | |
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} | |
;; | |
riscv64*) | |
export CFLAGS_lp64d=${CFLAGS_lp64d--mabi=lp64d}; | |
export CHOST_lp64d=${CTARGET}; | |
export CTARGET_lp64d=${CTARGET}; | |
export LIBDIR_lp64d="lib64/lp64d"; | |
export CFLAGS_lp64=${CFLAGS_lp64--mabi=lp64}; | |
export CHOST_lp64=${CTARGET}; | |
export CTARGET_lp64=${CTARGET}; | |
export LIBDIR_lp64="lib64/lp64"; | |
: ${MULTILIB_ABIS=lp64d lp64}; | |
: ${DEFAULT_ABI=lp64d} | |
;; | |
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; | |
local save_restore_variables=(CBUILD CHOST AR CC CXX F77 FC LD NM OBJDUMP RANLIB READELF STRIP PKG_CONFIG_LIBDIR PKG_CONFIG_PATH); | |
if [[ ${_DEFAULT_ABI_SAVED} == "true" ]]; then | |
for v in "${save_restore_variables[@]}"; | |
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 "${save_restore_variables[@]}"; | |
do | |
vv="_abi_saved_${v}"; | |
[[ ${!v+set} == "set" ]] && export ${vv}="${!v}" || unset ${vv}; | |
done; | |
export _DEFAULT_ABI_SAVED="true"; | |
if [[ ${CBUILD} == "${CHOST}" ]]; then | |
export CBUILD=$(get_abi_CHOST $1); | |
fi; | |
export CHOST=$(get_abi_CHOST ${DEFAULT_ABI}); | |
export AR="$(tc-getAR)"; | |
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 NM="$(tc-getNM)"; | |
export OBJDUMP="$(tc-getOBJDUMP)"; | |
export RANLIB="$(tc-getRANLIB)"; | |
export READELF="$(tc-getREADELF)"; | |
export STRIP="$(tc-getSTRIP)"; | |
export CHOST=$(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 () | |
{ | |
( insopts -m 0644; | |
insinto /usr/share/applications; | |
newins "$@" ) | |
} | |
no-as-needed () | |
{ | |
[[ $# -ne 0 ]] && die "no-as-needed takes no arguments"; | |
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 () | |
{ | |
eerror "path_exists has been removed. Please see the following post"; | |
eerror "for a replacement snippet:"; | |
eerror "https://blogs.gentoo.org/mgorny/2018/08/09/inlining-path_exists/"; | |
die "path_exists is banned" | |
} | |
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; | |
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 () | |
{ | |
xdg_desktop_database_update; | |
xdg_icon_cache_update; | |
if ! use gmp-autoupdate && ! use eme-free; then | |
elog "USE='-gmp-autoupdate' has disabled the following plugins from updating or"; | |
elog "installing into new profiles:"; | |
local plugin; | |
for plugin in "${GMP_PLUGIN_LIST[@]}"; | |
do | |
elog "\t ${plugin}"; | |
done; | |
elog; | |
fi; | |
if use pulseaudio && has_version ">=media-sound/apulse-0.1.12-r4"; then | |
elog "Apulse was detected at merge time on this system and so it will always be"; | |
elog "used for sound. If you wish to use pulseaudio instead please unmerge"; | |
elog "media-sound/apulse."; | |
elog; | |
fi; | |
local show_doh_information show_normandy_information; | |
if [[ -z "${REPLACING_VERSIONS}" ]]; then | |
show_doh_information=yes; | |
show_normandy_information=yes; | |
else | |
local replacing_version; | |
for replacing_version in ${REPLACING_VERSIONS}; | |
do | |
if ver_test "${replacing_version}" -lt 70; then | |
show_doh_information=yes; | |
fi; | |
if ver_test "${replacing_version}" -lt 74.0-r2; then | |
show_normandy_information=yes; | |
fi; | |
done; | |
fi; | |
if [[ -n "${show_doh_information}" ]]; then | |
elog; | |
elog "Note regarding Trusted Recursive Resolver aka DNS-over-HTTPS (DoH):"; | |
elog "Due to privacy concerns (encrypting DNS might be a good thing, sending all"; | |
elog "DNS traffic to Cloudflare by default is not a good idea and applications"; | |
elog "should respect OS configured settings), \"network.trr.mode\" was set to 5"; | |
elog "(\"Off by choice\") by default."; | |
elog "You can enable DNS-over-HTTPS in ${PN^}'s preferences."; | |
fi; | |
if [[ -n "${show_normandy_information}" ]]; then | |
elog; | |
elog "Upstream operates a service named Normandy which allows Mozilla to"; | |
elog "push changes for default settings or even install new add-ons remotely."; | |
elog "While this can be useful to address problems like 'Armagadd-on 2.0' or"; | |
elog "revert previous decisions to disable TLS 1.0/1.1, privacy and security"; | |
elog "concerns prevail, which is why we have switched off the use of this"; | |
elog "service by default."; | |
elog; | |
elog "To re-enable this service set"; | |
elog; | |
elog " app.normandy.enabled=true"; | |
elog; | |
elog "in about:config."; | |
fi | |
} | |
pkg_postrm () | |
{ | |
xdg_desktop_database_update; | |
xdg_icon_cache_update | |
} | |
pkg_preinst () | |
{ | |
if use pulseaudio && has_version ">=media-sound/apulse-0.1.12-r4"; then | |
einfo "APULSE found - Generating library symlinks for sound support"; | |
local lib; | |
pushd "${ED}"${MOZILLA_FIVE_HOME} &> /dev/null || die; | |
for lib in ../apulse/libpulse{.so{,.0},-simple.so{,.0}}; | |
do | |
if [[ ! -L ${lib##*/} ]]; then | |
ln -s "${lib}" ${lib##*/} || die; | |
fi; | |
done; | |
popd &> /dev/null || die; | |
fi | |
} | |
pkg_pretend () | |
{ | |
if use pgo; then | |
if ! has usersandbox $FEATURES; then | |
die "You must enable usersandbox as X server can not run as root!"; | |
fi; | |
if ! use clang; then | |
eerror "USE=pgo when using GCC is currently known to be broken."; | |
eerror "Either switch to USE=clang or temporarily set USE=-pgo."; | |
die "USE=pgo without USE=clang is currently known to be broken."; | |
fi; | |
fi; | |
if use pgo || use lto || use debug || use test; then | |
CHECKREQS_DISK_BUILD="8G"; | |
else | |
CHECKREQS_DISK_BUILD="4G"; | |
fi; | |
check-reqs_pkg_pretend | |
} | |
pkg_setup () | |
{ | |
moz_pkgsetup; | |
if use pgo || use lto || use debug || use test; then | |
CHECKREQS_DISK_BUILD="8G"; | |
else | |
CHECKREQS_DISK_BUILD="4G"; | |
fi; | |
check-reqs_pkg_setup; | |
unset DBUS_SESSION_BUS_ADDRESS DISPLAY ORBIT_SOCKETDIR SESSION_MANAGER XDG_CACHE_HOME XDG_SESSION_COOKIE XAUTHORITY; | |
if ! use bindist; then | |
einfo; | |
elog "You are enabling official branding. You may not redistribute this build"; | |
elog "to any users on your network or the internet. Doing so puts yourself into"; | |
elog "a legal problem with Mozilla Foundation."; | |
elog "You can disable it by emerging ${PN} _with_ the bindist USE-flag."; | |
fi; | |
addpredict /proc/self/oom_score_adj; | |
llvm_pkg_setup; | |
if has ccache ${FEATURES}; then | |
if use clang && use pgo; then | |
die "Using FEATURES=ccache with USE=clang and USE=pgo is currently known to be broken (bug #718632)."; | |
fi; | |
fi | |
} | |
preserve_old_lib () | |
{ | |
if [[ ${EBUILD_PHASE} != "preinst" ]]; then | |
eerror "preserve_old_lib() must be called from pkg_preinst() only"; | |
die "Invalid preserve_old_lib() usage"; | |
fi; | |
[[ -z $1 ]] && die "Usage: preserve_old_lib <library to preserve> [more libraries to preserve]"; | |
has preserve-libs ${FEATURES} && return 0; | |
has "${EAPI:-0}" 0 1 2 && local ED=${D} EROOT=${ROOT}; | |
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; | |
has "${EAPI:-0}" 0 1 2 && local EROOT=${ROOT}; | |
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; | |
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 | |
eerror "${FUNCNAME}: variable substitution likely failed in ${pc}"; | |
eerror "(arg: ${arg})"; | |
eerror "Most likely, you need to add virtual/pkgconfig to DEPEND."; | |
die "${FUNCNAME}: unsubstituted variable found in .pc"; | |
fi; | |
pc_libs+=(lib${arg#-l}.la); | |
fi; | |
done; | |
done < <(find "${D}" -type f -name '*.pc' -print0); | |
rm -f "${tf}"; | |
fi; | |
pkgconfig_scanned=1; | |
fi; | |
has "${f##*/}" "${pc_libs[@]}" && reason='covered by .pc'; | |
fi; | |
fi; | |
fi; | |
fi; | |
if [[ -n ${reason} ]]; then | |
einfo "Removing unnecessary ${f#${D%/}} (${reason})"; | |
queue+=("${f}"); | |
fi; | |
done < <(find "${D}" -xtype f -name '*.la' -print0); | |
if [[ -n ${queue[@]} ]]; then | |
rm -f "${queue[@]}"; | |
fi | |
} | |
python-any-r1_pkg_setup () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ ${MERGE_TYPE} != binary ]] && python_setup | |
} | |
python_abi_depend () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_byte-compile_modules () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_clean_byte-compiled_modules () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_clean_installation_image () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_clean_py-compile_files () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_convert_shebangs () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#python_convert_shebangs" | |
} | |
python_disable_pyc () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_doexe () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local f; | |
for f in "$@"; | |
do | |
python_newexe "${f}" "${f##*/}"; | |
done | |
} | |
python_doheader () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ -n ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).'; | |
local includedir=$(python_get_includedir); | |
local d=${includedir#${EPREFIX}}; | |
( insopts -m 0644; | |
insinto "${d}"; | |
doins -r "${@}" || return ${?} ) | |
} | |
python_domodule () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ -n ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).'; | |
local d; | |
if [[ ${python_moduleroot} == /* ]]; then | |
d=${python_moduleroot}; | |
else | |
local sitedir=$(python_get_sitedir); | |
d=${sitedir#${EPREFIX}}/${python_moduleroot//.//}; | |
fi; | |
( insopts -m 0644; | |
insinto "${d}"; | |
doins -r "${@}" || return ${?} ); | |
python_optimize "${ED%/}/${d}" | |
} | |
python_doscript () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local _PYTHON_REWRITE_SHEBANG=1; | |
python_doexe "${@}" | |
} | |
python_enable_pyc () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_execute_function () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#python_execute_function" | |
} | |
python_execute_nosetests () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_execute_py.test () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_execute_trial () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_export () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
eqawarn "python_export() is part of private eclass API."; | |
eqawarn "Please call python_get*() instead."; | |
_python_export "${@}" | |
} | |
python_export_utf8_locale () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
type locale > /dev/null || return 0; | |
if [[ $(locale charmap) != UTF-8 ]]; then | |
local lang locales="C.UTF-8 en_US.UTF-8 en_GB.UTF-8 $(locale -a)"; | |
for lang in ${locales}; | |
do | |
if [[ $(LC_ALL=${lang} locale charmap 2>/dev/null) == UTF-8 ]]; then | |
if _python_check_locale_sanity "${lang}"; then | |
export LC_CTYPE=${lang}; | |
if [[ -n ${LC_ALL} ]]; then | |
export LC_NUMERIC=${LC_ALL}; | |
export LC_TIME=${LC_ALL}; | |
export LC_COLLATE=${LC_ALL}; | |
export LC_MONETARY=${LC_ALL}; | |
export LC_MESSAGES=${LC_ALL}; | |
export LC_PAPER=${LC_ALL}; | |
export LC_NAME=${LC_ALL}; | |
export LC_ADDRESS=${LC_ALL}; | |
export LC_TELEPHONE=${LC_ALL}; | |
export LC_MEASUREMENT=${LC_ALL}; | |
export LC_IDENTIFICATION=${LC_ALL}; | |
export LC_ALL=; | |
fi; | |
return 0; | |
fi; | |
fi; | |
done; | |
ewarn "Could not find a UTF-8 locale. This may trigger build failures in"; | |
ewarn "some python packages. Please ensure that a UTF-8 locale is listed in"; | |
ewarn "/etc/locale.gen and run locale-gen."; | |
return 1; | |
fi; | |
return 0 | |
} | |
python_fix_shebang () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ -n ${EPYTHON} ]] || die "${FUNCNAME}: EPYTHON unset (pkg_setup not called?)"; | |
local force quiet; | |
while [[ -n ${@} ]]; do | |
case "${1}" in | |
-f | --force) | |
force=1; | |
shift | |
;; | |
-q | --quiet) | |
quiet=1; | |
shift | |
;; | |
--) | |
shift; | |
break | |
;; | |
*) | |
break | |
;; | |
esac; | |
done; | |
[[ -n ${1} ]] || die "${FUNCNAME}: no paths given"; | |
local path f; | |
for path in "$@"; | |
do | |
local any_correct any_fixed is_recursive; | |
[[ -d ${path} ]] && is_recursive=1; | |
while IFS= read -r -d '' f; do | |
local shebang i; | |
local error= from=; | |
IFS= read -r shebang < "${f}"; | |
if [[ ${shebang} == '#!'* ]]; then | |
local split_shebang=(); | |
read -r -a split_shebang <<< ${shebang} || die; | |
for i in "${split_shebang[@]}"; | |
do | |
case "${i}" in | |
*"${EPYTHON}") | |
debug-print "${FUNCNAME}: in file ${f#${D%/}}"; | |
debug-print "${FUNCNAME}: shebang matches EPYTHON: ${shebang}"; | |
any_correct=1; | |
from=${EPYTHON}; | |
break | |
;; | |
*python | *python[23]) | |
debug-print "${FUNCNAME}: in file ${f#${D%/}}"; | |
debug-print "${FUNCNAME}: rewriting shebang: ${shebang}"; | |
if [[ ${i} == *python2 ]]; then | |
from=python2; | |
if [[ ! -n ${force} ]]; then | |
python_is_python3 "${EPYTHON}" && error=1; | |
fi; | |
else | |
if [[ ${i} == *python3 ]]; then | |
from=python3; | |
if [[ ! -n ${force} ]]; then | |
python_is_python3 "${EPYTHON}" || error=1; | |
fi; | |
else | |
from=python; | |
fi; | |
fi; | |
break | |
;; | |
*python[23].[0123456789] | *pypy | *pypy3 | *jython[23].[0123456789]) | |
if [[ ! -n ${force} ]]; then | |
error=1; | |
else | |
case "${i}" in | |
*python[23].[0123456789]) | |
from="python[23].[0123456789]" | |
;; | |
*pypy) | |
from="pypy" | |
;; | |
*pypy3) | |
from="pypy3" | |
;; | |
*jython[23].[0123456789]) | |
from="jython[23].[0123456789]" | |
;; | |
*) | |
die "${FUNCNAME}: internal error in 2nd pattern match" | |
;; | |
esac; | |
fi; | |
break | |
;; | |
esac; | |
done; | |
fi; | |
if [[ ! -n ${error} && ! -n ${from} ]]; then | |
[[ -n ${is_recursive} ]] && continue; | |
error=1; | |
fi; | |
if [[ ! -n ${quiet} ]]; then | |
einfo "Fixing shebang in ${f#${D%/}}."; | |
fi; | |
if [[ ! -n ${error} ]]; then | |
if [[ ${shebang} == *${from}" "* ]]; then | |
sed -i -e "1s:${from} :${EPYTHON} :" "${f}" || die; | |
else | |
sed -i -e "1s:${from}$:${EPYTHON}:" "${f}" || die; | |
fi; | |
any_fixed=1; | |
else | |
eerror "The file has incompatible shebang:"; | |
eerror " file: ${f#${D%/}}"; | |
eerror " current shebang: ${shebang}"; | |
eerror " requested impl: ${EPYTHON}"; | |
die "${FUNCNAME}: conversion of incompatible shebang requested"; | |
fi; | |
done < <(find -H "${path}" -type f -print0 || die); | |
if [[ ! -n ${any_fixed} ]]; then | |
local cmd=eerror; | |
[[ ${EAPI} == 5 ]] && cmd=eqawarn; | |
"${cmd}" "QA warning: ${FUNCNAME}, ${path#${D%/}} did not match any fixable files."; | |
if [[ -n ${any_correct} ]]; then | |
"${cmd}" "All files have ${EPYTHON} shebang already."; | |
else | |
"${cmd}" "There are no Python files in specified directory."; | |
fi; | |
[[ ${cmd} == eerror ]] && die "${FUNCNAME} did not match any fixable files (QA warning fatal in EAPI ${EAPI})"; | |
fi; | |
done | |
} | |
python_gen_any_dep () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local depstr=${1}; | |
[[ -n ${depstr} ]] || die "No dependency string provided"; | |
local i PYTHON_PKG_DEP out=; | |
for i in "${_PYTHON_SUPPORTED_IMPLS[@]}"; | |
do | |
local PYTHON_USEDEP="python_targets_${i}(-),python_single_target_${i}(+)"; | |
_python_export "${i}" PYTHON_PKG_DEP; | |
local i_depstr=${depstr//\$\{PYTHON_USEDEP\}/${PYTHON_USEDEP}}; | |
out="( ${PYTHON_PKG_DEP%=} ${i_depstr} ) ${out}"; | |
done; | |
echo "|| ( ${out})" | |
} | |
python_generate_cffi_modules () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_generate_wrapper_scripts () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_get_CFLAGS () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
_python_export "${@}" PYTHON_CFLAGS; | |
echo "${PYTHON_CFLAGS}" | |
} | |
python_get_LIBS () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
_python_export "${@}" PYTHON_LIBS; | |
echo "${PYTHON_LIBS}" | |
} | |
python_get_PYTHON_CONFIG () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
_python_export "${@}" PYTHON_CONFIG; | |
echo "${PYTHON_CONFIG}" | |
} | |
python_get_extension_module_suffix () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_get_implementation () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_get_implementation_and_version () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_get_implementational_package () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_get_includedir () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
_python_export "${@}" PYTHON_INCLUDEDIR; | |
echo "${PYTHON_INCLUDEDIR}" | |
} | |
python_get_libdir () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_get_library () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_get_library_path () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
_python_export "${@}" PYTHON_LIBPATH; | |
echo "${PYTHON_LIBPATH}" | |
} | |
python_get_scriptdir () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
_python_export "${@}" PYTHON_SCRIPTDIR; | |
echo "${PYTHON_SCRIPTDIR}" | |
} | |
python_get_sitedir () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
_python_export "${@}" PYTHON_SITEDIR; | |
echo "${PYTHON_SITEDIR}" | |
} | |
python_get_version () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_install_executables () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_is_installed () | |
{ | |
local impl=${1:-${EPYTHON}}; | |
[[ -n ${impl} ]] || die "${FUNCNAME}: no impl nor EPYTHON"; | |
local hasv_args=(); | |
case ${EAPI} in | |
5 | 6) | |
hasv_args+=(--host-root) | |
;; | |
*) | |
hasv_args+=(-b) | |
;; | |
esac; | |
local PYTHON_PKG_DEP; | |
_python_export "${impl}" PYTHON_PKG_DEP; | |
has_version "${hasv_args[@]}" "${PYTHON_PKG_DEP}" | |
} | |
python_is_python3 () | |
{ | |
local impl=${1:-${EPYTHON}}; | |
[[ -n ${impl} ]] || die "python_is_python3: no impl nor EPYTHON"; | |
[[ ${impl} == python3* || ${impl} == pypy3 ]] | |
} | |
python_merge_intermediate_installation_images () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_mod_cleanup () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#Python_byte-code_compilation" | |
} | |
python_mod_optimize () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#Python_byte-code_compilation" | |
} | |
python_moduleinto () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
python_moduleroot=${1} | |
} | |
python_need_rebuild () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_newexe () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ -n ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).'; | |
[[ ${#} -eq 2 ]] || die "Usage: ${FUNCNAME} <path> <new-name>"; | |
local wrapd=${python_scriptroot:-/usr/bin}; | |
local f=${1}; | |
local newfn=${2}; | |
local scriptdir=$(python_get_scriptdir); | |
local d=${scriptdir#${EPREFIX}}; | |
( dodir "${wrapd}"; | |
exeopts -m 0755; | |
exeinto "${d}"; | |
newexe "${f}" "${newfn}" || return ${?} ); | |
_python_ln_rel "${ED%/}"/usr/lib/python-exec/python-exec2 "${ED%/}/${wrapd}/${newfn}" || die; | |
if [[ -n ${_PYTHON_REWRITE_SHEBANG} ]]; then | |
python_fix_shebang -q "${ED%/}/${d}/${newfn}"; | |
fi | |
} | |
python_newscript () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local _PYTHON_REWRITE_SHEBANG=1; | |
python_newexe "${@}" | |
} | |
python_optimize () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
if [[ ${EBUILD_PHASE} == pre* || ${EBUILD_PHASE} == post* ]]; then | |
eerror "The new Python eclasses expect the compiled Python files to"; | |
eerror "be controlled by the Package Manager. For this reason,"; | |
eerror "the python_optimize function can be used only during src_* phases"; | |
eerror "(src_install most commonly) and not during pkg_* phases."; | |
echo; | |
die "python_optimize is not to be used in pre/post* phases"; | |
fi; | |
[[ -n ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).'; | |
local PYTHON=${PYTHON}; | |
[[ -n ${PYTHON} ]] || _python_export PYTHON; | |
if [[ ${#} -eq 0 ]]; then | |
local f; | |
while IFS= read -r -d '' f; do | |
if [[ ${f} == /* && -d ${D%/}${f} ]]; then | |
set -- "${D%/}${f}" "${@}"; | |
fi; | |
done < <("${PYTHON}" -c 'import sys; print("".join(x + "\0" for x in sys.path))' || die); | |
debug-print "${FUNCNAME}: using sys.path: ${*/%/;}"; | |
fi; | |
local d; | |
for d in "$@"; | |
do | |
local instpath=${d#${D%/}}; | |
instpath=/${instpath##/}; | |
case "${EPYTHON}" in | |
python2.7 | python3.[34]) | |
"${PYTHON}" -m compileall -q -f -d "${instpath}" "${d}"; | |
"${PYTHON}" -OO -m compileall -q -f -d "${instpath}" "${d}" | |
;; | |
python* | pypy3) | |
"${PYTHON}" -m compileall -q -f -d "${instpath}" "${d}"; | |
"${PYTHON}" -O -m compileall -q -f -d "${instpath}" "${d}"; | |
"${PYTHON}" -OO -m compileall -q -f -d "${instpath}" "${d}" | |
;; | |
*) | |
"${PYTHON}" -m compileall -q -f -d "${instpath}" "${d}" | |
;; | |
esac; | |
done | |
} | |
python_pkg_setup () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#pkg_setup" | |
} | |
python_scriptinto () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
python_scriptroot=${1} | |
} | |
python_set_active_version () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#pkg_setup" | |
} | |
python_setup () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
if [[ -n ${PYTHON_COMPAT_OVERRIDE} ]]; then | |
local impls=(${PYTHON_COMPAT_OVERRIDE}); | |
[[ ${#impls[@]} -eq 1 ]] || die "PYTHON_COMPAT_OVERRIDE must name exactly one implementation for python-any-r1"; | |
ewarn "WARNING: PYTHON_COMPAT_OVERRIDE in effect. The following Python"; | |
ewarn "implementation will be used:"; | |
ewarn; | |
ewarn " ${PYTHON_COMPAT_OVERRIDE}"; | |
ewarn; | |
ewarn "Dependencies won't be satisfied, and EPYTHON/eselect-python will be ignored."; | |
_python_export "${impls[0]}" EPYTHON PYTHON; | |
_python_wrapper_setup; | |
einfo "Using ${EPYTHON} to build"; | |
return; | |
fi; | |
if [[ -n ${EPYTHON} ]]; then | |
if _python_EPYTHON_supported "${EPYTHON}"; then | |
_python_export EPYTHON PYTHON; | |
_python_wrapper_setup; | |
einfo "Using ${EPYTHON} to build"; | |
return; | |
fi; | |
fi; | |
local variant i; | |
for variant in '' '--python2' '--python3'; | |
do | |
i=$(eselect python --show ${variant} 2>/dev/null); | |
if [[ ! -n ${i} ]]; then | |
break; | |
else | |
if _python_EPYTHON_supported "${i}"; then | |
_python_export "${i}" EPYTHON PYTHON; | |
_python_wrapper_setup; | |
einfo "Using ${EPYTHON} to build"; | |
return; | |
fi; | |
fi; | |
done; | |
for ((i = ${#_PYTHON_SUPPORTED_IMPLS[@]} - 1; i >= 0; i-- )) | |
do | |
_python_export "${_PYTHON_SUPPORTED_IMPLS[i]}" EPYTHON PYTHON; | |
if _python_EPYTHON_supported "${EPYTHON}"; then | |
_python_wrapper_setup; | |
einfo "Using ${EPYTHON} to build"; | |
return; | |
fi; | |
done; | |
eerror "No Python implementation found for the build. This is usually"; | |
eerror "a bug in the ebuild. Please report it to bugs.gentoo.org"; | |
eerror "along with the build log."; | |
echo; | |
die "No supported Python implementation installed." | |
} | |
python_wrapper_setup () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
eqawarn "python_wrapper_setup() is part of private eclass API."; | |
eqawarn "Please call python_setup() instead."; | |
_python_wrapper_setup "${@}" | |
} | |
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; | |
export ${var}="${new[*]}"; | |
done; | |
return 0 | |
} | |
replace-sparc64-flags () | |
{ | |
[[ $# -ne 0 ]] && die "replace-sparc64-flags takes no arguments"; | |
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*' '-fstack-check*' -fno-stack-check -fbounds-check -fbounds-checking -fno-strict-overflow -fno-PIE -fno-pie -nopie -no-pie -fno-unit-at-a-time -g '-g[0-9]' -ggdb '-ggdb[0-9]' '-gdwarf-*' gstabs -gstabs+ -gz -fno-ident -fpermissive -frecord-gcc-switches '-fdiagnostics*' '-fplugin*' '-W*' -w '-[DUILR]*' '-Wl,*' '-fuse-ld'); | |
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-r4000 -mno-fix-r4000 -mfix-r4400 -mno-fix-r4400 -mfix-rm7000 -mno-fix-rm7000 -mfix-r10000 -mno-fix-r10000 -mr10k-cache-barrier -mthumb -marm -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); | |
ALLOWED_FLAGS+=(-mstackrealign) | |
} | |
src_compile () | |
{ | |
local _virtx=; | |
if use pgo; then | |
_virtx=virtx; | |
gnome2_environment_reset; | |
addpredict /root; | |
addpredict /etc/gconf; | |
fi; | |
GDK_BACKEND=x11 MOZ_MAKE_FLAGS="${MAKEOPTS} -O" SHELL="${SHELL:-${EPREFIX}/bin/bash}" MOZ_NOSPAM=1 ${_virtx} ./mach build --verbose || die | |
} | |
src_configure () | |
{ | |
MEXTENSIONS="default"; | |
_google_api_key=AIzaSyDEAOvatFo0eTgsV_ZlEzx0ObmepsMzfAc; | |
if [[ -n "${TERM}" ]]; then | |
einfo "TERM is set to: \"${TERM}\""; | |
else | |
einfo "TERM is unset."; | |
fi; | |
if use clang && ! tc-is-clang; then | |
einfo "Enforcing the use of clang due to USE=clang ..."; | |
CC=${CHOST}-clang; | |
CXX=${CHOST}-clang++; | |
strip-unsupported-flags; | |
else | |
if ! use clang && ! tc-is-gcc; then | |
einfo "Enforcing the use of gcc due to USE=-clang ..."; | |
CC=${CHOST}-gcc; | |
CXX=${CHOST}-g++; | |
strip-unsupported-flags; | |
fi; | |
fi; | |
mozconfig_init; | |
mozconfig_annotate 'system_libs' --with-system-zlib --with-system-bz2; | |
mozconfig_annotate 'Enable by Gentoo' --enable-release; | |
mozconfig_annotate '' --with-libclang-path="$(llvm-config --libdir)"; | |
if use pgo; then | |
if ! has userpriv $FEATURES; then | |
eerror "Building firefox with USE=pgo and FEATURES=-userpriv is not supported!"; | |
fi; | |
fi; | |
filter-flags -flto*; | |
if use lto; then | |
local show_old_compiler_warning=; | |
if use clang; then | |
if [[ $(clang-major-version) -lt 7 ]]; then | |
show_old_compiler_warning=1; | |
fi; | |
mozconfig_annotate "forcing ld=lld due to USE=clang and USE=lto" --enable-linker=lld; | |
else | |
if [[ $(gcc-major-version) -lt 8 ]]; then | |
show_old_compiler_warning=1; | |
fi; | |
if ! use cpu_flags_x86_avx2; then | |
local _gcc_version_with_ipa_cdtor_fix="8.3"; | |
local _current_gcc_version="$(gcc-major-version).$(gcc-minor-version)"; | |
if ver_test "${_current_gcc_version}" -lt "${_gcc_version_with_ipa_cdtor_fix}"; then | |
einfo "Disable IPA cdtor due to bug in GCC and missing AVX2 support -- triggered by USE=lto"; | |
append-ldflags -fdisable-ipa-cdtor; | |
else | |
einfo "No GCC workaround required, GCC version is already patched!"; | |
fi; | |
else | |
einfo "No GCC workaround required, system supports AVX2"; | |
fi; | |
mozconfig_annotate "forcing ld=gold due to USE=lto" --enable-linker=gold; | |
fi; | |
if [[ -n "${show_old_compiler_warning}" ]]; then | |
ewarn ""; | |
ewarn "USE=lto requires up-to-date compiler (>=gcc-8 or >=clang-7)."; | |
ewarn "You are on your own -- expect build failures. Don't file bugs using that unsupported configuration!"; | |
ewarn ""; | |
sleep 5; | |
fi; | |
mozconfig_annotate '+lto' --enable-lto=thin; | |
if use pgo; then | |
mozconfig_annotate '+pgo' MOZ_PGO=1; | |
fi; | |
else | |
if use clang; then | |
mozconfig_annotate "forcing ld=lld due to USE=clang" --enable-linker=lld; | |
else | |
if tc-ld-is-gold; then | |
mozconfig_annotate "linker is set to gold" --enable-linker=gold; | |
else | |
mozconfig_annotate "linker is set to bfd" --enable-linker=bfd; | |
fi; | |
fi; | |
fi; | |
use alpha && append-ldflags "-Wl,--no-relax"; | |
use hardened && append-ldflags "-Wl,-z,now"; | |
if use cpu_flags_arm_neon; then | |
mozconfig_annotate '' --with-fpu=neon; | |
if ! tc-is-clang; then | |
mozconfig_annotate '' --with-thumb=yes; | |
mozconfig_annotate '' --with-thumb-interwork=no; | |
fi; | |
fi; | |
if [[ ${CHOST} == armv*h* ]]; then | |
mozconfig_annotate '' --with-float-abi=hard; | |
if ! use system-libvpx; then | |
sed -i -e "s|softfp|hard|" "${S}"/media/libvpx/moz.build; | |
fi; | |
fi; | |
mozconfig_use_enable !bindist official-branding; | |
mozconfig_use_enable debug; | |
mozconfig_use_enable debug tests; | |
if ! use debug; then | |
mozconfig_annotate 'disabled by Gentoo' --disable-debug-symbols; | |
else | |
mozconfig_annotate 'enabled by Gentoo' --enable-debug-symbols; | |
fi; | |
mozconfig_annotate '' --with-system-nspr --with-nspr-prefix="${SYSROOT}${EPREFIX}"/usr; | |
mozconfig_annotate '' --with-system-nss --with-nss-prefix="${SYSROOT}${EPREFIX}"/usr; | |
mozconfig_annotate '' --x-includes="${SYSROOT}${EPREFIX}"/usr/include --x-libraries="${SYSROOT}${EPREFIX}"/usr/$(get_libdir); | |
mozconfig_annotate '' --prefix="${EPREFIX}"/usr; | |
mozconfig_annotate '' --libdir="${EPREFIX}"/usr/$(get_libdir); | |
mozconfig_annotate '' --disable-crashreporter; | |
mozconfig_annotate 'Gentoo default' --with-system-png; | |
mozconfig_annotate '' --enable-system-ffi; | |
mozconfig_annotate '' --disable-gconf; | |
mozconfig_annotate '' --with-intl-api; | |
mozconfig_annotate '' --enable-system-pixman; | |
mozconfig_annotate '' --target="${CHOST}"; | |
mozconfig_annotate '' --host="${CBUILD:-${CHOST}}"; | |
mozconfig_annotate '' --with-toolchain-prefix="${CHOST}-"; | |
if use system-libevent; then | |
mozconfig_annotate '' --with-system-libevent="${SYSROOT}${EPREFIX}"/usr; | |
fi; | |
if ! use x86 && [[ ${CHOST} != armv*h* ]]; then | |
mozconfig_annotate '' --enable-rust-simd; | |
fi; | |
if use wayland; then | |
mozconfig_annotate '' --enable-default-toolkit=cairo-gtk3-wayland; | |
else | |
mozconfig_annotate '' --enable-default-toolkit=cairo-gtk3; | |
fi; | |
mozconfig_use_enable startup-notification; | |
mozconfig_use_with system-av1; | |
mozconfig_use_with system-harfbuzz; | |
mozconfig_use_with system-harfbuzz system-graphite2; | |
mozconfig_use_with system-icu; | |
mozconfig_use_with system-jpeg; | |
mozconfig_use_with system-libvpx; | |
mozconfig_use_with system-webp; | |
mozconfig_use_enable pulseaudio; | |
if use kernel_linux && ! use pulseaudio; then | |
mozconfig_annotate '-pulseaudio' --enable-alsa; | |
fi; | |
mozconfig_annotate '' --without-ccache; | |
sed -i -e 's/ccache_stats = None/return None/' python/mozbuild/mozbuild/controller/building.py || die "Failed to disable ccache stats call"; | |
mozconfig_use_enable wifi necko-wifi; | |
mozconfig_use_enable geckodriver; | |
mozconfig_use_enable jack; | |
use eme-free && mozconfig_annotate '+eme-free' --disable-eme; | |
echo -n "${_google_api_key}" > "${S}"/google-api-key; | |
mozconfig_annotate '' --with-google-location-service-api-keyfile="${S}/google-api-key"; | |
mozconfig_annotate '' --with-google-safebrowsing-api-keyfile="${S}/google-api-key"; | |
mozconfig_annotate '' --enable-extensions="${MEXTENSIONS}"; | |
append-ldflags "-Wl,--compress-debug-sections=zlib"; | |
if use clang && ! use arm64; then | |
mozconfig_annotate 'elf-hack is broken when using Clang' --disable-elf-hack; | |
fi; | |
echo "mk_add_options MOZ_OBJDIR=${BUILD_OBJ_DIR}" >> "${S}"/.mozconfig; | |
echo "mk_add_options XARGS=/usr/bin/xargs" >> "${S}"/.mozconfig; | |
mozconfig_final; | |
mkdir -p "${S}"/third_party/rust/libloading/.deps; | |
SHELL="${SHELL:-${EPREFIX}/bin/bash}" MOZ_NOSPAM=1 ./mach configure || die | |
} | |
src_install () | |
{ | |
cd "${BUILD_OBJ_DIR}" || die; | |
pax-mark m "${BUILD_OBJ_DIR}"/dist/bin/xpcshell; | |
cp "${FILESDIR}"/gentoo-default-prefs.js-3 "${BUILD_OBJ_DIR}/dist/bin/browser/defaults/preferences/all-gentoo.js" || die; | |
echo "pref(\"spellchecker.dictionary_path\", \"${EPREFIX}/usr/share/myspell\");" >> "${BUILD_OBJ_DIR}/dist/bin/browser/defaults/preferences/all-gentoo.js" || die; | |
if use system-harfbuzz; then | |
echo "sticky_pref(\"gfx.font_rendering.graphite.enabled\",true);" >> "${BUILD_OBJ_DIR}/dist/bin/browser/defaults/preferences/all-gentoo.js" || die; | |
fi; | |
if [[ $(tc-endian) == "big" ]]; then | |
echo "sticky_pref(\"gfx.canvas.azure.backends\",\"cairo\");" >> "${BUILD_OBJ_DIR}/dist/bin/browser/defaults/preferences/all-gentoo.js" || die; | |
echo "sticky_pref(\"gfx.content.azure.backends\",\"cairo\");" >> "${BUILD_OBJ_DIR}/dist/bin/browser/defaults/preferences/all-gentoo.js" || die; | |
fi; | |
if use hwaccel; then | |
cat "${FILESDIR}"/gentoo-hwaccel-prefs.js-1 >> "${BUILD_OBJ_DIR}/dist/bin/browser/defaults/preferences/all-gentoo.js" || die; | |
fi; | |
if ! use screenshot; then | |
echo "pref(\"extensions.screenshots.disabled\", true);" >> "${BUILD_OBJ_DIR}/dist/bin/browser/defaults/preferences/all-gentoo.js" || die; | |
fi; | |
echo "pref(\"extensions.autoDisableScopes\", 3);" >> "${BUILD_OBJ_DIR}/dist/bin/browser/defaults/preferences/all-gentoo.js" || die; | |
local plugin; | |
use gmp-autoupdate || use eme-free || for plugin in "${GMP_PLUGIN_LIST[@]}"; | |
do | |
echo "pref(\"media.${plugin}.autoupdate\", false);" >> "${BUILD_OBJ_DIR}/dist/bin/browser/defaults/preferences/all-gentoo.js" || die; | |
done; | |
cd "${S}"; | |
MOZ_MAKE_FLAGS="${MAKEOPTS}" SHELL="${SHELL:-${EPREFIX}/bin/bash}" MOZ_NOSPAM=1 DESTDIR="${D}" ./mach install || die; | |
if use geckodriver; then | |
cp "${BUILD_OBJ_DIR}"/dist/bin/geckodriver "${ED%/}"${MOZILLA_FIVE_HOME} || die; | |
pax-mark m "${ED%/}"${MOZILLA_FIVE_HOME}/geckodriver; | |
dosym ${MOZILLA_FIVE_HOME}/geckodriver /usr/bin/geckodriver; | |
fi; | |
MOZEXTENSION_TARGET="distribution/extensions" MOZ_INSTALL_L10N_XPIFILE="1" mozlinguas_src_install; | |
local size sizes icon_path icon name; | |
if use bindist; then | |
sizes="16 32 48"; | |
icon_path="${S}/browser/branding/aurora"; | |
icon="aurora"; | |
name="Aurora"; | |
cat >> "${BUILD_OBJ_DIR}/dist/bin/browser/defaults/preferences/all-gentoo.js" <<PROFILE_EOF | |
pref("app.feedback.baseURL", "https://input.mozilla.org/%LOCALE%/feedback/firefoxdev/%VERSION%/"); | |
sticky_pref("lightweightThemes.selectedThemeID", "[email protected]"); | |
sticky_pref("browser.devedition.theme.enabled", true); | |
sticky_pref("devtools.theme", "dark"); | |
PROFILE_EOF | |
else | |
sizes="16 22 24 32 48 64 128 256" | |
icon_path="${S}/browser/branding/official"; | |
icon="${PN}"; | |
name="Mozilla Firefox"; | |
fi; | |
insinto ${MOZILLA_FIVE_HOME}/distribution/; | |
newins "${FILESDIR}"/disable-auto-update.policy.json policies.json; | |
for size in ${sizes}; | |
do | |
insinto "/usr/share/icons/hicolor/${size}x${size}/apps"; | |
newins "${icon_path}/default${size}.png" "${icon}.png"; | |
done; | |
newicon "${icon_path}/default48.png" "${icon}.png"; | |
local startup_notify="false"; | |
if use startup-notification; then | |
startup_notify="true"; | |
fi; | |
local display_protocols="auto X11" use_wayland="false"; | |
if use wayland; then | |
display_protocols+=" Wayland"; | |
use_wayland="true"; | |
fi; | |
local app_name desktop_filename display_protocol exec_command; | |
for display_protocol in ${display_protocols}; | |
do | |
app_name="${name} on ${display_protocol}"; | |
desktop_filename="${PN}-${display_protocol,,}.desktop"; | |
case ${display_protocol} in | |
Wayland) | |
exec_command='firefox-wayland --name firefox-wayland'; | |
newbin "${FILESDIR}"/firefox-wayland.sh firefox-wayland | |
;; | |
X11) | |
if ! use wayland; then | |
continue; | |
fi; | |
exec_command='firefox-x11 --name firefox-x11'; | |
newbin "${FILESDIR}"/firefox-x11.sh firefox-x11 | |
;; | |
*) | |
app_name="${name}"; | |
desktop_filename="${PN}.desktop"; | |
exec_command='firefox' | |
;; | |
esac; | |
newmenu "${FILESDIR}/icon/${PN}-r1.desktop" "${desktop_filename}"; | |
sed -i -e "s:@NAME@:${app_name}:" -e "s:@EXEC@:${exec_command}:" -e "s:@ICON@:${icon}:" -e "s:@STARTUP_NOTIFY@:${startup_notify}:" "${ED%/}/usr/share/applications/${desktop_filename}" || die; | |
done; | |
rm "${ED%/}"/usr/bin/firefox || die; | |
newbin "${FILESDIR}"/firefox.sh firefox; | |
local wrapper; | |
for wrapper in "${ED%/}"/usr/bin/firefox "${ED%/}"/usr/bin/firefox-x11 "${ED%/}"/usr/bin/firefox-wayland; | |
do | |
[[ ! -f "${wrapper}" ]] && continue; | |
sed -i -e "s:@PREFIX@:${EPREFIX%/}/usr:" -e "s:@DEFAULT_WAYLAND@:${use_wayland}:" "${wrapper}" || die; | |
done; | |
[[ -f "${ED%/}${MOZILLA_FIVE_HOME}/llvm-symbolizer" ]] && rm "${ED%/}${MOZILLA_FIVE_HOME}/llvm-symbolizer"; | |
rm "${ED%/}"${MOZILLA_FIVE_HOME}/firefox-bin || die; | |
dosym firefox ${MOZILLA_FIVE_HOME}/firefox-bin; | |
pax-mark m "${ED%/}"${MOZILLA_FIVE_HOME}/{firefox,plugin-container} | |
} | |
src_prepare () | |
{ | |
eapply "${WORKDIR}/firefox"; | |
sed -i -e "s/multiprocessing.cpu_count()/$(makeopts_jobs)/" "${S}"/build/moz.configure/lto-pgo.configure || die "sed failed to set num_cores"; | |
eapply_user; | |
einfo "Removing pre-built binaries ..."; | |
find "${S}"/third_party -type f \( -name '*.so' -o -name '*.o' \) -print -delete || die; | |
if use debug; then | |
sed -i -e "s:GNOME_DISABLE_CRASH_DIALOG=1:GNOME_DISABLE_CRASH_DIALOG=0:g" "${S}"/build/unix/run-mozilla.sh || die "sed failed!"; | |
fi; | |
if use ia64; then | |
sed -i -e '/^OS_LIBS += no_as_needed/d' -e '/^OS_LIBS += as_needed/d' "${S}"/widget/gtk/mozgtk/gtk2/moz.build "${S}"/widget/gtk/mozgtk/gtk3/moz.build || die "sed failed to drop --as-needed for ia64"; | |
fi; | |
sed -e "s:\(/no-such-file\):${T}\1:g" -i "${S}"/config/rules.mk -i "${S}"/nsprpub/configure{.in,} || die; | |
sed '/^MOZ_PKG_FATAL_WARNINGS/s@= 1@= 0@' -i "${S}"/browser/installer/Makefile.in || die; | |
sed 's@\(xargs rm\)$@\1 -f@' -i "${S}"/toolkit/mozapps/installer/packager.mk || die; | |
sed '/^MOZ_DEV_EDITION=1/d' -i "${S}"/browser/branding/aurora/configure.sh || die; | |
sed -i -e "s@check_prog('RUSTFMT', add_rustup_path('rustfmt')@check_prog('RUSTFMT', add_rustup_path('rustfmt_do_not_use')@" "${S}"/build/moz.configure/rust.configure || die; | |
eautoreconf old-configure.in; | |
cd "${S}"/js/src || die; | |
eautoconf old-configure.in; | |
sed -i 's/\("files":{\)[^}]*/\1/' "${S}"/third_party/rust/target-lexicon-0.9.0/.cargo-checksum.json || die | |
} | |
src_test () | |
{ | |
default | |
} | |
src_unpack () | |
{ | |
default; | |
mozlinguas_src_unpack | |
} | |
strip-flags () | |
{ | |
[[ $# -ne 0 ]] && die "strip-flags takes no arguments"; | |
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; | |
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 () | |
{ | |
[[ $# -ne 0 ]] && die "strip-unsupported-flags takes no arguments"; | |
export CFLAGS=$(test-flags-CC ${CFLAGS}); | |
export CXXFLAGS=$(test-flags-CXX ${CXXFLAGS}); | |
export FFLAGS=$(test-flags-F77 ${FFLAGS}); | |
export FCFLAGS=$(test-flags-FC ${FCFLAGS}); | |
export LDFLAGS=$(test-flags-CCLD ${LDFLAGS}) | |
} | |
tc-arch () | |
{ | |
tc-ninja_magic_to_arch portage "$@" | |
} | |
tc-arch-kernel () | |
{ | |
tc-ninja_magic_to_arch kern "$@" | |
} | |
tc-check-openmp () | |
{ | |
if ! tc-has-openmp; then | |
eerror "Your current compiler does not support OpenMP!"; | |
if tc-is-gcc; then | |
eerror "Enable OpenMP support by building sys-devel/gcc with USE=\"openmp\"."; | |
else | |
if tc-is-clang; then | |
eerror "OpenMP support in sys-devel/clang is provided by sys-libs/libomp."; | |
fi; | |
fi; | |
die "Active compiler does not have required support for OpenMP"; | |
fi | |
} | |
tc-cpp-is-true () | |
{ | |
local CONDITION=${1}; | |
shift; | |
$(tc-getTARGET_CPP) "${@}" -P - <<-EOF > /dev/null 2>&1 | |
#if ${CONDITION} | |
true | |
#else | |
#error false | |
#endif | |
EOF | |
} | |
tc-detect-is-softfloat () | |
{ | |
[[ $(tc-getTARGET_CPP) == "gcc -E" ]] && return 1; | |
case ${CTARGET:-${CHOST}} in | |
*-newlib | *-elf | *-eabi) | |
return 1 | |
;; | |
arm*) | |
if tc-cpp-is-true "defined(__ARM_PCS_VFP)"; then | |
echo "no"; | |
else | |
if tc-cpp-is-true "defined(__SOFTFP__)"; then | |
echo "yes"; | |
else | |
echo "softfp"; | |
fi; | |
fi; | |
return 0 | |
;; | |
*) | |
return 1 | |
;; | |
esac | |
} | |
tc-enables-pie () | |
{ | |
tc-cpp-is-true "defined(__PIE__)" ${CPPFLAGS} ${CFLAGS} | |
} | |
tc-enables-ssp () | |
{ | |
tc-cpp-is-true "defined(__SSP__) || defined(__SSP_STRONG__) || defined(__SSP_ALL__)" ${CPPFLAGS} ${CFLAGS} | |
} | |
tc-enables-ssp-all () | |
{ | |
tc-cpp-is-true "defined(__SSP_ALL__)" ${CPPFLAGS} ${CFLAGS} | |
} | |
tc-enables-ssp-strong () | |
{ | |
tc-cpp-is-true "defined(__SSP_STRONG__) || defined(__SSP_ALL__)" ${CPPFLAGS} ${CFLAGS} | |
} | |
tc-endian () | |
{ | |
local host=$1; | |
[[ -z ${host} ]] && host=${CTARGET:-${CHOST}}; | |
host=${host%%-*}; | |
case ${host} in | |
aarch64*be) | |
echo big | |
;; | |
aarch64) | |
echo little | |
;; | |
alpha*) | |
echo little | |
;; | |
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 | |
;; | |
riscv*) | |
echo little | |
;; | |
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) READELF=$(tc-getBUILD_READELF) "$@" | |
} | |
tc-export () | |
{ | |
local var; | |
for var in "$@"; | |
do | |
[[ $(type -t "tc-get${var}") != "function" ]] && die "tc-export: invalid export variable '${var}'"; | |
"tc-get${var}" > /dev/null; | |
done | |
} | |
tc-export_build_env () | |
{ | |
tc-export "$@"; | |
if tc-is-cross-compiler; then | |
: ${BUILD_CFLAGS:=-O1 -pipe}; | |
: ${BUILD_CXXFLAGS:=-O1 -pipe}; | |
: ${BUILD_CPPFLAGS:= }; | |
: ${BUILD_LDFLAGS:= }; | |
else | |
: ${BUILD_CFLAGS:=${CFLAGS}}; | |
: ${BUILD_CXXFLAGS:=${CXXFLAGS}}; | |
: ${BUILD_CPPFLAGS:=${CPPFLAGS}}; | |
: ${BUILD_LDFLAGS:=${LDFLAGS}}; | |
fi; | |
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-get-compiler-type () | |
{ | |
local code=' | |
#if defined(__PATHSCALE__) | |
HAVE_PATHCC | |
#elif defined(__clang__) | |
HAVE_CLANG | |
#elif defined(__GNUC__) | |
HAVE_GCC | |
#endif | |
'; | |
local res=$($(tc-getCPP "$@") -E -P - <<<"${code}"); | |
case ${res} in | |
*HAVE_PATHCC*) | |
echo pathcc | |
;; | |
*HAVE_CLANG*) | |
echo clang | |
;; | |
*HAVE_GCC*) | |
echo gcc | |
;; | |
*) | |
echo unknown | |
;; | |
esac | |
} | |
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 "$(tc-getBUILD_CC) -E" "$@" | |
} | |
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 () | |
{ | |
local vars="BUILD_$1 $1_FOR_BUILD HOST$1"; | |
tc-is-cross-compiler || vars+=" $1"; | |
_tc-getPROG CBUILD "${vars}" "${@:2}" | |
} | |
tc-getBUILD_RANLIB () | |
{ | |
tc-getBUILD_PROG RANLIB ranlib "$@" | |
} | |
tc-getBUILD_READELF () | |
{ | |
tc-getBUILD_PROG READELF readelf "$@" | |
} | |
tc-getBUILD_STRIP () | |
{ | |
tc-getBUILD_PROG STRIP strip "$@" | |
} | |
tc-getCC () | |
{ | |
tc-getPROG CC gcc "$@" | |
} | |
tc-getCPP () | |
{ | |
tc-getPROG CPP "${CC:-gcc} -E" "$@" | |
} | |
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-getREADELF () | |
{ | |
tc-getPROG READELF readelf "$@" | |
} | |
tc-getSTRIP () | |
{ | |
tc-getPROG STRIP strip "$@" | |
} | |
tc-getTARGET_CPP () | |
{ | |
if [[ -n ${CTARGET} ]]; then | |
_tc-getPROG CTARGET TARGET_CPP "gcc -E" "$@"; | |
else | |
tc-getCPP "$@"; | |
fi | |
} | |
tc-has-openmp () | |
{ | |
local base="${T}/test-tc-openmp"; | |
cat <<-EOF > "${base}.c" | |
#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 <<-EOF > "${base}.c" | |
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-clang () | |
{ | |
[[ $(tc-get-compiler-type) == clang ]] | |
} | |
tc-is-cross-compiler () | |
{ | |
[[ ${CBUILD:-${CHOST}} != ${CHOST} ]] | |
} | |
tc-is-gcc () | |
{ | |
[[ $(tc-get-compiler-type) == gcc ]] | |
} | |
tc-is-softfloat () | |
{ | |
tc-detect-is-softfloat || tc-tuple-is-softfloat | |
} | |
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 fallback="true"; | |
if tc-is-gcc; then | |
local major=$(gcc-major-version "$@"); | |
local minor=$(gcc-minor-version "$@"); | |
if [[ ${major} -gt 4 ]] || [[ ${major} -eq 4 && ${minor} -ge 8 ]]; then | |
export LDFLAGS="${LDFLAGS} -fuse-ld=bfd"; | |
fallback="false"; | |
fi; | |
else | |
if tc-is-clang; then | |
local major=$(clang-major-version "$@"); | |
local minor=$(clang-minor-version "$@"); | |
if [[ ${major} -gt 3 ]] || [[ ${major} -eq 3 && ${minor} -ge 5 ]]; then | |
export LDFLAGS="${LDFLAGS} -fuse-ld=bfd"; | |
fallback="false"; | |
fi; | |
fi; | |
fi; | |
if [[ ${fallback} == "true" ]]; 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; | |
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 <<-EOF > "${base}.c" | |
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-ld-is-lld () | |
{ | |
local out; | |
out=$($(tc-getLD "$@") --version 2>&1); | |
if [[ ${out} == *"LLD"* ]]; then | |
return 0; | |
fi; | |
local base="${T}/test-tc-lld"; | |
cat <<-EOF > "${base}.c" | |
int main() { return 0; } | |
EOF | |
out=$($(tc-getCC "$@") ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} -Wl,--version "${base}.c" -o "${base}" 2>&1); | |
rm -f "${base}"*; | |
if [[ ${out} == *"LLD"* ]]; 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}}; | |
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" && ${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 | |
;; | |
or1k | or32*) | |
echo openrisc | |
;; | |
powerpc*) | |
if [[ ${type} == "kern" ]]; then | |
echo powerpc; | |
else | |
if [[ ${host} == powerpc64* ]]; then | |
echo ppc64; | |
else | |
echo ppc; | |
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" ]]; then | |
echo x86; | |
else | |
echo amd64; | |
fi | |
;; | |
xtensa*) | |
echo xtensa | |
;; | |
*) | |
echo unknown | |
;; | |
esac | |
} | |
tc-stack-grows-down () | |
{ | |
case ${ARCH} in | |
hppa | metag) | |
return 1 | |
;; | |
esac; | |
return 0 | |
} | |
tc-tuple-is-softfloat () | |
{ | |
local CTARGET=${CTARGET:-${CHOST}}; | |
case ${CTARGET//_/-} in | |
bfin* | h8300*) | |
echo "only" | |
;; | |
*-softfloat-*) | |
echo "yes" | |
;; | |
*-softfp-*) | |
echo "softfp" | |
;; | |
arm*-hardfloat-* | arm*eabihf) | |
echo "no" | |
;; | |
*-newlib | *-elf | *-eabi) | |
echo "no" | |
;; | |
arm*) | |
echo "yes" | |
;; | |
*) | |
echo "no" | |
;; | |
esac | |
} | |
test-flag-CC () | |
{ | |
test-flag-PROG "CC" c "$@" | |
} | |
test-flag-CCLD () | |
{ | |
test-flag-PROG "CC" c+ld "$@" | |
} | |
test-flag-CXX () | |
{ | |
test-flag-PROG "CXX" c++ "$@" | |
} | |
test-flag-F77 () | |
{ | |
test-flag-PROG "F77" f77 "$@" | |
} | |
test-flag-FC () | |
{ | |
test-flag-PROG "FC" f95 "$@" | |
} | |
test-flag-PROG () | |
{ | |
local comp=$1; | |
local lang=$2; | |
shift 2; | |
if [[ -z ${comp} ]]; then | |
return 1; | |
fi; | |
if [[ -z $1 ]]; then | |
return 1; | |
fi; | |
comp=($(tc-get${comp})); | |
if ! type -p ${comp[0]} > /dev/null; then | |
return 1; | |
fi; | |
local in_src in_ext cmdline_extra=(); | |
case "${lang}" in | |
c) | |
in_ext='c'; | |
in_src='int main(void) { return 0; }'; | |
cmdline_extra+=(-xc -c) | |
;; | |
c++) | |
in_ext='cc'; | |
in_src='int main(void) { return 0; }'; | |
cmdline_extra+=(-xc++ -c) | |
;; | |
f77) | |
in_ext='f'; | |
in_src=' end'; | |
cmdline_extra+=(-xf77 -c) | |
;; | |
f95) | |
in_ext='f90'; | |
in_src='end'; | |
cmdline_extra+=(-xf95 -c) | |
;; | |
c+ld) | |
in_ext='c'; | |
in_src='int main(void) { return 0; }'; | |
cmdline_extra+=(-xc) | |
;; | |
esac; | |
local test_in=${T}/test-flag.${in_ext}; | |
local test_out=${T}/test-flag.exe; | |
printf "%s\n" "${in_src}" > "${test_in}" || die "Failed to create '${test_in}'"; | |
local cmdline=("${comp[@]}" -Werror "$@" "${cmdline_extra[@]}" "${test_in}" -o "${test_out}"); | |
if ! "${cmdline[@]}" &> /dev/null; then | |
cmdline+=(-Qunused-arguments); | |
"${cmdline[@]}" &> /dev/null; | |
fi | |
} | |
test-flags () | |
{ | |
test-flags-CC "$@" | |
} | |
test-flags-CC () | |
{ | |
test-flags-PROG "CC" "$@" | |
} | |
test-flags-CCLD () | |
{ | |
test-flags-PROG "CCLD" "$@" | |
} | |
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; | |
while (( $# )); do | |
case "$1" in | |
--param | -B) | |
if test-flag-${comp} "$1" "$2"; then | |
flags+=("$1" "$2"); | |
fi; | |
shift 2 | |
;; | |
*) | |
if test-flag-${comp} "$1"; then | |
flags+=("$1"); | |
fi; | |
shift 1 | |
;; | |
esac; | |
done; | |
echo "${flags[*]}"; | |
[[ ${#flags[@]} -gt 0 ]] | |
} | |
test_version_info () | |
{ | |
if [[ $($(tc-getCC) --version 2>&1) == *$1* ]]; then | |
return 0; | |
else | |
return 1; | |
fi | |
} | |
uclibctoolize () | |
{ | |
die "Use elibtoolize" | |
} | |
use_if_iuse () | |
{ | |
in_iuse $1 || return 1; | |
use $1 | |
} | |
ver_cut () | |
{ | |
local range=${1}; | |
local v=${2:-${PV}}; | |
local start end; | |
local -a comp; | |
_ver_split "${v}"; | |
local max=$((${#comp[@]}/2)); | |
_ver_parse_range "${range}" "${max}"; | |
if [[ ${start} -gt 0 ]]; then | |
start=$(( start*2 - 1 )); | |
fi; | |
printf "%s" "${comp[@]:start:end*2-start}" ' | |
' | |
} | |
ver_rs () | |
{ | |
local v; | |
(( ${#} & 1 )) && v=${@: -1} || v=${PV}; | |
local start end i; | |
local -a comp; | |
_ver_split "${v}"; | |
local max=$((${#comp[@]}/2 - 1)); | |
while [[ ${#} -ge 2 ]]; do | |
_ver_parse_range "${1}" "${max}"; | |
for ((i = start*2; i <= end*2; i+=2 )) | |
do | |
[[ ${i} -eq 0 && -z ${comp[i]} ]] && continue; | |
comp[i]=${2}; | |
done; | |
shift 2; | |
done; | |
local IFS=; | |
echo "${comp[*]}" | |
} | |
ver_test () | |
{ | |
local va op vb; | |
if [[ $# -eq 3 ]]; then | |
va=${1}; | |
shift; | |
else | |
va=${PVR}; | |
fi; | |
[[ $# -eq 2 ]] || die "${FUNCNAME}: bad number of arguments"; | |
op=${1}; | |
vb=${2}; | |
case ${op} in | |
-eq | -ne | -lt | -le | -gt | -ge) | |
;; | |
*) | |
die "${FUNCNAME}: invalid operator: ${op}" | |
;; | |
esac; | |
_ver_compare "${va}" "${vb}"; | |
test $? "${op}" 2 | |
} | |
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 | |
} | |
virtualmake () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
[[ ${EAPI} == [45] ]] || die "${FUNCNAME} is unsupported in EAPI > 5, please use virtx"; | |
if [[ -n ${maketype} ]]; then | |
[[ ${EAPI} == [45] ]] || die "maketype is banned in EAPI > 5"; | |
eqawarn "ebuild is exporting \$maketype=${maketype}"; | |
eqawarn "Ebuild should be migrated to use 'virtx command' instead."; | |
VIRTUALX_COMMAND=${maketype}; | |
fi; | |
virtx "${VIRTUALX_COMMAND}" "${@}" | |
} | |
virtx () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
[[ $# -lt 1 ]] && die "${FUNCNAME} needs at least one argument"; | |
local i=0; | |
local retval=0; | |
local OLD_SANDBOX_ON="${SANDBOX_ON}"; | |
local XVFB XHOST XDISPLAY; | |
local xvfbargs="-screen 0 1280x1024x24 +extension RANDR"; | |
XVFB=$(type -p Xvfb) || die; | |
XHOST=$(type -p xhost) || die; | |
debug-print "${FUNCNAME}: running Xvfb hack"; | |
export XAUTHORITY=; | |
einfo "Scanning for an open DISPLAY to start Xvfb ..."; | |
XDISPLAY=$(i=1; while [[ -f /tmp/.X${i}-lock ]] ; do ((i++));done; echo ${i}); | |
debug-print "${FUNCNAME}: XDISPLAY=${XDISPLAY}"; | |
export SANDBOX_ON="0"; | |
debug-print "${FUNCNAME}: ${XVFB} :${XDISPLAY} ${xvfbargs}"; | |
${XVFB} :${XDISPLAY} ${xvfbargs} &> /dev/null & sleep 2; | |
local start=${XDISPLAY}; | |
while [[ ! -f /tmp/.X${XDISPLAY}-lock ]]; do | |
if ((XDISPLAY - start > 15)); then | |
eerror "'${XVFB} :${XDISPLAY} ${xvfbargs}' returns:"; | |
echo; | |
${XVFB} :${XDISPLAY} ${xvfbargs}; | |
echo; | |
eerror "If possible, correct the above error and try your emerge again."; | |
die "Unable to start Xvfb"; | |
fi; | |
((XDISPLAY++)); | |
debug-print "${FUNCNAME}: ${XVFB} :${XDISPLAY} ${xvfbargs}"; | |
${XVFB} :${XDISPLAY} ${xvfbargs} &> /dev/null & sleep 2; | |
done; | |
export SANDBOX_ON="${OLD_SANDBOX_ON}"; | |
einfo "Starting Xvfb on \$DISPLAY=${XDISPLAY} ..."; | |
export DISPLAY=:${XDISPLAY}; | |
debug-print "${FUNCNAME}: $@"; | |
nonfatal "$@"; | |
retval=$?; | |
kill $(cat /tmp/.X${XDISPLAY}-lock); | |
[[ ${retval} -ne 0 ]] && die "Failed to run '$@'"; | |
return 0 | |
} | |
xdg_desktop_database_update () | |
{ | |
if [[ ${EBUILD_PHASE} != post* ]]; then | |
die "xdg_desktop_database_update must be used in pkg_post* phases."; | |
fi; | |
if ! type update-desktop-database &> /dev/null; then | |
debug-print "update-desktop-database is not found"; | |
return; | |
fi; | |
ebegin "Updating .desktop files database"; | |
update-desktop-database -q "${EROOT%/}${DESKTOP_DATABASE_DIR}"; | |
eend $? | |
} | |
xdg_environment_reset () | |
{ | |
export XDG_DATA_HOME="${HOME}/.local/share"; | |
export XDG_CONFIG_HOME="${HOME}/.config"; | |
export XDG_CACHE_HOME="${HOME}/.cache"; | |
export XDG_RUNTIME_DIR="${T}/run"; | |
mkdir -p "${XDG_DATA_HOME}" "${XDG_CONFIG_HOME}" "${XDG_CACHE_HOME}" "${XDG_RUNTIME_DIR}" || die; | |
chmod 0700 "${XDG_RUNTIME_DIR}" || die; | |
unset DBUS_SESSION_BUS_ADDRESS | |
} | |
xdg_icon_cache_update () | |
{ | |
if [[ ${EBUILD_PHASE} != post* ]]; then | |
die "xdg_icon_cache_update must be used in pkg_post* phases."; | |
fi; | |
if ! type gtk-update-icon-cache &> /dev/null; then | |
debug-print "gtk-update-icon-cache is not found"; | |
return; | |
fi; | |
ebegin "Updating icons cache"; | |
local dir f retval=0; | |
local fails=(); | |
for dir in "${EROOT%/}"/usr/share/icons/*; | |
do | |
if [[ -f "${dir}/index.theme" ]]; then | |
local rv=0; | |
gtk-update-icon-cache -qf "${dir}"; | |
rv=$?; | |
if [[ ! $rv -eq 0 ]]; then | |
debug-print "Updating cache failed on ${dir}"; | |
fails+=("${dir}"); | |
retval=2; | |
fi; | |
else | |
if [[ $(ls "${dir}") = "icon-theme.cache" ]]; then | |
rm "${dir}/icon-theme.cache"; | |
fi; | |
fi; | |
if [[ -z $(ls "${dir}") ]]; then | |
rmdir "${dir}"; | |
fi; | |
done; | |
eend ${retval}; | |
for f in "${fails[@]}"; | |
do | |
eerror "Failed to update cache with icon $f"; | |
done | |
} | |
xdg_mimeinfo_database_update () | |
{ | |
if [[ ${EBUILD_PHASE} != post* ]]; then | |
die "xdg_mimeinfo_database_update must be used in pkg_post* phases."; | |
fi; | |
if ! type update-mime-database &> /dev/null; then | |
debug-print "update-mime-database is not found"; | |
return; | |
fi; | |
ebegin "Updating shared mime info database"; | |
update-mime-database "${EROOT%/}${MIMEINFO_DATABASE_DIR}"; | |
eend $? | |
} | |
xpi_copy () | |
{ | |
local emid; | |
[[ ${#} -ne 1 ]] && die "$FUNCNAME takes exactly one argument, please specify an xpi to unpack"; | |
x="${1}"; | |
if [[ -f "${x}"/install.rdf ]]; then | |
emid="$(sed -n -e '/install-manifest/,$ { /em:id/!d; s/.*[\">]\([^\"<>]*\)[\"<].*/\1/; p; q }' "${x}"/install.rdf)"; | |
[[ -z "${emid}" ]] && die "failed to determine extension id from install.rdf"; | |
else | |
if [[ -f "${x}"/manifest.json ]]; then | |
emid="$(sed -n 's/.*"id": "\([^"]*\)".*/\1/p' "${x}"/manifest.json)"; | |
[[ -z "${emid}" ]] && die "failed to determine extension id from manifest.json"; | |
else | |
die "failed to determine extension id"; | |
fi; | |
fi; | |
if [[ -n ${MOZEXTENSION_TARGET} ]]; then | |
insinto "${MOZILLA_FIVE_HOME}"/${MOZEXTENSION_TARGET%/}; | |
else | |
if $(mozversion_extension_location); then | |
insinto "${MOZILLA_FIVE_HOME}"/browser/extensions; | |
else | |
insinto "${MOZILLA_FIVE_HOME}"/extensions; | |
fi; | |
fi; | |
newins "${DISTDIR%/}"/${x##*/}.xpi ${emid}.xpi | |
} | |
xpi_install () | |
{ | |
local emid; | |
[[ ${#} -ne 1 ]] && die "$FUNCNAME takes exactly one argument, please specify an xpi to unpack"; | |
x="${1}"; | |
if [[ -f "${x}"/install.rdf ]]; then | |
emid="$(sed -n -e '/install-manifest/,$ { /em:id/!d; s/.*[\">]\([^\"<>]*\)[\"<].*/\1/; p; q }' "${x}"/install.rdf)"; | |
[[ -z "${emid}" ]] && die "failed to determine extension id from install.rdf"; | |
else | |
if [[ -f "${x}"/manifest.json ]]; then | |
emid="$( sed -n 's/.*"id": "\(.*\)".*/\1/p' "${x}"/manifest.json )"; | |
[[ -z "${emid}" ]] && die "failed to determine extension id from manifest.json"; | |
else | |
die "failed to determine extension id"; | |
fi; | |
fi; | |
if [[ -n ${MOZEXTENSION_TARGET} ]]; then | |
insinto "${MOZILLA_FIVE_HOME}"/${MOZEXTENSION_TARGET%/}/${emid}; | |
else | |
if $(mozversion_extension_location); then | |
insinto "${MOZILLA_FIVE_HOME}"/browser/extensions/${emid}; | |
else | |
insinto "${MOZILLA_FIVE_HOME}"/extensions/${emid}; | |
fi; | |
fi; | |
doins -r "${x}"/* || die "failed to copy extension" | |
} | |
xpi_unpack () | |
{ | |
local xpi xpiname srcdir; | |
[[ -z "$*" ]] && die "Nothing passed to the $FUNCNAME command. please pass which xpi to unpack"; | |
for xpi in "$@"; | |
do | |
einfo "Unpacking ${xpi} to ${PWD}"; | |
xpiname=$(basename ${xpi%.*}); | |
if [[ "${xpi:0:2}" != "./" ]] && [[ "${xpi:0:1}" != "/" ]]; then | |
srcdir="${DISTDIR}/"; | |
fi; | |
[[ -s "${srcdir}${xpi}" ]] || die "${xpi} does not exist"; | |
case "${xpi##*.}" in | |
ZIP | zip | jar | xpi) | |
mkdir "${WORKDIR}/${xpiname}" && unzip -qo "${srcdir}${xpi}" -d "${WORKDIR}/${xpiname}" || die "failed to unpack ${xpi}" | |
;; | |
*) | |
einfo "unpack ${xpi}: file format not recognized. Ignoring." | |
;; | |
esac; | |
done | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment