declare -x ABI="amd64" declare -x ABI_MIPS="" declare -x ABI_S390="" declare -x ABI_X86="64" declare -x ADA_TARGET="" declare -x ALLOW_TEST="network" declare -- ALL_DEPEND=$'\n\tdev-libs/glib:2[static-libs(+)]\n\tsys-libs/zlib[static-libs(+)]\n\tpython? ( python_targets_python3_10? ( dev-lang/python:3.10[ncurses,readline] ) python_targets_python3_11? ( dev-lang/python:3.11[ncurses,readline] ) python_targets_python3_12? ( dev-lang/python:3.12[ncurses,readline] ) )\n\tsystemtap? ( dev-util/systemtap )\n\txattr? ( sys-apps/attr[static-libs(+)] )\n' declare -x ALSA_CARDS="" declare -x AMDGPU_TARGETS="" declare -x ANT_HOME="/usr/share/ant" declare -x APACHE2_MODULES="" declare -x APACHE2_MPMS="" declare -x AR="x86_64-pc-linux-gnu-ar" declare -x ARCH="amd64" declare -x AS="x86_64-pc-linux-gnu-as" declare BDEPEND=$'\n\tpython_targets_python3_10? ( dev-lang/python:3.10 ) python_targets_python3_11? ( dev-lang/python:3.11 ) python_targets_python3_12? ( dev-lang/python:3.12 )\n\tdev-lang/perl\n\t>=dev-util/meson-0.63.0\n\tdev-python/pip[python_targets_python3_10(-)?,python_targets_python3_11(-)?,python_targets_python3_12(-)?]\n\tvirtual/pkgconfig\n\tdoc? (\n\t\t>=dev-python/sphinx-1.6.0[python_targets_python3_10(-)?,python_targets_python3_11(-)?,python_targets_python3_12(-)?]\n\t\tdev-python/sphinx-rtd-theme[python_targets_python3_10(-)?,python_targets_python3_11(-)?,python_targets_python3_12(-)?]\n\t)\n\tgtk? ( nls? ( sys-devel/gettext ) )\n\ttest? (\n\t\tdev-libs/glib[utils]\n\t\tsys-devel/bc\n\t)\n virtual/pkgconfig' declare -x BINPKG_FORMAT="xpak" 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" declare -x CALLIGRA_FEATURES="" declare -x CAMERAS="" declare -x CARGO_TERM_COLOR="never" declare -x CBUILD="x86_64-pc-linux-gnu" declare -- CDEPEND=$'\n\t\n\tdev-libs/glib:2\n\tsys-libs/zlib\n\tpython? ( python_targets_python3_10? ( dev-lang/python:3.10[ncurses,readline] ) python_targets_python3_11? ( dev-lang/python:3.11[ncurses,readline] ) python_targets_python3_12? ( dev-lang/python:3.12[ncurses,readline] ) )\n\tsystemtap? ( dev-util/systemtap )\n\txattr? ( sys-apps/attr )\n\n\t\n\t>=x11-libs/pixman-0.28.0\n\taccessibility? (\n\t\tapp-accessibility/brltty[api]\n\t\tapp-accessibility/brltty\n\t)\n\taio? ( dev-libs/libaio )\n\talsa? ( >=media-libs/alsa-lib-1.0.13 )\n\tbpf? ( dev-libs/libbpf:= )\n\tbzip2? ( app-arch/bzip2 )\n\tcapstone? ( dev-libs/capstone:= )\n\tcurl? ( >=net-misc/curl-7.15.4 )\n\tfdt? ( >=sys-apps/dtc-1.5.1 )\n\tfuse? ( >=sys-fs/fuse-3.1:3 )\n\tglusterfs? ( >=sys-cluster/glusterfs-3.4.0 )\n\tgnutls? (\n\t\t>=net-libs/gnutls-3.0:=\n\t\tdev-libs/nettle:=\n\t)\n\tgtk? (\n\t\tx11-libs/gtk+:3\n\t\tvte? ( x11-libs/vte:2.91 )\n\t)\n\tinfiniband? ( sys-cluster/rdma-core )\n\tiscsi? ( net-libs/libiscsi )\n\tio-uring? ( sys-libs/liburing:= )\n\tjack? ( virtual/jack )\n\tjemalloc? ( dev-libs/jemalloc )\n\tjpeg? ( media-libs/libjpeg-turbo:= )\n\tkernel_linux? ( sys-libs/libcap-ng )\n\tkeyutils? ( sys-apps/keyutils )\n\tlzo? ( dev-libs/lzo:2 )\n\tmultipath? ( sys-fs/multipath-tools )\n\tncurses? (\n\t\tsys-libs/ncurses:=[unicode(+)]\n\t\tsys-libs/ncurses:=\n\t)\n\tnfs? ( >=net-fs/libnfs-1.9.3:= )\n\tnuma? ( sys-process/numactl )\n\topengl? (\n\t\tvirtual/opengl\n\t\tmedia-libs/libepoxy\n\t\tmedia-libs/mesa\n\t\tmedia-libs/mesa[egl(+),gbm(+)]\n\t)\n\tpam? ( sys-libs/pam )\n\tpipewire? ( >=media-video/pipewire-0.3.60 )\n\tpng? ( >=media-libs/libpng-1.6.34:= )\n\tpulseaudio? ( media-libs/libpulse )\n\trbd? ( sys-cluster/ceph )\n\tsasl? ( dev-libs/cyrus-sasl )\n\tsdl? (\n\t\tmedia-libs/libsdl2[video]\n\t\tmedia-libs/libsdl2\n\t)\n\tsdl-image? ( media-libs/sdl2-image )\n\tseccomp? ( >=sys-libs/libseccomp-2.1.0 )\n\tslirp? ( net-libs/libslirp )\n\tsmartcard? ( >=app-emulation/libcacard-2.5.0 )\n\tsnappy? ( app-arch/snappy:= )\n\tspice? (\n\t\t>=app-emulation/spice-protocol-0.14.0\n\t\t>=app-emulation/spice-0.14.0\n\t)\n\tssh? ( >=net-libs/libssh-0.8.6 )\n\tudev? ( virtual/libudev:= )\n\tusb? ( >=virtual/libusb-1-r2:1 )\n\tusbredir? ( >=sys-apps/usbredir-0.6 )\n\tvde? ( net-misc/vde )\n\tvirgl? ( media-libs/virglrenderer )\n\tvirtfs? ( sys-libs/libcap )\n\txen? ( app-emulation/xen-tools:= )\n\tzstd? ( >=app-arch/zstd-1.4.0 )\n\n\tqemu_softmmu_targets_i386? ( \n\tpin-upstream-blobs? (\n\t\t~sys-firmware/edk2-ovmf-bin-202202\n\t\t~sys-firmware/ipxe-1.21.1[binary,qemu]\n\t\t~sys-firmware/seabios-bin-1.16.0\n\t\t~sys-firmware/sgabios-0.1_pre10[binary]\n\t)\n\t!pin-upstream-blobs? (\n\t\t|| (\n\t\t\t>=sys-firmware/edk2-ovmf-202202\n\t\t\t>=sys-firmware/edk2-ovmf-bin-202202\n\t\t)\n\t\tsys-firmware/ipxe[qemu]\n\t\t|| (\n\t\t\t>=sys-firmware/seabios-1.16.0[seavgabios]\n\t\t\t>=sys-firmware/seabios-bin-1.16.0\n\t\t)\n\t\tsys-firmware/sgabios\n\t)\n )\n\tqemu_softmmu_targets_x86_64? ( \n\tpin-upstream-blobs? (\n\t\t~sys-firmware/edk2-ovmf-bin-202202\n\t\t~sys-firmware/ipxe-1.21.1[binary,qemu]\n\t\t~sys-firmware/seabios-bin-1.16.0\n\t\t~sys-firmware/sgabios-0.1_pre10[binary]\n\t)\n\t!pin-upstream-blobs? (\n\t\t|| (\n\t\t\t>=sys-firmware/edk2-ovmf-202202\n\t\t\t>=sys-firmware/edk2-ovmf-bin-202202\n\t\t)\n\t\tsys-firmware/ipxe[qemu]\n\t\t|| (\n\t\t\t>=sys-firmware/seabios-1.16.0[seavgabios]\n\t\t\t>=sys-firmware/seabios-bin-1.16.0\n\t\t)\n\t\tsys-firmware/sgabios\n\t)\n )\n\tqemu_softmmu_targets_ppc? ( \n\tpin-upstream-blobs? (\n\t\t~sys-firmware/seabios-bin-1.16.0\n\t)\n\t!pin-upstream-blobs? (\n\t\t|| (\n\t\t\t>=sys-firmware/seabios-1.16.0[seavgabios]\n\t\t\t>=sys-firmware/seabios-bin-1.16.0\n\t\t)\n\t)\n )\n\tqemu_softmmu_targets_ppc64? ( \n\tpin-upstream-blobs? (\n\t\t~sys-firmware/seabios-bin-1.16.0\n\t)\n\t!pin-upstream-blobs? (\n\t\t|| (\n\t\t\t>=sys-firmware/seabios-1.16.0[seavgabios]\n\t\t\t>=sys-firmware/seabios-bin-1.16.0\n\t\t)\n\t)\n )\n' declare -x CFLAGS="-O2 -pipe -march=native -fno-diagnostics-color" declare -x CFLAGS_amd64="-m64" declare -x CFLAGS_default declare -x CFLAGS_x32="-mx32" declare -x CFLAGS_x86="-m32 -mfpmath=sse" declare -- CHECKCONFIG_DONOTHING="" 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_COLOR_DIAGNOSTICS="OFF" declare -x CMAKE_COLOR_MAKEFILE="OFF" declare -x COLLECTD_PLUGINS="" declare -- COMMON_TARGETS=$'\n\taarch64\n\talpha\n\tarm\n\tcris\n\thppa\n\ti386\n\tloongarch64\n\tm68k\n\tmicroblaze\n\tmicroblazeel\n\tmips\n\tmips64\n\tmips64el\n\tmipsel\n\tnios2\n\tor1k\n\tppc\n\tppc64\n\triscv32\n\triscv64\n\ts390x\n\tsh4\n\tsh4eb\n\tsparc\n\tsparc64\n\tx86_64\n\txtensa\n\txtensaeb\n' declare -x CPU_FLAGS_ARM="" declare -x CPU_FLAGS_PPC="" declare -x CPU_FLAGS_X86="" declare -x CSSTRNGS="/usr/share/locale" declare -x CTARGET_default="x86_64-pc-linux-gnu" declare -x CURL_SSL="" declare -x CXXFLAGS="-O2 -pipe -march=native -fno-diagnostics-color" declare -x DEFAULT_ABI="amd64" declare -x DEFINED_PHASES=" compile configure info install postinst postrm prepare pretend setup test unpack" declare DEPEND=$'\n\t\n\t\n\tdev-libs/glib:2\n\tsys-libs/zlib\n\tpython? ( python_targets_python3_10? ( dev-lang/python:3.10[ncurses,readline] ) python_targets_python3_11? ( dev-lang/python:3.11[ncurses,readline] ) python_targets_python3_12? ( dev-lang/python:3.12[ncurses,readline] ) )\n\tsystemtap? ( dev-util/systemtap )\n\txattr? ( sys-apps/attr )\n\n\t\n\t>=x11-libs/pixman-0.28.0\n\taccessibility? (\n\t\tapp-accessibility/brltty[api]\n\t\tapp-accessibility/brltty\n\t)\n\taio? ( dev-libs/libaio )\n\talsa? ( >=media-libs/alsa-lib-1.0.13 )\n\tbpf? ( dev-libs/libbpf:= )\n\tbzip2? ( app-arch/bzip2 )\n\tcapstone? ( dev-libs/capstone:= )\n\tcurl? ( >=net-misc/curl-7.15.4 )\n\tfdt? ( >=sys-apps/dtc-1.5.1 )\n\tfuse? ( >=sys-fs/fuse-3.1:3 )\n\tglusterfs? ( >=sys-cluster/glusterfs-3.4.0 )\n\tgnutls? (\n\t\t>=net-libs/gnutls-3.0:=\n\t\tdev-libs/nettle:=\n\t)\n\tgtk? (\n\t\tx11-libs/gtk+:3\n\t\tvte? ( x11-libs/vte:2.91 )\n\t)\n\tinfiniband? ( sys-cluster/rdma-core )\n\tiscsi? ( net-libs/libiscsi )\n\tio-uring? ( sys-libs/liburing:= )\n\tjack? ( virtual/jack )\n\tjemalloc? ( dev-libs/jemalloc )\n\tjpeg? ( media-libs/libjpeg-turbo:= )\n\tkernel_linux? ( sys-libs/libcap-ng )\n\tkeyutils? ( sys-apps/keyutils )\n\tlzo? ( dev-libs/lzo:2 )\n\tmultipath? ( sys-fs/multipath-tools )\n\tncurses? (\n\t\tsys-libs/ncurses:=[unicode(+)]\n\t\tsys-libs/ncurses:=\n\t)\n\tnfs? ( >=net-fs/libnfs-1.9.3:= )\n\tnuma? ( sys-process/numactl )\n\topengl? (\n\t\tvirtual/opengl\n\t\tmedia-libs/libepoxy\n\t\tmedia-libs/mesa\n\t\tmedia-libs/mesa[egl(+),gbm(+)]\n\t)\n\tpam? ( sys-libs/pam )\n\tpipewire? ( >=media-video/pipewire-0.3.60 )\n\tpng? ( >=media-libs/libpng-1.6.34:= )\n\tpulseaudio? ( media-libs/libpulse )\n\trbd? ( sys-cluster/ceph )\n\tsasl? ( dev-libs/cyrus-sasl )\n\tsdl? (\n\t\tmedia-libs/libsdl2[video]\n\t\tmedia-libs/libsdl2\n\t)\n\tsdl-image? ( media-libs/sdl2-image )\n\tseccomp? ( >=sys-libs/libseccomp-2.1.0 )\n\tslirp? ( net-libs/libslirp )\n\tsmartcard? ( >=app-emulation/libcacard-2.5.0 )\n\tsnappy? ( app-arch/snappy:= )\n\tspice? (\n\t\t>=app-emulation/spice-protocol-0.14.0\n\t\t>=app-emulation/spice-0.14.0\n\t)\n\tssh? ( >=net-libs/libssh-0.8.6 )\n\tudev? ( virtual/libudev:= )\n\tusb? ( >=virtual/libusb-1-r2:1 )\n\tusbredir? ( >=sys-apps/usbredir-0.6 )\n\tvde? ( net-misc/vde )\n\tvirgl? ( media-libs/virglrenderer )\n\tvirtfs? ( sys-libs/libcap )\n\txen? ( app-emulation/xen-tools:= )\n\tzstd? ( >=app-arch/zstd-1.4.0 )\n\n\tqemu_softmmu_targets_i386? ( \n\tpin-upstream-blobs? (\n\t\t~sys-firmware/edk2-ovmf-bin-202202\n\t\t~sys-firmware/ipxe-1.21.1[binary,qemu]\n\t\t~sys-firmware/seabios-bin-1.16.0\n\t\t~sys-firmware/sgabios-0.1_pre10[binary]\n\t)\n\t!pin-upstream-blobs? (\n\t\t|| (\n\t\t\t>=sys-firmware/edk2-ovmf-202202\n\t\t\t>=sys-firmware/edk2-ovmf-bin-202202\n\t\t)\n\t\tsys-firmware/ipxe[qemu]\n\t\t|| (\n\t\t\t>=sys-firmware/seabios-1.16.0[seavgabios]\n\t\t\t>=sys-firmware/seabios-bin-1.16.0\n\t\t)\n\t\tsys-firmware/sgabios\n\t)\n )\n\tqemu_softmmu_targets_x86_64? ( \n\tpin-upstream-blobs? (\n\t\t~sys-firmware/edk2-ovmf-bin-202202\n\t\t~sys-firmware/ipxe-1.21.1[binary,qemu]\n\t\t~sys-firmware/seabios-bin-1.16.0\n\t\t~sys-firmware/sgabios-0.1_pre10[binary]\n\t)\n\t!pin-upstream-blobs? (\n\t\t|| (\n\t\t\t>=sys-firmware/edk2-ovmf-202202\n\t\t\t>=sys-firmware/edk2-ovmf-bin-202202\n\t\t)\n\t\tsys-firmware/ipxe[qemu]\n\t\t|| (\n\t\t\t>=sys-firmware/seabios-1.16.0[seavgabios]\n\t\t\t>=sys-firmware/seabios-bin-1.16.0\n\t\t)\n\t\tsys-firmware/sgabios\n\t)\n )\n\tqemu_softmmu_targets_ppc? ( \n\tpin-upstream-blobs? (\n\t\t~sys-firmware/seabios-bin-1.16.0\n\t)\n\t!pin-upstream-blobs? (\n\t\t|| (\n\t\t\t>=sys-firmware/seabios-1.16.0[seavgabios]\n\t\t\t>=sys-firmware/seabios-bin-1.16.0\n\t\t)\n\t)\n )\n\tqemu_softmmu_targets_ppc64? ( \n\tpin-upstream-blobs? (\n\t\t~sys-firmware/seabios-bin-1.16.0\n\t)\n\t!pin-upstream-blobs? (\n\t\t|| (\n\t\t\t>=sys-firmware/seabios-1.16.0[seavgabios]\n\t\t\t>=sys-firmware/seabios-bin-1.16.0\n\t\t)\n\t)\n )\n\n\tkernel_linux? ( >=sys-kernel/linux-headers-2.6.35 )\n\tstatic-user? ( \n\tdev-libs/glib:2[static-libs(+)]\n\tsys-libs/zlib[static-libs(+)]\n\tpython? ( python_targets_python3_10? ( dev-lang/python:3.10[ncurses,readline] ) python_targets_python3_11? ( dev-lang/python:3.11[ncurses,readline] ) python_targets_python3_12? ( dev-lang/python:3.12[ncurses,readline] ) )\n\tsystemtap? ( dev-util/systemtap )\n\txattr? ( sys-apps/attr[static-libs(+)] )\n )\n ' declare DESCRIPTION="QEMU + Kernel-based Virtual Machine userland tools" declare -- DESKTOP_DATABASE_DIR="/usr/share/applications" declare -x DIROPTIONS="-m0755" declare -- DOC_CONTENTS=$'If you don\'t have kvm compiled into the kernel, make sure you have the\nkernel module loaded before running kvm. The easiest way to ensure that the\nkernel module is loaded is to load it on boot.\n\tFor AMD CPUs the module is called \'kvm-amd\'.\n\tFor Intel CPUs the module is called \'kvm-intel\'.\nPlease review /etc/conf.d/modules for how to load these.\n\nMake sure your user is in the \'kvm\' group. Just run\n\t$ gpasswd -a kvm\nthen have re-login.\n\nFor brand new installs, the default permissions on /dev/kvm might not let\nyou access it. You can tell udev to reset ownership/perms:\n\t$ udevadm trigger -c add /dev/kvm\n\nIf you want to register binfmt handlers for qemu user targets:\nFor openrc:\n\t# rc-update add qemu-binfmt\nFor systemd:\n\t# ln -s /usr/share/qemu/binfmt.d/qemu.conf /etc/binfmt.d/qemu.conf' declare -x DOTNET_ROOT="/opt/dotnet-sdk-bin-7.0" declare -x DSM_CONFIG="/etc/tivoli/dsm.opt" declare -x DSM_DIR="/opt/tivoli/tsm/client/ba/bin" declare -x DSM_LOG="/var/log/tsm" declare -x EAPI="8" declare -- EDK2_OVMF_VERSION="202202" declare -x EGO_BUILD_FLAGS="-p 4" declare -x ELIBC="glibc" 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="1703123926.508867" declare -- EPOCHSECONDS="1703123926" declare -x EPYTHON="python3.11" declare -x EXEOPTIONS="-m0755" declare -- E_IDEPEND="filecaps? ( sys-libs/libcap )" declare -x FCFLAGS="-O2 -pipe -march=native -fno-diagnostics-color" 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="-O2 -pipe -march=native -fno-diagnostics-color" declare -x FFTOOLS="" declare -- FIRMWARE_ABI_VERSION="7.2.0" declare -x FPATH="/usr/local/share/zsh/site-functions:/usr/share/zsh/site-functions:/usr/share/zsh/5.9/functions/Calendar:/usr/share/zsh/5.9/functions/Chpwd:/usr/share/zsh/5.9/functions/Completion:/usr/share/zsh/5.9/functions/Completion/AIX:/usr/share/zsh/5.9/functions/Completion/BSD:/usr/share/zsh/5.9/functions/Completion/Base:/usr/share/zsh/5.9/functions/Completion/Cygwin:/usr/share/zsh/5.9/functions/Completion/Darwin:/usr/share/zsh/5.9/functions/Completion/Debian:/usr/share/zsh/5.9/functions/Completion/Linux:/usr/share/zsh/5.9/functions/Completion/Mandriva:/usr/share/zsh/5.9/functions/Completion/Redhat:/usr/share/zsh/5.9/functions/Completion/Solaris:/usr/share/zsh/5.9/functions/Completion/Unix:/usr/share/zsh/5.9/functions/Completion/X:/usr/share/zsh/5.9/functions/Completion/Zsh:/usr/share/zsh/5.9/functions/Completion/openSUSE:/usr/share/zsh/5.9/functions/Exceptions:/usr/share/zsh/5.9/functions/MIME:/usr/share/zsh/5.9/functions/Math:/usr/share/zsh/5.9/functions/Misc:/usr/share/zsh/5.9/functions/Newuser:/usr/share/zsh/5.9/functions/Prompts:/usr/share/zsh/5.9/functions/TCP:/usr/share/zsh/5.9/functions/VCS_Info:/usr/share/zsh/5.9/functions/VCS_Info/Backends:/usr/share/zsh/5.9/functions/Zftp:/usr/share/zsh/5.9/functions/Zle:/usr/share/Lmod/init/ksh_funcs" declare -x GCC_COLORS="" declare -x GCC_SPECS="" declare -x GIT_PAGER="cat" declare -x GO19CONCURRENTCOMPILATION="0" declare -x GOMAXPROCS="4" declare -x GPG_VERIFY_GROUP_DROP="nogroup" declare -x GPG_VERIFY_USER_DROP="nobody" declare -x GPSD_PROTOCOLS="" declare -x GRUB_PLATFORMS="" declare HOMEPAGE="https://www.qemu.org https://www.linux-kvm.org" declare IDEPEND="filecaps? ( sys-libs/libcap )" declare -x INHERITED=" toolchain-funcs multilib linux-info out-of-source-utils multibuild multiprocessing python-utils-r1 python-r1 udev fcaps readme.gentoo-r1 pax-utils xdg-utils" declare -x INPUT_DEVICES="" declare -x INSOPTIONS="-m0644" declare IUSE=$'accessibility +aio alsa bpf bzip2 capstone +curl debug doc\n\t+fdt fuse glusterfs +gnutls gtk infiniband iscsi io-uring\n\tjack jemalloc +jpeg keyutils\n\tlzo multipath\n\tncurses nfs nls numa opengl +oss pam +pin-upstream-blobs pipewire\n\tplugins +png pulseaudio python rbd sasl +seccomp sdl sdl-image selinux\n\t+slirp\n\tsmartcard snappy spice ssh static-user systemtap test udev usb\n\tusbredir vde +vhost-net virgl virtfs +vnc vte xattr xen\n\tzstd qemu_softmmu_targets_aarch64 qemu_softmmu_targets_alpha qemu_softmmu_targets_arm qemu_softmmu_targets_cris qemu_softmmu_targets_hppa qemu_softmmu_targets_i386 qemu_softmmu_targets_loongarch64 qemu_softmmu_targets_m68k qemu_softmmu_targets_microblaze qemu_softmmu_targets_microblazeel qemu_softmmu_targets_mips qemu_softmmu_targets_mips64 qemu_softmmu_targets_mips64el qemu_softmmu_targets_mipsel qemu_softmmu_targets_nios2 qemu_softmmu_targets_or1k qemu_softmmu_targets_ppc qemu_softmmu_targets_ppc64 qemu_softmmu_targets_riscv32 qemu_softmmu_targets_riscv64 qemu_softmmu_targets_s390x qemu_softmmu_targets_sh4 qemu_softmmu_targets_sh4eb qemu_softmmu_targets_sparc qemu_softmmu_targets_sparc64 qemu_softmmu_targets_x86_64 qemu_softmmu_targets_xtensa qemu_softmmu_targets_xtensaeb qemu_softmmu_targets_avr qemu_softmmu_targets_rx qemu_softmmu_targets_tricore qemu_user_targets_aarch64 qemu_user_targets_alpha qemu_user_targets_arm qemu_user_targets_cris qemu_user_targets_hppa qemu_user_targets_i386 qemu_user_targets_loongarch64 qemu_user_targets_m68k qemu_user_targets_microblaze qemu_user_targets_microblazeel qemu_user_targets_mips qemu_user_targets_mips64 qemu_user_targets_mips64el qemu_user_targets_mipsel qemu_user_targets_nios2 qemu_user_targets_or1k qemu_user_targets_ppc qemu_user_targets_ppc64 qemu_user_targets_riscv32 qemu_user_targets_riscv64 qemu_user_targets_s390x qemu_user_targets_sh4 qemu_user_targets_sh4eb qemu_user_targets_sparc qemu_user_targets_sparc64 qemu_user_targets_x86_64 qemu_user_targets_xtensa qemu_user_targets_xtensaeb qemu_user_targets_aarch64_be qemu_user_targets_armeb qemu_user_targets_hexagon qemu_user_targets_mipsn32 qemu_user_targets_mipsn32el qemu_user_targets_ppc64le qemu_user_targets_sparc32plus python_targets_python3_10 python_targets_python3_11 python_targets_python3_12 +filecaps' declare -x IUSE_EFFECTIVE="abi_x86_64 accessibility aio alpha alsa amd64 amd64-linux arm arm64 arm64-macos bpf bzip2 capstone curl debug doc elibc_Darwin elibc_SunOS elibc_bionic elibc_glibc elibc_mingw elibc_musl fdt filecaps fuse glusterfs gnutls gtk hppa ia64 infiniband io-uring iscsi jack jemalloc jpeg kernel_Darwin kernel_SunOS kernel_linux keyutils loong lzo m68k mips multipath ncurses nfs nls numa opengl oss pam pin-upstream-blobs pipewire plugins png ppc ppc-macos ppc64 ppc64-linux prefix prefix-guest prefix-stack pulseaudio python python_targets_python3_10 python_targets_python3_11 python_targets_python3_12 qemu_softmmu_targets_aarch64 qemu_softmmu_targets_alpha qemu_softmmu_targets_arm qemu_softmmu_targets_avr qemu_softmmu_targets_cris qemu_softmmu_targets_hppa qemu_softmmu_targets_i386 qemu_softmmu_targets_loongarch64 qemu_softmmu_targets_m68k qemu_softmmu_targets_microblaze qemu_softmmu_targets_microblazeel qemu_softmmu_targets_mips qemu_softmmu_targets_mips64 qemu_softmmu_targets_mips64el qemu_softmmu_targets_mipsel qemu_softmmu_targets_nios2 qemu_softmmu_targets_or1k qemu_softmmu_targets_ppc qemu_softmmu_targets_ppc64 qemu_softmmu_targets_riscv32 qemu_softmmu_targets_riscv64 qemu_softmmu_targets_rx qemu_softmmu_targets_s390x qemu_softmmu_targets_sh4 qemu_softmmu_targets_sh4eb qemu_softmmu_targets_sparc qemu_softmmu_targets_sparc64 qemu_softmmu_targets_tricore qemu_softmmu_targets_x86_64 qemu_softmmu_targets_xtensa qemu_softmmu_targets_xtensaeb qemu_user_targets_aarch64 qemu_user_targets_aarch64_be qemu_user_targets_alpha qemu_user_targets_arm qemu_user_targets_armeb qemu_user_targets_cris qemu_user_targets_hexagon qemu_user_targets_hppa qemu_user_targets_i386 qemu_user_targets_loongarch64 qemu_user_targets_m68k qemu_user_targets_microblaze qemu_user_targets_microblazeel qemu_user_targets_mips qemu_user_targets_mips64 qemu_user_targets_mips64el qemu_user_targets_mipsel qemu_user_targets_mipsn32 qemu_user_targets_mipsn32el qemu_user_targets_nios2 qemu_user_targets_or1k qemu_user_targets_ppc qemu_user_targets_ppc64 qemu_user_targets_ppc64le qemu_user_targets_riscv32 qemu_user_targets_riscv64 qemu_user_targets_s390x qemu_user_targets_sh4 qemu_user_targets_sh4eb qemu_user_targets_sparc qemu_user_targets_sparc32plus qemu_user_targets_sparc64 qemu_user_targets_x86_64 qemu_user_targets_xtensa qemu_user_targets_xtensaeb rbd riscv s390 sasl sdl sdl-image seccomp selinux slirp smartcard snappy sparc spice ssh static-user systemtap test udev usb usbredir vde vhost-net virgl virtfs vnc vte x64-macos x64-solaris x86 x86-linux xattr xen zstd" declare -x IUSE_IMPLICIT="abi_x86_64 prefix prefix-guest prefix-stack" declare -- IUSE_SOFTMMU_TARGETS=$'\n\t\n\taarch64\n\talpha\n\tarm\n\tcris\n\thppa\n\ti386\n\tloongarch64\n\tm68k\n\tmicroblaze\n\tmicroblazeel\n\tmips\n\tmips64\n\tmips64el\n\tmipsel\n\tnios2\n\tor1k\n\tppc\n\tppc64\n\triscv32\n\triscv64\n\ts390x\n\tsh4\n\tsh4eb\n\tsparc\n\tsparc64\n\tx86_64\n\txtensa\n\txtensaeb\n\n\tavr\n\trx\n\ttricore\n' declare -- IUSE_USER_TARGETS=$'\n\t\n\taarch64\n\talpha\n\tarm\n\tcris\n\thppa\n\ti386\n\tloongarch64\n\tm68k\n\tmicroblaze\n\tmicroblazeel\n\tmips\n\tmips64\n\tmips64el\n\tmipsel\n\tnios2\n\tor1k\n\tppc\n\tppc64\n\triscv32\n\triscv64\n\ts390x\n\tsh4\n\tsh4eb\n\tsparc\n\tsparc64\n\tx86_64\n\txtensa\n\txtensaeb\n\n\taarch64_be\n\tarmeb\n\thexagon\n\tmipsn32\n\tmipsn32el\n\tppc64le\n\tsparc32plus\n' declare -x JAVAC="/etc/java-config-2/current-system-vm/bin/javac" declare -x JAVACC_HOME="/usr/share/javacc/" declare -x JAVA_HOME="/etc/java-config-2/current-system-vm" declare -x JDK_HOME="/etc/java-config-2/current-system-vm" declare -x KERNEL="linux" declare -x KERNEL_ABI="amd64" declare -- KERNEL_DIR="/usr/src/linux" declare -- KERNEL_MAKEFILE="/usr/src/linux/Makefile" declare -x KEYWORDS="~amd64 ~arm ~arm64 ~loong ~ppc ~ppc64 ~riscv ~x86" declare -- KV_DIR="/usr/src/linux" declare -- KV_EXTRA="" declare -- KV_FULL="6.6.7" declare -- KV_LOCAL="" declare -- KV_MAJOR="6" declare -- KV_MINOR="6" declare -- KV_OUT_DIR="/usr/src/linux" declare -- KV_PATCH="7" declare -x L10N="" declare -x LADSPA_PATH="/usr/lib64/ladspa" declare -x LANG="C.UTF8" declare -x LCD_DEVICES="" declare -x LC_COLLATE="C" declare -x LC_MESSAGES="C" declare -x LD="x86_64-pc-linux-gnu-ld" declare -x LDFLAGS="-Wl,-O1 -Wl,--as-needed -Wl,--defsym=__gentoo_check_ldflags__=0" 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 LE_CONFIG_HOME="/etc/acme-sh/" declare -x LE_WORKING_DIR="/etc/acme-sh/" 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-2 LGPL-2 BSD-2" declare -x LLVM_TARGETS="" declare -x LMOD_CACHED_LOADS="yes" declare -x LMOD_CMD="/usr/share/Lmod/libexec/lmod" declare -x LMOD_DIR="/usr/share/Lmod/libexec" declare -x LMOD_PKG="/usr/share/Lmod" declare -x LMOD_ROOT="/usr/share/Lmod/.." declare -x LMOD_SETTARG_FULL_SUPPORT="no" declare -x LMOD_VERSION="8.7.23" declare -x LMOD_sys="Linux" declare -x LOGTALKHOME="/usr/share/logtalk-3.47.0" declare -x LUA_SINGLE_TARGET="" declare -x LUA_TARGETS="" declare -x LV2_PATH="/usr/lib64/lv2" declare -x MAILTO="tinderbox" declare -x MAKEOPTS=" -j4 V=1" declare -x MANPAGER="manpager" declare -- MIMEINFO_DATABASE_DIR="/usr/share/mime" declare -x MODULEPATH="/etc/modulefiles/Linux:/etc/modulefiles/Core:/usr/share/Lmod/modulefiles/Core" declare -x MODULEPATH_ROOT="/etc/modulefiles" declare -x MODULESHOME="/usr/share/Lmod" declare -x MONKEYD_PLUGINS="" declare -x MOZ_GMP_PATH="/usr/lib64/nsbrowser/plugins/gmp-gmpopenh264/system-installed" 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 -x MULTITALK_DIR="/usr/share/multitalk" declare -- MY_P="qemu-8.2.0" declare -x NGINX_MODULES_HTTP="" declare -x NGINX_MODULES_MAIL="" declare -x NGINX_MODULES_STREAM="" declare -x NM="x86_64-pc-linux-gnu-nm" declare -x NPM_CONFIG_GLOBALCONFIG="/etc/npm/npmrc" declare -x OBJCOPY="x86_64-pc-linux-gnu-objcopy" declare -x OCAML_COLOR="never" declare -x OFFICE_IMPLEMENTATION="" declare -x OMP_DYNAMIC="FALSE" declare -x OMP_NESTED="FALSE" declare -x OMP_NUM_THREADS="4" declare -x OPCODEDIR="/usr/lib64/csound/plugins" declare -x OPENMPI_FABRICS="" declare -x OPENMPI_OFED_FEATURES="" declare -x OPENMPI_RM="" declare -x ORACLE_HOME="/usr/lib64/oracle/client" declare -a PATCHES=([0]="/var/tmp/portage/app-emulation/qemu-8.2.0/files/qemu-8.0.0-disable-keymap.patch" [1]="/var/tmp/portage/app-emulation/qemu-8.2.0/files/qemu-7.1.0-capstone-include-path.patch" [2]="/var/tmp/portage/app-emulation/qemu-8.2.0/files/qemu-8.1.0-also-build-virtfs-proxy-helper.patch" [3]="/var/tmp/portage/app-emulation/qemu-8.2.0/files/qemu-8.1.0-skip-tests.patch" [4]="/var/tmp/portage/app-emulation/qemu-8.2.0/files/qemu-8.1.0-find-sphinx.patch") declare -x PATH="/var/tmp/portage/app-emulation/qemu-8.2.0/temp/python3.11/bin:/usr/lib/portage/python3.11/ebuild-helpers/xattr:/usr/lib/portage/python3.11/ebuild-helpers:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/lib/llvm/17/bin:/usr/lib/llvm/16/bin:/opt/zookeeper-bin/bin" declare -- PAX_MARKINGS="none" declare PDEPEND="" declare -x PGPLOT_FONT="/usr/lib64/pgplot/grfont.dat" declare -x PHP_TARGETS="" declare -x PKGSYSTEM_ENABLE_FSYNC="0" declare -x PKG_CONFIG="x86_64-pc-linux-gnu-pkg-config" declare -x PKG_CONFIG_PATH="/var/tmp/portage/app-emulation/qemu-8.2.0/temp/python3.11/pkgconfig" declare -x PORTAGE_COMPRESSION_COMMAND="zstd -T4" 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/qemu-8.2.0/html") declare -a PORTAGE_DOSTRIP=([0]="/") declare -a PORTAGE_DOSTRIP_SKIP=() declare -x PORTAGE_TMPFS="/dev/shm" declare -x PORT_LOGDIR="/var/log/portage" declare -x POSTGRES_TARGETS="" declare -- PPC_FIRMWARE_DEPEND=$'\n\tpin-upstream-blobs? (\n\t\t~sys-firmware/seabios-bin-1.16.0\n\t)\n\t!pin-upstream-blobs? (\n\t\t|| (\n\t\t\t>=sys-firmware/seabios-1.16.0[seavgabios]\n\t\t\t>=sys-firmware/seabios-bin-1.16.0\n\t\t)\n\t)\n' 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 -- PROPERTIES="" declare -x PYTEST_ADDOPTS="--color=no" declare -x PYTHON="/usr/bin/python3.11" declare -x PYTHONDOCS_3_12="/usr/share/doc/python-docs-3.12.1/html/library" declare -x PYTHONDONTWRITEBYTECODE="1" declare -a PYTHON_COMPAT=([0]="python3_10" [1]="python3_11" [2]="python3_12") declare -- PYTHON_DEPS="python_targets_python3_10? ( dev-lang/python:3.10[ncurses,readline] ) python_targets_python3_11? ( dev-lang/python:3.11[ncurses,readline] ) python_targets_python3_12? ( dev-lang/python:3.12[ncurses,readline] ) " declare -- PYTHON_REQUIRED_USE="|| ( python_targets_python3_10 python_targets_python3_11 python_targets_python3_12 )" declare -- PYTHON_REQ_USE="ncurses,readline" declare -x PYTHON_SINGLE_TARGET="" declare -x PYTHON_TARGETS="python3_11" declare -- PYTHON_USEDEP="python_targets_python3_10(-)?,python_targets_python3_11(-)?,python_targets_python3_12(-)?" declare -x PY_FORCE_COLOR="0" declare -- QA_PREBUILT=$'\n\tusr/share/qemu/hppa-firmware.img\n\tusr/share/qemu/openbios-ppc\n\tusr/share/qemu/openbios-sparc64\n\tusr/share/qemu/openbios-sparc32\n\tusr/share/qemu/opensbi-riscv64-generic-fw_dynamic.elf\n\tusr/share/qemu/opensbi-riscv32-generic-fw_dynamic.elf\n\tusr/share/qemu/palcode-clipper\n\tusr/share/qemu/s390-ccw.img\n\tusr/share/qemu/s390-netboot.img\n\tusr/share/qemu/u-boot.e500\n' declare -- QA_WX_LOAD=$'\n\tusr/bin/qemu-i386\n\tusr/bin/qemu-x86_64\n\tusr/bin/qemu-alpha\n\tusr/bin/qemu-arm\n\tusr/bin/qemu-cris\n\tusr/bin/qemu-m68k\n\tusr/bin/qemu-microblaze\n\tusr/bin/qemu-microblazeel\n\tusr/bin/qemu-mips\n\tusr/bin/qemu-mipsel\n\tusr/bin/qemu-or1k\n\tusr/bin/qemu-ppc\n\tusr/bin/qemu-ppc64\n\tusr/bin/qemu-sh4\n\tusr/bin/qemu-sh4eb\n\tusr/bin/qemu-sparc\n\tusr/bin/qemu-sparc64\n\tusr/bin/qemu-armeb\n\tusr/bin/qemu-sparc32plus\n\tusr/bin/qemu-s390x\n\tusr/bin/qemu-unicore32\n' declare -- QEMU_DOCS_PREBUILT="1" declare -- QEMU_DOCS_PREBUILT_DEV="sam" declare -- QEMU_DOCS_VERSION="8.2.0" declare -- QEMU_DOC_USEFLAG="doc" declare -x QEMU_SOFTMMU_TARGETS="i386 x86_64" declare -x QEMU_USER_TARGETS="i386 x86_64" declare -x QPSMTPD_CONFIG="/etc/qpsmtpd" declare -x QRNADB="/usr/share/qrna/data" declare -x RANLIB="x86_64-pc-linux-gnu-ranlib" declare RDEPEND=$'\n\t\n\t\n\tdev-libs/glib:2\n\tsys-libs/zlib\n\tpython? ( python_targets_python3_10? ( dev-lang/python:3.10[ncurses,readline] ) python_targets_python3_11? ( dev-lang/python:3.11[ncurses,readline] ) python_targets_python3_12? ( dev-lang/python:3.12[ncurses,readline] ) )\n\tsystemtap? ( dev-util/systemtap )\n\txattr? ( sys-apps/attr )\n\n\t\n\t>=x11-libs/pixman-0.28.0\n\taccessibility? (\n\t\tapp-accessibility/brltty[api]\n\t\tapp-accessibility/brltty\n\t)\n\taio? ( dev-libs/libaio )\n\talsa? ( >=media-libs/alsa-lib-1.0.13 )\n\tbpf? ( dev-libs/libbpf:= )\n\tbzip2? ( app-arch/bzip2 )\n\tcapstone? ( dev-libs/capstone:= )\n\tcurl? ( >=net-misc/curl-7.15.4 )\n\tfdt? ( >=sys-apps/dtc-1.5.1 )\n\tfuse? ( >=sys-fs/fuse-3.1:3 )\n\tglusterfs? ( >=sys-cluster/glusterfs-3.4.0 )\n\tgnutls? (\n\t\t>=net-libs/gnutls-3.0:=\n\t\tdev-libs/nettle:=\n\t)\n\tgtk? (\n\t\tx11-libs/gtk+:3\n\t\tvte? ( x11-libs/vte:2.91 )\n\t)\n\tinfiniband? ( sys-cluster/rdma-core )\n\tiscsi? ( net-libs/libiscsi )\n\tio-uring? ( sys-libs/liburing:= )\n\tjack? ( virtual/jack )\n\tjemalloc? ( dev-libs/jemalloc )\n\tjpeg? ( media-libs/libjpeg-turbo:= )\n\tkernel_linux? ( sys-libs/libcap-ng )\n\tkeyutils? ( sys-apps/keyutils )\n\tlzo? ( dev-libs/lzo:2 )\n\tmultipath? ( sys-fs/multipath-tools )\n\tncurses? (\n\t\tsys-libs/ncurses:=[unicode(+)]\n\t\tsys-libs/ncurses:=\n\t)\n\tnfs? ( >=net-fs/libnfs-1.9.3:= )\n\tnuma? ( sys-process/numactl )\n\topengl? (\n\t\tvirtual/opengl\n\t\tmedia-libs/libepoxy\n\t\tmedia-libs/mesa\n\t\tmedia-libs/mesa[egl(+),gbm(+)]\n\t)\n\tpam? ( sys-libs/pam )\n\tpipewire? ( >=media-video/pipewire-0.3.60 )\n\tpng? ( >=media-libs/libpng-1.6.34:= )\n\tpulseaudio? ( media-libs/libpulse )\n\trbd? ( sys-cluster/ceph )\n\tsasl? ( dev-libs/cyrus-sasl )\n\tsdl? (\n\t\tmedia-libs/libsdl2[video]\n\t\tmedia-libs/libsdl2\n\t)\n\tsdl-image? ( media-libs/sdl2-image )\n\tseccomp? ( >=sys-libs/libseccomp-2.1.0 )\n\tslirp? ( net-libs/libslirp )\n\tsmartcard? ( >=app-emulation/libcacard-2.5.0 )\n\tsnappy? ( app-arch/snappy:= )\n\tspice? (\n\t\t>=app-emulation/spice-protocol-0.14.0\n\t\t>=app-emulation/spice-0.14.0\n\t)\n\tssh? ( >=net-libs/libssh-0.8.6 )\n\tudev? ( virtual/libudev:= )\n\tusb? ( >=virtual/libusb-1-r2:1 )\n\tusbredir? ( >=sys-apps/usbredir-0.6 )\n\tvde? ( net-misc/vde )\n\tvirgl? ( media-libs/virglrenderer )\n\tvirtfs? ( sys-libs/libcap )\n\txen? ( app-emulation/xen-tools:= )\n\tzstd? ( >=app-arch/zstd-1.4.0 )\n\n\tqemu_softmmu_targets_i386? ( \n\tpin-upstream-blobs? (\n\t\t~sys-firmware/edk2-ovmf-bin-202202\n\t\t~sys-firmware/ipxe-1.21.1[binary,qemu]\n\t\t~sys-firmware/seabios-bin-1.16.0\n\t\t~sys-firmware/sgabios-0.1_pre10[binary]\n\t)\n\t!pin-upstream-blobs? (\n\t\t|| (\n\t\t\t>=sys-firmware/edk2-ovmf-202202\n\t\t\t>=sys-firmware/edk2-ovmf-bin-202202\n\t\t)\n\t\tsys-firmware/ipxe[qemu]\n\t\t|| (\n\t\t\t>=sys-firmware/seabios-1.16.0[seavgabios]\n\t\t\t>=sys-firmware/seabios-bin-1.16.0\n\t\t)\n\t\tsys-firmware/sgabios\n\t)\n )\n\tqemu_softmmu_targets_x86_64? ( \n\tpin-upstream-blobs? (\n\t\t~sys-firmware/edk2-ovmf-bin-202202\n\t\t~sys-firmware/ipxe-1.21.1[binary,qemu]\n\t\t~sys-firmware/seabios-bin-1.16.0\n\t\t~sys-firmware/sgabios-0.1_pre10[binary]\n\t)\n\t!pin-upstream-blobs? (\n\t\t|| (\n\t\t\t>=sys-firmware/edk2-ovmf-202202\n\t\t\t>=sys-firmware/edk2-ovmf-bin-202202\n\t\t)\n\t\tsys-firmware/ipxe[qemu]\n\t\t|| (\n\t\t\t>=sys-firmware/seabios-1.16.0[seavgabios]\n\t\t\t>=sys-firmware/seabios-bin-1.16.0\n\t\t)\n\t\tsys-firmware/sgabios\n\t)\n )\n\tqemu_softmmu_targets_ppc? ( \n\tpin-upstream-blobs? (\n\t\t~sys-firmware/seabios-bin-1.16.0\n\t)\n\t!pin-upstream-blobs? (\n\t\t|| (\n\t\t\t>=sys-firmware/seabios-1.16.0[seavgabios]\n\t\t\t>=sys-firmware/seabios-bin-1.16.0\n\t\t)\n\t)\n )\n\tqemu_softmmu_targets_ppc64? ( \n\tpin-upstream-blobs? (\n\t\t~sys-firmware/seabios-bin-1.16.0\n\t)\n\t!pin-upstream-blobs? (\n\t\t|| (\n\t\t\t>=sys-firmware/seabios-1.16.0[seavgabios]\n\t\t\t>=sys-firmware/seabios-bin-1.16.0\n\t\t)\n\t)\n )\n\n\tacct-group/kvm\n\tselinux? (\n\t\tsec-policy/selinux-qemu\n\t\tsys-libs/libselinux\n\t)\n ' declare -- README_GENTOO_SUFFIX="" declare REPOSITORY declare REQUIRED_USE=$'\n\t|| ( python_targets_python3_10 python_targets_python3_11 python_targets_python3_12 )\n\tqemu_softmmu_targets_arm? ( fdt )\n\tqemu_softmmu_targets_microblaze? ( fdt )\n\tqemu_softmmu_targets_mips64el? ( fdt )\n\tqemu_softmmu_targets_ppc64? ( fdt )\n\tqemu_softmmu_targets_ppc? ( fdt )\n\tqemu_softmmu_targets_riscv32? ( fdt )\n\tqemu_softmmu_targets_riscv64? ( fdt )\n\tqemu_softmmu_targets_x86_64? ( fdt )\n\tsdl-image? ( sdl )\n\tstatic-user? ( !plugins )\n\tvirgl? ( opengl )\n\tvirtfs? ( xattr )\n\tvnc? ( gnutls )\n\tvte? ( gtk )\n\tmultipath? ( udev )\n\tplugins? ( !static-user )\n qemu_softmmu_targets_aarch64? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_alpha? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_arm? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_cris? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_hppa? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_i386? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_loongarch64? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_m68k? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_microblaze? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_microblazeel? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_mips? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_mips64? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_mips64el? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_mipsel? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_nios2? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_or1k? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_ppc? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_ppc64? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_riscv32? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_riscv64? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_s390x? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_sh4? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_sh4eb? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_sparc? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_sparc64? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_x86_64? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_xtensa? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_xtensaeb? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_avr? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_rx? ( kernel_linux? ( seccomp ) ) qemu_softmmu_targets_tricore? ( kernel_linux? ( seccomp ) ) ' declare RESTRICT="test" declare -x RESUMECOMMAND_SSH="bash -c \"x=\\\${2#ssh://} ; host=\\\${x%%/*} ; port=\\\${host##*:} ; host=\\\${host%:*} ; [[ \\\${host} = \\\${port} ]] && port= ; exec rsync --rsh=\\\"ssh \\\${port:+-p\\\${port}} \\\${3}\\\" -avP \\\"\\\${host}:/\\\${x#*/}\\\" \\\"\\\$1\\\"\" rsync \"\${DISTDIR}/\${FILE}\" \"\${URI}\" \"\${PORTAGE_SSH_OPTS}\"" declare -x RUBY_TARGETS="" declare -x RUST_TEST_TASKS="4" declare -x RUST_TEST_THREADS="4" declare -x S="/var/tmp/portage/app-emulation/qemu-8.2.0/work/qemu-8.2.0" declare -x SANDBOX_DEBUG="0" declare -x SANDBOX_DENY="" declare -x SANDBOX_METHOD="any" declare -x SANDBOX_PREDICT="/var/tmp/portage/app-emulation/qemu-8.2.0/homedir:/dev/crypto:/var/cache/man:/dev/random:/proc/self/coredump_filter:/dev/random:/proc/self/coredump_filter:/dev/random:/proc/self/coredump_filter:/dev/random:/proc/self/coredump_filter:/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/tmp/:/var/tmp/portage:/var/tmp/portage/app-emulation/qemu-8.2.0/homedir/.bash_history" declare -x SANE_BACKENDS="" declare -x SCHEME_LIBRARY_PATH="/usr/share/slib/" declare -- SEABIOS_VERSION="1.16.0" declare -x SHELL="/bin/bash" declare -- SKIP_KERNEL_CHECK="" declare -x SLOT="0" declare -- SOFTMMU_TOOLS_DEPEND=$'\n\t>=x11-libs/pixman-0.28.0[static-libs(+)]\n\taccessibility? (\n\t\tapp-accessibility/brltty[api]\n\t\tapp-accessibility/brltty[static-libs(+)]\n\t)\n\taio? ( dev-libs/libaio[static-libs(+)] )\n\talsa? ( >=media-libs/alsa-lib-1.0.13 )\n\tbpf? ( dev-libs/libbpf:= )\n\tbzip2? ( app-arch/bzip2[static-libs(+)] )\n\tcapstone? ( dev-libs/capstone:=[static-libs(+)] )\n\tcurl? ( >=net-misc/curl-7.15.4[static-libs(+)] )\n\tfdt? ( >=sys-apps/dtc-1.5.1[static-libs(+)] )\n\tfuse? ( >=sys-fs/fuse-3.1:3[static-libs(+)] )\n\tglusterfs? ( >=sys-cluster/glusterfs-3.4.0[static-libs(+)] )\n\tgnutls? (\n\t\t>=net-libs/gnutls-3.0:=[static-libs(+)]\n\t\tdev-libs/nettle:=[static-libs(+)]\n\t)\n\tgtk? (\n\t\tx11-libs/gtk+:3\n\t\tvte? ( x11-libs/vte:2.91 )\n\t)\n\tinfiniband? ( sys-cluster/rdma-core[static-libs(+)] )\n\tiscsi? ( net-libs/libiscsi )\n\tio-uring? ( sys-libs/liburing:=[static-libs(+)] )\n\tjack? ( virtual/jack )\n\tjemalloc? ( dev-libs/jemalloc )\n\tjpeg? ( media-libs/libjpeg-turbo:=[static-libs(+)] )\n\tkernel_linux? ( sys-libs/libcap-ng[static-libs(+)] )\n\tkeyutils? ( sys-apps/keyutils[static-libs(+)] )\n\tlzo? ( dev-libs/lzo:2[static-libs(+)] )\n\tmultipath? ( sys-fs/multipath-tools )\n\tncurses? (\n\t\tsys-libs/ncurses:=[unicode(+)]\n\t\tsys-libs/ncurses:=[static-libs(+)]\n\t)\n\tnfs? ( >=net-fs/libnfs-1.9.3:=[static-libs(+)] )\n\tnuma? ( sys-process/numactl[static-libs(+)] )\n\topengl? (\n\t\tvirtual/opengl\n\t\tmedia-libs/libepoxy[static-libs(+)]\n\t\tmedia-libs/mesa[static-libs(+)]\n\t\tmedia-libs/mesa[egl(+),gbm(+)]\n\t)\n\tpam? ( sys-libs/pam )\n\tpipewire? ( >=media-video/pipewire-0.3.60 )\n\tpng? ( >=media-libs/libpng-1.6.34:=[static-libs(+)] )\n\tpulseaudio? ( media-libs/libpulse )\n\trbd? ( sys-cluster/ceph )\n\tsasl? ( dev-libs/cyrus-sasl[static-libs(+)] )\n\tsdl? (\n\t\tmedia-libs/libsdl2[video]\n\t\tmedia-libs/libsdl2[static-libs(+)]\n\t)\n\tsdl-image? ( media-libs/sdl2-image[static-libs(+)] )\n\tseccomp? ( >=sys-libs/libseccomp-2.1.0[static-libs(+)] )\n\tslirp? ( net-libs/libslirp[static-libs(+)] )\n\tsmartcard? ( >=app-emulation/libcacard-2.5.0[static-libs(+)] )\n\tsnappy? ( app-arch/snappy:= )\n\tspice? (\n\t\t>=app-emulation/spice-protocol-0.14.0\n\t\t>=app-emulation/spice-0.14.0[static-libs(+)]\n\t)\n\tssh? ( >=net-libs/libssh-0.8.6[static-libs(+)] )\n\tudev? ( virtual/libudev:= )\n\tusb? ( >=virtual/libusb-1-r2:1[static-libs(+)] )\n\tusbredir? ( >=sys-apps/usbredir-0.6[static-libs(+)] )\n\tvde? ( net-misc/vde[static-libs(+)] )\n\tvirgl? ( media-libs/virglrenderer[static-libs(+)] )\n\tvirtfs? ( sys-libs/libcap )\n\txen? ( app-emulation/xen-tools:= )\n\tzstd? ( >=app-arch/zstd-1.4.0[static-libs(+)] )\n' declare -i SRANDOM="2336336197" declare SRC_URI="https://download.qemu.org/qemu-8.2.0.tar.xz !doc? ( https://dev.gentoo.org/~sam/distfiles/app-emulation/qemu/qemu-8.2.0-docs.tar.xz )" declare -x STRINGS="x86_64-pc-linux-gnu-strings" declare -x SVDIR="/etc/service/" declare -x SYMLINK_LIB="no" declare -x TERMINFO="/etc/terminfo" declare -x TNS_ADMIN="/etc/oracle/" declare -x TWISTED_DISABLE_WRITING_OF_PLUGIN_CACHE="1" declare -x USE="abi_x86_64 aio amd64 bzip2 curl elibc_glibc fdt filecaps gnutls jemalloc kernel_linux ncurses oss pam pin-upstream-blobs png python python_targets_python3_11 qemu_softmmu_targets_i386 qemu_softmmu_targets_x86_64 qemu_user_targets_i386 qemu_user_targets_x86_64 sasl seccomp slirp vhost-net vnc xattr" 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 UWSGI_PLUGINS="" declare -x VIDEO_CARDS="" declare -x VOICEMAIL_STORAGE="" declare -x WINDRES="x86_64-pc-linux-gnu-windres" declare -- X86_FIRMWARE_DEPEND=$'\n\tpin-upstream-blobs? (\n\t\t~sys-firmware/edk2-ovmf-bin-202202\n\t\t~sys-firmware/ipxe-1.21.1[binary,qemu]\n\t\t~sys-firmware/seabios-bin-1.16.0\n\t\t~sys-firmware/sgabios-0.1_pre10[binary]\n\t)\n\t!pin-upstream-blobs? (\n\t\t|| (\n\t\t\t>=sys-firmware/edk2-ovmf-202202\n\t\t\t>=sys-firmware/edk2-ovmf-bin-202202\n\t\t)\n\t\tsys-firmware/ipxe[qemu]\n\t\t|| (\n\t\t\t>=sys-firmware/seabios-1.16.0[seavgabios]\n\t\t\t>=sys-firmware/seabios-bin-1.16.0\n\t\t)\n\t\tsys-firmware/sgabios\n\t)\n' declare -x XTABLES_ADDONS="" declare -x XZ_OPT="-9 -T4" declare -- _FCAPS_ECLASS="1" declare -- _LINUX_CONFIG_EXISTS_DONE="" declare -- _LINUX_INFO_ECLASS="1" declare -- _MULTIBUILD_ECLASS="1" declare -- _MULTILIB_ECLASS="1" declare -- _MULTIPROCESSING_ECLASS="1" declare -- _OUT_OF_SOURCE_UTILS_ECLASS="1" declare -- _PAX_UTILS_ECLASS="1" declare -a _PYTHON_ALL_IMPLS=([0]="pypy3" [1]="python3_10" [2]="python3_11" [3]="python3_12") declare -a _PYTHON_HISTORICAL_IMPLS=([0]="jython2_7" [1]="pypy" [2]="pypy1_8" [3]="pypy1_9" [4]="pypy2_0" [5]="python2_5" [6]="python2_6" [7]="python2_7" [8]="python3_1" [9]="python3_2" [10]="python3_3" [11]="python3_4" [12]="python3_5" [13]="python3_6" [14]="python3_7" [15]="python3_8" [16]="python3_9") declare -- _PYTHON_R1_ECLASS="1" declare -a _PYTHON_SUPPORTED_IMPLS=([0]="python3_10" [1]="python3_11" [2]="python3_12") declare -a _PYTHON_UNSUPPORTED_IMPLS=([0]="pypy3") declare -- _PYTHON_UTILS_R1_ECLASS="1" declare -- _README_GENTOO_ECLASS="1" declare -- _TOOLCHAIN_FUNCS_ECLASS="1" declare -- _UDEV_ECLASS="1" declare -x __E_DESTTREE="/usr" declare -x __E_DOCDESTTREE="" declare -x __E_EXEDESTTREE="" declare -x __E_INSDESTTREE="" declare -x __LMOD_SET_FPATH="1" declare -x ac_cv_c_undeclared_builtin_options="none needed" declare -x enable_year2038="no" declare -- get_version_warning_done="" declare -x gl_cv_compiler_check_decl_option="-Werror=implicit-function-declaration" declare -- smname="tricore" declare -a softmmu_bins=([0]="qemu-system-i386" [1]="qemu-system-x86_64") declare -- softmmu_targets="i386-softmmu,x86_64-softmmu" declare -- use_softmmu_targets=" qemu_softmmu_targets_aarch64 qemu_softmmu_targets_alpha qemu_softmmu_targets_arm qemu_softmmu_targets_cris qemu_softmmu_targets_hppa qemu_softmmu_targets_i386 qemu_softmmu_targets_loongarch64 qemu_softmmu_targets_m68k qemu_softmmu_targets_microblaze qemu_softmmu_targets_microblazeel qemu_softmmu_targets_mips qemu_softmmu_targets_mips64 qemu_softmmu_targets_mips64el qemu_softmmu_targets_mipsel qemu_softmmu_targets_nios2 qemu_softmmu_targets_or1k qemu_softmmu_targets_ppc qemu_softmmu_targets_ppc64 qemu_softmmu_targets_riscv32 qemu_softmmu_targets_riscv64 qemu_softmmu_targets_s390x qemu_softmmu_targets_sh4 qemu_softmmu_targets_sh4eb qemu_softmmu_targets_sparc qemu_softmmu_targets_sparc64 qemu_softmmu_targets_x86_64 qemu_softmmu_targets_xtensa qemu_softmmu_targets_xtensaeb qemu_softmmu_targets_avr qemu_softmmu_targets_rx qemu_softmmu_targets_tricore" declare -- use_user_targets=" qemu_user_targets_aarch64 qemu_user_targets_alpha qemu_user_targets_arm qemu_user_targets_cris qemu_user_targets_hppa qemu_user_targets_i386 qemu_user_targets_loongarch64 qemu_user_targets_m68k qemu_user_targets_microblaze qemu_user_targets_microblazeel qemu_user_targets_mips qemu_user_targets_mips64 qemu_user_targets_mips64el qemu_user_targets_mipsel qemu_user_targets_nios2 qemu_user_targets_or1k qemu_user_targets_ppc qemu_user_targets_ppc64 qemu_user_targets_riscv32 qemu_user_targets_riscv64 qemu_user_targets_s390x qemu_user_targets_sh4 qemu_user_targets_sh4eb qemu_user_targets_sparc qemu_user_targets_sparc64 qemu_user_targets_x86_64 qemu_user_targets_xtensa qemu_user_targets_xtensaeb qemu_user_targets_aarch64_be qemu_user_targets_armeb qemu_user_targets_hexagon qemu_user_targets_mipsn32 qemu_user_targets_mipsn32el qemu_user_targets_ppc64le qemu_user_targets_sparc32plus" declare -a user_bins=([0]="qemu-i386" [1]="qemu-x86_64") declare -- user_targets="i386-linux-user,x86_64-linux-user" SwitchGCC () { local highest=$(gcc-config --list-profiles --nocolor | cut -f 3 -d ' ' -s | grep -E 'x86_64-(pc|gentoo)-linux-(gnu|musl)-.*[0-9]$' | tail -n 1); if ! gcc-config --list-profiles --nocolor | grep -q -F "$highest *"; then local current; current=$(gcc -dumpversion); echo "major version change of gcc: $current -> $highest" | tee -a $taskfile.history; gcc-config --nocolor $highest; source_profile; add2backlog "sys-devel/libtool"; if grep -q '^LIBTOOL="rdlibtool"' /etc/portage/make.conf; then add2backlog "sys-devel/slibtool"; fi; add2backlog "%emerge --unmerge sys-devel/gcc:$(cut -f 1 -d '.' <<< $current)"; fi } declare -fx SwitchGCC __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 } _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 } _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}" } _get_all_makeopts () { echo "${MAKEOPTS} ${GNUMAKEFLAGS} ${MAKEFLAGS}" } _pax_list_files () { local f cmd; cmd=$1; shift; for f in "$@"; do ${cmd} " ${f}"; done } _python_check_EPYTHON () { if [[ -z ${EPYTHON} ]]; then die "EPYTHON unset, invalid call context"; fi } _python_check_locale_sanity () { local -x LC_ALL=${1}; local IFS=; local lc=({a..z}); local uc=({A..Z}); local input="${lc[*]}${uc[*]}"; local output=$(tr '[:lower:][:upper:]' '[:upper:][:lower:]' <<< "${input}"); [[ ${output} == "${uc[*]}${lc[*]}" ]] } _python_check_occluded_packages () { debug-print-function ${FUNCNAME} "${@}"; [[ -z ${BUILD_DIR} || ! -d ${BUILD_DIR}/install ]] && return; local sitedir="${BUILD_DIR}/install$(python_get_sitedir)"; [[ ${sitedir} -ef . ]] && return; local f fn diff l; for f in "${sitedir}"/*/; do f=${f%/}; fn=${f##*/}; [[ ${fn} == *.dist-info || ${fn} == *.egg-info ]] && continue; if [[ -d ${fn} ]]; then diff=$(comm -1 -3 <(find "${fn}" -type f -not -path '*/__pycache__/*' | sort assert) <(cd "${sitedir}" && find "${fn}" -type f -not -path '*/__pycache__/*' | sort assert)); if [[ -n ${diff} ]]; then eqawarn "The directory ${fn} occludes package installed for ${EPYTHON}."; eqawarn "The installed package includes additional files:"; eqawarn; while IFS= read -r l; do eqawarn " ${l}"; done <<< "${diff}"; eqawarn; if [[ ! -n ${_PYTHON_WARNED_OCCLUDED_PACKAGES} ]]; then eqawarn "For more information on occluded packages, please see:"; eqawarn "https://projects.gentoo.org/python/guide/test.html#importerrors-for-c-extensions"; _PYTHON_WARNED_OCCLUDED_PACKAGES=1; fi; fi; fi; done } _python_export () { debug-print-function ${FUNCNAME} "${@}"; local impl var; case "${1}" in python* | jython*) impl=${1/_/.}; shift ;; pypy | pypy3) impl=${1}; shift ;; *) impl=${EPYTHON}; if [[ -z ${impl} ]]; then die "_python_export called without a python implementation and EPYTHON is unset"; fi ;; esac; debug-print "${FUNCNAME}: implementation: ${impl}"; for var in "$@"; do case "${var}" in EPYTHON) export EPYTHON=${impl}; debug-print "${FUNCNAME}: EPYTHON = ${EPYTHON}" ;; PYTHON) export PYTHON=${BROOT-${EPREFIX}}/usr/bin/${impl}; debug-print "${FUNCNAME}: PYTHON = ${PYTHON}" ;; PYTHON_SITEDIR) [[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it"; PYTHON_SITEDIR=$("${PYTHON}" - "${EPREFIX}/usr" <<-EOF || import sys, sysconfig print(sysconfig.get_path("purelib", vars={"base": sys.argv[1]})) EOF die); export PYTHON_SITEDIR; debug-print "${FUNCNAME}: PYTHON_SITEDIR = ${PYTHON_SITEDIR}" ;; PYTHON_INCLUDEDIR) [[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it"; PYTHON_INCLUDEDIR=$("${PYTHON}" - "${ESYSROOT}/usr" <<-EOF || import sys, sysconfig print(sysconfig.get_path("platinclude", vars={"installed_platbase": sys.argv[1]})) EOF die); export PYTHON_INCLUDEDIR; debug-print "${FUNCNAME}: PYTHON_INCLUDEDIR = ${PYTHON_INCLUDEDIR}"; if [[ ! -d ${PYTHON_INCLUDEDIR} ]]; then die "${impl} does not install any header files!"; fi ;; PYTHON_LIBPATH) [[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it"; PYTHON_LIBPATH=$("${PYTHON}" - <<-EOF || import os.path, sysconfig print( os.path.join( sysconfig.get_config_var("LIBDIR"), sysconfig.get_config_var("LDLIBRARY")) if sysconfig.get_config_var("LDLIBRARY") else "") EOF die); export PYTHON_LIBPATH; debug-print "${FUNCNAME}: PYTHON_LIBPATH = ${PYTHON_LIBPATH}"; if [[ ! -n ${PYTHON_LIBPATH} ]]; then die "${impl} lacks a (usable) dynamic library"; fi ;; PYTHON_CFLAGS) local val; case "${impl}" in python*) val=$($(tc-getPKG_CONFIG) --cflags ${impl/n/n-}) || die ;; *) die "${impl}: obtaining ${var} not supported" ;; esac; export PYTHON_CFLAGS=${val}; debug-print "${FUNCNAME}: PYTHON_CFLAGS = ${PYTHON_CFLAGS}" ;; PYTHON_LIBS) local val; case "${impl}" in python*) val=$($(tc-getPKG_CONFIG) --libs ${impl/n/n-}-embed) || die ;; *) die "${impl}: obtaining ${var} not supported" ;; esac; export PYTHON_LIBS=${val}; debug-print "${FUNCNAME}: PYTHON_LIBS = ${PYTHON_LIBS}" ;; PYTHON_CONFIG) local flags val; case "${impl}" in python*) [[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it"; flags=$("${PYTHON}" - <<-EOF || import sysconfig print(sysconfig.get_config_var("ABIFLAGS") or "") EOF die); val=${PYTHON}${flags}-config ;; *) die "${impl}: obtaining ${var} not supported" ;; esac; export PYTHON_CONFIG=${val}; debug-print "${FUNCNAME}: PYTHON_CONFIG = ${PYTHON_CONFIG}" ;; PYTHON_PKG_DEP) local d; case ${impl} in python*) PYTHON_PKG_DEP="dev-lang/python:${impl#python}" ;; pypy3) PYTHON_PKG_DEP="dev-python/${impl}:=" ;; *) die "Invalid implementation: ${impl}" ;; esac; if [[ -n ${PYTHON_REQ_USE} ]]; then PYTHON_PKG_DEP+=[${PYTHON_REQ_USE}]; fi; export PYTHON_PKG_DEP; debug-print "${FUNCNAME}: PYTHON_PKG_DEP = ${PYTHON_PKG_DEP}" ;; PYTHON_SCRIPTDIR) local dir; export PYTHON_SCRIPTDIR=${EPREFIX}/usr/lib/python-exec/${impl}; debug-print "${FUNCNAME}: PYTHON_SCRIPTDIR = ${PYTHON_SCRIPTDIR}" ;; *) die "_python_export: unknown variable ${var}" ;; esac; done } _python_gen_usedep () { debug-print-function ${FUNCNAME} "${@}"; local impl matches=(); _python_verify_patterns "${@}"; for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do if _python_impl_matches "${impl}" "${@}"; then matches+=("python_targets_${impl}(-)?"); fi; done; [[ -n ${matches[@]} ]] || die "No supported implementations match python_gen_usedep patterns: ${@}"; local out=${matches[@]}; echo "${out// /,}" } _python_impl_matches () { [[ ${#} -ge 1 ]] || die "${FUNCNAME}: takes at least 1 parameter"; [[ ${#} -eq 1 ]] && return 0; local impl=${1/./_} pattern; shift; for pattern in "$@"; do case ${pattern} in -2 | python2* | pypy) if [[ ${EAPI} != 7 ]]; then eerror; eerror "Python 2 is no longer supported in Gentoo, please remove Python 2"; eerror "${FUNCNAME[1]} calls."; die "Passing ${pattern} to ${FUNCNAME[1]} is banned in EAPI ${EAPI}"; fi ;; -3) if [[ ${EAPI} != 7 ]]; then eerror; eerror "Python 2 is no longer supported in Gentoo, please remove Python 2"; eerror "${FUNCNAME[1]} calls."; die "Passing ${pattern} to ${FUNCNAME[1]} is banned in EAPI ${EAPI}"; fi; return 0 ;; 3.10) [[ ${impl} == python${pattern/./_} || ${impl} == pypy3 ]] && return 0 ;; 3.8 | 3.9 | 3.1[1-2]) [[ ${impl} == python${pattern/./_} ]] && return 0 ;; *) [[ ${impl} == ${pattern/./_} ]] && return 0 ;; esac; done; return 1 } _python_multibuild_wrapper () { debug-print-function ${FUNCNAME} "${@}"; local -x EPYTHON PYTHON; local -x PATH=${PATH} PKG_CONFIG_PATH=${PKG_CONFIG_PATH}; _python_export "${MULTIBUILD_VARIANT}" EPYTHON PYTHON; _python_wrapper_setup; "${@}" } _python_obtain_impls () { _python_validate_useflags; if [[ -n ${PYTHON_COMPAT_OVERRIDE} ]]; then MULTIBUILD_VARIANTS=(${PYTHON_COMPAT_OVERRIDE}); return; fi; MULTIBUILD_VARIANTS=(); local impl; for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do has "${impl}" "${PYTHON_COMPAT[@]}" && use "python_targets_${impl}" && MULTIBUILD_VARIANTS+=("${impl}"); done } _python_run_check_deps () { debug-print-function ${FUNCNAME} "${@}"; local impl=${1}; einfo "Checking whether ${impl} is suitable ..."; local PYTHON_PKG_DEP; _python_export "${impl}" PYTHON_PKG_DEP; ebegin " ${PYTHON_PKG_DEP}"; has_version -b "${PYTHON_PKG_DEP}"; eend ${?} || return 1; declare -f python_check_deps > /dev/null || return 0; local PYTHON_USEDEP="python_targets_${impl}(-)"; local PYTHON_SINGLE_USEDEP="python_single_target_${impl}(-)"; ebegin " python_check_deps"; python_check_deps; eend ${?} } _python_set_impls () { local i; if [[ ${BASH_VERSINFO[0]} -ge 5 ]]; then [[ ${PYTHON_COMPAT@a} == *a* ]]; else [[ $(declare -p PYTHON_COMPAT) == "declare -a"* ]]; fi; if [[ ${?} -ne 0 ]]; then if ! declare -p PYTHON_COMPAT &> /dev/null; then die 'PYTHON_COMPAT not declared.'; else die 'PYTHON_COMPAT must be an array.'; fi; fi; local obsolete=(); if [[ ! -n ${PYTHON_COMPAT_NO_STRICT} ]]; then for i in "${PYTHON_COMPAT[@]}"; do case ${i} in pypy3 | python3_9 | python3_1[0-2]) ;; jython2_7 | pypy | pypy1_[89] | pypy2_0 | python2_[5-7] | python3_[1-9]) obsolete+=("${i}") ;; *) if has "${i}" "${_PYTHON_ALL_IMPLS[@]}" "${_PYTHON_HISTORICAL_IMPLS[@]}"; then die "Mis-synced patterns in _python_set_impls: missing ${i}"; else die "Invalid implementation in PYTHON_COMPAT: ${i}"; fi ;; esac; done; fi; local supp=() unsupp=(); for i in "${_PYTHON_ALL_IMPLS[@]}"; do if has "${i}" "${PYTHON_COMPAT[@]}"; then supp+=("${i}"); else unsupp+=("${i}"); fi; done; if [[ ! -n ${supp[@]} ]]; then die "No supported implementation in PYTHON_COMPAT."; fi; if [[ -n ${_PYTHON_SUPPORTED_IMPLS[@]} ]]; then if [[ ${_PYTHON_SUPPORTED_IMPLS[@]} != ${supp[@]} ]]; then eerror "Supported impls (PYTHON_COMPAT) changed between inherits!"; eerror "Before: ${_PYTHON_SUPPORTED_IMPLS[*]}"; eerror "Now : ${supp[*]}"; die "_PYTHON_SUPPORTED_IMPLS integrity check failed"; fi; if [[ ${_PYTHON_UNSUPPORTED_IMPLS[@]} != ${unsupp[@]} ]]; then eerror "Unsupported impls changed between inherits!"; eerror "Before: ${_PYTHON_UNSUPPORTED_IMPLS[*]}"; eerror "Now : ${unsupp[*]}"; die "_PYTHON_UNSUPPORTED_IMPLS integrity check failed"; fi; else _PYTHON_SUPPORTED_IMPLS=("${supp[@]}"); _PYTHON_UNSUPPORTED_IMPLS=("${unsupp[@]}"); readonly _PYTHON_SUPPORTED_IMPLS _PYTHON_UNSUPPORTED_IMPLS; fi } _python_validate_useflags () { debug-print-function ${FUNCNAME} "${@}"; if [[ -n ${PYTHON_COMPAT_OVERRIDE} ]]; then if [[ ! -n ${_PYTHON_COMPAT_OVERRIDE_WARNED} ]]; then ewarn "WARNING: PYTHON_COMPAT_OVERRIDE in effect. The following Python"; ewarn "implementations will be enabled:"; ewarn; ewarn " ${PYTHON_COMPAT_OVERRIDE}"; ewarn; ewarn "Dependencies won't be satisfied, and PYTHON_TARGETS will be ignored."; _PYTHON_COMPAT_OVERRIDE_WARNED=1; fi; return; fi; local i; for i in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do use "python_targets_${i}" && return 0; done; eerror "No Python implementation selected for the build. Please add one"; eerror "of the following values to your PYTHON_TARGETS (in make.conf):"; eerror; eerror "${PYTHON_COMPAT[@]}"; echo; die "No supported Python implementation in PYTHON_TARGETS." } _python_verify_patterns () { debug-print-function ${FUNCNAME} "${@}"; local impl pattern; for pattern in "$@"; do case ${pattern} in -[23] | 3.[89] | 3.1[012]) continue ;; esac; for impl in "${_PYTHON_ALL_IMPLS[@]}" "${_PYTHON_HISTORICAL_IMPLS[@]}"; do [[ ${impl} == ${pattern/./_} ]] && continue 2; done; die "Invalid implementation pattern: ${pattern}"; done } _python_wrapper_setup () { debug-print-function ${FUNCNAME} "${@}"; local workdir=${1:-${T}/${EPYTHON}}; local impl=${2:-${EPYTHON}}; [[ -n ${workdir} ]] || die "${FUNCNAME}: no workdir specified."; [[ -n ${impl} ]] || die "${FUNCNAME}: no impl nor EPYTHON specified."; if [[ ! -x ${workdir}/bin/python ]]; then mkdir -p "${workdir}"/{bin,pkgconfig} || die; rm -f "${workdir}"/bin/python{,2,3}{,-config} || die; rm -f "${workdir}"/bin/2to3 || die; rm -f "${workdir}"/pkgconfig/python{2,3}{,-embed}.pc || die; local EPYTHON PYTHON; _python_export "${impl}" EPYTHON PYTHON; cat > "${workdir}/bin/python" <<-_EOF_ || #!/bin/sh exec "${PYTHON}" "\${@}" _EOF_ die cp "${workdir}/bin/python" "${workdir}/bin/python3" || die; chmod +x "${workdir}/bin/python" "${workdir}/bin/python3" || die; local nonsupp=(python2 python2-config); if [[ ${EPYTHON} == python* ]]; then cat > "${workdir}/bin/python-config" <<-_EOF_ || #!/bin/sh exec "${PYTHON}-config" "\${@}" _EOF_ die cp "${workdir}/bin/python-config" "${workdir}/bin/python3-config" || die; chmod +x "${workdir}/bin/python-config" "${workdir}/bin/python3-config" || die; ln -s "${PYTHON/python/2to3-}" "${workdir}"/bin/2to3 || die; ln -s "${EPREFIX}"/usr/$(get_libdir)/pkgconfig/${EPYTHON/n/n-}.pc "${workdir}"/pkgconfig/python3.pc || die; ln -s "${EPREFIX}"/usr/$(get_libdir)/pkgconfig/${EPYTHON/n/n-}-embed.pc "${workdir}"/pkgconfig/python3-embed.pc || die; else nonsupp+=(2to3 python-config python3-config); fi; local x; for x in "${nonsupp[@]}"; do cat > "${workdir}"/bin/${x} <<-_EOF_ || #!/bin/sh echo "${ECLASS}: ${FUNCNAME}: ${x} is not supported by ${EPYTHON} (PYTHON_COMPAT)" >&2 exit 127 _EOF_ die chmod +x "${workdir}"/bin/${x} || die; done; fi; if [[ ${PATH##:*} != ${workdir}/bin ]]; then PATH=${workdir}/bin${PATH:+:${PATH}}; fi; if [[ ${PKG_CONFIG_PATH##:*} != ${workdir}/pkgconfig ]]; then PKG_CONFIG_PATH=${workdir}/pkgconfig${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}; fi; export PATH PKG_CONFIG_PATH } _tc-getPROG () { local tuple=$1; local v var vars=$2; local prog=($3); var=${vars%% *}; for v in ${vars}; do if [[ -n ${!v} ]]; then export ${var}="${!v}"; echo "${!v}"; return 0; fi; done; local search=; [[ -n $4 ]] && search=$(type -p $4-${prog[0]}); [[ -z ${search} && -n ${!tuple} ]] && search=$(type -p ${!tuple}-${prog[0]}); [[ -n ${search} ]] && prog[0]=${search##*/}; export ${var}="${prog[*]}"; echo "${!var}" } _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} } _udev_get_udevdir () { local -x PKG_CONFIG_FDO_SYSROOT_RULES=1; if $($(tc-getPKG_CONFIG) --exists udev); then local udevdir="$($(tc-getPKG_CONFIG) --variable=udevdir udev)"; echo "${udevdir#${EPREFIX}}"; else echo /lib/udev; fi } add2backlog () { local bl=/var/tmp/tb/backlog.1st; if [[ $1 == '@preserved-rebuild' ]]; then sed -i -e "/@preserved-rebuild/d" $bl; sed -i -e "1 i\@preserved-rebuild" $bl; else if [[ $1 =~ ^@ || $1 =~ ^% ]]; then if [[ "$(tail -n 1 $bl)" != "$1" ]]; then echo "$1" >> $bl; fi; else if ! grep -q "^${1}$" $bl; then echo "$1" >> $bl; fi; fi; fi } declare -fx add2backlog build_sphinx () { debug-print-function ${FUNCNAME} "${@}"; [[ ${#} -eq 1 ]] || die "${FUNCNAME} takes 1 arg: "; local dir=${1}; sed -i -e 's:^intersphinx_mapping:disabled_&:' "${dir}"/conf.py || die; local command=("${EPYTHON}" -m sphinx.cmd.build); if ! "${EPYTHON}" -c "import sphinx.cmd.build" 2> /dev/null; then command=(sphinx-build); fi; command+=(-b html -d "${dir}"/_build/doctrees "${dir}" "${dir}"/_build/html); echo "${command[@]}" 1>&2; "${command[@]}" || die; HTML_DOCS+=("${dir}/_build/html/.") } checkEOL () { if [[ -f /var/tmp/tb/EOL || -f /var/tmp/tb/STOP ]]; then exit 42; fi } check_extra_config () { use kernel_linux || return; local config negate die error reworkmodulenames; local soft_errors_count=0 hard_errors_count=0 config_required=0; local old_LINUX_CONFIG_EXISTS_DONE="${_LINUX_CONFIG_EXISTS_DONE}"; linux-info_get_any_version; for config in ${CONFIG_CHECK}; do if [[ "${config:0:1}" != "~" ]]; then config_required=1; break; fi; done; if [[ ${config_required} == 0 ]]; then if ! linux_config_exists; then ewarn "Unable to check for the following kernel config options due"; ewarn "to absence of any configured kernel sources or compiled"; ewarn "config:"; for config in ${CONFIG_CHECK}; do config=${config#\~}; config=${config#\!}; local_error="ERROR_${config}"; msg="${!local_error}"; if [[ -z ${msg} ]]; then local_error="WARNING_${config}"; msg="${!local_error}"; fi; ewarn " - ${config}${msg:+ - }${msg}"; done; ewarn "You're on your own to make sure they are set if needed."; export LINUX_CONFIG_EXISTS_DONE="${old_LINUX_CONFIG_EXISTS_DONE}"; return 0; fi; else if ! linux_config_exists; then qeerror "Could not find a neither a usable .config in the kernel source directory"; qeerror "nor a /proc/config.gz file,"; qeerror "Please ensure that ${KERNEL_DIR} points to a configured set of Linux sources."; qeerror "If you are using KBUILD_OUTPUT, please set the environment var so that"; qeerror "it points to the necessary object directory so that it might find .config"; qeerror "or have a properly configured kernel to produce a config.gz file. (CONFIG_IKCONFIG)."; die "Kernel not configured; no .config found in ${KV_OUT_DIR} or /proc/config.gz found"; fi; fi; ebegin "Checking for suitable kernel configuration options"; for config in ${CONFIG_CHECK}; do die=1; error=0; negate=0; reworkmodulenames=0; if [[ ${config:0:1} == "~" ]]; then die=0; config=${config:1}; else if [[ ${config:0:1} == "@" ]]; then die=0; reworkmodulenames=1; config=${config:1}; fi; fi; if [[ ${config:0:1} == "!" ]]; then negate=1; config=${config:1}; fi; if [[ ${negate} == 1 ]]; then linux_chkconfig_present ${config} && error=2; else if [[ ${reworkmodulenames} == 1 ]]; then local temp_config="${config//*:}" i n; config="${config//:*}"; if linux_chkconfig_present ${config}; then for i in ${MODULE_NAMES}; do n="${i//${temp_config}}"; [[ -z ${n//\(*} ]] && MODULE_IGNORE="${MODULE_IGNORE} ${temp_config}"; done; error=2; fi; else linux_chkconfig_present ${config} || error=1; fi; fi; if [[ ${error} -gt 0 ]]; then local report_func="eerror" local_error; local_error="ERROR_${config}"; local_error="${!local_error}"; if [[ -z "${local_error}" ]]; then local_error="${config}_ERROR"; local_error="${!local_error}"; fi; if [[ ${die} == 0 && -z "${local_error}" ]]; then local_error="WARNING_${config}"; local_error="${!local_error}"; if [[ -n "${local_error}" ]]; then report_func="ewarn"; fi; fi; if [[ -z "${local_error}" ]]; then [[ ${error} == 1 ]] && local_error="is not set when it should be." || local_error="should not be set. But it is."; local_error="CONFIG_${config}:\t ${local_error}"; fi; if [[ ${die} == 0 ]]; then ${report_func} " ${local_error}"; soft_errors_count=$[soft_errors_count + 1]; else ${report_func} " ${local_error}"; hard_errors_count=$[hard_errors_count + 1]; fi; fi; done; if [[ ${hard_errors_count} -gt 0 ]]; then eend 1; eerror "Please check to make sure these options are set correctly."; eerror "Failure to do so may cause unexpected problems."; eerror "Once you have satisfied these options, please try merging"; eerror "this package again."; export LINUX_CONFIG_EXISTS_DONE="${old_LINUX_CONFIG_EXISTS_DONE}"; die "Incorrect kernel configuration options"; else if [[ ${soft_errors_count} -gt 0 ]]; then eend 1; ewarn "Please check to make sure these options are set correctly."; ewarn "Failure to do so may cause unexpected problems."; else eend 0; fi; fi; export LINUX_CONFIG_EXISTS_DONE="${old_LINUX_CONFIG_EXISTS_DONE}" } check_kernel_built () { if ! use kernel_linux; then die "${FUNCNAME}() called on non-Linux system, please fix the ebuild"; fi; [[ -n ${SKIP_KERNEL_CHECK} ]] && return; require_configured_kernel; local versionh_path; if kernel_is -ge 3 7; then versionh_path="include/generated/uapi/linux/version.h"; else versionh_path="include/linux/version.h"; fi; if [[ ! -f "${KV_OUT_DIR}/${versionh_path}" ]]; then eerror "These sources have not yet been prepared."; eerror "We cannot build against an unprepared tree."; eerror "To resolve this, please type the following:"; eerror; eerror "# cd ${KV_DIR}"; eerror "# make oldconfig"; eerror "# make modules_prepare"; eerror; eerror "Then please try merging this module again."; die "Kernel sources need compiling first"; fi } check_modules_supported () { if ! use kernel_linux; then die "${FUNCNAME}() called on non-Linux system, please fix the ebuild"; fi; require_configured_kernel; if ! linux_chkconfig_builtin "MODULES"; then eerror "These sources do not support loading external modules."; eerror "to be able to use this module please enable \"Loadable modules support\""; eerror "in your kernel, recompile and then try merging this module again."; die "No support for external modules in ${KV_FULL} config"; fi } check_targets () { local var=$1 mak=$2; local detected sorted; pushd "${S}"/configs/targets/ > /dev/null || die; detected=$(echo $(printf '%s\n' *-${mak}.mak | sed "s:-${mak}.mak::" | LC_COLLATE=C sort -u)); sorted=$(echo $(printf '%s\n' ${!var} | LC_COLLATE=C sort -u)); if [[ ${sorted} != "${detected}" ]]; then eerror "The ebuild needs to be kept in sync."; eerror "${var}: ${sorted}"; eerror "$(printf '%-*s' ${#var} configure): ${detected}"; die "sync ${var} to the list of targets"; fi; popd > /dev/null } check_zlibinflate () { if ! use kernel_linux; then die "${FUNCNAME}() called on non-Linux system, please fix the ebuild"; fi; require_configured_kernel; local INFLATE; local DEFLATE; einfo "Determining the usability of ZLIB_INFLATE support in your kernel"; ebegin "checking ZLIB_INFLATE"; linux_chkconfig_builtin CONFIG_ZLIB_INFLATE; eend $? || die; ebegin "checking ZLIB_DEFLATE"; linux_chkconfig_builtin CONFIG_ZLIB_DEFLATE; eend $? || die; local LINENO_START; local LINENO_END; local SYMBOLS; local x; LINENO_END="$(grep -n 'CONFIG_ZLIB_INFLATE y' ${KV_DIR}/lib/Config.in | cut -d : -f 1)"; LINENO_START="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | grep -n 'if \[' | tail -n 1 | cut -d : -f 1)"; (( LINENO_AMOUNT = ${LINENO_END} - ${LINENO_START} )); (( LINENO_END = ${LINENO_END} - 1 )); SYMBOLS="$(head -n $LINENO_END ${KV_DIR}/lib/Config.in | tail -n $LINENO_AMOUNT | sed -e 's/^.*\(CONFIG_[^\" ]*\).*/\1/g;')"; for x in ${SYMBOLS}; do if [[ "${!x}" = "y" ]]; then einfo "${x} ensures zlib is linked into your kernel - excellent"; return 0; fi; done; eerror; eerror "This kernel module requires ZLIB library support."; eerror "You have enabled zlib support in your kernel, but haven't enabled"; eerror "enabled any option that will ensure that zlib is linked into your"; eerror "kernel."; eerror; eerror "Please ensure that you enable at least one of these options:"; eerror; for x in ${SYMBOLS}; do eerror " * $x"; done; eerror; eerror "Please remember to recompile and install your kernel, and reboot"; eerror "into your new kernel before attempting to load this kernel module."; die "Kernel doesn't include zlib support" } 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' "$@" } conf_malloc () { if [[ ! ${buildtype} == "user" ]]; then usex "${1}" "--enable-malloc=${1}" ""; fi } conf_notuser () { if [[ ${buildtype} == "user" ]]; then echo "--disable-${2:-$1}"; else use_enable "$@"; fi } conf_softmmu () { if [[ ${buildtype} == "softmmu" ]]; then use_enable "$@"; else echo "--disable-${2:-$1}"; fi } conf_tools () { if [[ ${buildtype} == "tools" ]]; then use_enable "$@"; else echo "--disable-${2:-$1}"; fi } 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 } 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 ) } epytest () { debug-print-function ${FUNCNAME} "${@}"; _python_check_EPYTHON; _python_check_occluded_packages; local color=yes; [[ -n ${NO_COLOR} ]] && color=no; local args=(-vv -ra -l -Wdefault "--color=${color}" -o console_output_style=count); if [[ ! -n ${PYTEST_DISABLE_PLUGIN_AUTOLOAD} ]]; then args+=(-p no:cov -p no:flake8 -p no:flakes -p no:pylint -p no:markdown -p no:sugar -p no:xvfb -p no:pytest-describe -p no:plus -p no:tavern -p no:salt-factories); fi; if [[ -n ${EPYTEST_XDIST} ]]; then local jobs=${EPYTEST_JOBS:-$(makeopts_jobs)}; if [[ ${jobs} -gt 1 ]]; then if [[ ${PYTEST_PLUGINS} != *xdist.plugin* ]]; then args+=(-p xdist); fi; args+=(-n "${jobs}" --dist=worksteal); fi; fi; local x; for x in "${EPYTEST_DESELECT[@]}"; do args+=(--deselect "${x}"); done; for x in "${EPYTEST_IGNORE[@]}"; do args+=(--ignore "${x}"); done; set -- "${EPYTHON}" -m pytest "${args[@]}" "${@}"; echo "${@}" 1>&2; "${@}" || die -n "pytest failed with ${EPYTHON}"; local ret=${?}; rm -rf .hypothesis .pytest_cache || die; if [[ -n ${BUILD_DIR} && -d ${BUILD_DIR} ]]; then find "${BUILD_DIR}" -name '*-pytest-*.pyc' -delete || die; fi; return ${ret} } eunittest () { debug-print-function ${FUNCNAME} "${@}"; _python_check_EPYTHON; _python_check_occluded_packages; local runner=unittest; if _python_impl_matches "${EPYTHON}" 3.{9..11}; then runner=unittest_or_fail; fi; set -- "${EPYTHON}" -m "${runner}" discover -v "${@}"; echo "${@}" 1>&2; "${@}" || die -n "Tests failed with ${EPYTHON}"; return ${?} } fcaps () { debug-print-function ${FUNCNAME} "$@"; if [[ ${EUID} -ne 0 ]]; then einfo "Insufficient privileges to execute ${FUNCNAME}, skipping."; return 0; fi; local owner='0'; local group='0'; local mode='4711'; local caps_mode='711'; while [[ $# -gt 0 ]]; do case $1 in -o) owner=$2; shift ;; -g) group=$2; shift ;; -m) mode=$2; shift ;; -M) caps_mode=$2; shift ;; *) break ;; esac; shift; done; [[ $# -lt 2 ]] && die "${FUNCNAME}: wrong arg count"; local caps=$1; [[ ${caps} == *[-=+]* ]] || caps+="=ep"; shift; local root; case ${EBUILD_PHASE} in compile | install | preinst) root=${ED:-${D}} ;; postinst) root=${EROOT:-${ROOT}} ;; esac; root=${root%/}; local file; for file in "$@"; do [[ ${file} != /* ]] && file="${root}/${file}"; if use filecaps; then debug-print "${FUNCNAME}: setting caps '${caps}' on '${file}'"; chmod ${caps_mode} "${file}" || die; if ! out=$(LC_ALL=C setcap "${caps}" "${file}" 2>&1); then case ${out} in *"Not supported"* | *"Operation not supported"*) local fstype=$(stat -f -c %T "${file}"); ewarn "Could not set caps on '${file}' due to missing filesystem support:"; ewarn "* enable XATTR support for '${fstype}' in your kernel (if configurable)"; ewarn "* mount the fs with the user_xattr option (if not the default)"; ewarn "* enable the relevant FS_SECURITY option (if configurable)" ;; *) eerror "Setting caps '${caps}' on file '${file}' failed:"; eerror "${out}"; die "could not set caps" ;; esac; else setcap -v "${caps}" "${file}" > /dev/null || die "Checking caps '${caps}' on '${file}' failed"; continue; fi; fi; debug-print "${FUNCNAME}: setting owner/mode on '${file}'"; chown "${owner}:${group}" "${file}" || die; chmod ${mode} "${file}" || die; done } fcaps_pkg_postinst () { local arg args=(); for arg in "${FILECAPS[@]}" "--"; do if [[ ${arg} == "--" ]]; then fcaps "${args[@]}"; args=(); else args+=("${arg}"); fi; done } firmware_abi_change () { local pv; for pv in ${REPLACING_VERSIONS}; do if ver_test ${pv} -lt ${FIRMWARE_ABI_VERSION}; then return 0; fi; done; return 1 } 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 } generate_initd () { local out="${T}/qemu-binfmt"; local out_systemd="${T}/qemu.conf"; local d="${T}/binfmt.d"; einfo "Generating qemu binfmt scripts and configuration files"; mkdir -p "${d}"; "${S}"/scripts/qemu-binfmt-conf.sh --debian --exportdir "${d}" --qemu-path "${EPREFIX}/usr/bin" || die; sed -E -i -e 's:^([^ ]+) (.*)$:\1="\2":' "${d}"/* || die; local f qcpu package interpreter magic mask; cat "${FILESDIR}"/qemu-binfmt.initd.head > "${out}" || die; for f in "${d}"/qemu-*; do source "${f}"; qcpu=${package#qemu-}; case ${qcpu} in arm*) qcpu="arm" ;; mips*) qcpu="mips" ;; ppc*) qcpu="ppc" ;; s390*) qcpu="s390" ;; sh*) qcpu="sh" ;; sparc*) qcpu="sparc" ;; esac; cat <> "${out}" if [ "\${cpu}" != "${qcpu}" -a -x "${interpreter}" ] ; then printf '%s\n' ':${package}:M::${magic}:${mask}:${interpreter}:'"\${QEMU_BINFMT_FLAGS}" >/proc/sys/fs/binfmt_misc/register fi EOF echo ":${package}:M::${magic}:${mask}:${interpreter}:OC" >> "${out_systemd}"; done; cat "${FILESDIR}"/qemu-binfmt.initd.tail >> "${out}" || die } 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_makefile_extract_function () { [[ -n ${SKIP_KERNEL_CHECK} ]] && return; local a='' b='' mkfunc='getfilevar'; a="$(getfilevar VERSION ${KERNEL_MAKEFILE})"; b="$(getfilevar_noexec VERSION ${KERNEL_MAKEFILE})"; [[ "${a}" != "${b}" ]] && mkfunc='getfilevar_noexec'; echo "${mkfunc}" } get_makeopts_jobs () { makeopts_jobs "$(_get_all_makeopts)" "${1:-1}" } get_makeopts_loadavg () { makeopts_loadavg "$(_get_all_makeopts)" "${1:-999}" } get_modname () { local modname; local ver=$1; case ${CHOST} in *-darwin*) modname="bundle" ;; *) modname="so" ;; esac; echo ".${modname}" } get_nproc () { local nproc; if type -P nproc &> /dev/null; then nproc=$(nproc); fi; if [[ -z ${nproc} ]] && type -P sysctl &> /dev/null; then nproc=$(sysctl -n hw.ncpu 2> /dev/null); fi; if [[ -z ${nproc} ]] && type -P python &> /dev/null; then nproc=$(python -c 'import multiprocessing; print(multiprocessing.cpu_count());' 2> /dev/null); fi; if [[ -n ${nproc} ]]; then echo "${nproc}"; else echo "${1:-1}"; fi } get_running_version () { if ! use kernel_linux; then die "${FUNCNAME}() called on non-Linux system, please fix the ebuild"; fi; local kv=$(uname -r); if [[ -f ${ROOT%/}/lib/modules/${kv}/source/Makefile ]]; then KERNEL_DIR=$(readlink -f "${ROOT%/}/lib/modules/${kv}/source"); if [[ -f ${ROOT%/}/lib/modules/${kv}/build/Makefile ]]; then KBUILD_OUTPUT=$(readlink -f "${ROOT%/}/lib/modules/${kv}/build"); fi; get_version && return 0; fi; KV_FULL=${kv}; local kv_full=${KV_FULL//[-+_]*}; KV_MAJOR=$(ver_cut 1 ${kv_full}); KV_MINOR=$(ver_cut 2 ${kv_full}); KV_PATCH=$(ver_cut 3 ${kv_full}); KV_EXTRA="${KV_FULL#${KV_MAJOR}.${KV_MINOR}${KV_PATCH:+.${KV_PATCH}}}"; : "${KV_PATCH:=0}"; return 0 } get_udevdir () { debug-print-function ${FUNCNAME} "${@}"; echo "$(_udev_get_udevdir)" } get_version () { if ! use kernel_linux; then die "${FUNCNAME}() called on non-Linux system, please fix the ebuild"; fi; local tmplocal; [[ -n ${SKIP_KERNEL_CHECK} ]] && return; [[ -n "${KV_FULL}" ]] && return 0; unset KV_DIR; [[ -z "${get_version_warning_done}" ]] && qeinfo "Determining the location of the kernel source code"; [[ -d "${KERNEL_DIR}" ]] && KV_DIR="${KERNEL_DIR}"; if [[ -z "${KV_DIR}" ]]; then if [[ -z "${get_version_warning_done}" ]]; then get_version_warning_done=1; qewarn "Unable to find kernel sources at ${KERNEL_DIR}"; if [[ "${KERNEL_DIR}" == "/usr/src/linux" ]]; then qeinfo "Please make sure that ${KERNEL_DIR} points at your running kernel, "; qeinfo "(or the kernel you wish to build against)."; qeinfo "Alternatively, set the KERNEL_DIR environment variable to the kernel sources location"; else qeinfo "Please ensure that the KERNEL_DIR environment variable points at full Linux sources of the kernel you wish to compile against."; fi; fi; return 1; fi; if [[ -z "${KBUILD_OUTPUT}" && -L "${KERNEL_DIR}/source" ]]; then KBUILD_OUTPUT=${KERNEL_DIR}; KERNEL_DIR=$(readlink -f "${KERNEL_DIR}/source"); KV_DIR=${KERNEL_DIR}; fi; if [[ -z "${get_version_warning_done}" ]]; then qeinfo "Found kernel source directory:"; qeinfo " ${KV_DIR}"; fi; kernel_get_makefile; if [[ ! -s ${KERNEL_MAKEFILE} ]]; then if [[ -z "${get_version_warning_done}" ]]; then get_version_warning_done=1; qeerror "Could not find a Makefile in the kernel source directory."; qeerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources"; fi; return 1; fi; local OUTPUT_DIR=${KBUILD_OUTPUT}; if [[ -z ${OUTPUT_DIR} ]]; then local mkfunc=$(get_makefile_extract_function "${KERNEL_MAKEFILE}"); OUTPUT_DIR=$(${mkfunc} KBUILD_OUTPUT "${KERNEL_MAKEFILE}"); fi; KV_MAJOR=$(getfilevar VERSION "${KERNEL_MAKEFILE}"); KV_MINOR=$(getfilevar PATCHLEVEL "${KERNEL_MAKEFILE}"); KV_PATCH=$(getfilevar SUBLEVEL "${KERNEL_MAKEFILE}"); KV_EXTRA=$(getfilevar EXTRAVERSION "${KERNEL_MAKEFILE}"); if [[ -z "${KV_MAJOR}" || -z "${KV_MINOR}" || -z "${KV_PATCH}" ]]; then if [[ -z "${get_version_warning_done}" ]]; then get_version_warning_done=1; qeerror "Could not detect kernel version."; qeerror "Please ensure that ${KERNEL_DIR} points to a complete set of Linux sources."; fi; return 1; fi; [[ -d "${OUTPUT_DIR}" ]] && KV_OUT_DIR="${OUTPUT_DIR}"; if [[ -n "${KV_OUT_DIR}" ]]; then qeinfo "Found kernel object directory:"; qeinfo " ${KV_OUT_DIR}"; fi; KV_OUT_DIR="${KV_OUT_DIR:-${KV_DIR}}"; if [[ -s "${KV_OUT_DIR}"/include/config/kernel.release ]]; then KV_LOCAL=$(< "${KV_OUT_DIR}"/include/config/kernel.release); else if [[ -s "${KV_OUT_DIR}"/.kernelrelease ]]; then KV_LOCAL=$(< "${KV_OUT_DIR}"/.kernelrelease); else KV_LOCAL=; fi; fi; tmplocal=${KV_LOCAL#${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}}; if [[ "${KV_LOCAL}" = "${tmplocal}" ]]; then KV_LOCAL=; else KV_LOCAL=${tmplocal}; fi; if [[ -z ${OUTPUT_DIR} ]]; then for OUTPUT_DIR in "${SYSROOT}" "${ROOT%/}" ""; do OUTPUT_DIR+="/lib/modules/${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}${KV_LOCAL}/build"; if [[ -e ${OUTPUT_DIR} ]]; then break; fi; done; fi; KV_FULL="${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}${KV_LOCAL}"; qeinfo "Found sources for kernel version:"; qeinfo " ${KV_FULL}"; return 0 } getfilevar () { local ERROR basefname basedname myARCH="${ARCH}"; ERROR=0; [[ -z "${1}" ]] && ERROR=1; [[ ! -f "${2}" ]] && ERROR=1; if [[ "${ERROR}" = 1 ]]; then echo -e "\n"; eerror "getfilevar requires 2 variables, with the second a valid file."; eerror " getfilevar "; else basefname="$(basename ${2})"; basedname="$(dirname ${2})"; unset ARCH; echo -e "e:\\n\\t@echo \$(${1})\\ninclude ${basefname}" | nonfatal emake -C "${basedname}" --no-print-directory M="${T}" dot-config=0 need-config= need-compiler= ${BUILD_FIXES} -s -f - 2> /dev/null; ARCH=${myARCH}; fi } getfilevar_noexec () { local ERROR basefname basedname mycat myARCH="${ARCH}"; ERROR=0; mycat='cat'; [[ -z "${1}" ]] && ERROR=1; [[ ! -f "${2}" ]] && ERROR=1; [[ "${2%.gz}" != "${2}" ]] && mycat='zcat'; if [[ "${ERROR}" = 1 ]]; then echo -e "\n"; eerror "getfilevar_noexec requires 2 variables, with the second a valid file."; eerror " getfilevar_noexec "; else ${mycat} "${2}" | sed -n -e "/^[[:space:]]*${1}[[:space:]]*:\\?=[[:space:]]*\(.*\)\$/{ s,^[^=]*[[:space:]]*=[[:space:]]*,,g ; s,[[:space:]]*\$,,g ; p }"; fi } has_multilib_profile () { [ -n "${MULTILIB_ABIS}" -a "${MULTILIB_ABIS}" != "${MULTILIB_ABIS/ /}" ] } host-is-pax () { grep -qs ^PaX: /proc/self/status } in_iuse () { local use=${1}; if [[ -z "${use}" ]]; then echo "!!! in_iuse() called without a parameter." 1>&2; echo "!!! in_iuse " 1>&2; die "in_iuse() called without a parameter"; fi; local liuse=(${IUSE_EFFECTIVE}); has "${use}" "${liuse[@]#[+-]}" } is_final_abi () { has_multilib_profile || return 0; set -- $(get_install_abis); local LAST_ABI=$#; [[ ${!LAST_ABI} == ${ABI} ]] } kernel_get_makefile () { [[ -s ${KV_DIR}/GNUMakefile ]] && KERNEL_MAKEFILE="${KV_DIR}/GNUMakefile" && return; [[ -s ${KV_DIR}/makefile ]] && KERNEL_MAKEFILE="${KV_DIR}/makefile" && return; [[ -s ${KV_DIR}/Makefile ]] && KERNEL_MAKEFILE="${KV_DIR}/Makefile" && return } kernel_is () { if ! use kernel_linux; then die "${FUNCNAME}() called on non-Linux system, please fix the ebuild"; fi; linux-info_get_any_version; local operator; case ${1#-} in lt) operator="-lt"; shift ;; gt) operator="-gt"; shift ;; le) operator="-le"; shift ;; ge) operator="-ge"; shift ;; eq) operator="-eq"; shift ;; *) operator="-eq" ;; esac; [[ $# -gt 3 ]] && die "Error in ${ECLASS}_${FUNCNAME}(): too many parameters"; ver_test "${KV_MAJOR:-0}.${KV_MINOR:-0}.${KV_PATCH:-0}" "${operator}" "${1:-${KV_MAJOR:-0}}.${2:-${KV_MINOR:-0}}.${3:-${KV_PATCH:-0}}" } linux-info_get_any_version () { if ! use kernel_linux; then die "${FUNCNAME}() called on non-Linux system, please fix the ebuild"; fi; if ! get_version; then ewarn "Unable to calculate Linux Kernel version for build, attempting to use running version"; if ! get_running_version; then die "Unable to determine any Linux Kernel version, please report a bug"; fi; fi } linux-info_pkg_setup () { use kernel_linux || return; linux-info_get_any_version; [[ -n "${CONFIG_CHECK}" && -z ${CHECKCONFIG_DONOTHING} ]] && check_extra_config } linux_chkconfig_builtin () { [[ -n ${SKIP_KERNEL_CHECK} ]] && return; linux_config_qa_check linux_chkconfig_builtin; [[ $(getfilevar_noexec "CONFIG_$1" "$(linux_config_path)") == y ]] } linux_chkconfig_module () { [[ -n ${SKIP_KERNEL_CHECK} ]] && return; linux_config_qa_check linux_chkconfig_module; [[ $(getfilevar_noexec "CONFIG_$1" "$(linux_config_path)") == m ]] } linux_chkconfig_present () { [[ -n ${SKIP_KERNEL_CHECK} ]] && return; linux_config_qa_check linux_chkconfig_present; [[ $(getfilevar_noexec "CONFIG_$1" "$(linux_config_path)") == [my] ]] } linux_chkconfig_string () { [[ -n ${SKIP_KERNEL_CHECK} ]] && return; linux_config_qa_check linux_chkconfig_string; getfilevar_noexec "CONFIG_$1" "$(linux_config_path)" } linux_config_bin_exists () { export _LINUX_CONFIG_EXISTS_DONE=1; use kernel_linux && [[ -s /proc/config.gz ]] } linux_config_exists () { linux_config_src_exists || linux_config_bin_exists } linux_config_path () { if linux_config_src_exists; then echo "${KV_OUT_DIR}/.config"; else if linux_config_bin_exists; then echo "/proc/config.gz"; else return 1; fi; fi } linux_config_qa_check () { local f="$1"; if [[ -z "${_LINUX_CONFIG_EXISTS_DONE}" ]]; then ewarn "QA: You called $f before any linux_config_exists!"; ewarn "QA: The return value of $f will NOT guaranteed later!"; fi; if ! use kernel_linux; then die "$f called on non-Linux system, please fix the ebuild"; fi } linux_config_src_exists () { export _LINUX_CONFIG_EXISTS_DONE=1; use kernel_linux && [[ -n ${KV_OUT_DIR} && -s ${KV_OUT_DIR}/.config ]] } list-paxables () { file "$@" 2> /dev/null | grep -E 'ELF.*(executable|shared object)' | sed -e 's/: .*$//' } makeopts_jobs () { [[ $# -eq 0 ]] && set -- "$(_get_all_makeopts)"; local jobs=$(echo " $* " | sed -r -n -e 's:.*[[:space:]](-[a-z]*j|--jobs[=[:space:]])[[:space:]]*([0-9]+).*:\2:p' -e "s:.*[[:space:]](-[a-z]*j|--jobs)[[:space:]].*:${2:-$(( $(get_nproc) + 1 ))}:p"); echo ${jobs:-1} } makeopts_loadavg () { [[ $# -eq 0 ]] && set -- "$(_get_all_makeopts)"; local lavg=$(echo " $* " | sed -r -n -e 's:.*[[:space:]](-[a-z]*l|--(load-average|max-load)[=[:space:]])[[:space:]]*([0-9]+(\.[0-9]+)?)[[:space:]].*:\3:p' -e "s:.*[[:space:]](-[a-z]*l|--(load-average|max-load))[[:space:]].*:${2:-999}:p"); echo ${lavg:-${2:-999}} } ml () { eval "$($LMOD_DIR/ml_cmd "$@")" } declare -fx ml module () { if [ -z "${LMOD_SH_DBG_ON+x}" ]; then case "$-" in *v*x*) __lmod_sh_dbg='vx' ;; *v*) __lmod_sh_dbg='v' ;; *x*) __lmod_sh_dbg='x' ;; esac; fi; if [ -n "${__lmod_sh_dbg:-}" ]; then set +$__lmod_sh_dbg; echo "Shell debugging temporarily silenced: export LMOD_SH_DBG_ON=1 for Lmod's output" 1>&2; fi; eval "$($LMOD_CMD shell "$@")" && eval "$(${LMOD_SETTARG_CMD:-:} -s sh)"; __lmod_my_status=$?; if [ -n "${__lmod_sh_dbg:-}" ]; then echo "Shell debugging restarted" 1>&2; set -$__lmod_sh_dbg; fi; unset __lmod_sh_dbg; return $__lmod_my_status } declare -fx module multibuild_copy_sources () { debug-print-function ${FUNCNAME} "${@}"; local _MULTIBUILD_INITIAL_BUILD_DIR=${BUILD_DIR:-${S}}; einfo "Will copy sources from ${_MULTIBUILD_INITIAL_BUILD_DIR}"; function _multibuild_create_source_copy () { einfo "${MULTIBUILD_VARIANT}: copying to ${BUILD_DIR}"; cp -p -R "${_MULTIBUILD_INITIAL_BUILD_DIR}" "${BUILD_DIR}" || die }; multibuild_foreach_variant _multibuild_create_source_copy } multibuild_for_best_variant () { debug-print-function ${FUNCNAME} "${@}"; [[ -n ${MULTIBUILD_VARIANTS} ]] || die "MULTIBUILD_VARIANTS need to be set"; local MULTIBUILD_VARIANTS=("${MULTIBUILD_VARIANTS[-1]}"); multibuild_foreach_variant "${@}" } multibuild_foreach_variant () { debug-print-function ${FUNCNAME} "${@}"; [[ -n ${MULTIBUILD_VARIANTS} ]] || die "MULTIBUILD_VARIANTS need to be set"; local bdir=${BUILD_DIR:-${S}}; [[ ${bdir%%/} == ${WORKDIR%%/} ]] && bdir=${WORKDIR}/build; local prev_id=${MULTIBUILD_ID:+${MULTIBUILD_ID}-}; local ret=0 lret=0 v; debug-print "${FUNCNAME}: initial build_dir = ${bdir}"; for v in "${MULTIBUILD_VARIANTS[@]}"; do local MULTIBUILD_VARIANT=${v}; local MULTIBUILD_ID=${prev_id}${v}; local BUILD_DIR=${bdir%%/}-${v}; function _multibuild_run () { local i=1; while [[ ${!i} == _* ]]; do (( i += 1 )); done; [[ ${i} -le ${#} ]] && einfo "${v}: running ${@:${i}}"; "${@}" }; _multibuild_run "${@}" > >(exec tee -a "${T}/build-${MULTIBUILD_ID}.log") 2>&1; lret=${?}; [[ ${ret} -eq 0 && ${lret} -ne 0 ]] && ret=${lret}; done; return ${ret} } multibuild_merge_root () { debug-print-function ${FUNCNAME} "${@}"; local src=${1}; local dest=${2}; cp -a "${src}"/. "${dest}"/ || die "${MULTIBUILD_VARIANT:-(unknown)}: merging image failed"; rm -rf "${src}" || die } 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 } number_abis () { set -- `get_install_abis`; echo $# } pax-mark () { local f; local flags; local ret=0; flags="${1//[!zPpEeMmRrSs]}"; [[ -n "${flags}" ]] || return 0; shift; local dodefault=""; [[ -n "${flags//[!z]}" ]] && dodefault="yes"; if has PT ${PAX_MARKINGS}; then for f in "$@"; do if type -p paxctl > /dev/null; then einfo "PT_PAX marking -${flags} ${f} with paxctl"; paxctl -q${flags} "${f}" > /dev/null 2>&1 && continue; fi; if type -p paxctl-ng > /dev/null && paxctl-ng -L; then einfo "PT_PAX marking -${flags} ${f} with paxctl-ng"; flags="${flags//z}"; [[ ${dodefault} == "yes" ]] && paxctl-ng -L -z "${f}" > /dev/null 2>&1; [[ -n "${flags}" ]] || continue; paxctl-ng -L -${flags} "${f}" > /dev/null 2>&1 && continue; fi; if type -p scanelf > /dev/null && [[ ${PAX_MARKINGS} != "none" ]]; then einfo "PT_PAX marking -${flags} ${f} with scanelf"; scanelf -Xxz ${flags} "$f" > /dev/null 2>&1; else if [[ ${PAX_MARKINGS} != "none" ]]; then elog "Failed to set PT_PAX markings -${flags} ${f}."; ret=1; fi; fi; done; fi; if has XT ${PAX_MARKINGS}; then flags="${flags//z}"; for f in "$@"; do if type -p paxctl-ng > /dev/null && paxctl-ng -l; then einfo "XATTR_PAX marking -${flags} ${f} with paxctl-ng"; [[ ${dodefault} == "yes" ]] && paxctl-ng -d "${f}" > /dev/null 2>&1; [[ -n "${flags}" ]] || continue; paxctl-ng -l -${flags} "${f}" > /dev/null 2>&1 && continue; fi; if type -p setfattr > /dev/null; then [[ -n "${flags//[!Ee]}" ]] || flags+="e"; einfo "XATTR_PAX marking -${flags} ${f} with setfattr"; [[ ${dodefault} == "yes" ]] && setfattr -x "user.pax.flags" "${f}" > /dev/null 2>&1; setfattr -n "user.pax.flags" -v "${flags}" "${f}" > /dev/null 2>&1 && continue; fi; if [[ ${PAX_MARKINGS} != "none" ]]; then elog "Failed to set XATTR_PAX markings -${flags} ${f}."; ret=1; fi; done; fi; return ${ret} } pkg_info () { echo "Using:"; echo " $(best_version app-emulation/spice-protocol)"; if has_version 'sys-firmware/edk2-ovmf-bin'; then echo " $(best_version sys-firmware/edk2-ovmf-bin)"; else echo " $(best_version sys-firmware/edk2-ovmf)"; fi; if has_version 'sys-firmware/seabios-bin'; then echo " $(best_version sys-firmware/seabios-bin)"; else echo " $(best_version sys-firmware/seabios)"; fi; echo " $(best_version sys-firmware/ipxe)"; echo " $(best_version sys-firmware/sgabios)" } pkg_nofetch () { default } pkg_postinst () { if [[ -n ${softmmu_targets} ]] && use kernel_linux; then udev_reload; fi; xdg_icon_cache_update; [[ -z ${EPREFIX} ]] && [[ -f ${EROOT}/usr/libexec/qemu-bridge-helper ]] && fcaps cap_net_admin "${EROOT}"/usr/libexec/qemu-bridge-helper; DISABLE_AUTOFORMATTING=true; readme.gentoo_print_elog; if use pin-upstream-blobs && firmware_abi_change; then ewarn "This version of qemu pins new versions of firmware blobs:"; if has_version 'sys-firmware/edk2-ovmf-bin'; then ewarn " $(best_version sys-firmware/edk2-ovmf-bin)"; else ewarn " $(best_version sys-firmware/edk2-ovmf)"; fi; if has_version 'sys-firmware/seabios-bin'; then ewarn " $(best_version sys-firmware/seabios-bin)"; else ewarn " $(best_version sys-firmware/seabios)"; fi; ewarn " $(best_version sys-firmware/ipxe)"; ewarn " $(best_version sys-firmware/sgabios)"; ewarn "This might break resume of hibernated guests (started with a different"; ewarn "firmware version) and live migration to/from qemu versions with different"; ewarn "firmware. Please (cold) restart all running guests. For functional"; ewarn "guest migration ensure that all"; ewarn "hosts run at least"; ewarn " app-emulation/qemu-${FIRMWARE_ABI_VERSION}."; fi } pkg_postrm () { xdg_icon_cache_update; udev_reload } pkg_pretend () { if use kernel_linux && kernel_is lt 2 6 25; then eerror "This version of KVM requires a host kernel of 2.6.25 or higher."; else if use kernel_linux; then if ! linux_config_exists; then eerror "Unable to check your kernel for KVM support"; else CONFIG_CHECK="~KVM ~TUN ~BRIDGE"; ERROR_KVM="You must enable KVM in your kernel to continue"; ERROR_KVM_AMD="If you have an AMD CPU, you must enable KVM_AMD in"; ERROR_KVM_AMD+=" your kernel configuration."; ERROR_KVM_INTEL="If you have an Intel CPU, you must enable"; ERROR_KVM_INTEL+=" KVM_INTEL in your kernel configuration."; ERROR_TUN="You will need the Universal TUN/TAP driver compiled"; ERROR_TUN+=" into your kernel or loaded as a module to use the"; ERROR_TUN+=" virtual network device if using -net tap."; ERROR_BRIDGE="You will also need support for 802.1d"; ERROR_BRIDGE+=" Ethernet Bridging for some network configurations."; use vhost-net && CONFIG_CHECK+=" ~VHOST_NET"; ERROR_VHOST_NET="You must enable VHOST_NET to have vhost-net"; ERROR_VHOST_NET+=" support"; if use amd64 || use x86 || use amd64-linux || use x86-linux; then if grep -q AuthenticAMD /proc/cpuinfo; then CONFIG_CHECK+=" ~KVM_AMD"; else if grep -q GenuineIntel /proc/cpuinfo; then CONFIG_CHECK+=" ~KVM_INTEL"; fi; fi; fi; use python && CONFIG_CHECK+=" ~DEBUG_FS"; ERROR_DEBUG_FS="debugFS support required for kvm_stat"; check_extra_config; fi; fi; fi; if grep -qs '/usr/bin/qemu-kvm' "${EROOT}"/etc/libvirt/qemu/*.xml; then eerror "The kvm/qemu-kvm wrappers no longer exist, but your libvirt"; eerror "instances are still pointing to it. Please update your"; eerror "configs in /etc/libvirt/qemu/ to use the -enable-kvm flag"; eerror "and the right system binary (e.g. qemu-system-x86_64)."; die "update your virt configs to not use qemu-kvm"; fi } pkg_setup () { linux-info_pkg_setup "$@" } post_src_install () { ( if grep -E -q 'internal compiler error' "${WORKDIR}"/*/config.log &> /dev/null; then echo "${CATEGORY}/${PF}: Found ICE in config.log?!"; fi; if [[ -f "${S}"/meson.build ]] && ! grep -q "dev-util/meson" <<< "${BDEPEND}"; then echo "${CATEGORY}/${PF}: meson.build found but ebuild doesn't use meson?"; fi; if grep -r -q "dejagnu" "${S}" &> /dev/null && ! grep -q "dejagnu" <<< "${BDEPEND}"; then echo "${CATEGORY}/${PF}: Missing dejagnu tests?"; fi; if grep -r -q "test" "${S}/meson_options.txt" &> /dev/null && ! grep -q "test" <<< "${IUSE}"; then echo "${CATEGORY}/${PF}: Missing test option wiring for meson?"; fi; if grep -E -r -q -- "(disable|enable|with(out)?)-(unit)?test(s?)" configure.ac &> /dev/null && ! grep -q "test" <<< "${IUSE}"; then echo "${CATEGORY}/${PF}: Missing test option wiring for autoconf?"; fi; if grep -E -r -q -- "(disable|enable)-valgrind" configure.ac &> /dev/null && ! grep -q "valgrind" <<< "${IUSE}"; then echo "${CATEGORY}/${PF}: Missing valgrind option wiring for autoconf?"; fi; if grep -r -q "valgrind" "${S}/meson_options.txt" &> /dev/null && ! grep -q "valgrind" <<< "${IUSE}"; then echo "${CATEGORY}/${PF}: Missing valgrind option wiring for meson?"; fi; if grep -E -r -q -- "(disable|enable)-fuzz" configure.ac &> /dev/null && ! grep -q "fuzz" <<< "${EBUILD}"; then echo "${CATEGORY}/${PF}: Missing fuzz option wiring for autoconf?"; fi; if grep -r -q "fuzz" "${S}/meson_options.txt" &> /dev/null && ! grep -q "fuzz" <<< "${EBUILD}"; then echo "${CATEGORY}/${PF}: Missing fuzz option wiring for meson?"; fi ) &>> /var/tmp/sam.txt } python_copy_sources () { debug-print-function ${FUNCNAME} "${@}"; local MULTIBUILD_VARIANTS; _python_obtain_impls; multibuild_copy_sources } python_doexe () { debug-print-function ${FUNCNAME} "${@}"; [[ ${EBUILD_PHASE} != install ]] && die "${FUNCNAME} can only be used in src_install"; local f; for f in "$@"; do python_newexe "${f}" "${f##*/}"; done } python_doheader () { debug-print-function ${FUNCNAME} "${@}"; [[ ${EBUILD_PHASE} != install ]] && die "${FUNCNAME} can only be used in src_install"; [[ -n ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).'; local includedir=$(python_get_includedir); local d=${includedir#${EPREFIX}}; ( insopts -m 0644; insinto "${d}"; doins -r "${@}" || return ${?} ) } python_domodule () { debug-print-function ${FUNCNAME} "${@}"; [[ -n ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).'; local d; if [[ ${_PYTHON_MODULEROOT} == /* ]]; then d=${_PYTHON_MODULEROOT}; else local sitedir=$(python_get_sitedir); d=${sitedir#${EPREFIX}}/${_PYTHON_MODULEROOT//.//}; fi; if [[ ${EBUILD_PHASE} == install ]]; then ( insopts -m 0644; insinto "${d}"; doins -r "${@}" || return ${?} ); python_optimize "${ED%/}/${d}"; else if [[ -n ${BUILD_DIR} ]]; then local dest=${BUILD_DIR}/install${EPREFIX}/${d}; mkdir -p "${dest}" || die; cp -pR "${@}" "${dest}/" || die; ( cd "${dest}" && chmod -R a+rX "${@##*/}" ) || die; else die "${FUNCNAME} can only be used in src_install or with BUILD_DIR set"; fi; fi } python_doscript () { debug-print-function ${FUNCNAME} "${@}"; [[ ${EBUILD_PHASE} != install ]] && die "${FUNCNAME} can only be used in src_install"; local _PYTHON_REWRITE_SHEBANG=1; python_doexe "${@}" } python_export_utf8_locale () { debug-print-function ${FUNCNAME} "${@}"; type locale &> /dev/null || return 0; if [[ $(locale charmap) != UTF-8 ]]; then local lang locales="C.UTF-8 en_US.UTF-8 en_GB.UTF-8 $(locale -a)"; for lang in ${locales}; do if [[ $(LC_ALL=${lang} locale charmap 2> /dev/null) == UTF-8 ]]; then if _python_check_locale_sanity "${lang}"; then export LC_CTYPE=${lang}; if [[ -n ${LC_ALL} ]]; then export LC_NUMERIC=${LC_ALL}; export LC_TIME=${LC_ALL}; export LC_COLLATE=${LC_ALL}; export LC_MONETARY=${LC_ALL}; export LC_MESSAGES=${LC_ALL}; export LC_PAPER=${LC_ALL}; export LC_NAME=${LC_ALL}; export LC_ADDRESS=${LC_ALL}; export LC_TELEPHONE=${LC_ALL}; export LC_MEASUREMENT=${LC_ALL}; export LC_IDENTIFICATION=${LC_ALL}; export LC_ALL=; fi; return 0; fi; fi; done; ewarn "Could not find a UTF-8 locale. This may trigger build failures in"; ewarn "some python packages. Please ensure that a UTF-8 locale is listed in"; ewarn "/etc/locale.gen and run locale-gen."; return 1; fi; return 0 } python_fix_shebang () { debug-print-function ${FUNCNAME} "${@}"; [[ -n ${EPYTHON} ]] || die "${FUNCNAME}: EPYTHON unset (pkg_setup not called?)"; local force quiet; while [[ -n ${@} ]]; do case "${1}" in -f | --force) force=1; shift ;; -q | --quiet) quiet=1; shift ;; --) shift; break ;; *) break ;; esac; done; [[ -n ${1} ]] || die "${FUNCNAME}: no paths given"; local path f; for path in "$@"; do local any_fixed is_recursive; [[ -d ${path} ]] && is_recursive=1; while IFS= read -r -d '' f; do local shebang i; local error= match=; IFS= read -r shebang < "${f}"; if [[ ${shebang} == '#!'* ]]; then local split_shebang=(); read -r -a split_shebang <<< ${shebang#"#!"} || die; local in_path=${split_shebang[0]}; local from='^#! *[^ ]*'; if [[ ${in_path} == */env ]]; then in_path=${split_shebang[1]}; from+=' *[^ ]*'; fi; case ${in_path##*/} in "${EPYTHON}") match=1 ;; python | python3) match=1 ;; python2 | python[23].[0-9] | python3.[1-9][0-9] | pypy | pypy3 | jython[23].[0-9]) match=1; error=1 ;; esac; fi; [[ -n ${force} ]] && error=; if [[ ! -n ${match} ]]; then [[ -n ${is_recursive} ]] && continue; error=1; fi; if [[ ! -n ${quiet} ]]; then einfo "Fixing shebang in ${f#${D%/}}."; fi; if [[ ! -n ${error} ]]; then debug-print "${FUNCNAME}: in file ${f#${D%/}}"; debug-print "${FUNCNAME}: rewriting shebang: ${shebang}"; sed -i -e "1s@${from}@#!${EPREFIX}/usr/bin/${EPYTHON}@" "${f}" || die; any_fixed=1; else eerror "The file has incompatible shebang:"; eerror " file: ${f#${D%/}}"; eerror " current shebang: ${shebang}"; eerror " requested impl: ${EPYTHON}"; die "${FUNCNAME}: conversion of incompatible shebang requested"; fi; done < <(find -H "${path}" -type f -print0 || die); if [[ ! -n ${any_fixed} ]]; then eerror "QA error: ${FUNCNAME}, ${path#${D%/}} did not match any fixable files."; eerror "There are no Python files in specified directory."; die "${FUNCNAME} did not match any fixable files"; fi; done } python_foreach_impl () { debug-print-function ${FUNCNAME} "${@}"; if [[ -n ${_DISTUTILS_R1_ECLASS} ]]; then if has "${EBUILD_PHASE}" prepare configure compile test install && [[ ! -n ${_DISTUTILS_CALLING_FOREACH_IMPL} && ! -n ${_DISTUTILS_FOREACH_IMPL_WARNED} ]]; then eqawarn "python_foreach_impl has been called directly while using distutils-r1."; eqawarn "Please redefine python_*() phase functions to meet your expectations"; eqawarn "instead."; _DISTUTILS_FOREACH_IMPL_WARNED=1; if ! has "${EAPI}" 7 8; then die "Calling python_foreach_impl from distutils-r1 is banned in EAPI ${EAPI}"; fi; fi; local _DISTUTILS_CALLING_FOREACH_IMPL=; fi; local MULTIBUILD_VARIANTS; _python_obtain_impls; multibuild_foreach_variant _python_multibuild_wrapper "${@}" } python_gen_any_dep () { debug-print-function ${FUNCNAME} "${@}"; local depstr=${1}; shift; local i PYTHON_PKG_DEP out=; _python_verify_patterns "${@}"; for i in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do if _python_impl_matches "${i}" "${@}"; then local PYTHON_USEDEP="python_targets_${i}(-)"; local PYTHON_SINGLE_USEDEP="python_single_target_${i}(-)"; _python_export "${i}" PYTHON_PKG_DEP; local i_depstr=${depstr//\$\{PYTHON_USEDEP\}/${PYTHON_USEDEP}}; i_depstr=${i_depstr//\$\{PYTHON_SINGLE_USEDEP\}/${PYTHON_SINGLE_USEDEP}}; out="( ${PYTHON_PKG_DEP/:=} ${i_depstr} ) ${out}"; fi; done; echo "|| ( ${out})" } python_gen_cond_dep () { debug-print-function ${FUNCNAME} "${@}"; local impl matches=(); local dep=${1}; shift; _python_verify_patterns "${@}"; for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do if _python_impl_matches "${impl}" "${@}"; then if [[ ${dep} == *'${PYTHON_USEDEP}'* ]]; then local usedep=$(_python_gen_usedep "${@}"); dep=${dep//\$\{PYTHON_USEDEP\}/${usedep}}; fi; matches+=("python_targets_${impl}? ( ${dep} )"); fi; done; echo "${matches[@]}" } python_gen_impl_dep () { debug-print-function ${FUNCNAME} "${@}"; local impl matches=(); local PYTHON_REQ_USE=${1}; shift; _python_verify_patterns "${@}"; for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do if _python_impl_matches "${impl}" "${@}"; then local PYTHON_PKG_DEP; _python_export "${impl}" PYTHON_PKG_DEP; matches+=("python_targets_${impl}? ( ${PYTHON_PKG_DEP} )"); fi; done; echo "${matches[@]}" } python_gen_useflags () { debug-print-function ${FUNCNAME} "${@}"; local impl matches=(); _python_verify_patterns "${@}"; for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; do if _python_impl_matches "${impl}" "${@}"; then matches+=("python_targets_${impl}"); fi; done; echo "${matches[@]}" } python_get_CFLAGS () { debug-print-function ${FUNCNAME} "${@}"; _python_export "${@}" PYTHON_CFLAGS; echo "${PYTHON_CFLAGS}" } python_get_LIBS () { debug-print-function ${FUNCNAME} "${@}"; _python_export "${@}" PYTHON_LIBS; echo "${PYTHON_LIBS}" } python_get_PYTHON_CONFIG () { debug-print-function ${FUNCNAME} "${@}"; _python_export "${@}" PYTHON_CONFIG; echo "${PYTHON_CONFIG}" } python_get_includedir () { debug-print-function ${FUNCNAME} "${@}"; _python_export "${@}" PYTHON_INCLUDEDIR; echo "${PYTHON_INCLUDEDIR}" } python_get_library_path () { debug-print-function ${FUNCNAME} "${@}"; _python_export "${@}" PYTHON_LIBPATH; echo "${PYTHON_LIBPATH}" } python_get_scriptdir () { debug-print-function ${FUNCNAME} "${@}"; _python_export "${@}" PYTHON_SCRIPTDIR; echo "${PYTHON_SCRIPTDIR}" } python_get_sitedir () { debug-print-function ${FUNCNAME} "${@}"; _python_export "${@}" PYTHON_SITEDIR; echo "${PYTHON_SITEDIR}" } python_has_version () { debug-print-function ${FUNCNAME} "${@}"; local root_arg=(-b); case ${1} in -b | -d | -r) root_arg=("${1}"); shift ;; esac; local pkg; for pkg in "$@"; do ebegin " ${pkg}"; has_version "${root_arg[@]}" "${pkg}"; eend ${?} || return; done; return 0 } python_moduleinto () { debug-print-function ${FUNCNAME} "${@}"; _PYTHON_MODULEROOT=${1} } python_newexe () { debug-print-function ${FUNCNAME} "${@}"; [[ ${EBUILD_PHASE} != install ]] && die "${FUNCNAME} can only be used in src_install"; [[ -n ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).'; [[ ${#} -eq 2 ]] || die "Usage: ${FUNCNAME} "; local wrapd=${_PYTHON_SCRIPTROOT:-/usr/bin}; local f=${1}; local newfn=${2}; local scriptdir=$(python_get_scriptdir); local d=${scriptdir#${EPREFIX}}; ( dodir "${wrapd}"; exeopts -m 0755; exeinto "${d}"; newexe "${f}" "${newfn}" || return ${?} ); local dosym=dosym; [[ ${EAPI} == 7 ]] && dosym=dosym8; "${dosym}" -r /usr/lib/python-exec/python-exec2 "${wrapd}/${newfn}"; if [[ -n ${_PYTHON_REWRITE_SHEBANG} ]]; then python_fix_shebang -q "${ED%/}/${d}/${newfn}"; fi } python_newscript () { debug-print-function ${FUNCNAME} "${@}"; [[ ${EBUILD_PHASE} != install ]] && die "${FUNCNAME} can only be used in src_install"; local _PYTHON_REWRITE_SHEBANG=1; python_newexe "${@}" } python_optimize () { debug-print-function ${FUNCNAME} "${@}"; [[ -n ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).'; local PYTHON=${PYTHON}; [[ -n ${PYTHON} ]] || _python_export PYTHON; [[ -x ${PYTHON} ]] || die "PYTHON (${PYTHON}) is not executable"; if [[ ${#} -eq 0 ]]; then local f; while IFS= read -r -d '' f; do if [[ ${f} == /* && -d ${D%/}${f} ]]; then set -- "${D%/}${f}" "${@}"; fi; done < <("${PYTHON}" - <<-EOF || import sys print("".join(x + "\0" for x in sys.path)) EOF die); debug-print "${FUNCNAME}: using sys.path: ${*/%/;}"; fi; local jobs=$(makeopts_jobs); local d; for d in "$@"; do local instpath=${d#${D%/}}; instpath=/${instpath##/}; einfo "Optimize Python modules for ${instpath}"; case "${EPYTHON}" in python3.8) "${PYTHON}" -m compileall -j "${jobs}" -q -f -d "${instpath}" "${d}"; "${PYTHON}" -O -m compileall -j "${jobs}" -q -f -d "${instpath}" "${d}"; "${PYTHON}" -OO -m compileall -j "${jobs}" -q -f -d "${instpath}" "${d}" ;; python* | pypy3) "${PYTHON}" -m compileall -j "${jobs}" -o 0 -o 1 -o 2 --hardlink-dupes -q -f -d "${instpath}" "${d}" ;; pypy | jython2.7) "${PYTHON}" -m compileall -q -f -d "${instpath}" "${d}" ;; *) die "${FUNCNAME}: unexpected EPYTHON=${EPYTHON}" ;; esac; done } python_replicate_script () { debug-print-function ${FUNCNAME} "${@}"; function _python_replicate_script () { local _PYTHON_FIX_SHEBANG_QUIET=1; local PYTHON_SCRIPTDIR; _python_export PYTHON_SCRIPTDIR; ( exeopts -m 0755; exeinto "${PYTHON_SCRIPTDIR#${EPREFIX}}"; doexe "${files[@]}" ); python_fix_shebang -q "${files[@]/*\//${D%/}/${PYTHON_SCRIPTDIR}/}" }; local files=("${@}"); python_foreach_impl _python_replicate_script; unset -f _python_replicate_script; local f; for f in "$@"; do local dosym=dosym; [[ ${EAPI} == 7 ]] && dosym=dosym8; "${dosym}" -r /usr/lib/python-exec/python-exec2 "${f#${ED}}"; done } python_scriptinto () { debug-print-function ${FUNCNAME} "${@}"; _PYTHON_SCRIPTROOT=${1} } python_setup () { debug-print-function ${FUNCNAME} "${@}"; local has_check_deps; declare -f python_check_deps > /dev/null && has_check_deps=1; if [[ ! -n ${has_check_deps} ]]; then _python_validate_useflags; fi; local pycompat=("${PYTHON_COMPAT[@]}"); if [[ -n ${PYTHON_COMPAT_OVERRIDE} ]]; then pycompat=(${PYTHON_COMPAT_OVERRIDE}); fi; local found i; _python_verify_patterns "${@}"; for ((i = ${#_PYTHON_SUPPORTED_IMPLS[@]} - 1; i >= 0; i-- )) do local impl=${_PYTHON_SUPPORTED_IMPLS[i]}; has "${impl}" "${pycompat[@]}" || continue; if [[ ! -n ${PYTHON_COMPAT_OVERRIDE} && ! -n ${has_check_deps} ]]; then use "python_targets_${impl}" || continue; fi; _python_impl_matches "${impl}" "${@}" || continue; _python_export "${impl}" EPYTHON PYTHON; if [[ -n ${has_check_deps} ]]; then _python_run_check_deps "${impl}" || continue; fi; found=1; break; done; if [[ ! -n ${found} ]]; then eerror "${FUNCNAME}: none of the enabled implementation matched the patterns."; eerror " patterns: ${@-'(*)'}"; eerror "Likely a REQUIRED_USE constraint (possibly USE-conditional) is missing."; eerror " suggested: || ( \$(python_gen_useflags ${@}) )"; eerror "(remember to quote all the patterns with '')"; die "${FUNCNAME}: no enabled implementation satisfy requirements"; fi; _python_wrapper_setup; einfo "Using ${EPYTHON} in global scope" } qeerror () { qout eerror "${@}" } qeinfo () { qout einfo "${@}" } qemu_python_install () { python_domodule "${S}/python/qemu"; python_doscript "${S}/scripts/kvm/vmxcap"; python_doscript "${S}/scripts/qmp/qmp-shell"; python_doscript "${S}/scripts/qmp/qemu-ga-client" } qemu_src_configure () { debug-print-function ${FUNCNAME} "$@"; local buildtype=$1; local builddir="${S}/${buildtype}-build"; mkdir "${builddir}" || die; local conf_opts=(--prefix=/usr --sysconfdir=/etc --bindir=/usr/bin --libdir=/usr/$(get_libdir) --datadir=/usr/share --docdir=/usr/share/doc/${PF}/html --mandir=/usr/share/man --localstatedir=/var --disable-bsd-user --disable-containers --disable-guest-agent --disable-strip --disable-download --disable-tcg-interpreter --disable-werror --disable-gcrypt --cc="$(tc-getCC)" --cxx="$(tc-getCXX)" --objcc="$(tc-getCC)" --host-cc="$(tc-getBUILD_CC)" $(use_enable alsa) $(use_enable debug debug-info) $(use_enable debug debug-tcg) $(use_enable jack) $(use_enable nls gettext) $(use_enable oss) $(use_enable pipewire) $(use_enable plugins) $(use_enable pulseaudio pa) $(use_enable selinux) $(use_enable xattr attr)); function conf_notuser () { if [[ ${buildtype} == "user" ]]; then echo "--disable-${2:-$1}"; else use_enable "$@"; fi }; function conf_softmmu () { if [[ ${buildtype} == "softmmu" ]]; then use_enable "$@"; else echo "--disable-${2:-$1}"; fi }; function conf_tools () { if [[ ${buildtype} == "tools" ]]; then use_enable "$@"; else echo "--disable-${2:-$1}"; fi }; function conf_malloc () { if [[ ! ${buildtype} == "user" ]]; then usex "${1}" "--enable-malloc=${1}" ""; fi }; conf_opts+=($(conf_notuser accessibility brlapi) $(conf_notuser aio linux-aio) $(conf_softmmu bpf) $(conf_notuser bzip2) $(conf_notuser capstone) $(conf_notuser curl) $(conf_tools doc docs) $(conf_notuser fdt) $(conf_notuser fuse) $(conf_notuser glusterfs) $(conf_notuser gnutls) $(conf_notuser gnutls nettle) $(conf_notuser gtk) $(conf_notuser infiniband rdma) $(conf_notuser iscsi libiscsi) $(conf_notuser io-uring linux-io-uring) $(conf_malloc jemalloc) $(conf_notuser jpeg vnc-jpeg) $(conf_notuser kernel_linux kvm) $(conf_notuser keyutils libkeyutils) $(conf_notuser lzo) $(conf_notuser multipath mpath) $(conf_notuser ncurses curses) $(conf_notuser nfs libnfs) $(conf_notuser numa) $(conf_notuser opengl) $(conf_notuser pam auth-pam) $(conf_notuser png) $(conf_notuser rbd) $(conf_notuser sasl vnc-sasl) $(conf_notuser sdl) $(conf_softmmu sdl-image) $(conf_notuser seccomp) $(conf_notuser slirp) $(conf_notuser smartcard) $(conf_notuser snappy) $(conf_notuser spice) $(conf_notuser ssh libssh) $(conf_notuser udev libudev) $(conf_notuser usb libusb) $(conf_notuser usbredir usb-redir) $(conf_notuser vde) $(conf_notuser vhost-net) $(conf_notuser virgl virglrenderer) $(conf_softmmu virtfs) $(conf_notuser vnc) $(conf_notuser vte) $(conf_notuser xen) $(conf_notuser xen xen-pci-passthrough) --disable-xkbcommon $(conf_notuser zstd)); if [[ ! ${buildtype} == "user" ]]; then local audio_opts=($(usex pulseaudio pa "") $(usev pipewire) $(usev jack) $(usev sdl) $(usev alsa) $(usev oss)); conf_opts+=(--audio-drv-list=$(IFS=,; echo "${audio_opts[*]}")); fi; case ${buildtype} in user) conf_opts+=(--enable-linux-user --disable-system --disable-tools --disable-cap-ng --disable-seccomp); local static_flag="static-user" ;; softmmu) conf_opts+=(--disable-linux-user --enable-system --disable-tools --enable-cap-ng --enable-seccomp); local static_flag="none" ;; tools) conf_opts+=(--disable-linux-user --disable-system --enable-tools --enable-cap-ng); local static_flag="none" ;; esac; local targets="${buildtype}_targets"; [[ -n ${targets} ]] && conf_opts+=(--target-list="${!targets}"); use systemtap && conf_opts+=(--enable-trace-backends="dtrace"); if [[ ${static_flag} != "none" ]] && use ${static_flag}; then conf_opts+=(--static --disable-pie); else tc-enables-pie && conf_opts+=(--enable-pie); fi; tc-is-cross-compiler && conf_opts+=(--cross-prefix="${CHOST}-"); conf_opts+=(${EXTRA_CONF_QEMU}); echo "../configure ${conf_opts[*]}"; cd "${builddir}"; ../configure "${conf_opts[@]}" || die "configure failed" } qewarn () { qout ewarn "${@}" } qout () { local outputmsg type; type=${1}; shift; outputmsg="${@}"; case "${EBUILD_PHASE}" in depend) unset outputmsg ;; clean) unset outputmsg ;; preinst) unset outputmsg ;; esac; [[ -n "${outputmsg}" ]] && ${type} "${outputmsg}" } 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 } require_configured_kernel () { [[ -n ${SKIP_KERNEL_CHECK} ]] && return; if ! use kernel_linux; then die "${FUNCNAME}() called on non-Linux system, please fix the ebuild"; fi; if ! linux_config_src_exists; then qeerror "Could not find a usable .config in the kernel source directory."; qeerror "Please ensure that ${KERNEL_DIR} points to a configured set of Linux sources."; qeerror "If you are using KBUILD_OUTPUT, please set the environment var so that"; qeerror "it points to the necessary object directory so that it might find .config."; die "Kernel not configured; no .config found in ${KV_OUT_DIR}"; fi; get_version || die "Unable to determine configured kernel version" } run_in_build_dir () { debug-print-function ${FUNCNAME} "${@}"; local ret; [[ ${#} -eq 0 ]] && die "${FUNCNAME}: no command specified."; [[ -z ${BUILD_DIR} ]] && die "${FUNCNAME}: BUILD_DIR not set."; mkdir -p "${BUILD_DIR}" || die; pushd "${BUILD_DIR}" > /dev/null || die; "${@}"; ret=${?}; popd > /dev/null || die; return ${ret} } set_arch_to_kernel () { export ARCH=$(tc-arch-kernel) } set_arch_to_pkgmgr () { export ARCH=$(tc-arch) } source_profile () { set +u; source /etc/profile 2> /dev/null; set -u } declare -fx source_profile src_compile () { if [[ -n ${user_targets} ]]; then cd "${S}/user-build" || die; default; fi; if [[ -n ${softmmu_targets} ]]; then cd "${S}/softmmu-build" || die; default; fi; cd "${S}/tools-build" || die; default } src_configure () { local target; python_setup; softmmu_targets= softmmu_bins=(); user_targets= user_bins=(); for target in ${IUSE_SOFTMMU_TARGETS}; do if use "qemu_softmmu_targets_${target}"; then softmmu_targets+=",${target}-softmmu"; softmmu_bins+=("qemu-system-${target}"); fi; done; for target in ${IUSE_USER_TARGETS}; do if use "qemu_user_targets_${target}"; then user_targets+=",${target}-linux-user"; user_bins+=("qemu-${target}"); fi; done; softmmu_targets=${softmmu_targets#,}; user_targets=${user_targets#,}; [[ -n ${softmmu_targets} ]] && qemu_src_configure "softmmu"; [[ -n ${user_targets} ]] && qemu_src_configure "user"; qemu_src_configure "tools" } src_install () { if [[ -n ${user_targets} ]]; then cd "${S}/user-build"; emake DESTDIR="${ED}" install; generate_initd; doinitd "${T}/qemu-binfmt"; insinto "/usr/share/qemu/binfmt.d"; doins "${T}/qemu.conf"; fi; if [[ -n ${softmmu_targets} ]]; then cd "${S}/softmmu-build"; emake DESTDIR="${ED}" install; [[ -e check-report.html ]] && dodoc check-report.html; if use kernel_linux; then udev_newrules "${FILESDIR}"/65-kvm.rules-r2 65-kvm.rules; fi; if use python; then python_foreach_impl qemu_python_install; fi; fi; cd "${S}/tools-build" || die; emake DESTDIR="${ED}" install; if ! use doc && [[ ${QEMU_DOCS_PREBUILT} == 1 ]]; then doman "${WORKDIR}"/${PN}-${QEMU_DOCS_VERSION}-docs/docs/*.[0-8]; fi; pushd "${ED}"/usr/bin > /dev/null || die; pax-mark mr "${softmmu_bins[@]}" "${user_bins[@]}"; popd > /dev/null || die; insinto "/etc/qemu"; doins "${FILESDIR}/bridge.conf"; cd "${S}" || die; dodoc MAINTAINERS; newdoc pc-bios/README README.pc-bios; dostrip -x ${QA_PREBUILT}; if [[ -n ${softmmu_targets} ]]; then if use qemu_softmmu_targets_x86_64 || use qemu_softmmu_targets_i386; then dosym ../seabios/bios-256k.bin /usr/share/qemu/bios-256k.bin; fi; rm "${ED}/usr/share/qemu/vgabios.bin"; rm "${ED}/usr/share/qemu/vgabios-cirrus.bin"; rm "${ED}/usr/share/qemu/vgabios-qxl.bin"; rm "${ED}/usr/share/qemu/vgabios-stdvga.bin"; rm "${ED}/usr/share/qemu/vgabios-virtio.bin"; rm "${ED}/usr/share/qemu/vgabios-vmware.bin"; if use qemu_softmmu_targets_x86_64 || use qemu_softmmu_targets_i386 || use qemu_softmmu_targets_ppc || use qemu_softmmu_targets_ppc64; then dosym ../seavgabios/vgabios-isavga.bin /usr/share/qemu/vgabios.bin; dosym ../seavgabios/vgabios-cirrus.bin /usr/share/qemu/vgabios-cirrus.bin; dosym ../seavgabios/vgabios-qxl.bin /usr/share/qemu/vgabios-qxl.bin; dosym ../seavgabios/vgabios-stdvga.bin /usr/share/qemu/vgabios-stdvga.bin; dosym ../seavgabios/vgabios-virtio.bin /usr/share/qemu/vgabios-virtio.bin; dosym ../seavgabios/vgabios-vmware.bin /usr/share/qemu/vgabios-vmware.bin; fi; if use qemu_softmmu_targets_x86_64 || use qemu_softmmu_targets_i386; then dosym ../sgabios/sgabios.bin /usr/share/qemu/sgabios.bin; fi; if use qemu_softmmu_targets_x86_64 || use qemu_softmmu_targets_i386; then dosym ../ipxe/8086100e.rom /usr/share/qemu/pxe-e1000.rom; dosym ../ipxe/80861209.rom /usr/share/qemu/pxe-eepro100.rom; dosym ../ipxe/10500940.rom /usr/share/qemu/pxe-ne2k_pci.rom; dosym ../ipxe/10222000.rom /usr/share/qemu/pxe-pcnet.rom; dosym ../ipxe/10ec8139.rom /usr/share/qemu/pxe-rtl8139.rom; dosym ../ipxe/1af41000.rom /usr/share/qemu/pxe-virtio.rom; fi; fi; DISABLE_AUTOFORMATTING=true; readme.gentoo_create_doc } src_prepare () { check_targets IUSE_SOFTMMU_TARGETS softmmu; check_targets IUSE_USER_TARGETS linux-user; default; tc-export AR AS LD NM OBJCOPY PKG_CONFIG RANLIB STRINGS; export WINDRES=${CHOST}-windres; MAKEOPTS+=" V=1"; rm -r roms/*/ || die } src_test () { if [[ -n ${softmmu_targets} ]]; then cd "${S}/softmmu-build" || die; pax-mark m */qemu-system-*; emake check; fi } src_unpack () { if [[ ${PV} == 9999 ]]; then git-r3_src_unpack; for file in ${A}; do unpack "${file}"; done; cd "${WORKDIR}" || die; for proj in "${!SUBPROJECTS[@]}"; do mv "${proj}-${SUBPROJECTS[${proj}]}" "${S}/subprojects/${proj}" || die; done; cd "${S}" || die; meson subprojects packagefiles --apply || die; else default; fi } 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-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 } udev_dorules () { debug-print-function ${FUNCNAME} "${@}"; ( insopts -m 0644; insinto "$(_udev_get_udevdir)"/rules.d; doins "${@}" ) } udev_get_udevdir () { debug-print-function ${FUNCNAME} "${@}"; eerror "This ebuild should be using the get_udevdir() function instead of the deprecated udev_get_udevdir()"; die "Deprecated function call: udev_get_udevdir(), please report to (overlay) maintainers." } udev_newrules () { debug-print-function ${FUNCNAME} "${@}"; ( insopts -m 0644; insinto "$(_udev_get_udevdir)"/rules.d; newins "${@}" ) } udev_reload () { if [[ -n ${ROOT%/} ]]; then return 0; fi; if [[ -d ${ROOT}/run/udev ]]; then ebegin "Running udev control --reload for reloading rules and databases"; udevadm control --reload; eend $?; 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 } xdg_desktop_database_update () { if [[ ${EBUILD_PHASE} != post* ]]; then die "xdg_desktop_database_update must be used in pkg_post* phases."; fi; if ! type update-desktop-database &> /dev/null; then debug-print "update-desktop-database is not found"; return; fi; ebegin "Updating .desktop files database"; update-desktop-database -q "${EROOT%/}${DESKTOP_DATABASE_DIR}"; eend $? } xdg_environment_reset () { export XDG_DATA_HOME="${HOME}/.local/share"; export XDG_CONFIG_HOME="${HOME}/.config"; export XDG_CACHE_HOME="${HOME}/.cache"; export XDG_STATE_HOME="${HOME}/.local/state"; export XDG_RUNTIME_DIR="${T}/run"; mkdir -p "${XDG_DATA_HOME}" "${XDG_CONFIG_HOME}" "${XDG_CACHE_HOME}" "${XDG_STATE_HOME}" "${XDG_RUNTIME_DIR}" || die; chmod 0700 "${XDG_RUNTIME_DIR}" || die; unset DBUS_SESSION_BUS_ADDRESS } xdg_icon_cache_update () { if [[ ${EBUILD_PHASE} != post* ]]; then die "xdg_icon_cache_update must be used in pkg_post* phases."; fi; if ! type gtk-update-icon-cache &> /dev/null; then debug-print "gtk-update-icon-cache is not found"; return; fi; ebegin "Updating icons cache"; local dir retval=0; local fails=(); for dir in "${EROOT%/}"/usr/share/icons/*; do if [[ -f ${dir}/index.theme ]]; then if ! gtk-update-icon-cache -qf "${dir}"; then debug-print "Updating cache failed on ${dir}"; fails+=("${dir}"); retval=2; fi; else if [[ $(ls "${dir}") = icon-theme.cache ]]; then rm "${dir}/icon-theme.cache"; fi; fi; if [[ -z $(ls "${dir}") ]]; then rmdir "${dir}"; fi; done; eend ${retval}; for dir in "${fails[@]}"; do eerror "Failed to update cache with icon ${dir}"; done } xdg_mimeinfo_database_update () { if [[ ${EBUILD_PHASE} != post* ]]; then die "xdg_mimeinfo_database_update must be used in pkg_post* phases."; fi; if ! type update-mime-database &> /dev/null; then debug-print "update-mime-database is not found"; return; fi; local -x PKGSYSTEM_ENABLE_FSYNC=0; ebegin "Updating shared mime info database"; update-mime-database "${EROOT%/}${MIMEINFO_DATABASE_DIR}"; eend $? }