declare -x ABI="amd64" declare -x ABI_MIPS="" declare -x ABI_S390="" declare -x ABI_X86="64" declare -x ADA_TARGET="" 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 AMDGPU_TARGETS="" declare -- AM_OPTS="" declare -x APACHE2_MODULES="" declare -x APACHE2_MPMS="" declare -x ARCH="amd64" declare -- AT_M4DIR="" declare -- AT_NOEAUTOHEADER="" declare -- AT_NOEAUTOMAKE="" declare -- AT_NOELIBTOOLIZE="" declare -- AT_SYS_M4DIR="" declare -- AUTOTOOLS_AUTO_DEPEND="yes" declare -- AUTOTOOLS_DEPEND=$'|| ( >=dev-build/automake-1.16.5:1.16 )\n\t|| ( >=dev-build/autoconf-2.72-r1:2.72 >=dev-build/autoconf-2.71-r6:2.71 )\n\t>=dev-build/libtool-2.4.7' declare -x AVERAGE="32" declare BDEPEND=$'sys-apps/texinfo\n\tvirtual/pkgconfig\n\tgzip-el? ( app-arch/gzip ) sys-devel/gnuconfig >=app-portage/elt-patches-20170815 || ( >=dev-build/automake-1.16.5:1.16 )\n\t|| ( >=dev-build/autoconf-2.72-r1:2.72 >=dev-build/autoconf-2.71-r6:2.71 )\n\t>=dev-build/libtool-2.4.7 >=dev-vcs/git-1.8.2.1[curl]' declare -x BINPKG_FORMAT="gpkg" declare -x BINPKG_GPG_SIGNING_BASE_COMMAND="/usr/bin/flock /run/lock/portage-binpkg-gpg.lock /usr/bin/gpg --sign --armor [PORTAGE_CONFIG]" declare -x BINPKG_GPG_SIGNING_DIGEST="SHA512" declare -x BINPKG_GPG_VERIFY_BASE_COMMAND="/usr/bin/gpg --verify --batch --no-tty --no-auto-check-trustdb --status-fd 2 [PORTAGE_CONFIG] [SIGNATURE]" declare -x BINPKG_GPG_VERIFY_GPG_HOME="/etc/portage/gnupg" declare -x BOOTSTRAP_USE="unicode internal-glib pkg-config split-usr xml python_targets_python3_11 python_single_target_python3_11 multilib systemd sysv-utils udev" declare -- BYTECOMPFLAGS="-L ." declare -x CALLIGRA_FEATURES="" declare -x CAMERAS="" declare -x CBUILD="x86_64-pc-linux-gnu" declare -x CFLAGS="-march=native -Ofast -fno-stack-protector -fno-finite-math-only -pipe -fno-lto -Wno-error=odr -Wno-error=lto-type-mismatch -Wno-error=strict-aliasing" declare -x CFLAGS_amd64="-m64" declare -x CFLAGS_default declare -x CFLAGS_x32="-mx32" declare -x CFLAGS_x86="-m32 -mfpmath=sse" 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 CMAKE_MAKEFILE_GENERATOR="ninja" declare -x COLLECTD_PLUGINS="" declare -x COMMON_FLAGS="-march=native -Ofast -fno-stack-protector -fno-finite-math-only -pipe -fno-lto -Wno-error=odr -Wno-error=lto-type-mismatch -Wno-error=strict-aliasing" declare -x CONF_PREFIX="/usr" 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 CXXFLAGS="-march=native -Ofast -fno-stack-protector -fno-finite-math-only -pipe -fno-lto -Wno-error=odr -Wno-error=lto-type-mismatch -Wno-error=strict-aliasing -fpermissive" declare -x DEFAULT_ABI="amd64" declare -x DEFINED_PHASES=" compile configure install postinst postrm preinst prepare test unpack" declare DEPEND=$'app-emacs/emacs-common[games?,gui(-)?]\n\tsys-libs/ncurses:0=\n\tacl? ( virtual/acl )\n\talsa? ( media-libs/alsa-lib )\n\tdbus? ( sys-apps/dbus )\n\tgames? ( acct-group/gamestat )\n\tgmp? ( dev-libs/gmp:0= )\n\tgpm? ( sys-libs/gpm )\n\t!inotify? ( gfile? ( >=dev-libs/glib-2.28.6 ) )\n\tjit? (\n\t\tsys-devel/gcc:=[jit(-)]\n\t\tsys-libs/zlib\n\t)\n\tjson? ( dev-libs/jansson:= )\n\tkerberos? ( virtual/krb5 )\n\tlcms? ( media-libs/lcms:2 )\n\tlibxml2? ( >=dev-libs/libxml2-2.2.0 )\n\tmailutils? ( net-mail/mailutils[clients] )\n\t!mailutils? ( acct-group/mail net-libs/liblockfile )\n\tselinux? ( sys-libs/libselinux )\n\tsqlite? ( dev-db/sqlite:3 )\n\tssl? ( net-libs/gnutls:0= )\n\tsystemd? ( sys-apps/systemd )\n\ttree-sitter? ( dev-libs/tree-sitter )\n\tvalgrind? ( dev-debug/valgrind )\n\txattr? ( sys-apps/attr )\n\tzlib? ( sys-libs/zlib )\n\tgui? (\n\t\tgif? ( media-libs/giflib:0= )\n\t\tjpeg? ( media-libs/libjpeg-turbo:0= )\n\t\tpng? ( >=media-libs/libpng-1.4:0= )\n\t\tsvg? ( >=gnome-base/librsvg-2.0 )\n\t\ttiff? ( media-libs/tiff:= )\n\t\twebp? ( media-libs/libwebp:0= )\n\t\timagemagick? ( media-gfx/imagemagick:0=[jpeg?,png?,svg?,tiff?] )\n\t\t!aqua? (\n\t\t\tgsettings? (\n\t\t\t\tapp-emacs/emacs-common[gsettings(-)]\n\t\t\t\t>=dev-libs/glib-2.28.6\n\t\t\t)\n\t\t\tgtk? ( !X? (\n\t\t\t\tmedia-libs/fontconfig\n\t\t\t\tmedia-libs/freetype\n\t\t\t\t>=x11-libs/cairo-1.12.18\n\t\t\t\tx11-libs/gtk+:3\n\t\t\t\tharfbuzz? ( media-libs/harfbuzz:0= )\n\t\t\t\tm17n-lib? (\n\t\t\t\t\t>=dev-libs/libotf-0.9.4\n\t\t\t\t\t>=dev-libs/m17n-lib-1.5.1\n\t\t\t\t)\n\t\t\t\txwidgets? ( net-libs/webkit-gtk:4.1= )\n\t\t\t) )\n\t\t\t!gtk? ( x11-libs/libICE\n\tx11-libs/libSM\n\tx11-libs/libX11\n\tx11-libs/libXcomposite\n\tx11-libs/libXext\n\tx11-libs/libXfixes\n\tx11-libs/libXi\n\tx11-libs/libXinerama\n\tx11-libs/libXrandr\n\tx11-libs/libxcb\n\tx11-libs/xcb-util\n\tx11-misc/xbitmaps\n\txpm? ( x11-libs/libXpm )\n\txft? (\n\t\tmedia-libs/fontconfig\n\t\tmedia-libs/freetype\n\t\tx11-libs/libXrender\n\t\tcairo? ( >=x11-libs/cairo-1.12.18[X] )\n\t\t!cairo? ( x11-libs/libXft )\n\t\tharfbuzz? ( media-libs/harfbuzz:0= )\n\t\tm17n-lib? (\n\t\t\t>=dev-libs/libotf-0.9.4\n\t\t\t>=dev-libs/m17n-lib-1.5.1\n\t\t)\n\t)\n\tgtk? (\n\t\tx11-libs/gtk+:3\n\t\txwidgets? (\n\t\t\tnet-libs/webkit-gtk:4.1=\n\t\t\tx11-libs/libXcomposite\n\t\t)\n\t)\n\t!gtk? (\n\t\tmotif? (\n\t\t\t>=x11-libs/motif-2.3:0\n\t\t\tx11-libs/libXpm\n\t\t\tx11-libs/libXmu\n\t\t\tx11-libs/libXt\n\t\t)\n\t\t!motif? (\n\t\t\tXaw3d? (\n\t\t\t\tx11-libs/libXaw3d\n\t\t\t\tx11-libs/libXmu\n\t\t\t\tx11-libs/libXt\n\t\t\t)\n\t\t\t!Xaw3d? ( athena? (\n\t\t\t\tx11-libs/libXaw\n\t\t\t\tx11-libs/libXmu\n\t\t\t\tx11-libs/libXt\n\t\t\t) )\n\t\t)\n\t) )\n\t\t\tX? ( x11-libs/libICE\n\tx11-libs/libSM\n\tx11-libs/libX11\n\tx11-libs/libXcomposite\n\tx11-libs/libXext\n\tx11-libs/libXfixes\n\tx11-libs/libXi\n\tx11-libs/libXinerama\n\tx11-libs/libXrandr\n\tx11-libs/libxcb\n\tx11-libs/xcb-util\n\tx11-misc/xbitmaps\n\txpm? ( x11-libs/libXpm )\n\txft? (\n\t\tmedia-libs/fontconfig\n\t\tmedia-libs/freetype\n\t\tx11-libs/libXrender\n\t\tcairo? ( >=x11-libs/cairo-1.12.18[X] )\n\t\t!cairo? ( x11-libs/libXft )\n\t\tharfbuzz? ( media-libs/harfbuzz:0= )\n\t\tm17n-lib? (\n\t\t\t>=dev-libs/libotf-0.9.4\n\t\t\t>=dev-libs/m17n-lib-1.5.1\n\t\t)\n\t)\n\tgtk? (\n\t\tx11-libs/gtk+:3\n\t\txwidgets? (\n\t\t\tnet-libs/webkit-gtk:4.1=\n\t\t\tx11-libs/libXcomposite\n\t\t)\n\t)\n\t!gtk? (\n\t\tmotif? (\n\t\t\t>=x11-libs/motif-2.3:0\n\t\t\tx11-libs/libXpm\n\t\t\tx11-libs/libXmu\n\t\t\tx11-libs/libXt\n\t\t)\n\t\t!motif? (\n\t\t\tXaw3d? (\n\t\t\t\tx11-libs/libXaw3d\n\t\t\t\tx11-libs/libXmu\n\t\t\t\tx11-libs/libXt\n\t\t\t)\n\t\t\t!Xaw3d? ( athena? (\n\t\t\t\tx11-libs/libXaw\n\t\t\t\tx11-libs/libXmu\n\t\t\t\tx11-libs/libXt\n\t\t\t) )\n\t\t)\n\t) )\n\t\t)\n\t)\n\tgui? ( !aqua? (\n\t\t!gtk? ( x11-base/xorg-proto )\n\t\tX? ( x11-base/xorg-proto )\n\t) ) ' declare DESCRIPTION="The extensible, customizable, self-documenting real-time display editor" declare -x DIROPTIONS="-m0755" declare -- DISABLE_LTO="-fno-lto -Wno-error=odr -Wno-error=lto-type-mismatch -Wno-error=strict-aliasing" declare -x EAPI="8" declare -x EAT_SHELL_INTEGRATION_DIR="/home/st/.config/emacs/.local/straight/build-30.0.50/eat/integration" declare -- ECONF_SOURCE="." declare -- EGIT3_STORE_DIR="/var/cache/distfiles/git3-src" declare -- EGIT_BRANCH="master" declare -- EGIT_CHECKOUT_DIR="/var/tmp/portage/app-editors/emacs-30.0.9999/work/emacs" declare -- EGIT_CLONE_TYPE="single" declare -- EGIT_COMMIT="" declare -- EGIT_COMMIT_DATE="" declare -x EGIT_DIR="/var/cache/distfiles/git3-src/emacs.git" declare -- EGIT_LFS_CLONE_TYPE="shallow" declare -- EGIT_MIN_CLONE_TYPE="shallow" declare -- EGIT_REPO_URI="https://git.savannah.gnu.org/git/emacs.git" declare -x EGIT_VERSION="8d4a8b7dfd0905defac172cc58c2252dc1b39ad7" declare -x ELIBC="glibc" declare -- EMACS="/usr/bin/emacs" declare -- EMACSFLAGS="-batch -q --no-site-file" declare -- EMACSMODULES="/usr/@libdir@/emacs/modules" declare -- EMACS_SUFFIX="emacs-30-vcs" declare -x ENV="''" declare -x ENV_UNSET="CARGO_HOME DBUS_SESSION_BUS_ADDRESS DISPLAY GDK_PIXBUF_MODULE_FILE 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 XDG_STATE_HOME" declare -- EPOCHREALTIME="1710717660.596284" declare -- EPOCHSECONDS="1710717660" declare -a EVCS_STORE_DIRS=([0]="/var/cache/distfiles/git3-src/emacs.git" [1]="/var/cache/distfiles/git3-src/emacs.git") declare -x EXEOPTIONS="-m0755" declare -x FCFLAGS="-march=native -O3 -flto -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -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="-march=native -O3 -flto -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing -pipe" declare -x FFTOOLS="" declare -- FULL_VERSION="30.0.50" declare -x GCC_SPECS="" declare -x GPG_VERIFY_GROUP_DROP="nogroup" declare -x GPG_VERIFY_USER_DROP="nobody" declare -x GPSD_PROTOCOLS="" declare -x GRUB_PLATFORMS="" declare -x GSETTINGS_BACKEND="dconf" declare HOMEPAGE="https://www.gnu.org/software/emacs/" declare IDEPEND="app-eselect/eselect-emacs " declare -x INHERITED=" gnuconfig toolchain-funcs multilib libtool autotools elisp-common flag-o-matic readme.gentoo-r1 git-r3" declare -x INPUT_DEVICES="" declare -x INSIDE_EMACS="30.0.50,eat,tramp:2.7.1-pre" declare -x INSOPTIONS="-m0644" declare IUSE="acl alsa aqua athena cairo dbus dynamic-loading games gfile gif +gmp gpm gsettings gtk gui gzip-el harfbuzz imagemagick +inotify jit jpeg json kerberos lcms libxml2 livecd m17n-lib mailutils motif png selinux sound source sqlite ssl svg systemd +threads tiff toolkit-scroll-bars tree-sitter valgrind webp wide-int +X xattr Xaw3d xft +xpm xwidgets zlib " declare -x IUSE_EFFECTIVE="X Xaw3d abi_x86_64 acl alpha alsa amd64 amd64-linux aqua arm arm64 arm64-macos athena cairo dbus dynamic-loading elibc_Darwin elibc_SunOS elibc_bionic elibc_glibc elibc_mingw elibc_musl games gfile gif gmp gpm gsettings gtk gui gzip-el harfbuzz hppa ia64 imagemagick inotify jit jpeg json kerberos kernel_Darwin kernel_SunOS kernel_linux lcms libxml2 livecd loong m17n-lib m68k mailutils mips motif png ppc ppc-macos ppc64 ppc64-linux prefix prefix-guest prefix-stack riscv s390 selinux sound source sparc sqlite ssl svg systemd threads tiff toolkit-scroll-bars tree-sitter valgrind webp wide-int x64-macos x64-solaris x86 x86-linux xattr xft xpm xwidgets zlib" declare -x IUSE_IMPLICIT="abi_x86_64 prefix prefix-guest prefix-stack" declare -x KERNEL="linux" declare -x KERNEL_ABI="amd64" declare -x KEYWORDS="" declare -x L10N="" declare -x LANG="C.utf8" declare -x LCD_DEVICES="" declare -x LC_ADDRESS="en_US.utf8" declare -x LC_COLLATE="C" declare -x LC_CTYPE="en_US.utf8" declare -x LC_IDENTIFICATION="en_US.utf8" declare -x LC_MEASUREMENT="en_US.utf8" declare -x LC_MESSAGES="en_US.utf8" declare -x LC_MONETARY="en_US.utf8" declare -x LC_NAME="en_US.utf8" declare -x LC_NUMERIC="en_US.utf8" declare -x LC_PAPER="en_US.utf8" declare -x LC_TELEPHONE="en_US.utf8" declare -x LC_TIME="en_US.utf8" declare -- LD="/usr/bin/ld.bfd" declare -x LDFLAGS="-Wl,--as-needed -Wl,-Ofast -Wl,--sort-common" 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 LEX="flex" 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="GPL-3+ FDL-1.3+ BSD HPND MIT W3C unicode PSF-2" declare -x LINES="58" declare -x LLVM_SLOT="" declare -x LLVM_TARGETS="" declare -x LUA_SINGLE_TARGET="" declare -x LUA_TARGETS="" declare -x MAKEOPTS="-j32 -l32" declare -x MANPAGER="manpager" declare -x MARCH="native" declare -x MONKEYD_PLUGINS="" 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|binutils|eclipse-3|debug|portage|udev|systemd|clang|python-exec|llvm)" declare -- NEED_EMACS="25.3" declare -x NGINX_MODULES_HTTP="" declare -x NGINX_MODULES_MAIL="" declare -x NGINX_MODULES_STREAM="" declare -x NPM_CONFIG_GLOBALCONFIG="/etc/npm/npmrc" declare -x NTHREADS="32" declare -x OFFICE_IMPLEMENTATION="" declare -x OPENMPI_FABRICS="" declare -x OPENMPI_OFED_FEATURES="" declare -x OPENMPI_RM="" declare -x OPTLEVEL="3" declare -x PATH="/usr/lib/portage/python3.11/ebuild-helpers/xattr:/usr/lib/portage/python3.11/ebuild-helpers:/usr/local/sbin:/usr/local/bin:/usr/bin:/opt/bin:/usr/lib/llvm/18/bin:/usr/lib/llvm/17/bin:/usr/lib/llvm/16/bin" declare PDEPEND="" declare -x PHP_TARGETS="" declare -x PORTAGE_COMPRESSION_COMMAND="zstd -T32" 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/emacs-30.0.9999/html") declare -a PORTAGE_DOSTRIP=([0]="/") declare -a PORTAGE_DOSTRIP_SKIP=() declare -x POSTGRES_TARGETS="" declare -x PRIORITY="5" declare -x PROFILE_ONLY_VARIABLES="ARCH ELIBC IUSE_IMPLICIT KERNEL USE_EXPAND_IMPLICIT USE_EXPAND_UNPREFIXED USE_EXPAND_VALUES_ARCH USE_EXPAND_VALUES_ELIBC USE_EXPAND_VALUES_KERNEL" declare -x PROMPT_COMMAND="" declare -- PROPERTIES="live" declare -x PS3="" declare -x PYTHONDONTWRITEBYTECODE="1" declare -x PYTHON_SINGLE_TARGET="" declare -x PYTHON_TARGETS="" declare -a QA_CONFIG_IMPL_DECL_SKIP=([0]="malloc_set_state" [1]="malloc_get_state" [2]="MIN" [3]="static_assert" [4]="alignof" [5]="unreachable" [6]="statvfs64" [7]="re_set_syntax" [8]="re_compile_pattern" [9]="re_search" [10]="re_match") declare -- QA_FLAGS_IGNORED="usr/lib64/emacs/30.0.50/native-lisp/.*" declare -x QEMU_SOFTMMU_TARGETS="" declare -x QEMU_USER_TARGETS="" declare RDEPEND=$'app-emacs/emacs-common[games?,gui(-)?]\n\tsys-libs/ncurses:0=\n\tacl? ( virtual/acl )\n\talsa? ( media-libs/alsa-lib )\n\tdbus? ( sys-apps/dbus )\n\tgames? ( acct-group/gamestat )\n\tgmp? ( dev-libs/gmp:0= )\n\tgpm? ( sys-libs/gpm )\n\t!inotify? ( gfile? ( >=dev-libs/glib-2.28.6 ) )\n\tjit? (\n\t\tsys-devel/gcc:=[jit(-)]\n\t\tsys-libs/zlib\n\t)\n\tjson? ( dev-libs/jansson:= )\n\tkerberos? ( virtual/krb5 )\n\tlcms? ( media-libs/lcms:2 )\n\tlibxml2? ( >=dev-libs/libxml2-2.2.0 )\n\tmailutils? ( net-mail/mailutils[clients] )\n\t!mailutils? ( acct-group/mail net-libs/liblockfile )\n\tselinux? ( sys-libs/libselinux )\n\tsqlite? ( dev-db/sqlite:3 )\n\tssl? ( net-libs/gnutls:0= )\n\tsystemd? ( sys-apps/systemd )\n\ttree-sitter? ( dev-libs/tree-sitter )\n\tvalgrind? ( dev-debug/valgrind )\n\txattr? ( sys-apps/attr )\n\tzlib? ( sys-libs/zlib )\n\tgui? (\n\t\tgif? ( media-libs/giflib:0= )\n\t\tjpeg? ( media-libs/libjpeg-turbo:0= )\n\t\tpng? ( >=media-libs/libpng-1.4:0= )\n\t\tsvg? ( >=gnome-base/librsvg-2.0 )\n\t\ttiff? ( media-libs/tiff:= )\n\t\twebp? ( media-libs/libwebp:0= )\n\t\timagemagick? ( media-gfx/imagemagick:0=[jpeg?,png?,svg?,tiff?] )\n\t\t!aqua? (\n\t\t\tgsettings? (\n\t\t\t\tapp-emacs/emacs-common[gsettings(-)]\n\t\t\t\t>=dev-libs/glib-2.28.6\n\t\t\t)\n\t\t\tgtk? ( !X? (\n\t\t\t\tmedia-libs/fontconfig\n\t\t\t\tmedia-libs/freetype\n\t\t\t\t>=x11-libs/cairo-1.12.18\n\t\t\t\tx11-libs/gtk+:3\n\t\t\t\tharfbuzz? ( media-libs/harfbuzz:0= )\n\t\t\t\tm17n-lib? (\n\t\t\t\t\t>=dev-libs/libotf-0.9.4\n\t\t\t\t\t>=dev-libs/m17n-lib-1.5.1\n\t\t\t\t)\n\t\t\t\txwidgets? ( net-libs/webkit-gtk:4.1= )\n\t\t\t) )\n\t\t\t!gtk? ( x11-libs/libICE\n\tx11-libs/libSM\n\tx11-libs/libX11\n\tx11-libs/libXcomposite\n\tx11-libs/libXext\n\tx11-libs/libXfixes\n\tx11-libs/libXi\n\tx11-libs/libXinerama\n\tx11-libs/libXrandr\n\tx11-libs/libxcb\n\tx11-libs/xcb-util\n\tx11-misc/xbitmaps\n\txpm? ( x11-libs/libXpm )\n\txft? (\n\t\tmedia-libs/fontconfig\n\t\tmedia-libs/freetype\n\t\tx11-libs/libXrender\n\t\tcairo? ( >=x11-libs/cairo-1.12.18[X] )\n\t\t!cairo? ( x11-libs/libXft )\n\t\tharfbuzz? ( media-libs/harfbuzz:0= )\n\t\tm17n-lib? (\n\t\t\t>=dev-libs/libotf-0.9.4\n\t\t\t>=dev-libs/m17n-lib-1.5.1\n\t\t)\n\t)\n\tgtk? (\n\t\tx11-libs/gtk+:3\n\t\txwidgets? (\n\t\t\tnet-libs/webkit-gtk:4.1=\n\t\t\tx11-libs/libXcomposite\n\t\t)\n\t)\n\t!gtk? (\n\t\tmotif? (\n\t\t\t>=x11-libs/motif-2.3:0\n\t\t\tx11-libs/libXpm\n\t\t\tx11-libs/libXmu\n\t\t\tx11-libs/libXt\n\t\t)\n\t\t!motif? (\n\t\t\tXaw3d? (\n\t\t\t\tx11-libs/libXaw3d\n\t\t\t\tx11-libs/libXmu\n\t\t\t\tx11-libs/libXt\n\t\t\t)\n\t\t\t!Xaw3d? ( athena? (\n\t\t\t\tx11-libs/libXaw\n\t\t\t\tx11-libs/libXmu\n\t\t\t\tx11-libs/libXt\n\t\t\t) )\n\t\t)\n\t) )\n\t\t\tX? ( x11-libs/libICE\n\tx11-libs/libSM\n\tx11-libs/libX11\n\tx11-libs/libXcomposite\n\tx11-libs/libXext\n\tx11-libs/libXfixes\n\tx11-libs/libXi\n\tx11-libs/libXinerama\n\tx11-libs/libXrandr\n\tx11-libs/libxcb\n\tx11-libs/xcb-util\n\tx11-misc/xbitmaps\n\txpm? ( x11-libs/libXpm )\n\txft? (\n\t\tmedia-libs/fontconfig\n\t\tmedia-libs/freetype\n\t\tx11-libs/libXrender\n\t\tcairo? ( >=x11-libs/cairo-1.12.18[X] )\n\t\t!cairo? ( x11-libs/libXft )\n\t\tharfbuzz? ( media-libs/harfbuzz:0= )\n\t\tm17n-lib? (\n\t\t\t>=dev-libs/libotf-0.9.4\n\t\t\t>=dev-libs/m17n-lib-1.5.1\n\t\t)\n\t)\n\tgtk? (\n\t\tx11-libs/gtk+:3\n\t\txwidgets? (\n\t\t\tnet-libs/webkit-gtk:4.1=\n\t\t\tx11-libs/libXcomposite\n\t\t)\n\t)\n\t!gtk? (\n\t\tmotif? (\n\t\t\t>=x11-libs/motif-2.3:0\n\t\t\tx11-libs/libXpm\n\t\t\tx11-libs/libXmu\n\t\t\tx11-libs/libXt\n\t\t)\n\t\t!motif? (\n\t\t\tXaw3d? (\n\t\t\t\tx11-libs/libXaw3d\n\t\t\t\tx11-libs/libXmu\n\t\t\t\tx11-libs/libXt\n\t\t\t)\n\t\t\t!Xaw3d? ( athena? (\n\t\t\t\tx11-libs/libXaw\n\t\t\t\tx11-libs/libXmu\n\t\t\t\tx11-libs/libXt\n\t\t\t) )\n\t\t)\n\t) )\n\t\t)\n\t) app-eselect/eselect-emacs ' declare -- README_GENTOO_SUFFIX="" declare REPOSITORY declare REQUIRED_USE="" declare RESTRICT="" 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 RUBY_TARGETS="" declare -x RUSTFLAGS="-Copt-level=3 -Ctarget-cpu=native -Ccodegen-units=32 -Clto=fat -Cembed-bitcode -Zdylib-lto" declare -x S="/var/tmp/portage/app-editors/emacs-30.0.9999/work/emacs" declare -x SANDBOX_DEBUG="0" declare -x SANDBOX_DENY="" declare -x SANDBOX_METHOD="any" declare -x SANDBOX_PREDICT="/var/tmp/portage/app-editors/emacs-30.0.9999/homedir:/dev/crypto:/var/cache/man:/dev/nvidiactl:/dev/nvidia-caps:/dev/char:/var/cache/fontconfig" 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/:/usr/tmp/cf:/usr/tmp/conftest:/var/cache/distfiles/git3-src:/var/tmp/:/var/tmp/portage:/var/tmp/portage/app-editors/emacs-30.0.9999/homedir/.bash_history" declare -x SANE_BACKENDS="" declare -x SHELL="/usr/bin/dash" declare -- SITEETC="/usr/share/emacs/etc" declare -- SITEFILE="20emacs-30-vcs-gentoo.el" declare -- SITELISP="/usr/share/emacs/site-lisp" declare -x SLOT="30-vcs" declare -i SRANDOM="3023394258" declare SRC_URI declare -x SUDO_COMMAND="/usr/bin/dash -c /bin/sh -i" declare -x SUDO_GID="1000" declare -x SUDO_UID="1000" declare -x SUDO_USER="st" declare -x SYMLINK_LIB="no" declare -x TERMINFO="/home/st/.config/emacs/.local/straight/build-30.0.50/eat/terminfo" declare -x THREADS="32" declare -x TMOUT="0" declare -x TWISTED_DISABLE_WRITING_OF_PLUGIN_CACHE="1" declare -x UCOMP="bash-completion zsh-completion fish-completion" declare -x UCOMPRESSION="bzip2 zlib zstd gzip lzo lzma modules-compress" declare -x UCONN="wifi bluetooth zeroconf" declare -x UCRYPT="crypt gnupg gpg" declare -x UDEVEL="git emacs -debug -doc debuginfod man" declare -x UGFX="gif jpeg png svg webp tiff xft lcms xml postscript truetype X qt6 gles2 appindicator libnotify fontconfig" declare -x UMISC="ncurses unicode dbus udev alsa games" declare -x UNVIDIA="nvidia vdpau nvenc vulkan opengl cuda" declare -x UOPTIMIZE="openmp boost graphite threads asm xs pgo pch lto jit optimization strong-optimization orc -ssp" declare -x USE="X Xaw3d abi_x86_64 acl amd64 athena cairo dbus dynamic-loading elibc_glibc games gif gmp gpm gui harfbuzz imagemagick inotify jit jpeg json kernel_linux lcms libxml2 m17n-lib mailutils png sound source sqlite ssl svg systemd threads tiff tree-sitter webp xattr xft xpm zlib" declare -x USERLAND="GNU" declare -x USE_EXPAND_IMPLICIT="ARCH ELIBC KERNEL" declare -x USE_EXPAND_UNPREFIXED="ARCH" declare -x USE_EXPAND_VALUES_ARCH="alpha amd64 amd64-linux arm arm64 arm64-macos hppa ia64 loong m68k mips ppc ppc64 ppc64-linux ppc-macos riscv s390 sparc x64-macos x64-solaris x86 x86-linux" declare -x USE_EXPAND_VALUES_ELIBC="bionic Darwin glibc mingw musl SunOS" declare -x USE_EXPAND_VALUES_KERNEL="Darwin linux SunOS" declare -x USOUND="pulseaudio pipewire sound-server" declare -x USYS="grub dist-kernel" declare -x USYSTEM="native-symlinks system-libyaml system-lua system-bootstrap system-llvm system-lz4 system-sqlite system-ffmpeg system-icu system-av1 system-harfbuzz system-jpeg system-libevent system-librnp system-libvpx system-png system-python-libs system-webp system-ssl system-zlib system-boost" declare -x UWSGI_PLUGINS="" declare -x VIDEO_CARDS="" declare -x VOICEMAIL_STORAGE="" declare -x WANT_AUTOCONF="2.72" declare -x WANT_AUTOMAKE="1.16" declare -x WANT_LIBTOOL="latest" declare -x WARNING_FLAGS="-Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing" declare -x XDG_CONFIG_DIRS="/etc/xdg" declare -x XDG_DATA_DIRS="/usr/local/share:/usr/share" declare -x XTABLES_ADDONS="" declare -- X_DEPEND=$'x11-libs/libICE\n\tx11-libs/libSM\n\tx11-libs/libX11\n\tx11-libs/libXcomposite\n\tx11-libs/libXext\n\tx11-libs/libXfixes\n\tx11-libs/libXi\n\tx11-libs/libXinerama\n\tx11-libs/libXrandr\n\tx11-libs/libxcb\n\tx11-libs/xcb-util\n\tx11-misc/xbitmaps\n\txpm? ( x11-libs/libXpm )\n\txft? (\n\t\tmedia-libs/fontconfig\n\t\tmedia-libs/freetype\n\t\tx11-libs/libXrender\n\t\tcairo? ( >=x11-libs/cairo-1.12.18[X] )\n\t\t!cairo? ( x11-libs/libXft )\n\t\tharfbuzz? ( media-libs/harfbuzz:0= )\n\t\tm17n-lib? (\n\t\t\t>=dev-libs/libotf-0.9.4\n\t\t\t>=dev-libs/m17n-lib-1.5.1\n\t\t)\n\t)\n\tgtk? (\n\t\tx11-libs/gtk+:3\n\t\txwidgets? (\n\t\t\tnet-libs/webkit-gtk:4.1=\n\t\t\tx11-libs/libXcomposite\n\t\t)\n\t)\n\t!gtk? (\n\t\tmotif? (\n\t\t\t>=x11-libs/motif-2.3:0\n\t\t\tx11-libs/libXpm\n\t\t\tx11-libs/libXmu\n\t\t\tx11-libs/libXt\n\t\t)\n\t\t!motif? (\n\t\t\tXaw3d? (\n\t\t\t\tx11-libs/libXaw3d\n\t\t\t\tx11-libs/libXmu\n\t\t\t\tx11-libs/libXt\n\t\t\t)\n\t\t\t!Xaw3d? ( athena? (\n\t\t\t\tx11-libs/libXaw\n\t\t\t\tx11-libs/libXmu\n\t\t\t\tx11-libs/libXt\n\t\t\t) )\n\t\t)\n\t)' declare -- _AUTOTOOLS_AUTO_DEPEND="yes" declare -- _AUTOTOOLS_ECLASS="1" declare -- _ELISP_EMACS_VERSION="" declare -- _FLAG_O_MATIC_ECLASS="1" declare -- _GIT_R3_ECLASS="1" declare -- _GNUCONFIG_CLASS="1" declare -a _LATEST_AUTOCONF=([0]="2.72-r1:2.72" [1]="2.71-r6:2.71") declare -a _LATEST_AUTOMAKE=([0]="1.16.5:1.16") declare -- _LIBTOOL_ECLASS="1" declare -- _MULTILIB_ECLASS="1" declare -- _README_GENTOO_ECLASS="1" declare -- _TOOLCHAIN_FUNCS_ECLASS="1" declare -x __E_DESTTREE="/usr" declare -x __E_DOCDESTTREE="" declare -x __E_EXEDESTTREE="" declare -x __E_INSDESTTREE="" declare -- _libtool_atom=">=dev-build/libtool-2.4.7" declare -x ac_cv_c_undeclared_builtin_options="none needed" declare -x enable_year2038="no" declare -x gl_cv_compiler_check_decl_option="-Werror=implicit-function-declaration" declare -x gl_cv_func_getcwd_path_max="yes" __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 } __eapi7_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]}; __eapi7_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 __eapi7_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 __eapi7_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; __eapi7_ver_compare_int "${ar#-r}" "${br#-r}" || return; return 2 } __eapi7_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}" ]] } __eapi7_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 } __eapi7_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 } __eapi8_src_prepare () { local f; 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; grep -E -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 "${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_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) if ! gcc-specs-pie && ! tc-enables-pie; then continue; fi; 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 | -fstack-protector-strong) if ! gcc-specs-ssp && ! tc-enables-ssp && ! tc-enables-ssp-strong; then continue; fi; is-flagq -fno-stack-protector || append-flags $(test-flags -fno-stack-protector) ;; -fstack-protector-all) if ! gcc-specs-ssp-to-all && ! tc-enables-ssp-all; then continue; fi; 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) ;; -D_GLIBCXX_ASSERTIONS | -D_LIBCPP_ENABLE_ASSERTIONS | -D_LIBCPP_ENABLE_HARDENED_MODE) tc-enables-cxx-assertions || continue; append-cppflags -U_GLIBCXX_ASSERTIONS -U_LIBCPP_ENABLE_ASSERTIONS -U_LIBCPP_ENABLE_HARDENED_MODE ;; -D_FORTIFY_SOURCE=*) tc-enables-fortify-source || continue; append-cppflags -U_FORTIFY_SOURCE ;; 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}" } _git-r3_env_setup () { debug-print-function ${FUNCNAME} "$@"; case "${EGIT_CLONE_TYPE}" in mirror | single+tags | single | shallow) ;; *) die "Invalid EGIT_CLONE_TYPE=${EGIT_CLONE_TYPE}" ;; esac; case "${EGIT_MIN_CLONE_TYPE}" in shallow) ;; single) if [[ ${EGIT_CLONE_TYPE} == shallow ]]; then einfo "git-r3: ebuild needs to be cloned in 'single' mode, adjusting"; EGIT_CLONE_TYPE=single; fi ;; single+tags) if [[ ${EGIT_CLONE_TYPE} == shallow || ${EGIT_CLONE_TYPE} == single ]]; then einfo "git-r3: ebuild needs to be cloned in 'single+tags' mode, adjusting"; EGIT_CLONE_TYPE=single+tags; fi ;; mirror) if [[ ${EGIT_CLONE_TYPE} != mirror ]]; then einfo "git-r3: ebuild needs to be cloned in 'mirror' mode, adjusting"; EGIT_CLONE_TYPE=mirror; fi ;; *) die "Invalid EGIT_MIN_CLONE_TYPE=${EGIT_MIN_CLONE_TYPE}" ;; esac; if [[ -n ${EGIT_SUBMODULES[@]+1} && $(declare -p EGIT_SUBMODULES) != "declare -a"* ]]; then die 'EGIT_SUBMODULES must be an array.'; fi; local esc_pn livevar; esc_pn=${PN//[-+]/_}; [[ ${esc_pn} == [0-9]* ]] && esc_pn=_${esc_pn}; livevar=${esc_pn}_LIVE_REPO; EGIT_REPO_URI=${!livevar-${EGIT_REPO_URI}}; [[ -n ${!livevar} ]] && ewarn "Using ${livevar}, no support will be provided"; livevar=${esc_pn}_LIVE_BRANCH; EGIT_BRANCH=${!livevar-${EGIT_BRANCH}}; [[ -n ${!livevar} ]] && ewarn "Using ${livevar}, no support will be provided"; livevar=${esc_pn}_LIVE_COMMIT; EGIT_COMMIT=${!livevar-${EGIT_COMMIT}}; [[ -n ${!livevar} ]] && ewarn "Using ${livevar}, no support will be provided"; livevar=${esc_pn}_LIVE_COMMIT_DATE; EGIT_COMMIT_DATE=${!livevar-${EGIT_COMMIT_DATE}}; [[ -n ${!livevar} ]] && ewarn "Using ${livevar}, no support will be provided"; if [[ -n ${EGIT_COMMIT} && -n ${EGIT_COMMIT_DATE} ]]; then die "EGIT_COMMIT and EGIT_COMMIT_DATE can not be specified simultaneously"; fi } _git-r3_is_local_repo () { debug-print-function ${FUNCNAME} "$@"; local uri=${1}; [[ ${uri} == file://* || ${uri} == /* ]] } _git-r3_set_gitdir () { debug-print-function ${FUNCNAME} "$@"; local repo_name=${1#*://*/}; repo_name=${repo_name%/}; case "${repo_name}" in browse/*) repo_name=${repo_name#browse/} ;; cgit/*) repo_name=${repo_name#cgit/} ;; git/*) repo_name=${repo_name#git/} ;; gitroot/*) repo_name=${repo_name#gitroot/} ;; p/*) repo_name=${repo_name#p/} ;; pub/scm/*) repo_name=${repo_name#pub/scm/} ;; esac; repo_name=${repo_name%.git}.git; repo_name=${repo_name//\//_}; local distdir=${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}}; : "${EGIT3_STORE_DIR:=${distdir}/git3-src}"; GIT_DIR=${EGIT3_STORE_DIR}/${repo_name}; EVCS_STORE_DIRS+=("${GIT_DIR}"); if [[ ! -d ${EGIT3_STORE_DIR} && ! -n ${EVCS_OFFLINE} ]]; then ( addwrite /; mkdir -p "${EGIT3_STORE_DIR}" ) || die "Unable to create ${EGIT3_STORE_DIR}"; fi; addwrite "${EGIT3_STORE_DIR}"; if [[ ! -d ${GIT_DIR} ]]; then if [[ -n ${EVCS_OFFLINE} ]]; then eerror "A clone of the following repository is required to proceed:"; eerror " ${1}"; eerror "However, networking activity has been disabled using EVCS_OFFLINE and there"; eerror "is no local clone available."; die "No local clone of ${1}. Unable to proceed with EVCS_OFFLINE."; fi; local saved_umask; if [[ -n ${EVCS_UMASK} ]]; then saved_umask=$(umask); umask "${EVCS_UMASK}" || die "Bad options to umask: ${EVCS_UMASK}"; fi; mkdir "${GIT_DIR}" || die; git init --bare -b __init__ || die; if [[ -n ${saved_umask} ]]; then umask "${saved_umask}" || die; fi; fi } _git-r3_set_submodules () { debug-print-function ${FUNCNAME} "$@"; local parent_path=${1}; local data=${2}; [[ -z ${parent_path} || ${parent_path} == */ ]] || die; submodules=(); local l; while read l; do [[ ${l} == submodule.*.url=* ]] || continue; l=${l#submodule.}; local subname=${l%%.url=*}; if declare -p EGIT_SUBMODULES &> /dev/null; then local p l_res res=; for p in "${EGIT_SUBMODULES[@]}"; do if [[ ${p} == -* ]]; then p=${p#-}; l_res=; else l_res=1; fi; [[ ${parent_path}${subname} == ${p} ]] && res=${l_res}; done; if [[ ! -n ${res} ]]; then einfo "Skipping submodule ${parent_path}${subname}"; continue; else einfo "Using submodule ${parent_path}${subname}"; fi; fi; local upd=$(echo "${data}" | git config -f /dev/fd/0 submodule."${subname}".update); [[ ${upd} == none ]] && continue; local enc_subname=${subname//[^a-zA-Z0-9-]/_}; submodules+=("${enc_subname}" "$(echo "${data}" | git config -f /dev/fd/0 submodule."${subname}".url || die)" "$(echo "${data}" | git config -f /dev/fd/0 submodule."${subname}".path || die)"); done < <(echo "${data}" | git config -f /dev/fd/0 -l || die) } _git-r3_set_subrepos () { debug-print-function ${FUNCNAME} "$@"; local suburl=${1}; subrepos=("${@:2}"); if [[ ${suburl} == ./* || ${suburl} == ../* ]]; then subrepos=("${subrepos[@]%%/}"); while true; do if [[ ${suburl} == ./* ]]; then suburl=${suburl:2}; else if [[ ${suburl} == ../* ]]; then suburl=${suburl:3}; subrepos=("${subrepos[@]%/*}"); subrepos=("${subrepos[@]%%/}"); else break; fi; fi; done; subrepos=("${subrepos[@]/%//${suburl}}"); else subrepos=("${suburl}"); fi } _is_flagq () { local x var="$1[*]"; for x in ${!var}; do [[ ${x} == $2 ]] && return 0; done; return 1 } _setup-allowed-flags () { ALLOWED_FLAGS=(-pipe -O '-O[123szg]' '-mcpu=*' '-march=*' '-mtune=*' '-mfpmath=*' -flto '-flto=*' -fno-lto '-fstack-protector*' -fstack-clash-protection '-fcf-protection=*' -fbounds-check -fbounds-checking -fno-PIE -fno-pie -nopie -no-pie -fharden-compares -fharden-conditional-branches -fharden-control-flow-redundancy -fno-harden-control-flow-redundancy -fhardcfr-skip-leaf -fhardcfr-check-exceptions -fhardcfr-check-returning-calls '-fhardcfr-check-noreturn-calls=*' '-mindirect-branch=*' -mindirect-branch-register '-mfunction-return=*' -mretpoline '-mharden-sls=*' '-mbranch-protection=*' -fno-unit-at-a-time -fno-strict-overflow '-fsanitize*' '-fno-sanitize*' -g '-g[0-9]' -ggdb '-ggdb[0-9]' -gdwarf '-gdwarf-*' -gstabs -gstabs+ -gz -glldb '-fdebug-default-version=*' -fno-diagnostics-color '-fmessage-length=*' -fno-ident -fpermissive -frecord-gcc-switches -frecord-command-line '-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*' -mno-omit-leaf-frame-pointer); ALLOWED_FLAGS+=('-mregparm=*' -mno-app-regs -mapp-regs -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-ssse3 -mno-sse4 -mno-sse4.1 -mno-sse4.2 -mno-avx -mno-aes -mno-pclmul -mno-sse4a -mno-3dnow -mno-popcnt -mno-abm -mips1 -mips2 -mips3 -mips4 -mips32 -mips64 -mips16 -mplt -msoft-float -mno-soft-float -mhard-float -mno-hard-float '-mfpu=*' -mieee -mieee-with-inexact '-mschedule=*' -mfloat-gprs -mspe -mno-spe -mtls-direct-seg-refs -mno-tls-direct-seg-refs -mflat -mno-flat -mno-faster-structs -mfaster-structs -m32 -m64 -mx32 '-mabi=*' -mlittle-endian -mbig-endian -EL -EB -fPIC -mlive-g0 '-mcmodel=*' -mstack-bias -mno-stack-bias -msecure-plt '-m*-toc' '-mfloat-abi=*' '-mtls-dialect=*' -mfix-r4000 -mno-fix-r4000 -mfix-r4400 -mno-fix-r4400 -mfix-r10000 -mno-fix-r10000 '-mr10k-cache-barrier=*' -mthumb -marm -ffixed-x18 -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 '-mpreferred-stack-boundary=*' '-mincoming-stack-boundary=*'); ALLOWED_FLAGS+=('--unwindlib=*' '--rtlib=*' '--stdlib=*') } _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}" } _tc-has-openmp () { local base="${T}/test-tc-openmp"; cat <<-EOF > "${base}.c" #include int main(void) { 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} } _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; }'; if is-ldflagq -fuse-ld=*; then fuse_ld_value=$(get-flag -fuse-ld=*); cmdline_extra+=(${fuse_ld_value}); fi; 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}"); "${cmdline[@]}" &> /dev/null } _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 ]] } all-flag-vars () { echo {ADA,C,CPP,CXX,CCAS,F,FC,LD}FLAGS } append-atomic-flags () { local code; read -r -d '' code <<-EOF int main(void) { return 0; } EOF test-compile "c+ld" "${code}" || return; local bytesizes; [[ "${#}" == "0" ]] && bytesizes=("1" "2" "4" "8") || bytesizes="${@}"; for bytesize in ${bytesizes[@]}; do read -r -d '' code <<-EOF #include int main(void) { uint$((${bytesize} * 8))_t a = 0; __atomic_add_fetch(&a, 3, __ATOMIC_RELAXED); __atomic_compare_exchange_n(&a, &a, 2, 1, __ATOMIC_RELAXED, __ATOMIC_RELAXED); return 0; } EOF test-compile "c+ld" "${code}" && continue test-flags-CCLD "-latomic" &> /dev/null || die "-latomic is required but not supported by $(tc-getCC)"; append-libs "-latomic"; test-compile "c+ld" "${code}" || die "libatomic does not include an implementation of ${bytesize}-byte atomics for this toolchain"; return; done } 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} in 6) hv_args="--host-root" ;; *) hv_args="-b" ;; esac; has_version ${hv_args} "=dev-build/automake-${pv}*" && export WANT_AUTOMAKE="${pv}" && break; done; if use prefix && [[ ! -x "${BROOT}"/usr/bin/automake ]]; then [[ ${WANT_AUTOMAKE} == "latest" ]] && ewarn "Ignoring missing automake during Prefix bootstrap! Tried ${_LATEST_AUTOMAKE[*]}"; else [[ ${WANT_AUTOMAKE} == "latest" ]] && die "Cannot find the latest automake! Tried ${_LATEST_AUTOMAKE[*]}"; fi; fi; if [[ ${WANT_AUTOCONF} == "latest" ]]; then local pv; for pv in ${_LATEST_AUTOCONF[@]/#*:}; do local hv_args=""; case ${EAPI} in 6) hv_args="--host-root" ;; *) hv_args="-b" ;; esac; has_version ${hv_args} "=dev-build/autoconf-${pv}*" && export WANT_AUTOCONF="${pv}" && break; done; if use prefix && [[ ! -x "${BROOT}"/usr/bin/autoconf ]]; then [[ ${WANT_AUTOCONF} == "latest" ]] && ewarn "Ignoring missing autoconf during Prefix bootstrap! Tried ${_LATEST_AUTOCONF[*]}"; else [[ ${WANT_AUTOCONF} == "latest" ]] && die "Cannot find the latest autoconf! Tried ${_LATEST_AUTOCONF[*]}"; fi; fi } autotools_m4dir_include () { _autotools_m4dir_include ${AT_M4DIR} } autotools_m4sysdir_include () { local paths=($(eval echo ${AT_SYS_M4DIR})); _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_FUNC} != "src_prepare" ]]; then eqawarn "Running '${1}' in ${EBUILD_PHASE_FUNC} phase"; fi; if ${missing_ok} && ! type -P ${1} > /dev/null; then einfo "Skipping '$*' because '${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 bug report the contents of:"; eerror; eerror " ${STDERR_TARGET}"; echo; die "Failed running '${1}'!"; fi } 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; case ${EAPI} in 6) src="${EPREFIX}/usr/share/gettext/config.rpath" ;; *) src="${BROOT}/usr/share/gettext/config.rpath" ;; esac; [[ $# -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 } eaclocal () { if [[ ${EAPI} != 6 ]]; then if [[ ! -f "${T}"/aclocal/dirlist ]]; then mkdir "${T}"/aclocal || die; cat <<-EOF > "${T}"/aclocal/dirlist || ${BROOT}/usr/share/aclocal ${ESYSROOT}/usr/share/aclocal EOF die; fi local system_acdir=" --system-acdir=${T}/aclocal"; else local system_acdir=""; fi; [[ ! -f aclocal.m4 || -n $(grep -e 'generated.*by aclocal' aclocal.m4) ]] && autotools_run_tool --at-m4flags aclocal "$@" $(eaclocal_amflags) ${system_acdir} } 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 columns=${COLUMNS:-0}; [[ ${columns} == 0 ]] && columns=$(set -- $( ( stty size < /dev/tty ) 2> /dev/null || echo 24 80); echo $2); (( columns > 0 )) || (( columns = 80 )); 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 if [[ -z ${applied} ]]; then einfo "${PORTAGE_COLOR_INFO}$(for ((column = 0; column < ${columns} - 3; column++)) do echo -n =; done)${PORTAGE_COLOR_NORMAL}"; einfo "Applying user patches from ${basedir} ..."; fi; eapply "${f}"; applied=1; fi; done < <(printf -- '%s\0' "${!_eapply_user_patches[@]}" | LC_ALL=C sort -z); fi; ${prev_shopt}; if [[ -n ${applied} ]]; then einfo "User patches applied."; einfo "${PORTAGE_COLOR_INFO}$(for ((column = 0; column < ${columns} - 3; column++)) do echo -n =; done)${PORTAGE_COLOR_NORMAL}"; fi } 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 case ${EAPI} in 6 | 7) 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." ;; *) einfo "Moving configure.in to configure.ac (bug #426262)"; mv configure.{in,ac} || die ;; esac; fi; local _gnuconfig=$(gnuconfig_findnewest); cp "${_gnuconfig}"/config.{guess,sub} . || die; 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; [[ ${AT_NOEAUTOHEADER} != "yes" ]] && 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}}; function econf_env () { CHOST=${CBUILD} econf "$@" }; tc-env_build econf_env "$@" } 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" } elisp-check-emacs-version () { if [[ -z ${_ELISP_EMACS_VERSION} ]]; then local have_emacs; have_emacs=$(elisp-emacs-version) || die "Could not determine Emacs version"; einfo "Emacs version: ${have_emacs}"; if [[ ${have_emacs} =~ XEmacs|Lucid ]]; then die "XEmacs detected. This package needs GNU Emacs."; fi; if ! [[ ${have_emacs} =~ ^[0-9]+(\.[0-9]+)*$ ]]; then die "Malformed version string: ${have_emacs}"; fi; _ELISP_EMACS_VERSION=${have_emacs}; fi; if ! ver_test "${_ELISP_EMACS_VERSION}" -ge "${NEED_EMACS}"; then eerror "This package needs at least Emacs ${NEED_EMACS}."; eerror "Use \"eselect emacs\" to select the active version."; die "Emacs version too low"; fi } elisp-compile () { elisp-check-emacs-version; ebegin "Compiling GNU Emacs Elisp files"; ${EMACS} ${EMACSFLAGS} ${BYTECOMPFLAGS} -f batch-byte-compile "$@"; eend $? "elisp-compile: batch-byte-compile failed" || die } elisp-emacs-version () { local version ret tmout="timeout -k 5 55"; ${tmout} true &> /dev/null || tmout=""; echo "(princ emacs-version)" > "${T}"/emacs-version.el; version=$(unset TERM DISPLAY ${tmout} ${EMACS} ${EMACSFLAGS} -l "${T}"/emacs-version.el < /dev/null); ret=$?; rm -f "${T}"/emacs-version.el; if [[ ${ret} -ne 0 ]]; then eerror "elisp-emacs-version: Failed to run ${EMACS}"; [[ $(realpath ${EMACS} 2> /dev/null) == */emacs* ]] || eerror "This package needs GNU Emacs"; return ${ret}; fi; if [[ -z ${version} ]]; then eerror "elisp-emacs-version: Could not determine Emacs version"; return 1; fi; echo "${version}" } elisp-enable-tests () { debug-print-function ${FUNCNAME} "$@"; local optional; if [[ ${1} = "--optional" ]]; then optional=YES; shift; fi; local test_pkg; local test_runner=${1}; shift; _ELISP_TEST_OPTS=("$@"); case ${test_runner} in buttercup) test_pkg="app-emacs/buttercup"; _ELISP_TEST_FUNCTION=elisp-test-buttercup ;; ert-runner) test_pkg="app-emacs/ert-runner"; _ELISP_TEST_FUNCTION=elisp-test-ert-runner ;; ert) _ELISP_TEST_FUNCTION=elisp-test-ert ;; *) die "${FUNCNAME}: unknown test runner, given ${test_runner}" ;; esac; if [[ -n ${test_pkg} ]]; then IUSE+=" test "; RESTRICT+=" !test? ( test ) "; if [[ -n ${optional} ]]; then IUSE+=" emacs "; BDEPEND+=" test? ( emacs? ( ${test_pkg} ) ) "; else BDEPEND+=" test? ( ${test_pkg} ) "; fi; fi; return 0 } elisp-install () { local subdir="$1"; shift; ebegin "Installing Elisp files for GNU Emacs support"; ( insinto "${SITELISP}/${subdir}"; doins "$@" ); eend $? "elisp-install: doins failed" || die } elisp-make-autoload-file () { local f="${1:-${PN}-autoloads.el}" null="" page=' '; shift; elisp-check-emacs-version; ebegin "Generating autoload file for GNU Emacs"; cat > "${f}" <<-EOF ;;; ${f##*/} --- autoloads for ${PN} ;;; Commentary: ;; Automatically generated by elisp-common.eclass ;; DO NOT EDIT THIS FILE ;;; Code: ${page} ;; Local ${null}Variables: ;; version-control: never ;; no-byte-compile: t ;; no-native-compile: t ;; no-update-autoloads: t ;; End: ;;; ${f##*/} ends here EOF ${EMACS} ${EMACSFLAGS} --eval "(require 'autoload)" --eval "(setq make-backup-files nil)" --eval "(setq generated-autoload-file (expand-file-name \"${f}\"))" -f batch-update-autoloads "${@-.}"; eend $? "elisp-make-autoload-file: batch-update-autoloads failed" || die } elisp-make-site-file () { [[ $1 == [0-9][0-9]*-gentoo.el ]] || die "elisp-make-site-file: bad name of site-init file"; local f="${T}/$1" my_pn="${2:-${PN}}"; shift; shift; printf "%s\n" "(add-to-list 'load-path \"@SITELISP@\")" "$@" > "${f}" || die; elisp-site-file-install "${f}" "${my_pn}" } elisp-modules-install () { local subdir="$1"; shift; ebegin "Installing dynamic modules for GNU Emacs support"; ( exeinto "${EMACSMODULES//@libdir@/$(get_libdir)}/${subdir}"; doexe "$@" ); eend $? "elisp-modules-install: doins failed" || die } elisp-org-export-to () { local export_format="${1}"; local org_file_path="${2}"; local export_group; case ${export_format} in info) export_group=texinfo ;; markdown) export_group=md ;; pdf) export_group=latex ;; *) export_group=${export_format} ;; esac; local export_function=org-${export_group}-export-to-${export_format}; ${EMACS} ${EMACSFLAGS} "${org_file_path}" -f "${export_function}" || die "Org export to ${export_format} failed" } elisp-site-file-install () { local sf="${1##*/}" my_pn="${2:-${PN}}" modules ret; local add_header="1 { # Find first non-empty line :x; /^\$/ { n; bx; } # Insert a header, unless we already look at one /^;.*${PN}/I! s/^/;;; ${PN} site-lisp configuration\n\n/ 1 s/^/\n/ }"; [[ ${sf} == [0-9][0-9]*-gentoo*.el ]] || ewarn "elisp-site-file-install: bad name of site-init file"; [[ ${sf%-gentoo*.el} != "${sf}" ]] && sf="${sf%-gentoo*.el}-gentoo.el"; sf="${T}/${sf}"; ebegin "Installing site initialisation file for GNU Emacs"; [[ $1 == "${sf}" ]] || cp "$1" "${sf}"; modules=${EMACSMODULES//@libdir@/$(get_libdir)}; sed -i -e "${add_header}" -e "s:@SITELISP@:${EPREFIX}${SITELISP}/${my_pn}:g" -e "s:@SITEETC@:${EPREFIX}${SITEETC}/${my_pn}:g" -e "s:@EMACSMODULES@:${EPREFIX}${modules}/${my_pn}:g;\$q" "${sf}"; ( insinto "${SITELISP}/site-gentoo.d"; doins "${sf}" ); ret=$?; rm -f "${sf}"; eend ${ret} "elisp-site-file-install: doins failed" || die } elisp-site-regen () { local sitelisp=${ROOT%/}${EPREFIX}${SITELISP}; local sf i ret=0 null="" page=' '; local -a sflist; if [[ ${EBUILD_PHASE} == *rm && ! -e ${sitelisp}/site-gentoo.el ]]; then ewarn "Refusing to create site-gentoo.el in ${EBUILD_PHASE} phase."; return 0; fi; [[ -d ${sitelisp} ]] || die "elisp-site-regen: Directory ${sitelisp} does not exist"; [[ -d ${T} ]] || die "elisp-site-regen: Temporary directory ${T} does not exist"; ebegin "Regenerating site-gentoo.el for GNU Emacs (${EBUILD_PHASE})"; for sf in "${sitelisp}"/site-gentoo.d/[0-9][0-9]*.el; do [[ -r ${sf} ]] && sflist+=("${sf}"); done; cat <<-EOF > "${T}"/site-gentoo.el || ;;; site-gentoo.el --- site initialisation for Gentoo-installed packages ;;; Commentary: ;; Automatically generated by elisp-common.eclass ;; DO NOT EDIT THIS FILE ;;; Code: EOF ret=$? sed '$q' "${sflist[@]}" < /dev/null >> "${T}"/site-gentoo.el || ret=$?; cat <<-EOF >> "${T}"/site-gentoo.el || ${page} (provide 'site-gentoo) ;; Local ${null}Variables: ;; no-byte-compile: t ;; no-native-compile: t ;; buffer-read-only: t ;; End: ;;; site-gentoo.el ends here EOF ret=$? if [[ ${ret} -ne 0 ]]; then eend ${ret} "elisp-site-regen: Writing site-gentoo.el failed."; die; else if cmp -s "${sitelisp}"/site-gentoo.el "${T}"/site-gentoo.el; then rm -f "${T}"/site-gentoo.el; eend 0; einfo "... no changes."; else mv "${T}"/site-gentoo.el "${sitelisp}"/site-gentoo.el; eend $? "elisp-site-regen: Replacing site-gentoo.el failed" || die; case ${#sflist[@]} in 0) [[ ${PN} == emacs-common ]] || ewarn "... Huh? No site initialisation files found." ;; 1) einfo "... ${#sflist[@]} site initialisation file included." ;; *) einfo "... ${#sflist[@]} site initialisation files included." ;; esac; fi; fi; return 0 } elisp-test () { if [[ -n ${_ELISP_TEST_FUNCTION} ]]; then ${_ELISP_TEST_FUNCTION} "${_ELISP_TEST_OPTS[@]}"; fi } elisp-test-buttercup () { debug-print-function ${FUNCNAME} "$@"; local test_dir="${1:-$(pwd)}"; shift; local -a myopts=(${BYTECOMPFLAGS} -L "${test_dir}" --traceback full "$@"); ebegin "Running buttercup tests"; buttercup "${myopts[@]}" "${test_dir}"; eend $? "${FUNCNAME}: tests failed" || die } elisp-test-ert () { debug-print-function ${FUNCNAME} "$@"; local test_dir="${1:-$(pwd)}"; shift; local -a extra_load=(); local extra_load_file; for extra_load_file in "${test_dir}"/?*-test.el; do if [[ -f "${extra_load_file}" ]]; then extra_load+=(-l "${extra_load_file}"); fi; done; local -a myopts=(${EMACSFLAGS} ${BYTECOMPFLAGS} -L "${test_dir}" "${extra_load[@]}" "$@" -f ert-run-tests-batch-and-exit); ebegin "Running ert tests"; ${EMACS} "${myopts[@]}"; eend $? "${FUNCNAME}: tests failed" || die } elisp-test-ert-runner () { debug-print-function ${FUNCNAME} "$@"; local test_dir="${1:-$(pwd)}"; shift; local -a myopts=(${BYTECOMPFLAGS} --reporter ert+duration --script -L "${test_dir}" "$@"); ebegin "Running ert-runner tests"; ert-runner "${myopts[@]}" "${test_dir}"; eend $? "${FUNCNAME}: tests failed" || die } 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 -D_TIME_BITS=64 } filter-lto () { [[ $# -ne 0 ]] && die "filter-lto takes no arguments"; filter-flags '-flto*' -fwhole-program-vtables '-fsanitize=cfi*' } 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*) 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 $(type -P ${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: "; 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_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_exeext () { case ${CHOST} in 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_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 mingw* | *-mingw*) libname="dll" ;; *-darwin*) libname="dylib" ;; *) libname="so" ;; esac; if [[ -z $* ]]; then echo ".${libname}"; else for ver in "$@"; do case ${CHOST} in *-darwin*) echo ".${ver}.${libname}" ;; *) echo ".${libname}.${ver}" ;; esac; done; fi } get_modname () { local modname; local ver=$1; case ${CHOST} in *-darwin*) modname="bundle" ;; *) modname="so" ;; esac; echo ".${modname}" } git-r3_checkout () { debug-print-function ${FUNCNAME} "$@"; local repos; if [[ -n ${1} ]]; then repos=(${1}); else if [[ $(declare -p EGIT_REPO_URI) == "declare -a"* ]]; then repos=("${EGIT_REPO_URI[@]}"); else repos=(${EGIT_REPO_URI}); fi; fi; local out_dir=${2:-${EGIT_CHECKOUT_DIR:-${WORKDIR}/${P}}}; local local_id=${3:-${CATEGORY}/${PN}/${SLOT%/*}}; local checkout_paths=("${@:4}"); local -x GIT_DIR; _git-r3_set_gitdir "${repos[0]}"; einfo "Checking out ${repos[0]} to ${out_dir} ..."; if ! git cat-file -e refs/git-r3/"${local_id}"/__main__; then die "Logic error: no local clone of ${repos[0]}. git-r3_fetch not used?"; fi; local remote_ref=$(git symbolic-ref --quiet refs/git-r3/"${local_id}"/__main__); local new_commit_id=$(git rev-parse --verify refs/git-r3/"${local_id}"/__main__); function git-r3_sub_checkout () { local orig_repo=${GIT_DIR}; local -x GIT_DIR=${out_dir}/.git; local -x GIT_WORK_TREE=${out_dir}; mkdir -p "${out_dir}" || die; git init --quiet -b __init__ || die; if [[ -n ${EGIT_LFS} ]]; then git lfs install --local --skip-repo || die; fi; echo "${orig_repo}/objects" > "${GIT_DIR}"/objects/info/alternates || die; cp -R "${orig_repo}"/refs/* "${GIT_DIR}"/refs/ || die; if [[ -f ${orig_repo}/packed-refs ]]; then cp "${orig_repo}"/packed-refs "${GIT_DIR}"/packed-refs || die; fi; git config --global --add safe.directory "$(cd "${out_dir}" && echo "${PWD}")" || die; if [[ -f ${orig_repo}/shallow ]]; then cp "${orig_repo}"/shallow "${GIT_DIR}"/ || die; fi; set -- git checkout --quiet; if [[ -n ${remote_ref} ]]; then set -- "${@}" "${remote_ref#refs/heads/}"; else set -- "${@}" "${new_commit_id}"; fi; if [[ -n ${checkout_paths[@]} ]]; then set -- "${@}" -- "${checkout_paths[@]}"; fi; echo "${@}" 1>&2; "${@}" || die "git checkout ${remote_ref:-${new_commit_id}} failed"; local has_git_lfs_filters=$(git grep "filter=lfs" -- ".gitattributes" "**/.gitattributes"); if [[ -n $has_git_lfs_filters ]]; then _EGIT_LFS_FILTERS_FOUND="yes"; fi }; git-r3_sub_checkout; unset -f git-r3_sub_checkout; local old_commit_id=$(git rev-parse --quiet --verify refs/git-r3/"${local_id}"/__old__); if [[ ! -n ${old_commit_id} ]]; then echo "GIT NEW branch -->"; echo " repository: ${repos[0]}"; echo " at the commit: ${new_commit_id}"; else echo "GIT update -->"; echo " repository: ${repos[0]}"; if [[ "${old_commit_id}" != "${new_commit_id}" ]]; then echo " updating from commit: ${old_commit_id}"; echo " to commit: ${new_commit_id}"; set -- git --no-pager diff --stat ${old_commit_id}..${new_commit_id}; if [[ -n ${checkout_paths[@]} ]]; then set -- "${@}" -- "${checkout_paths[@]}"; fi; "${@}"; else echo " at the commit: ${new_commit_id}"; fi; fi; git update-ref --no-deref refs/git-r3/"${local_id}"/{__old__,__main__} || die; if [[ -f ${out_dir}/.gitmodules && ! -n ${checkout_paths} ]]; then local submodules; _git-r3_set_submodules "${_GIT_SUBMODULE_PATH}" "$(< "${out_dir}"/.gitmodules)"; while [[ -n ${submodules[@]} ]]; do local subname=${submodules[0]}; local url=${submodules[1]}; local path=${submodules[2]}; if [[ -d ${out_dir}/${path} ]]; then local subrepos; _git-r3_set_subrepos "${url}" "${repos[@]}"; _GIT_SUBMODULE_PATH=${_GIT_SUBMODULE_PATH}${path}/ git-r3_checkout "${subrepos[*]}" "${out_dir}/${path}" "${local_id}/${subname}"; fi; submodules=("${submodules[@]:3}"); done; fi; export EGIT_DIR=${GIT_DIR}; export EGIT_VERSION=${new_commit_id} } git-r3_fetch () { debug-print-function ${FUNCNAME} "$@"; local -x GIT_TERMINAL_PROMPT=0; local repos; if [[ -n ${1} ]]; then repos=(${1}); else if [[ $(declare -p EGIT_REPO_URI) == "declare -a"* ]]; then repos=("${EGIT_REPO_URI[@]}"); else repos=(${EGIT_REPO_URI}); fi; fi; [[ -n ${repos[@]} ]] || die "No URI provided and EGIT_REPO_URI unset"; local r; for r in "${repos[@]}"; do if [[ ${r} == git:* || ${r} == http:* ]]; then ewarn "git-r3: ${r%%:*} protocol is completely insecure and may render the ebuild"; ewarn "easily susceptible to MITM attacks (even if used only as fallback). Please"; ewarn "use https instead."; ewarn "[URI: ${r}]"; fi; done; local -x GIT_DIR; _git-r3_set_gitdir "${repos[0]}"; einfo "Repository id: ${GIT_DIR##*/}"; if [[ -n ${EGIT_MIRROR_URI} ]]; then repos=("${EGIT_MIRROR_URI%/}/${GIT_DIR##*/}" "${repos[@]}"); fi; local branch_name=${EGIT_BRANCH}; local commit_id=${2:-${EGIT_COMMIT}}; local commit_date=${4:-${EGIT_COMMIT_DATE}}; local override_name=${GIT_DIR##*/}; override_name=${override_name%.git}; override_name=${override_name//[^a-zA-Z0-9_]/_}; override_name=${override_name^^}; local varmap=(REPO:repos BRANCH:branch_name COMMIT:commit_id COMMIT_DATE:commit_date); local localvar livevar live_warn= override_vars=(); for localvar in "${varmap[@]}"; do livevar=EGIT_OVERRIDE_${localvar%:*}_${override_name}; localvar=${localvar#*:}; override_vars+=("${livevar}"); if [[ -n ${!livevar} ]]; then [[ ${localvar} == repos ]] && repos=(); live_warn=1; ewarn "Using ${livevar}=${!livevar}"; declare "${localvar}=${!livevar}"; fi; done; if [[ -n ${live_warn} ]]; then ewarn "No support will be provided."; else einfo "To override fetched repository properties, use:"; local x; for x in "${override_vars[@]}"; do einfo " ${x}"; done; einfo; fi; local branch=${branch_name:+refs/heads/${branch_name}}; local remote_ref=${commit_id:-${branch:-HEAD}}; local local_id=${3:-${CATEGORY}/${PN}/${SLOT%/*}}; local local_ref=refs/git-r3/${local_id}/__main__; local success saved_umask; if [[ -n ${EVCS_UMASK} ]]; then saved_umask=$(umask); umask "${EVCS_UMASK}" || die "Bad options to umask: ${EVCS_UMASK}"; fi; for r in "${repos[@]}"; do if [[ ! -n ${EVCS_OFFLINE} ]]; then einfo "Fetching ${r} ..."; local fetch_command=(git fetch "${r}"); local clone_type=${EGIT_CLONE_TYPE}; if [[ ${clone_type} == mirror ]]; then fetch_command+=(--prune "+refs/heads/*:refs/heads/*" "+refs/tags/*:refs/tags/*" "+refs/notes/*:refs/notes/*" "+refs/pull/*/head:refs/pull/*" "+HEAD:refs/git-r3/HEAD" "${remote_ref}"); else local fetch_l fetch_r; if [[ ${remote_ref} == HEAD ]]; then fetch_l=HEAD; else if [[ ${remote_ref} == refs/* ]]; then fetch_l=${remote_ref}; else local tagref=$(git ls-remote "${r}" "refs/tags/${remote_ref}"); if [[ -n ${tagref} ]]; then fetch_l=refs/tags/${remote_ref}; else if [[ -n ${branch} ]]; then fetch_l=${branch}; else fetch_l=HEAD; fi; if [[ ${clone_type} == shallow ]]; then clone_type=single; fi; fi; fi; fi; if [[ -n ${commit_date} && ${clone_type} == shallow ]]; then clone_type=single; fi; if [[ ${fetch_l} == HEAD ]]; then fetch_r=refs/git-r3/HEAD; else fetch_r=${fetch_l}; fi; fetch_command+=("+${fetch_l}:${fetch_r}"); if [[ ${clone_type} == single+tags ]]; then fetch_command+=("+refs/tags/*:refs/tags/*"); fi; fi; if [[ ${clone_type} == shallow ]]; then if _git-r3_is_local_repo; then clone_type=single; else if [[ ! -n $(git rev-parse --quiet --verify "${fetch_r}") ]]; then fetch_command+=(--depth 1); fi; fi; else if [[ -f ${GIT_DIR}/shallow ]]; then fetch_command+=(--unshallow); fi; fi; set -- "${fetch_command[@]}"; echo "${@}" 1>&2; "${@}" || continue; if [[ ${clone_type} == mirror || ${fetch_l} == HEAD ]]; then git symbolic-ref HEAD refs/git-r3/HEAD || die "Unable to update HEAD"; fi; fi; if [[ -n ${commit_date} ]]; then local dated_commit_id=$(git rev-list --first-parent --before="${commit_date}" -n 1 "${remote_ref}"); if [[ ${?} -ne 0 ]]; then die "Listing ${remote_ref} failed (wrong ref?)."; else if [[ ! -n ${dated_commit_id} ]]; then die "Unable to find commit for date ${commit_date}."; else set -- git update-ref --no-deref "${local_ref}" "${dated_commit_id}"; fi; fi; else local full_remote_ref=$(git rev-parse --verify --symbolic-full-name "${remote_ref}"); if [[ -n ${full_remote_ref} ]]; then set -- git symbolic-ref "${local_ref}" "${full_remote_ref}"; else set -- git update-ref --no-deref "${local_ref}" "${remote_ref}"; fi; fi; echo "${@}" 1>&2; if ! "${@}"; then if [[ -n ${EVCS_OFFLINE} ]]; then eerror "A clone of the following repository is required to proceed:"; eerror " ${r}"; eerror "However, networking activity has been disabled using EVCS_OFFLINE and the local"; eerror "clone does not have requested ref:"; eerror " ${remote_ref}"; die "Local clone of ${r} does not have requested ref: ${remote_ref}. Unable to proceed with EVCS_OFFLINE."; else die "Referencing ${remote_ref} failed (wrong ref?)."; fi; fi; if [[ -n ${EGIT_LFS} ]]; then local lfs_fetch_command=(git lfs fetch "${r}"); case "${EGIT_LFS_CLONE_TYPE}" in shallow) lfs_fetch_command+=(--prune) ;; single) ;; mirror) lfs_fetch_command+=(--all) ;; *) die "Invalid EGIT_LFS_CLONE_TYPE=${EGIT_LFS_CLONE_TYPE}" ;; esac; set -- "${lfs_fetch_command[@]}"; echo "${@}" 1>&2; "${@}" || die; else if [[ -d ${GIT_DIR}/lfs && ${EGIT_LFS_CLONE_TYPE} == shallow ]]; then rm -fr ${GIT_DIR}/lfs || die; fi; fi; success=1; break; done; if [[ -n ${saved_umask} ]]; then umask "${saved_umask}" || die; fi; [[ -n ${success} ]] || die "Unable to fetch from any of EGIT_REPO_URI"; local EGIT_CLONE_TYPE=mirror; if git cat-file -e "${local_ref}":.gitmodules &> /dev/null; then local submodules; _git-r3_set_submodules "${_GIT_SUBMODULE_PATH}" "$(git cat-file -p "${local_ref}":.gitmodules || die)"; while [[ -n ${submodules[@]} ]]; do local subname=${submodules[0]}; local url=${submodules[1]}; local path=${submodules[2]}; if [[ -n $(git ls-tree -d "${local_ref}" "${path}") ]]; then local commit=$(git rev-parse "${local_ref}:${path}" || die); if [[ ! -n ${commit} ]]; then die "Unable to get commit id for submodule ${subname}"; fi; local subrepos; _git-r3_set_subrepos "${url}" "${repos[@]}"; _GIT_SUBMODULE_PATH=${_GIT_SUBMODULE_PATH}${path}/ git-r3_fetch "${subrepos[*]}" "${commit}" "${local_id}/${subname}" ""; fi; submodules=("${submodules[@]:3}"); done; fi } git-r3_peek_remote_ref () { debug-print-function ${FUNCNAME} "$@"; local repos; if [[ -n ${1} ]]; then repos=(${1}); else if [[ $(declare -p EGIT_REPO_URI) == "declare -a"* ]]; then repos=("${EGIT_REPO_URI[@]}"); else repos=(${EGIT_REPO_URI}); fi; fi; local branch=${EGIT_BRANCH:+refs/heads/${EGIT_BRANCH}}; local remote_ref=${2:-${EGIT_COMMIT:-${branch:-HEAD}}}; [[ -n ${repos[@]} ]] || die "No URI provided and EGIT_REPO_URI unset"; local r success; for r in "${repos[@]}"; do einfo "Peeking ${remote_ref} on ${r} ..." 1>&2; local lookup_ref; if [[ ${remote_ref} == refs/* || ${remote_ref} == HEAD ]]; then lookup_ref=${remote_ref}; else lookup_ref=refs/tags/${remote_ref}; fi; local ref=($(git ls-remote "${r}" "${lookup_ref}")); if [[ -n ${ref[0]} ]]; then echo "${ref[0]}"; return 0; fi; done; return 1 } git-r3_pkg_needrebuild () { debug-print-function ${FUNCNAME} "$@"; local new_commit_id=$(git-r3_peek_remote_ref); [[ -n ${new_commit_id} && -n ${EGIT_VERSION} ]] || die "Lookup failed"; if [[ ${EGIT_VERSION} != ${new_commit_id} ]]; then einfo "Update from ${EGIT_VERSION} to ${new_commit_id}"; else einfo "Local and remote at ${EGIT_VERSION}"; fi; [[ ${EGIT_VERSION} != ${new_commit_id} ]] } git-r3_src_fetch () { debug-print-function ${FUNCNAME} "$@"; if [[ ! -n ${EGIT3_STORE_DIR} && -n ${EGIT_STORE_DIR} ]]; then ewarn "You have set EGIT_STORE_DIR but not EGIT3_STORE_DIR. Please consider"; ewarn "setting EGIT3_STORE_DIR for git-r3.eclass. It is recommended to use"; ewarn "a different directory than EGIT_STORE_DIR to ease removing old clones"; ewarn "when git-2 eclass becomes deprecated."; fi; _git-r3_env_setup; git-r3_fetch } git-r3_src_unpack () { debug-print-function ${FUNCNAME} "$@"; _git-r3_env_setup; git-r3_src_fetch; git-r3_checkout; if [[ ! -n ${EGIT_LFS} && -n ${_EGIT_LFS_FILTERS_FOUND} ]]; then eqawarn "QA Notice: There are Git LFS filters setup in the cloned repo, consider using EGIT_LFS!"; fi; if [[ -n ${EGIT_LFS} && ! -n ${_EGIT_LFS_FILTERS_FOUND} ]]; then eqawarn "QA Notice: There are no Git LFS filters setup in the cloned repo. EGIT_LFS will do nothing!"; fi } gnuconfig_do_update () { local configsubs_dir target targetlist file; [[ $# -eq 0 ]] && die "do not call gnuconfig_do_update; use gnuconfig_update"; configsubs_dir=$(gnuconfig_findnewest); einfo "Using GNU config files from ${configsubs_dir}"; for file in "$@"; do if [[ ! -r ${configsubs_dir}/${file} ]]; then eerror "Can't read ${configsubs_dir}/${file}, skipping.."; continue; fi; targetlist=$(find "${startdir}" -name "${file}"); if [[ -n ${targetlist} ]]; then for target in ${targetlist}; do [[ -L ${target} ]] && rm -f "${target}"; ebegin " Updating ${target/$startdir\//}"; cp -f "${configsubs_dir}/${file}" "${target}"; eend $? || die; done; else ewarn " No ${file} found in ${startdir}, skipping ..."; fi; done; return 0 } gnuconfig_findnewest () { local locations=(); local prefix; case ${EAPI} in 5 | 6) prefix="${EPREFIX}" ;; *) prefix="${BROOT}" ;; esac; locations+=("${prefix}"/usr/share/misc/config.sub "${prefix}"/usr/share/gnuconfig/config.sub "${prefix}"/usr/share/automake*/config.sub "${prefix}"/usr/share/libtool/config.sub); grep -s '^timestamp' "${locations[@]}" | sort -r -n -t\' -k2 | sed -n '1{s,/config.sub:.*$,,;p;q}' } gnuconfig_update () { local startdir; if [[ $1 == /* ]]; then startdir=$1; shift; else startdir=${S}; fi; if [[ $# -gt 0 ]]; then gnuconfig_do_update "$@"; else gnuconfig_do_update config.sub config.guess; fi; return $? } has_multilib_profile () { [ -n "${MULTILIB_ABIS}" -a "${MULTILIB_ABIS}" != "${MULTILIB_ABIS/ /}" ] } in_iuse () { local use=${1}; if [[ -z "${use}" ]]; then echo "!!! in_iuse() called without a parameter." 1>&2; echo "!!! in_iuse " 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 "; 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 "; _is_flagq LDFLAGS $1 } is_final_abi () { has_multilib_profile || return 0; set -- $(get_install_abis); local LAST_ABI=$#; [[ ${!LAST_ABI} == ${ABI} ]] } 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 ;; loongarch64*) export CFLAGS_lp64d=${CFLAGS_lp64d--mabi=lp64d}; export CHOST_lp64d=${CTARGET}; export CTARGET_lp64d=${CTARGET}; export LIBDIR_lp64d=${LIBDIR_lp64d-lib64}; : "${MULTILIB_ABIS=lp64d}"; : "${DEFAULT_ABI=lp64d}" ;; 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*) : "${MULTILIB_ABIS=lp64d lp64 ilp32d ilp32}"; : "${DEFAULT_ABI=lp64d}"; local _libdir_riscvdefaultabi_variable="LIBDIR_${DEFAULT_ABI}"; local _libdir_riscvdefaultabi=${!_libdir_riscvdefaultabi_variable}; export ${_libdir_riscvdefaultabi_variable}=${_libdir_riscvdefaultabi:-lib64}; export CFLAGS_lp64d=${CFLAGS_lp64d--mabi=lp64d -march=rv64gc}; export CHOST_lp64d=${CTARGET}; export CTARGET_lp64d=${CTARGET}; export LIBDIR_lp64d=${LIBDIR_lp64d-lib64/lp64d}; export CFLAGS_lp64=${CFLAGS_lp64--mabi=lp64 -march=rv64imac}; export CHOST_lp64=${CTARGET}; export CTARGET_lp64=${CTARGET}; export LIBDIR_lp64=${LIBDIR_lp64-lib64/lp64}; export CFLAGS_ilp32d=${CFLAGS_ilp32d--mabi=ilp32d -march=rv32imafdc}; export CHOST_ilp32d=${CTARGET/riscv64/riscv32}; export CTARGET_ilp32d=${CTARGET/riscv64/riscv32}; export LIBDIR_ilp32d=${LIBDIR_ilp32d-lib32/ilp32d}; export CFLAGS_ilp32=${CFLAGS_ilp32--mabi=ilp32 -march=rv32imac}; export CHOST_ilp32=${CTARGET/riscv64/riscv32}; export CTARGET_ilp32=${CTARGET/riscv64/riscv32}; export LIBDIR_ilp32=${LIBDIR_ilp32-lib32/ilp32} ;; riscv32*) : "${MULTILIB_ABIS=ilp32d ilp32}"; : "${DEFAULT_ABI=ilp32d}"; local _libdir_riscvdefaultabi_variable="LIBDIR_${DEFAULT_ABI}"; local _libdir_riscvdefaultabi=${!_libdir_riscvdefaultabi_variable}; export ${_libdir_riscvdefaultabi_variable}=${_libdir_riscvdefaultabi:-lib}; export CFLAGS_ilp32d=${CFLAGS_ilp32d--mabi=ilp32d -march=rv32imafdc}; export CHOST_ilp32d=${CTARGET}; export CTARGET_ilp32d=${CTARGET}; export LIBDIR_ilp32d=${LIBDIR_ilp32d-lib32/ilp32d}; export CFLAGS_ilp32=${CFLAGS_ilp32--mabi=ilp32 -march=rv32imac}; export CHOST_ilp32=${CTARGET}; export CTARGET_ilp32=${CTARGET}; export LIBDIR_ilp32=${LIBDIR_ilp32-lib32/ilp32} ;; 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 OBJCOPY OBJDUMP PKG_CONFIG RANLIB READELF STRINGS STRIP PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG_SYSTEM_INCLUDE_PATH PKG_CONFIG_SYSTEM_LIBRARY_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 OBJCOPY="$(tc-getOBJCOPY)"; export OBJDUMP="$(tc-getOBJDUMP)"; export PKG_CONFIG="$(tc-getPKG_CONFIG)"; export RANLIB="$(tc-getRANLIB)"; export READELF="$(tc-getREADELF)"; export STRINGS="$(tc-getSTRINGS)"; 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; export PKG_CONFIG_SYSTEM_INCLUDE_PATH=${EPREFIX}/usr/include; export PKG_CONFIG_SYSTEM_LIBRARY_PATH=${EPREFIX}/$(get_libdir):${EPREFIX}/usr/$(get_libdir); fi } 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 $# } pkg_needrebuild () { git-r3_pkg_needrebuild } pkg_nofetch () { default } pkg_postinst () { elisp-site-regen; readme.gentoo_print_elog; if use livecd; then eselect emacs update; else eselect emacs update ifunset; fi } pkg_postrm () { elisp-site-regen; eselect emacs update ifunset } pkg_preinst () { local infodir="${ED}/usr/share/info/${EMACS_SUFFIX}"; [[ -f ${infodir}/dir || ! -d ${infodir} ]] || die } 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 "$@" } readme.gentoo_create_doc () { debug-print-function ${FUNCNAME} "${@}"; if [[ -n "${DOC_CONTENTS}" ]]; then if [[ -n "${DISABLE_AUTOFORMATTING}" ]]; then echo "${DOC_CONTENTS}" > "${T}"/README.gentoo || die; else local saved_flags=$-; set -f; echo -e ${DOC_CONTENTS} | fold -s -w 70 | sed 's/[[:space:]]*$//' > "${T}"/README.gentoo; assert; set +f -${saved_flags}; fi; else if [[ -f "${FILESDIR}/README.gentoo-${SLOT%/*}" ]]; then cp "${FILESDIR}/README.gentoo-${SLOT%/*}" "${T}"/README.gentoo || die; else if [[ -f "${FILESDIR}/README.gentoo${README_GENTOO_SUFFIX}" ]]; then cp "${FILESDIR}/README.gentoo${README_GENTOO_SUFFIX}" "${T}"/README.gentoo || die; else die "You are not specifying README.gentoo contents!"; fi; fi; fi; ( docinto .; dodoc "${T}"/README.gentoo ) || die; README_GENTOO_DOC_VALUE=$(< "${T}/README.gentoo") } readme.gentoo_print_elog () { debug-print-function ${FUNCNAME} "${@}"; if [[ -z "${README_GENTOO_DOC_VALUE}" ]]; then die "readme.gentoo_print_elog invoked without matching readme.gentoo_create_doc call!"; else if ! [[ -n "${REPLACING_VERSIONS}" ]] || [[ -n "${FORCE_PRINT_ELOG}" ]]; then echo -e "${README_GENTOO_DOC_VALUE}" | while read -r ELINE; do elog "${ELINE}"; done; elog ""; elog "(Note: Above message is only printed the first time package is"; elog "installed. Please look at ${EPREFIX}/usr/share/doc/${PF}/README.gentoo*"; elog "for future reference)"; fi; fi } 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 "; 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 } setup-allowed-flags () { [[ ${EAPI} == [67] ]] || die "Internal function ${FUNCNAME} is not available in EAPI ${EAPI}."; _setup-allowed-flags "$@" } src_compile () { export ac_cv_header_valgrind_valgrind_h=$(usex valgrind); append-cppflags -DUSE_VALGRIND=$(usex valgrind); if tc-is-cross-compiler; then emake -C "${S}-build" src; emake lib; cp "${S}-build"/lib-src/make-{docfile,fingerprint} lib-src || die; EMACS_EMAKE_ARGS=(EMACS="${S}-build/src/emacs"); emake "${EMACS_EMAKE_ARGS[@]}" actual-all; else EMACS_EMAKE_ARGS=(); emake; fi } src_configure () { local myconf; unset EMACS_SOCKET_NAME; if use alsa; then use sound || ewarn "USE flag \"alsa\" overrides \"-sound\"; enabling sound support."; myconf+=" --with-sound=alsa"; else myconf+=" --with-sound=$(usex sound oss)"; fi; if use jit; then use zlib || ewarn "USE flag \"jit\" overrides \"-zlib\"; enabling zlib support."; myconf+=" --with-zlib"; else myconf+=" $(use_with zlib)"; fi; if ! use gui; then einfo "Configuring to build without window system support"; myconf+=" --without-x --without-pgtk --without-ns"; else if use aqua; then einfo "Configuring to build with Nextstep (Macintosh Cocoa) support"; myconf+=" --with-ns --disable-ns-self-contained"; myconf+=" --without-x --without-pgtk"; else if use gtk && ! use X; then einfo "Configuring to build with pure GTK (without X11) support"; myconf+=" --with-pgtk --without-x --without-ns"; myconf+=" --with-toolkit-scroll-bars"; myconf+=" --without-gconf"; myconf+=" $(use_with gsettings)"; myconf+=" $(use_with harfbuzz)"; myconf+=" $(use_with m17n-lib libotf)"; myconf+=" $(use_with m17n-lib m17n-flt)"; myconf+=" $(use_with xwidgets)"; else myconf+=" --with-x --without-pgtk --without-ns"; myconf+=" --without-gconf"; myconf+=" $(use_with gsettings)"; myconf+=" $(use_with toolkit-scroll-bars)"; myconf+=" $(use_with xpm)"; if use xft; then myconf+=" --with-xft"; myconf+=" $(use_with cairo)"; myconf+=" $(use_with harfbuzz)"; myconf+=" $(use_with m17n-lib libotf)"; myconf+=" $(use_with m17n-lib m17n-flt)"; else myconf+=" --without-xft"; myconf+=" --without-cairo"; myconf+=" --without-libotf --without-m17n-flt"; use cairo && ewarn "USE flag \"cairo\" has no effect if \"xft\" is not set."; use m17n-lib && ewarn "USE flag \"m17n-lib\" has no effect if \"xft\" is not set."; fi; local f line; if use gtk; then einfo "Configuring to build with GIMP Toolkit (GTK+)"; while read line; do ewarn "${line}"; done <<-EOF Your version of GTK+ will have problems with closing open displays. This is no problem if you just use one display, but if you use more than one and close one of them Emacs may crash. See and . If you intend to use more than one display, then it is strongly recommended that you compile Emacs with the Athena/Lucid or the Motif toolkit instead. EOF myconf+=" --with-x-toolkit=gtk3 $(use_with xwidgets)"; for f in motif Xaw3d athena; do use ${f} && ewarn "USE flag \"${f}\" has no effect if \"gtk\" is set."; done; else if use motif; then einfo "Configuring to build with Motif toolkit"; myconf+=" --with-x-toolkit=motif"; for f in Xaw3d athena; do use ${f} && ewarn "USE flag \"${f}\" has no effect if \"motif\" is set."; done; else if use athena || use Xaw3d; then einfo "Configuring to build with Athena/Lucid toolkit"; myconf+=" --with-x-toolkit=lucid $(use_with Xaw3d xaw3d)"; else einfo "Configuring to build with no toolkit"; myconf+=" --with-x-toolkit=no"; fi; fi; fi; ! use gtk && use xwidgets && ewarn "USE flag \"xwidgets\" has no effect if \"gtk\" is not set."; fi; fi; fi; if use gui; then myconf+=" $(use_with gif)"; myconf+=" $(use_with jpeg)"; myconf+=" $(use_with png)"; myconf+=" $(use_with svg rsvg)"; myconf+=" $(use_with tiff)"; myconf+=" $(use_with webp)"; myconf+=" $(use_with imagemagick)"; fi; if tc-is-cross-compiler; then mkdir "${S}-build" && pushd "${S}-build" > /dev/null || die; ECONF_SOURCE="${S}" econf_build --without-all --without-x-toolkit; popd > /dev/null || die; myconf+=" --with-dumping=none"; else if use m68k; then myconf+=" --with-dumping=unexec"; else myconf+=" --with-dumping=pdumper"; fi; fi; econf --program-suffix="-${EMACS_SUFFIX}" --includedir="${EPREFIX}"/usr/include/${EMACS_SUFFIX} --infodir="${EPREFIX}"/usr/share/info/${EMACS_SUFFIX} --localstatedir="${EPREFIX}"/var --enable-locallisppath="${EPREFIX}/etc/emacs:${EPREFIX}${SITELISP}" --without-compress-install --without-hesiod --without-pop --with-file-notification=$(usev inotify || usev gfile || echo no) --with-pdumper $(use_enable acl) $(use_enable xattr) $(use_with dbus) $(use_with dynamic-loading modules) $(use_with games gameuser ":gamestat") $(use_with gmp libgmp) $(use_with gpm) $(use_with jit native-compilation aot) $(use_with json) $(use_with kerberos) $(use_with kerberos kerberos5) $(use_with lcms lcms2) $(use_with libxml2 xml2) $(use_with mailutils) $(use_with selinux) $(use_with sqlite sqlite3) $(use_with ssl gnutls) $(use_with systemd libsystemd) $(use_with threads) $(use_with tree-sitter) $(use_with wide-int) ${myconf} } src_install () { emake "${EMACS_EMAKE_ARGS[@]}" DESTDIR="${D}" NO_BIN_LINK=t BLESSMAIL_TARGET="" install; mv "${ED}"/usr/bin/{emacs-${FULL_VERSION}-,}${EMACS_SUFFIX} || die; mv "${ED}"/usr/share/man/man1/{emacs-,}${EMACS_SUFFIX}.1 || die; mv "${ED}"/usr/share/metainfo/{emacs-,}${EMACS_SUFFIX}.metainfo.xml || die; touch "${ED}"/usr/share/info/${EMACS_SUFFIX}/.keepinfodir; docompress -x /usr/share/info/${EMACS_SUFFIX}/dir; if ! use mailutils; then fowners root:mail /usr/libexec/emacs/${FULL_VERSION}/${CHOST}/movemail; fperms 2751 /usr/libexec/emacs/${FULL_VERSION}/${CHOST}/movemail; fi; rm "${ED}"/usr/share/emacs/site-lisp/subdirs.el || die; rm -rf "${ED}"/usr/share/{applications,icons} || die; rm -rf "${ED}"/usr/share/glib-2.0 || die; rm -rf "${ED}/usr/$(get_libdir)/systemd" || die; rm -rf "${ED}"/var || die; rm -rf "${ED}"/usr/share/emacs/${FULL_VERSION}/site-lisp || die; rm "${ED}"/usr/share/emacs/${FULL_VERSION}/lisp/COPYING || die; if use systemd; then insinto /usr/lib/systemd/user; sed -e "/^##/d" -e "/^ExecStart/s,emacs,${EPREFIX}/usr/bin/${EMACS_SUFFIX}," -e "/^ExecStop/s,emacsclient,${EPREFIX}/usr/bin/&-${EMACS_SUFFIX}," etc/emacs.service | newins - ${EMACS_SUFFIX}.service; assert; fi; if use gzip-el; then find "${ED}"/usr/share/emacs/${FULL_VERSION}/lisp -type f -name "*.elc" -print | sed 's/\.elc$/.el/' | xargs gzip -9n; assert "gzip .el failed"; fi; local cdir; if use source; then cdir="/usr/share/emacs/${FULL_VERSION}/src"; insinto "${cdir}"; doins src/*.{c,h,m}; else if has installsources ${FEATURES}; then cdir="/usr/src/debug/${CATEGORY}/${PF}/${S#"${WORKDIR}/"}/src"; fi; fi; sed -e "${cdir:+#}/^Y/d" -e "s/^[XY]//" > "${T}/${SITEFILE}" <<-EOF || X ;;; ${EMACS_SUFFIX} site-lisp configuration X (when (string-match "\\\\\`${FULL_VERSION//./\\\\.}\\\\>" emacs-version) Y (setq find-function-C-source-directory Y "${EPREFIX}${cdir}") X (let ((path (getenv "INFOPATH")) X (dir "${EPREFIX}/usr/share/info/${EMACS_SUFFIX}") X (re "\\\\\`${EPREFIX}/usr/share\\\\>")) X (and path X ;; move Emacs Info dir before anything else in /usr/share X (let* ((p (cons nil (split-string path ":" t))) (q p)) X (while (and (cdr q) (not (string-match re (cadr q)))) X (setq q (cdr q))) X (setcdr q (cons dir (delete dir (cdr q)))) X (setenv "INFOPATH" (mapconcat 'identity (cdr p) ":")))))) EOF die elisp-site-file-install "${T}/${SITEFILE}" || die; dodoc README BUGS CONTRIBUTE; if use gui && use aqua; then dodir /Applications/Gentoo; rm -rf "${ED}"/Applications/Gentoo/${EMACS_SUFFIX^}.app || die; mv nextstep/Emacs.app "${ED}"/Applications/Gentoo/${EMACS_SUFFIX^}.app || die; fi; local DOC_CONTENTS="You can set the version to be started by /usr/bin/emacs through the Emacs eselect module, which also redirects man and info pages. Therefore, several Emacs versions can be installed at the same time. \"man emacs.eselect\" for details. \\n\\nIf you upgrade from a previous major version of Emacs, then it is strongly recommended that you use app-admin/emacs-updater to rebuild all byte-compiled elisp files of the installed Emacs packages."; if use gui; then DOC_CONTENTS+="\\n\\nYou need to install some fonts for Emacs. Installing media-fonts/font-adobe-{75,100}dpi on the X server's machine would satisfy basic Emacs requirements under X11. See also https://wiki.gentoo.org/wiki/Xft_support_for_GNU_Emacs for how to enable anti-aliased fonts."; use aqua && DOC_CONTENTS+="\\n\\n${EMACS_SUFFIX^}.app is in \"${EPREFIX}/Applications/Gentoo\". You may want to copy or symlink it into /Applications by yourself."; fi; tc-is-cross-compiler && DOC_CONTENTS+="\\n\\nEmacs did not write a portable dump file due to being cross-compiled. To create this file at run time, execute the following command: \\n${EMACS_SUFFIX} --batch -Q --eval='(dump-emacs-portable \"/usr/libexec/emacs/${FULL_VERSION}/${CHOST}/emacs.pdmp\")'"; readme.gentoo_create_doc } src_prepare () { if [[ ${PV##*.} = 9999 ]]; then FULL_VERSION=$(sed -n 's/^AC_INIT([^,]*,[^0-9.]*\([0-9.]*\).*/\1/p' configure.ac); [[ -n ${FULL_VERSION} ]] || die "Cannot determine current Emacs version"; einfo "Emacs branch: ${EGIT_BRANCH}"; einfo "Commit: ${EGIT_VERSION}"; einfo "Emacs version number: ${FULL_VERSION}"; [[ ${FULL_VERSION} =~ ^${PV%.*}(\..*)?$ ]] || die "Upstream version number changed to ${FULL_VERSION}"; fi; default; if use jit; then find lisp -type f -name "*.elc" -delete || die; QA_FLAGS_IGNORED="usr/$(get_libdir)/emacs/${FULL_VERSION}/native-lisp/.*"; has ccache ${FEATURES} || has distcc ${FEATURES} && tc-is-gcc && export LIBRARY_PATH=$("$(tc-getCC)" -print-search-dirs | sed -n '/^libraries:/{s:^[^/]*::;p}'); fi; sed -i -e "/^\\.so/s/etags/&-${EMACS_SUFFIX}/" doc/man/ctags.1 || die; sed -i -e "/CHECK_MODULES/s/libseccomp/DiSaBlE&/" configure.ac || die; sed -i -e 's/(executable-find "bwrap")/nil/' test/src/emacs-tests.el test/lisp/emacs-lisp/bytecomp-tests.el || die; AT_M4DIR=m4 eautoreconf } src_test () { local exclude_tests=(%lisp/mail/undigest-tests.el %lisp/vc/vc-tests.el %lisp/vc/vc-bzr-tests.el %src/process-tests.el %src/treesit-tests.log %lisp/progmodes/typescript-ts-mode-tests.el); use threads || exclude_tests+=(%lisp/server-tests.el %lisp/progmodes/eglot-tests.el %src/emacs-module-tests.el %src/keyboard-tests.el); use xpm || exclude_tests+=(%src/image-tests.el); mkdir "${T}"/gpg || die; local f; for f in browser extra ssh; do printf "%%Assuan%%\nsocket=%s\n" "${T}/gpg/S.${f}" > "test/lisp/gnus/mml-sec-resources/S.gpg-agent.${f}" || die; done; emake EMACS_TEST_VERBOSE=1 EXCLUDE_TESTS="${exclude_tests[*]}" TEST_BACKTRACE_LINE_LENGTH=nil check } src_unpack () { git-r3_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 for y in "${ALLOWED_FLAGS[@]}"; do if [[ ${x} == ${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-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-cxx-assertions () { tc-cpp-is-true "defined(_GLIBCXX_ASSERTIONS) || defined(_LIBCPP_ENABLE_ASSERTIONS) || defined(_LIBCPP_ENABLE_HARDENED_MODE)" ${CPPFLAGS} ${CXXFLAGS} } tc-enables-fortify-source () { tc-cpp-is-true "defined(_FORTIFY_SOURCE)" ${CPPFLAGS} ${CFLAGS} ${CXXFLAGS} } tc-enables-pie () { tc-cpp-is-true "defined(__PIE__)" ${CPPFLAGS} ${CFLAGS} ${CXXFLAGS} } tc-enables-ssp () { tc-cpp-is-true "defined(__SSP__) || defined(__SSP_STRONG__) || defined(__SSP_ALL__)" ${CPPFLAGS} ${CFLAGS} ${CXXFLAGS} } tc-enables-ssp-all () { tc-cpp-is-true "defined(__SSP_ALL__)" ${CPPFLAGS} ${CFLAGS} ${CXXFLAGS} } tc-enables-ssp-strong () { tc-cpp-is-true "defined(__SSP_STRONG__) || defined(__SSP_ALL__)" ${CPPFLAGS} ${CFLAGS} ${CXXFLAGS} } 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 ;; arc*b*) echo big ;; arc*) echo little ;; arm*b*) echo big ;; arm*) echo little ;; cris*) echo little ;; hppa*) echo big ;; i?86*) echo little ;; ia64*) echo little ;; loongarch*) 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-build-ptr-size () { $(tc-getBUILD_CPP) -P - <<< __SIZEOF_POINTER__ || die "Could not determine CBUILD pointer size" } tc-get-c-rtlib () { local res=$($(tc-getCC) ${CPPFLAGS} ${CFLAGS} ${LDFLAGS} -print-libgcc-file-name 2> /dev/null); case ${res} in *libclang_rt*) echo compiler-rt ;; *libgcc*) echo libgcc ;; *) return 1 ;; esac; return 0 } 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-get-cxx-stdlib () { local code='#include #if defined(_LIBCPP_VERSION) HAVE_LIBCXX #elif defined(__GLIBCXX__) HAVE_LIBSTDCPP #endif '; local res=$($(tc-getCXX) ${CPPFLAGS} ${CXXFLAGS} -x c++ -E -P - <<< "${code}" 2> /dev/null); case ${res} in *HAVE_LIBCXX*) echo libc++ ;; *HAVE_LIBSTDCPP*) echo libstdc++ ;; *) return 1 ;; esac; return 0 } tc-get-ptr-size () { $(tc-getCPP) -P - <<< __SIZEOF_POINTER__ || die "Could not determine CHOST pointer size" } 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_STRINGS () { tc-getBUILD_PROG STRINGS strings "$@" } 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-getSTRINGS () { tc-getPROG STRINGS strings "$@" } 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-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-lto () { local f="${T}/test-lto.o"; case $(tc-get-compiler-type) in clang) $(tc-getCC) ${CFLAGS} -c -o "${f}" -x c - <<< "" || die; llvm-bcanalyzer "${f}" &> /dev/null && return 0 ;; gcc) $(tc-getCC) ${CFLAGS} -c -o "${f}" -x c - <<< "" || die; [[ $($(tc-getREADELF) -S "${f}") == *.gnu.lto* ]] && return 0 ;; esac; return 1 } 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 () { tc-ld-is-gold "$@" && tc-ld-force-bfd "$@" } tc-ld-force-bfd () { if ! tc-ld-is-gold "$@" && ! tc-ld-is-lld "$@"; then return; fi; ewarn "Forcing usage of the BFD linker"; local ld=$(unset LD; tc-getLD "$@"); local bfd_ld="${ld}.bfd"; local path_ld=$(type -P "${bfd_ld}" 2> /dev/null); [[ -e ${path_ld} ]] && export LD=${bfd_ld}; if tc-is-gcc || tc-is-clang; then export LDFLAGS="${LDFLAGS} -fuse-ld=bfd"; fi } tc-ld-is-gold () { local out; local -x LC_ALL=C; 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(void) { 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; local -x LC_ALL=C; 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(void) { 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 _tc_echo_kernel_alias () { [[ ${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 ;; arc*) echo arc ;; arm*) echo arm ;; avr*) _tc_echo_kernel_alias avr32 avr ;; bfin*) _tc_echo_kernel_alias blackfin bfin ;; c6x*) echo c6x ;; cris*) echo cris ;; frv*) echo frv ;; hexagon*) echo hexagon ;; hppa*) _tc_echo_kernel_alias parisc hppa ;; i?86*) echo x86 ;; ia64*) echo ia64 ;; loongarch*) _tc_echo_kernel_alias loongarch loong ;; 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*) _tc_echo_kernel_alias sh64 sh ;; sh*) echo sh ;; sparc64*) _tc_echo_kernel_alias sparc64 sparc ;; sparc*) [[ ${PROFILE_ARCH} == "sparc64" ]] && _tc_echo_kernel_alias sparc64 sparc || echo sparc ;; tile*) echo tile ;; vax*) echo vax ;; 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-compile () { local lang=$1; local code=$2; shift 2; [[ -z "${lang}" ]] && return 1; [[ -z "${code}" ]] && return 1; local compiler filename_in filename_out args=() libs=(); case "${lang}" in c) compiler="$(tc-getCC)"; filename_in="${T}/test.c"; filename_out="${T}/test.o"; args+=(${CFLAGS[@]} -xc -c) ;; c++) compiler="$(tc-getCXX)"; filename_in="${T}/test.cc"; filename_out="${T}/test.o"; args+=(${CXXFLAGS[@]} -xc++ -c) ;; f77) compiler="$(tc-getF77)"; filename_in="${T}/test.f"; filename_out="${T}/test.o"; args+=(${FFFLAGS[@]} -xf77 -c) ;; f95) compiler="$(tc-getFC)"; filename_in="${T}/test.f90"; filename_out="${T}/test.o"; args+=(${FCFLAGS[@]} -xf95 -c) ;; c+ld) compiler="$(tc-getCC)"; filename_in="${T}/test.c"; filename_out="${T}/test.exe"; args+=(${CFLAGS[@]} ${LDFLAGS[@]} -xc); libs+=(${LIBS[@]}) ;; c+++ld) compiler="$(tc-getCXX)"; filename_in="${T}/test.cc"; filename_out="${T}/test.exe"; args+=(${CXXFLAGS[@]} ${LDFLAGS[@]} -xc++); libs+=(${LIBS[@]}) ;; f77+ld) compiler="$(tc-getF77)"; filename_in="${T}/test.f"; filename_out="${T}/test.exe"; args+=(${FFLAGS[@]} ${LDFLAGS[@]} -xf77); libs+=(${LIBS[@]}) ;; f95+ld) compiler="$(tc-getFC)"; filename_in="${T}/test.f90"; filename_out="${T}/test.exe"; args+=(${FCFLAGS[@]} ${LDFLAGS[@]} -xf95); libs+=(${LIBS[@]}) ;; *) die "Unknown compiled language ${lang}" ;; esac; printf "%s\n" "${code}" > "${filename_in}" || die "Failed to create '${test_in}'"; "${compiler}" ${args[@]} "${filename_in}" -o "${filename_out}" ${libs[@]} &> /dev/null } 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 () { [[ ${EAPI} == [67] ]] || die "Internal function ${FUNCNAME} is not available in EAPI ${EAPI}."; _test-flag-PROG "$@" } 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 () { [[ ${EAPI} == [67] ]] || die "Internal function ${FUNCNAME} is not available in EAPI ${EAPI}."; _test-flags-PROG "$@" } test_version_info () { if [[ $($(tc-getCC) --version 2>&1) == *$1* ]]; then return 0; else return 1; fi } ver_cut () { local range=${1}; local v=${2:-${PV}}; local start end; local -a comp; __eapi7_ver_split "${v}"; local max=$((${#comp[@]}/2)); __eapi7_ver_parse_range "${range}" "${max}"; local IFS=; if [[ ${start} -gt 0 ]]; then start=$(( start*2 - 1 )); fi; echo "${comp[*]:start:end*2-start}" } ver_rs () { local v; (( ${#} & 1 )) && v=${@: -1} || v=${PV}; local start end i; local -a comp; __eapi7_ver_split "${v}"; local max=$((${#comp[@]}/2 - 1)); while [[ ${#} -ge 2 ]]; do __eapi7_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; __eapi7_ver_compare "${va}" "${vb}"; test $? "${op}" 2 }