declare -x ABI="amd64" declare -x ABI_MIPS="" declare -x ABI_PPC="" declare -x ABI_RISCV="" declare -x ABI_S390="" declare -x ABI_X86="64" declare -x ADAFLAGS="" declare -x ADA_TARGET="" declare -x ALSA_CARDS="" declare -x APACHE2_MODULES="" declare -x APACHE2_MPMS="" declare -x ARCH="amd64" declare BDEPEND="sys-devel/make >=dev-util/cmake-3.9.6" declare -x BOOTSTRAP_USE="unicode internal-glib pkg-config split-usr python_targets_python3_6 python_targets_python2_7 multilib nptl -berkdb -gdbm" declare -- BUILD_DIR="/var/tmp/portage/dev-db/percona-server-8.0.18.9/work/percona-server-8.0.18.9_build" declare -x CALLIGRA_FEATURES="" declare -x CAMERAS="" declare -x CARGO_TERM_COLOR="never" declare -x CATKIN_PREFIX_PATH="/usr" declare -x CBUILD="x86_64-gentoo-linux-musl" declare -x CCASFLAGS="" declare -x CFLAGS="-O2 -pipe -march=native -fno-common -falign-functions=32:25:16 -fno-strict-aliasing" declare -x CFLAGS_amd64="-m64" declare -x CFLAGS_default declare -x CFLAGS_x32="-mx32" declare -x CFLAGS_x86="-m32" declare -- CHECKREQS_DISK_BUILD="8G" declare -x CHOST="x86_64-gentoo-linux-musl" declare -x CHOST_amd64="x86_64-gentoo-linux-musl" declare -x CHOST_default="x86_64-gentoo-linux-musl" declare -x CHOST_x32="x86_64-pc-linux-gnux32" declare -x CHOST_x86="i686-pc-linux-gnu" declare -- CMAKE_BINARY="cmake" declare -- CMAKE_BUILD_TYPE="RelWithDebInfo" declare -- CMAKE_MAKEFILE_GENERATOR="emake" declare -- CMAKE_MIN_VERSION="3.9.6" declare -- CMAKE_REMOVE_MODULES="yes" declare -- CMAKE_REMOVE_MODULES_LIST="FindBLAS FindLAPACK" declare -- CMAKE_USE_DIR="/var/tmp/portage/dev-db/percona-server-8.0.18.9/work/mysql" declare -- CMAKE_VERBOSE="ON" declare -- CMAKE_WARN_UNUSED_CLI="yes" declare -x COLLECTD_PLUGINS="" declare -- COMMON_DEPEND=" >=app-arch/lz4-0_p131:= sys-libs/ncurses:0= >=sys-libs/zlib-1.2.3:0= libressl? ( dev-libs/libressl:0= ) !libressl? ( >=dev-libs/openssl-1.0.0:0= ) server? ( dev-libs/icu:= dev-libs/libevent:= >=dev-libs/protobuf-3.8:= net-libs/libtirpc:= net-misc/curl:= cjk? ( app-text/mecab:= ) jemalloc? ( dev-libs/jemalloc:0= ) kernel_linux? ( dev-libs/libaio:0= sys-process/procps:0= ) numa? ( sys-process/numactl ) pam? ( sys-libs/pam:0= ) tcmalloc? ( dev-util/google-perftools:0= ) ) " declare -x COMMON_FLAGS="-O2 -pipe -march=native -fno-common -falign-functions=32:25:16" declare -x CPPFLAGS="" declare -x CPU_FLAGS_ARM="" declare -x CPU_FLAGS_PPC="" declare -x CPU_FLAGS_X86="" declare -x CTARGET_default="x86_64-gentoo-linux-musl" declare -x CURL_SSL="" declare -x CXXFLAGS="-O2 -pipe -march=native -fno-common -falign-functions=32:25:16 -felide-constructors -fno-strict-aliasing" declare -x DCC_EMAILLOG_WHOM_TO_BLAME="" declare -x DEFAULT_ABI="amd64" declare -x DEFINED_PHASES=" compile config configure install postinst prepare pretend setup test unpack" declare DEPEND=" >=app-arch/lz4-0_p131:= sys-libs/ncurses:0= >=sys-libs/zlib-1.2.3:0= libressl? ( dev-libs/libressl:0= ) !libressl? ( >=dev-libs/openssl-1.0.0:0= ) server? ( dev-libs/icu:= dev-libs/libevent:= >=dev-libs/protobuf-3.8:= net-libs/libtirpc:= net-misc/curl:= cjk? ( app-text/mecab:= ) jemalloc? ( dev-libs/jemalloc:0= ) kernel_linux? ( dev-libs/libaio:0= sys-process/procps:0= ) numa? ( sys-process/numactl ) pam? ( sys-libs/pam:0= ) tcmalloc? ( dev-util/google-perftools:0= ) ) || ( >=sys-devel/gcc-3.4.6 >=sys-devel/gcc-apple-4.0 ) virtual/yacc server? ( net-libs/rpcsvc-proto ) test? ( acct-group/mysql acct-user/mysql dev-perl/JSON ) " declare DESCRIPTION="Fully compatible, enhanced and open source drop-in replacement for MySQL" declare -- DESKTOP_DATABASE_DIR="/usr/share/applications" declare -x DIROPTIONS="-m0755" declare -x EAPI="7" declare -x EC2_AMITOOL_HOME="/usr" declare -x EGO_BUILD_FLAGS="-p 1" declare -x ELIBC="musl" declare -x ENLIGHTENMENT_MODULES="" declare -x ENV_UNSET="DBUS_SESSION_BUS_ADDRESS DISPLAY GOBIN PERL5LIB PERL5OPT PERLPREFIX PERL_CORE PERL_MB_OPT PERL_MM_OPT XAUTHORITY XDG_CACHE_HOME XDG_CONFIG_HOME XDG_DATA_HOME XDG_RUNTIME_DIR" declare -- EPOCHREALTIME="1584996782.645462" declare -- EPOCHSECONDS="1584996782" declare -x EXEOPTIONS="-m0755" declare -x FCFLAGS="-O2 -pipe -march=native -fno-common -falign-functions=32:25:16 -fno-strict-aliasing" 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-common -falign-functions=32:25:16 -fno-strict-aliasing" declare -x FFTOOLS="" declare -x G4ABLADATA="/usr/share/geant4/data/G4ABLA3.1" declare -x G4ENSDFSTATEDATA="/usr/share/geant4/data/G4ENSDFSTATE2.2" declare -x G4INCLDATA="/usr/share/geant4/data/G4INCL1.0" declare -x G4LEDATA="/usr/share/geant4/data/G4EMLOW7.9.1" declare -x G4LEVELGAMMADATA="/usr/share/geant4/data/PhotonEvaporation5.5" declare -x G4NEUTRONHPDATA="/usr/share/geant4/data/G4NDL4.6" declare -x G4PARTICLEXSDATA="/usr/share/geant4/data/G4PARTICLEXS2.1" declare -x G4PIIDATA="/usr/share/geant4/data/G4PII1.3" declare -x G4PROTONHPDATA="/usr/share/geant4/data/G4TENDL1.3.2" declare -x G4RADIOACTIVEDATA="/usr/share/geant4/data/RadioactiveDecay5.4" declare -x G4REALSURFACEDATA="/usr/share/geant4/data/RealSurface2.1.1" declare -x G4SAIDXSDATA="/usr/share/geant4/data/G4SAIDDATA2.0" declare -x GCC_COLORS="" declare -x GCC_SPECS="" declare -x GO19CONCURRENTCOMPILATION="0" declare -x GOMAXPROCS="1" declare -x GPSD_PROTOCOLS="" declare -x GREP_COLORS="never" declare -x GRUB_PLATFORMS="" declare -x GSETTINGS_BACKEND="gconf" declare HOMEPAGE="https://www.percona.com/software/mysql-database/percona-server" declare -x INHERITED=" toolchain-funcs multilib multiprocessing ninja-utils eutils flag-o-matic xdg-utils cmake-utils linux-info prefix check-reqs" declare -x INPUT_DEVICES="" declare -x INSOPTIONS="-m0644" declare IUSE="cjk cracklib debug jemalloc latin1 libressl numa pam +perl profiling rocksdb router selinux +server tcmalloc test tokudb tokudb-backup-plugin kernel_linux" declare -x IUSE_EFFECTIVE="abi_x86_64 alpha amd64 amd64-fbsd amd64-linux arm arm64 cjk cracklib debug elibc_AIX elibc_Cygwin elibc_Darwin elibc_DragonFly elibc_FreeBSD elibc_HPUX elibc_Interix elibc_NetBSD elibc_OpenBSD elibc_SunOS elibc_Winnt elibc_bionic elibc_glibc elibc_mingw elibc_mintlib elibc_musl elibc_uclibc hppa ia64 jemalloc kernel_AIX kernel_Darwin kernel_FreeBSD kernel_HPUX kernel_NetBSD kernel_OpenBSD kernel_SunOS kernel_Winnt kernel_freemint kernel_linux latin1 libressl m68k m68k-mint mips numa pam perl ppc ppc-aix ppc-macos ppc64 ppc64-linux prefix prefix-guest prefix-stack profiling riscv rocksdb router s390 selinux server sh sparc sparc-solaris sparc64-solaris tcmalloc test tokudb tokudb-backup-plugin userland_BSD userland_GNU x64-cygwin x64-macos x64-solaris x64-winnt x86 x86-cygwin x86-fbsd x86-linux x86-macos x86-solaris x86-winnt" declare -x IUSE_IMPLICIT="abi_x86_64 prefix prefix-guest prefix-stack" declare -x KERNEL="linux" declare -x KERNEL_ABI="amd64" declare -- KERNEL_DIR="/usr/src/linux" declare -x KEYWORDS="~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux ~x64-macos ~x86-macos ~x64-solaris ~x86-solaris" declare -x L10N="" declare -x LADSPA_PATH="/usr/lib/ladspa" declare -x LANG="C.utf8" declare -x LCD_DEVICES="" declare -x LC_COLLATE="C" declare -x LC_MESSAGES="C" declare -x LDFLAGS="-Wl,-O1 -Wl,--as-needed" declare -x LDFLAGS_amd64="-m elf_x86_64" declare -x LDFLAGS_default declare -x LDFLAGS_x32="-m elf32_x86_64" declare -x LDFLAGS_x86="-m elf_i386" declare -x LIBDIR_amd64="lib" declare -x LIBDIR_default="lib" declare -x LIBDIR_x32="libx32" declare -x LIBDIR_x86="lib32" declare -x LIBOPTIONS="-m0644" declare -x LIBREOFFICE_EXTENSIONS="" declare -x LICENSE="GPL-2" declare -x LIRC_DEVICES="" declare -x LLVM_TARGETS="" declare -x MAKEOPTS="-j1" declare -x MANPAGER="manpager" declare -- MIMEINFO_DATABASE_DIR="/usr/share/mime" declare -x MONKEYD_PLUGINS="" declare -x MULTILIB_ABIS="amd64" declare -x MULTILIB_STRICT_DENY="64-bit.*shared object" declare -x MULTILIB_STRICT_DIRS="/lib32 /lib /usr/lib32 /usr/lib /usr/kde/*/lib32 /usr/kde/*/lib /usr/qt/*/lib32 /usr/qt/*/lib /usr/X11R6/lib32 /usr/X11R6/lib" declare -x MULTILIB_STRICT_EXEMPT="(perl5|gcc|gcc-lib|binutils|eclipse-3|debug|portage|udev|systemd|clang|python-exec|llvm)" declare -- MY_BOOST_VERSION="1.70.0" declare -- MY_EXTRAS_VER="20200317-0103Z" declare -- MY_MAJOR_PV="8.0" declare -- MY_P="percona-server-8.0.18-9" declare -- MY_PATCH_DIR="/var/tmp/portage/dev-db/percona-server-8.0.18.9/work/mysql-extras-20200317-0103Z" declare -- MY_PN="Percona-Server" declare -- MY_PV="8.0.18-9" declare -- MY_RELEASE_NOTES_URI="https://www.percona.com/doc/percona-server/8.0/" declare -x NGINX_MODULES_HTTP="" declare -x NGINX_MODULES_MAIL="" declare -x NGINX_MODULES_STREAM="" declare -x NINJAFLAGS="-j1" declare -x OCAML_COLOR="never" declare -x OFED_DRIVERS="" declare -x OFFICE_IMPLEMENTATION="" declare -x OMP_DYNAMIC="FALSE" declare -x OMP_NESTED="FALSE" declare -x OMP_NUM_THREADS="1" declare -x OPENMPI_FABRICS="" declare -x OPENMPI_OFED_FEATURES="" declare -x OPENMPI_RM="" declare -a PATCHES=([0]="/var/tmp/portage/dev-db/percona-server-8.0.18.9/work/mysql-extras-20200317-0103Z/20001_all_fix-minimal-build-cmake-mysql-8.0.17.patch" [1]="/var/tmp/portage/dev-db/percona-server-8.0.18.9/work/mysql-extras-20200317-0103Z/20007_all_cmake-debug-werror-8.0.18.patch" [2]="/var/tmp/portage/dev-db/percona-server-8.0.18.9/work/mysql-extras-20200317-0103Z/20018_all_mysql-5.7.23-fix-grant_user_lock-a-root.patch" [3]="/var/tmp/portage/dev-db/percona-server-8.0.18.9/work/mysql-extras-20200317-0103Z/20018_all_percona-server-8.0.18-without-clientlibs-tools.patch" [4]="/var/tmp/portage/dev-db/percona-server-8.0.18.9/work/mysql-extras-20200317-0103Z/20018_all_mysql-8.0.17-add-protobuf-3.8+-support.patch" [5]="/var/tmp/portage/dev-db/percona-server-8.0.18.9/work/mysql-extras-20200317-0103Z/20018_all_percona-server-8.0.18-fix-libressl-support.patch" [6]="/var/tmp/portage/dev-db/percona-server-8.0.18.9/work/mysql-extras-20200317-0103Z/20018_all_percona-server-8.0.16-dont-install-tokudb-misc-files.patch" [7]="/var/tmp/portage/dev-db/percona-server-8.0.18.9/work/mysql-extras-20200317-0103Z/20038_all_percona-server-8.0.16-PS-5873.patch" [8]="/var/tmp/portage/dev-db/percona-server-8.0.18.9/work/mysql-extras-20200317-0103Z/20018_all_mysql-8.0.19-fix-events_bugs-test.patch" [9]="/var/tmp/portage/dev-db/percona-server-8.0.18.9/work/mysql-extras-20200317-0103Z/20018_all_percona-server-8.0.18-fix-building-with-make-4.3.patch") declare -x PATH="/usr/lib/portage/python3.6/ebuild-helpers/xattr:/usr/lib/portage/python3.6/ebuild-helpers:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/lib/llvm/10/bin:/usr/lib/llvm/9/bin:/usr/lib/llvm/8/bin:/usr/lib/llvm/7/bin" declare -x PAX_MARKINGS="none" declare PDEPEND="perl? ( >=dev-perl/DBD-mysql-2.9004 ) " declare -x PGPLOT_FONT="/usr/lib/pgplot/grfont.dat" declare -x PHP_TARGETS="" declare -x PKG_CONFIG_PATH="/usr/lib/pkgconfig" declare -x PORTAGE_COMPRESSION_COMMAND="bzip2" declare -a PORTAGE_DOCOMPRESS=([0]="/usr/share/doc" [1]="/usr/share/info" [2]="/usr/share/man") declare -x PORTAGE_DOCOMPRESS_SIZE_LIMIT="128" declare -a PORTAGE_DOCOMPRESS_SKIP=([0]="/usr/share/doc/percona-server-8.0.18.9/html") declare -a PORTAGE_DOSTRIP=([0]="/") declare -a PORTAGE_DOSTRIP_SKIP=() declare -x PORTAGE_LIBC="musl" declare -x PORT_LOGDIR="/var/log/portage" declare -x POSTGRES_TARGETS="" declare -x PROFILE_ONLY_VARIABLES="ARCH ELIBC IUSE_IMPLICIT KERNEL USERLAND USE_EXPAND_IMPLICIT USE_EXPAND_UNPREFIXED USE_EXPAND_VALUES_ARCH USE_EXPAND_VALUES_ELIBC USE_EXPAND_VALUES_KERNEL USE_EXPAND_VALUES_USERLAND" declare -x PROPERTIES="" declare -x PYTHONDOCS_3_8="/usr/share/doc/python-docs-3.8.1/html/library" declare -x PYTHONDONTWRITEBYTECODE="1" declare -x PYTHON_SINGLE_TARGET="" declare -x PYTHON_TARGETS="" declare -x QEMU_SOFTMMU_TARGETS="" declare -x QEMU_USER_TARGETS="" declare RDEPEND=" >=app-arch/lz4-0_p131:= sys-libs/ncurses:0= >=sys-libs/zlib-1.2.3:0= libressl? ( dev-libs/libressl:0= ) !libressl? ( >=dev-libs/openssl-1.0.0:0= ) server? ( dev-libs/icu:= dev-libs/libevent:= >=dev-libs/protobuf-3.8:= net-libs/libtirpc:= net-misc/curl:= cjk? ( app-text/mecab:= ) jemalloc? ( dev-libs/jemalloc:0= ) kernel_linux? ( dev-libs/libaio:0= sys-process/procps:0= ) numa? ( sys-process/numactl ) pam? ( sys-libs/pam:0= ) tcmalloc? ( dev-util/google-perftools:0= ) ) !dev-db/mariadb !dev-db/mariadb-galera !dev-db/mysql !dev-db/mysql-cluster selinux? ( sec-policy/selinux-mysql ) !prefix? ( acct-group/mysql acct-user/mysql dev-db/mysql-init-scripts ) " declare REPOSITORY declare REQUIRED_USE="?? ( tcmalloc jemalloc ) cjk? ( server ) jemalloc? ( server ) numa? ( server ) profiling? ( server ) router? ( server ) tcmalloc? ( server ) " declare -x 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 ROS_MESSAGES="" declare -x ROS_PACKAGE_PATH="/usr/share/ros_packages" declare -x ROS_ROOT="/usr/share/ros" declare -x RUBY_TARGETS="" declare -x RUSTFLAGS="-C codegen-units=1 -C target-feature=-crt-static" declare -x RUST_TEST_TASKS="1" declare -x RUST_TEST_THREADS="1" declare -x S="/var/tmp/portage/dev-db/percona-server-8.0.18.9/work/mysql" declare -x SANDBOX_DEBUG="0" declare -x SANDBOX_DENY="" declare -x SANDBOX_PREDICT="/var/tmp/portage/dev-db/percona-server-8.0.18.9/homedir:/dev/crypto:/var/cache/man:/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/cf:/usr/tmp/conftest:/var/tmp/:/var/tmp/portage:/var/tmp/portage/dev-db/percona-server-8.0.18.9/homedir/.bash_history" declare -x SANE_BACKENDS="" declare -x SGML_CATALOG_FILES="/etc/sgml/xml-docbook-4.3.cat:/etc/sgml/xml-docbook-4.4.cat:/etc/sgml/xml-docbook-4.1.2.cat:/etc/sgml/sgml-ent.cat:/etc/sgml/xml-docbook-4.5.cat:/etc/sgml/sgml-docbook.cat:/etc/sgml/sgml-docbook-3.1.cat:/etc/sgml/sgml-docbook-3.0.cat:/etc/sgml/dsssl-docbook-stylesheets.cat:/etc/sgml/openjade-1.3.2.cat:/etc/sgml/sgml-lite.cat:/etc/sgml/html401.cat:/etc/sgml/xml-docbook-4.2.cat:/etc/sgml/sgml-docbook-4.4.cat:/etc/sgml/sgml-docbook-4.2.cat:/etc/sgml/sgml-docbook-4.0.cat:/etc/sgml/sgml-docbook-4.1.cat:/etc/sgml/xml-simple-docbook-1.0.cat:/etc/sgml/xml-simple-docbook-4.1.2.4.cat:/etc/sgml/xhtml1.cat" declare -x SHELL="/bin/bash" declare -x SLOT="0" declare SRC_URI="https://www.percona.com/downloads/Percona-Server-8.0/Percona-Server-8.0.18-9/source/tarball/percona-server-8.0.18-9.tar.gz https://dl.bintray.com/boostorg/release/1.70.0/source/boost_1_70_0.tar.bz2 mirror://gentoo/mysql-extras-20200317-0103Z.tar.bz2 https://gitweb.gentoo.org/proj/mysql-extras.git/snapshot/mysql-extras-20200317-0103Z.tar.bz2" declare -x SVDIR="/etc/service/" declare -x SYMLINK_LIB="no" declare -x TERMINFO="/etc/terminfo" declare -x TMAKEPATH="/usr/lib/tmake/linux-g++" declare -x TWISTED_DISABLE_WRITING_OF_PLUGIN_CACHE="1" declare -x UNCACHED_ERR_FD="" declare -x USE="abi_x86_64 amd64 elibc_musl kernel_linux pam perl server userland_GNU" declare -x USERLAND="GNU" declare -x USE_EXPAND_IMPLICIT="ARCH ELIBC KERNEL USERLAND" declare -x USE_EXPAND_UNPREFIXED="ARCH" declare -x USE_EXPAND_VALUES_ARCH="alpha amd64 amd64-fbsd amd64-linux arm arm64 hppa ia64 m68k m68k-mint mips ppc ppc64 ppc64-linux ppc-aix ppc-macos riscv s390 sh sparc sparc64-solaris sparc-solaris x64-cygwin x64-macos x64-solaris x64-winnt x86 x86-cygwin x86-fbsd x86-linux x86-macos x86-solaris x86-winnt" declare -x USE_EXPAND_VALUES_ELIBC="AIX bionic Cygwin Darwin DragonFly FreeBSD glibc HPUX Interix mingw mintlib musl NetBSD OpenBSD SunOS uclibc Winnt" declare -x USE_EXPAND_VALUES_KERNEL="AIX Darwin FreeBSD freemint HPUX linux NetBSD OpenBSD SunOS Winnt" declare -x USE_EXPAND_VALUES_USERLAND="BSD GNU" declare -x UWSGI_PLUGINS="" declare -x VIDEO_CARDS="" declare -x VOICEMAIL_STORAGE="" declare -x WCDHOME="/root/.wcd" declare -x XDG_CACHE_HOME="/var/tmp/portage/dev-db/percona-server-8.0.18.9/homedir/.cache" declare -x XDG_CONFIG_HOME="/var/tmp/portage/dev-db/percona-server-8.0.18.9/homedir/.config" declare -x XDG_DATA_HOME="/var/tmp/portage/dev-db/percona-server-8.0.18.9/homedir/.local/share" declare -x XDG_RUNTIME_DIR="/var/tmp/portage/dev-db/percona-server-8.0.18.9/temp/run" declare -x XFCE_PLUGINS="" declare -x XTABLES_ADDONS="" declare -- _CHECK_REQS_ECLASS_="1" declare -- _CMAKE_UTILS_ECLASS="1" declare -- _CMAKE_UTILS_SRC_PREPARE_HAS_RUN="1" declare -- _EUTILS_ECLASS="1" declare -x _E_DESTTREE_="/usr" declare -x _E_DOCDESTTREE_="" declare -x _E_EXEDESTTREE_="" declare -x _E_INSDESTTREE_="" declare -- _FLAG_O_MATIC_ECLASS="1" declare -- _LINUX_CONFIG_EXISTS_DONE="" declare -- _MULTILIB_ECLASS="1" declare -- _MULTIPROCESSING_ECLASS="1" declare -- _NINJA_UTILS_ECLASS="1" declare -- _TOOLCHAIN_FUNCS_ECLASS="1" declare -- get_version_warning_done="" declare -a mycmakeargs=([0]="-DCMAKE_C_FLAGS_RELWITHDEBINFO=-DNDEBUG" [1]="-DCMAKE_CXX_FLAGS_RELWITHDEBINFO=-DNDEBUG" [2]="-DMYSQL_DATADIR=/var/lib/mysql" [3]="-DSYSCONFDIR=/etc/mysql" [4]="-DINSTALL_BINDIR=bin" [5]="-DINSTALL_DOCDIR=share/doc/percona-server-8.0.18.9" [6]="-DINSTALL_DOCREADMEDIR=share/doc/percona-server-8.0.18.9" [7]="-DINSTALL_INCLUDEDIR=include/mysql" [8]="-DINSTALL_INFODIR=share/info" [9]="-DINSTALL_LIBDIR=lib" [10]="-DINSTALL_MANDIR=share/man" [11]="-DINSTALL_MYSQLSHAREDIR=share/mysql" [12]="-DINSTALL_PLUGINDIR=lib/mysql/plugin" [13]="-DINSTALL_MYSQLDATADIR=/var/lib/mysql" [14]="-DINSTALL_SBINDIR=sbin" [15]="-DINSTALL_SUPPORTFILESDIR=/usr/share/mysql" [16]="-DCOMPILATION_COMMENT=Gentoo Linux percona-server-8.0.18.9" [17]="-DWITH_UNIT_TESTS=OFF" [18]="-DWITH_EDITLINE=bundled" [19]="-DWITH_ZLIB=system" [20]="-DWITH_SSL=system" [21]="-DWITH_LIBWRAP=0" [22]="-DENABLED_LOCAL_INFILE=1" [23]="-DMYSQL_UNIX_ADDR=/var/run/mysqld/mysqld.sock" [24]="-DWITH_DEFAULT_COMPILER_OPTIONS=0" [25]="-DWITH_DEFAULT_FEATURE_SET=0" [26]="-DSTACK_DIRECTION=-1" [27]="-DCMAKE_POSITION_INDEPENDENT_CODE=ON" [28]="-DWITH_CURL=system" [29]="-DWITH_BOOST=/var/tmp/portage/dev-db/percona-server-8.0.18.9/work/boost_1_70_0" [30]="-DWITH_ROUTER=OFF" [31]="-DINSTALL_MYSQLTESTDIR=" [32]="-DWITHOUT_CLIENTLIBS=YES" [33]="-DWITH_ICU=system" [34]="-DWITH_LZ4=system" [35]="-DWITH_RAPIDJSON=bundled" [36]="-DDEFAULT_CHARSET=utf8mb4" [37]="-DDEFAULT_COLLATION=utf8mb4_0900_ai_ci" [38]="-DWITH_EXTRA_CHARSETS=all" [39]="-DWITH_DEBUG=no" [40]="-DWITH_LIBEVENT=system" [41]="-DWITH_MECAB=OFF" [42]="-DWITH_NUMA=OFF" [43]="-DWITH_PAM=yes" [44]="-DWITH_PROTOBUF=system" [45]="-DWITH_EXAMPLE_STORAGE_ENGINE=0" [46]="-DWITH_ARCHIVE_STORAGE_ENGINE=1" [47]="-DWITH_BLACKHOLE_STORAGE_ENGINE=1" [48]="-DWITH_CSV_STORAGE_ENGINE=1" [49]="-DWITH_FEDERATED_STORAGE_ENGINE=1" [50]="-DWITH_HEAP_STORAGE_ENGINE=1" [51]="-DWITH_INNOBASE_STORAGE_ENGINE=1" [52]="-DWITH_INNODB_MEMCACHED=0" [53]="-DWITH_MYISAMMRG_STORAGE_ENGINE=1" [54]="-DWITH_MYISAM_STORAGE_ENGINE=1" [55]="-DWITH_ROCKSDB=0" [56]="-DWITH_TOKUDB=0") declare -a myconf=([0]="-DWITH_LTO=OFF") __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 } _clang_fullversion () { local ver="$1"; shift; set -- $($(tc-getCPP "$@") -E -P - <<<"__clang_major__ __clang_minor__ __clang_patchlevel__"); eval echo "$ver" } _cmake_check_build_dir () { : ${CMAKE_USE_DIR:=${S}}; if [[ -n ${CMAKE_IN_SOURCE_BUILD} ]]; then BUILD_DIR="${CMAKE_USE_DIR}"; else if [[ ! -n ${BUILD_DIR} && -n ${CMAKE_BUILD_DIR} ]]; then if [[ ${EAPI} != [56] ]]; then eerror "The CMAKE_BUILD_DIR variable has been renamed to BUILD_DIR."; die "The ebuild must be migrated to BUILD_DIR."; else eqawarn "The CMAKE_BUILD_DIR variable has been renamed to BUILD_DIR."; eqawarn "Please migrate the ebuild to use the new one."; fi; _RESPECT_CMAKE_BUILD_DIR=1; fi; if [[ -n ${_RESPECT_CMAKE_BUILD_DIR} ]]; then BUILD_DIR=${CMAKE_BUILD_DIR:-${WORKDIR}/${P}_build}; else : ${BUILD_DIR:=${WORKDIR}/${P}_build}; fi; fi; [[ ${EAPI} == [56] ]] && CMAKE_BUILD_DIR=${BUILD_DIR}; mkdir -p "${BUILD_DIR}" || die; echo ">>> Working in BUILD_DIR: \"$BUILD_DIR\"" } _cmake_cleanup_cmake () { : ${CMAKE_USE_DIR:=${S}}; if [[ "${CMAKE_REMOVE_MODULES}" == "yes" ]]; then local name; for name in ${CMAKE_REMOVE_MODULES_LIST}; do find "${S}" -name ${name}.cmake -exec rm -v {} + || die; done; fi; if [[ ! -e ${CMAKE_USE_DIR}/CMakeLists.txt ]]; then eerror "Unable to locate CMakeLists.txt under:"; eerror "\"${CMAKE_USE_DIR}/CMakeLists.txt\""; eerror "Consider not inheriting the cmake eclass."; die "FATAL: Unable to find CMakeLists.txt"; fi; _cmake_modify-cmakelists } _cmake_emake_src_make () { debug-print-function ${FUNCNAME} "$@"; [[ -e Makefile ]] || die "Makefile not found. Error during configure stage."; if [[ "${CMAKE_VERBOSE}" != "OFF" ]]; then emake VERBOSE=1 "$@" || die; else emake "$@" || die; fi } _cmake_generator_to_use () { local generator_name; case ${CMAKE_MAKEFILE_GENERATOR} in ninja) case ${EAPI} in 5 | 6) if ! ROOT=/ has_version dev-util/ninja; then die "CMAKE_MAKEFILE_GENERATOR is set to ninja, but ninja is not installed. Please install dev-util/ninja or unset CMAKE_MAKEFILE_GENERATOR."; fi ;; *) if ! has_version -b dev-util/ninja; then die "CMAKE_MAKEFILE_GENERATOR is set to ninja, but ninja is not installed. Please install dev-util/ninja or unset CMAKE_MAKEFILE_GENERATOR."; fi ;; esac; generator_name="Ninja" ;; emake) generator_name="Unix Makefiles" ;; *) eerror "Unknown value for \${CMAKE_MAKEFILE_GENERATOR}"; die "Value ${CMAKE_MAKEFILE_GENERATOR} is not supported" ;; esac; echo ${generator_name} } _cmake_modify-cmakelists () { debug-print-function ${FUNCNAME} "$@"; grep -qs "<<< Gentoo configuration >>>" "${CMAKE_USE_DIR}"/CMakeLists.txt && return 0; find "${CMAKE_USE_DIR}" -name CMakeLists.txt -exec sed -e '/^[[:space:]]*set[[:space:]]*([[:space:]]*CMAKE_BUILD_TYPE\([[:space:]].*)\|)\)/I{s/^/#_cmake_modify_IGNORE /g}' -e '/^[[:space:]]*set[[:space:]]*([[:space:]]*CMAKE_COLOR_MAKEFILE[[:space:]].*)/I{s/^/#_cmake_modify_IGNORE /g}' -e '/^[[:space:]]*set[[:space:]]*([[:space:]]*CMAKE_INSTALL_PREFIX[[:space:]].*)/I{s/^/#_cmake_modify_IGNORE /g}' -e '/^[[:space:]]*set[[:space:]]*([[:space:]]*CMAKE_VERBOSE_MAKEFILE[[:space:]].*)/I{s/^/#_cmake_modify_IGNORE /g}' -i {} + || die "${LINENO}: failed to disable hardcoded settings"; local x; for x in $(find "${CMAKE_USE_DIR}" -name CMakeLists.txt -exec grep -l "^#_cmake_modify_IGNORE" {} +;); do einfo "Hardcoded definition(s) removed in $(echo "${x}" | cut -c $((${#CMAKE_USE_DIR}+2))-):"; einfo "$(grep -se '^#_cmake_modify_IGNORE' ${x} | cut -c 22-99)"; done; cat >> "${CMAKE_USE_DIR}"/CMakeLists.txt <<-_EOF_ || MESSAGE(STATUS "<<< Gentoo configuration >>> Build type \${CMAKE_BUILD_TYPE} Install path \${CMAKE_INSTALL_PREFIX} Compiler flags: C \${CMAKE_C_FLAGS} C++ \${CMAKE_CXX_FLAGS} Linker flags: Executable \${CMAKE_EXE_LINKER_FLAGS} Module \${CMAKE_MODULE_LINKER_FLAGS} Shared \${CMAKE_SHARED_LINKER_FLAGS}\n") _EOF_ die } _cmake_ninja_src_make () { debug-print-function ${FUNCNAME} "$@"; [[ -e build.ninja ]] || die "build.ninja not found. Error during configure stage."; eninja "$@" } _cmake_use_me_now () { debug-print-function ${FUNCNAME} "$@"; local arg=$2; [[ ! -z $3 ]] && arg=$3; [[ ${EAPI} == 5 ]] || die "${FUNCNAME[1]} is banned in EAPI 6 and later: use -D$1=\"\$(usex $2)\" instead"; local uper capitalised x; [[ -z $2 ]] && die "cmake-utils_use-$1 []"; if [[ ! -z $3 ]]; then echo "-D$1$3=$(use $2 && echo ON || echo OFF)"; else uper=$(echo ${2} | tr '[:lower:]' '[:upper:]'); capitalised=$(echo ${2} | sed 's/\<\(.\)\([^ ]*\)/\u\1\L\2/g'); for x in $2 $uper $capitalised; do echo "-D$1$x=$(use $2 && echo ON || echo OFF) "; done; fi } _cmake_use_me_now_inverted () { debug-print-function ${FUNCNAME} "$@"; local arg=$2; [[ ! -z $3 ]] && arg=$3; if [[ ${EAPI} != 5 && "${FUNCNAME[1]}" != cmake-utils_use_find_package ]]; then die "${FUNCNAME[1]} is banned in EAPI 6 and later: use -D$1=\"\$(usex $2)\" instead"; fi; local uper capitalised x; [[ -z $2 ]] && die "cmake-utils_use-$1 []"; if [[ ! -z $3 ]]; then echo "-D$1$3=$(use $2 && echo OFF || echo ON)"; else uper=$(echo ${2} | tr '[:lower:]' '[:upper:]'); capitalised=$(echo ${2} | sed 's/\<\(.\)\([^ ]*\)/\u\1\L\2/g'); for x in $2 $uper $capitalised; do echo "-D$1$x=$(use $2 && echo OFF || echo ON) "; done; fi } _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 } _filter-hardened () { local f; for f in "$@"; do case "${f}" in -fPIC | -fpic | -fPIE | -fpie | -Wl,pie | -pie) gcc-specs-pie || continue; if ! is-flagq -nopie && ! is-flagq -no-pie; then if test-flags -nopie > /dev/null; then append-flags -nopie; else append-flags -no-pie; fi; fi ;; -fstack-protector) gcc-specs-ssp || continue; is-flagq -fno-stack-protector || append-flags $(test-flags -fno-stack-protector) ;; -fstack-protector-all) gcc-specs-ssp-to-all || continue; is-flagq -fno-stack-protector-all || append-flags $(test-flags -fno-stack-protector-all) ;; -fno-strict-overflow) gcc-specs-nostrict || continue; is-flagq -fstrict-overflow || append-flags $(test-flags -fstrict-overflow) ;; esac; done } _filter-var () { local f x var=$1 new=(); shift; for f in ${!var}; do for x in "$@"; do [[ ${f} == ${x} ]] && continue 2; done; new+=("${f}"); done; export ${var}="${new[*]}" } _gcc-install-dir () { echo "$(LC_ALL=C $(tc-getCC) -print-search-dirs 2> /dev/null | awk '$1=="install:" {print $2}')" } _gcc-specs-directive_raw () { local cc=$(tc-getCC); local specfiles=$(LC_ALL=C ${cc} -v 2>&1 | awk '$1=="Reading" {print $NF}'); ${cc} -dumpspecs 2> /dev/null | cat - ${specfiles} | awk -v directive=$1 'BEGIN { pspec=""; spec=""; outside=1 } $1=="*"directive":" { pspec=spec; spec=""; outside=0; next } outside || NF==0 || ( substr($1,1,1)=="*" && substr($1,length($1),1)==":" ) { outside=1; next } spec=="" && substr($0,1,1)=="+" { spec=pspec " " substr($0,2); next } { spec=spec $0 } END { print spec }'; return 0 } _gcc-specs-exists () { [[ -f $(_gcc-install-dir)/$1 ]] } _gcc_fullversion () { local ver="$1"; shift; set -- $($(tc-getCPP "$@") -E -P - <<<"__GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__"); eval echo "$ver" } _is_flagq () { local x var="$1[*]"; for x in ${!var}; do [[ ${x} == $2 ]] && return 0; done; return 1 } _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}" } all-flag-vars () { echo {ADA,C,CPP,CXX,CCAS,F,FC,LD}FLAGS } append-cflags () { [[ $# -eq 0 ]] && return 0; export CFLAGS+=" $*"; return 0 } append-cppflags () { [[ $# -eq 0 ]] && return 0; export CPPFLAGS+=" $*"; return 0 } append-cxxflags () { [[ $# -eq 0 ]] && return 0; export CXXFLAGS+=" $*"; return 0 } append-fflags () { [[ $# -eq 0 ]] && return 0; export FFLAGS+=" $*"; export FCFLAGS+=" $*"; return 0 } append-flags () { [[ $# -eq 0 ]] && return 0; case " $* " in *' '-[DIU]*) eqawarn 'please use append-cppflags for preprocessor flags' ;; *' '-L* | *' '-Wl,*) eqawarn 'please use append-ldflags for linker flags' ;; esac; append-cflags "$@"; append-cxxflags "$@"; append-fflags "$@"; return 0 } append-ldflags () { [[ $# -eq 0 ]] && return 0; local flag; for flag in "$@"; do [[ ${flag} == -l* ]] && eqawarn "Appending a library link instruction (${flag}); libraries to link to should not be passed through LDFLAGS"; done; export LDFLAGS="${LDFLAGS} $*"; return 0 } append-lfs-flags () { [[ $# -ne 0 ]] && die "append-lfs-flags takes no arguments"; append-cppflags -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE } append-libs () { [[ $# -eq 0 ]] && return 0; local flag; for flag in "$@"; do if [[ -z "${flag// }" ]]; then eqawarn "Appending an empty argument to LIBS is invalid! Skipping."; continue; fi; case $flag in -[lL]*) export LIBS="${LIBS} ${flag}" ;; -*) eqawarn "Appending non-library to LIBS (${flag}); Other linker flags should be passed via LDFLAGS"; export LIBS="${LIBS} ${flag}" ;; *) export LIBS="${LIBS} -l${flag}" ;; esac; done; return 0 } check-reqs_disk () { debug-print-function ${FUNCNAME} "$@"; [[ -z ${2} ]] && die "Usage: ${FUNCNAME} [path] [size]"; local path=${1}; local size=${2}; local space_kbi; check-reqs_start_phase ${size} "disk space at \"${path}\""; space_kbi=$(df -Pk "${1}" 2>/dev/null | awk 'FNR == 2 {print $4}'); if [[ $? == 0 && -n ${space_kbi} ]]; then if [[ ${space_kbi} -lt $(check-reqs_get_kibibytes ${size}) ]]; then eend 1; check-reqs_unsatisfied ${size} "disk space at \"${path}\""; else eend 0; fi; else eend 1; ewarn "Couldn't determine disk space, skipping..."; fi } check-reqs_get_kibibytes () { debug-print-function ${FUNCNAME} "$@"; [[ -z ${1} ]] && die "Usage: ${FUNCNAME} [size]"; local unit=${1:(-1)}; local size=${1%[GMT]}; case ${unit} in M) echo $((1024 * size)) ;; G) echo $((1024 * 1024 * size)) ;; T) echo $((1024 * 1024 * 1024 * size)) ;; *) die "${FUNCNAME}: Unknown unit: ${unit}" ;; esac } check-reqs_get_number () { debug-print-function ${FUNCNAME} "$@"; [[ -z ${1} ]] && die "Usage: ${FUNCNAME} [size]"; local size=${1%[GMT]}; [[ ${size} == ${1} ]] && die "${FUNCNAME}: Missing unit: ${1}"; echo ${size} } check-reqs_get_unit () { debug-print-function ${FUNCNAME} "$@"; [[ -z ${1} ]] && die "Usage: ${FUNCNAME} [size]"; local unit=${1:(-1)}; case ${unit} in M) echo "MiB" ;; G) echo "GiB" ;; T) echo "TiB" ;; *) die "${FUNCNAME}: Unknown unit: ${unit}" ;; esac } check-reqs_memory () { debug-print-function ${FUNCNAME} "$@"; [[ -z ${1} ]] && die "Usage: ${FUNCNAME} [size]"; local size=${1}; local actual_memory; local actual_swap; check-reqs_start_phase ${size} "RAM"; if [[ -r /proc/meminfo ]]; then actual_memory=$(awk '/MemTotal/ { print $2 }' /proc/meminfo); actual_swap=$(awk '/SwapTotal/ { print $2 }' /proc/meminfo); else actual_memory=$(sysctl hw.physmem 2>/dev/null); [[ $? -eq 0 ]] && actual_memory=$(echo "${actual_memory}" | sed -e 's/^[^:=]*[:=][[:space:]]*//'); actual_swap=$(sysctl vm.swap_total 2>/dev/null); [[ $? -eq 0 ]] && actual_swap=$(echo "${actual_swap}" | sed -e 's/^[^:=]*[:=][[:space:]]*//'); fi; if [[ -n ${actual_memory} ]]; then if [[ ${actual_memory} -ge $(check-reqs_get_kibibytes ${size}) ]]; then eend 0; else if [[ -n ${actual_swap} && $((${actual_memory} + ${actual_swap})) -ge $(check-reqs_get_kibibytes ${size}) ]]; then ewarn "Amount of main memory is insufficient, but amount"; ewarn "of main memory combined with swap is sufficient."; ewarn "Build process may make computer very slow!"; eend 0; else eend 1; check-reqs_unsatisfied ${size} "RAM"; fi; fi; else eend 1; ewarn "Couldn't determine amount of memory, skipping..."; fi } check-reqs_output () { debug-print-function ${FUNCNAME} "$@"; local msg="ewarn"; [[ ${EBUILD_PHASE} == "pretend" && -z ${I_KNOW_WHAT_I_AM_DOING} ]] && msg="eerror"; if [[ -n ${CHECKREQS_FAILED} ]]; then ${msg}; ${msg} "Space constraints set in the ebuild were not met!"; ${msg} "The build will most probably fail, you should enhance the space"; ${msg} "as per failed tests."; ${msg}; [[ ${EBUILD_PHASE} == "pretend" && -z ${I_KNOW_WHAT_I_AM_DOING} ]] && die "Build requirements not met!"; fi } check-reqs_pkg_pretend () { debug-print-function ${FUNCNAME} "$@"; check-reqs_pkg_setup "$@" } check-reqs_pkg_setup () { debug-print-function ${FUNCNAME} "$@"; check-reqs_prepare; check-reqs_run; check-reqs_output } check-reqs_prepare () { debug-print-function ${FUNCNAME} "$@"; if [[ -z ${CHECKREQS_MEMORY} && -z ${CHECKREQS_DISK_BUILD} && -z ${CHECKREQS_DISK_USR} && -z ${CHECKREQS_DISK_VAR} ]]; then eerror "Set some check-reqs eclass variables if you want to use it."; eerror "If you are user and see this message file a bug against the package."; die "${FUNCNAME}: check-reqs eclass called but not actually used!"; fi } check-reqs_run () { debug-print-function ${FUNCNAME} "$@"; unset CHECKREQS_FAILED; if [[ ${MERGE_TYPE} != binary ]]; then [[ -n ${CHECKREQS_MEMORY} ]] && check-reqs_memory ${CHECKREQS_MEMORY}; [[ -n ${CHECKREQS_DISK_BUILD} ]] && check-reqs_disk "${T}" "${CHECKREQS_DISK_BUILD}"; fi; if [[ ${MERGE_TYPE} != buildonly ]]; then [[ -n ${CHECKREQS_DISK_USR} ]] && check-reqs_disk "${EROOT%/}/usr" "${CHECKREQS_DISK_USR}"; [[ -n ${CHECKREQS_DISK_VAR} ]] && check-reqs_disk "${EROOT%/}/var" "${CHECKREQS_DISK_VAR}"; fi } check-reqs_start_phase () { debug-print-function ${FUNCNAME} "$@"; [[ -z ${2} ]] && die "Usage: ${FUNCNAME} [size] [location]"; local size=${1}; local location=${2}; local sizeunit="$(check-reqs_get_number ${size}) $(check-reqs_get_unit ${size})"; ebegin "Checking for at least ${sizeunit} ${location}" } check-reqs_unsatisfied () { debug-print-function ${FUNCNAME} "$@"; [[ -z ${2} ]] && die "Usage: ${FUNCNAME} [size] [location]"; local msg="ewarn"; local size=${1}; local location=${2}; local sizeunit="$(check-reqs_get_number ${size}) $(check-reqs_get_unit ${size})"; [[ ${EBUILD_PHASE} == "pretend" && -z ${I_KNOW_WHAT_I_AM_DOING} ]] && msg="eerror"; ${msg} "There is NOT at least ${sizeunit} ${location}"; CHECKREQS_FAILED="true" } check_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 require_configured_kernel; fi; einfo "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} > 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} > 0 ]]; then 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} > 0 ]]; then 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; 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_reqs () { eerror "Package calling old ${FUNCNAME} function."; eerror "It should call check-reqs_pkg_pretend and check-reqs_pkg_setup."; die "${FUNCNAME} is banned" } 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' "$@" } cmake-utils_src_compile () { debug-print-function ${FUNCNAME} "$@"; cmake-utils_src_make "$@" } cmake-utils_src_configure () { debug-print-function ${FUNCNAME} "$@"; if [[ ! -n ${_CMAKE_UTILS_SRC_PREPARE_HAS_RUN} ]]; then if [[ ${EAPI} != [56] ]]; then die "FATAL: cmake-utils_src_prepare has not been run"; else eqawarn "cmake-utils_src_prepare has not been run, please open a bug on https://bugs.gentoo.org/"; fi; fi; [[ ${EAPI} == 5 ]] && _cmake_cleanup_cmake; _cmake_check_build_dir; xdg_environment_reset; if [[ ${CMAKE_BUILD_TYPE} = Gentoo ]]; then if ! has debug ${IUSE//+} || ! use debug; then local CPPFLAGS=${CPPFLAGS}; append-cppflags -DNDEBUG; fi; fi; local build_rules=${BUILD_DIR}/gentoo_rules.cmake; cat > "${build_rules}" <<-_EOF_ || SET (CMAKE_ASM_COMPILE_OBJECT " ${CPPFLAGS} -o -c " CACHE STRING "ASM compile command" FORCE) SET (CMAKE_ASM-ATT_COMPILE_OBJECT " ${CPPFLAGS} -o -c -x assembler " CACHE STRING "ASM-ATT compile command" FORCE) SET (CMAKE_ASM-ATT_LINK_FLAGS "-nostdlib" CACHE STRING "ASM-ATT link flags" FORCE) SET (CMAKE_C_COMPILE_OBJECT " ${CPPFLAGS} -o -c " CACHE STRING "C compile command" FORCE) SET (CMAKE_CXX_COMPILE_OBJECT " ${CPPFLAGS} -o -c " CACHE STRING "C++ compile command" FORCE) SET (CMAKE_Fortran_COMPILE_OBJECT " ${FCFLAGS} -o -c " CACHE STRING "Fortran compile command" FORCE) _EOF_ die local myCC=$(tc-getCC) myCXX=$(tc-getCXX) myFC=$(tc-getFC); local toolchain_file=${BUILD_DIR}/gentoo_toolchain.cmake; cat > ${toolchain_file} <<-_EOF_ || SET (CMAKE_ASM_COMPILER "${myCC/ /;}") SET (CMAKE_ASM-ATT_COMPILER "${myCC/ /;}") SET (CMAKE_C_COMPILER "${myCC/ /;}") SET (CMAKE_CXX_COMPILER "${myCXX/ /;}") SET (CMAKE_Fortran_COMPILER "${myFC/ /;}") SET (CMAKE_AR $(type -P $(tc-getAR)) CACHE FILEPATH "Archive manager" FORCE) SET (CMAKE_RANLIB $(type -P $(tc-getRANLIB)) CACHE FILEPATH "Archive index generator" FORCE) SET (CMAKE_SYSTEM_PROCESSOR "${CHOST%%-*}") _EOF_ die local -x ASMFLAGS=${CFLAGS}; local -x PKG_CONFIG=$(tc-getPKG_CONFIG); if tc-is-cross-compiler; then local sysname; case "${KERNEL:-linux}" in Cygwin) sysname="CYGWIN_NT-5.1" ;; HPUX) sysname="HP-UX" ;; linux) sysname="Linux" ;; Winnt) sysname="Windows"; cat >> "${toolchain_file}" <<-_EOF_ || SET (CMAKE_RC_COMPILER $(tc-getRC)) _EOF_ die ;; *) sysname="${KERNEL}" ;; esac cat >> "${toolchain_file}" <<-_EOF_ || SET (CMAKE_SYSTEM_NAME "${sysname}") _EOF_ die if [ "${SYSROOT:-/}" != "/" ]; then cat >> "${toolchain_file}" <<-_EOF_ || SET (CMAKE_FIND_ROOT_PATH "${SYSROOT}") SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) SET (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) SET (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) _EOF_ die; fi; fi if use prefix-guest; then cat >> "${build_rules}" <<-_EOF_ || # in Prefix we need rpath and must ensure cmake gets our default linker path # right ... except for Darwin hosts IF (NOT APPLE) SET (CMAKE_SKIP_RPATH OFF CACHE BOOL "" FORCE) SET (CMAKE_PLATFORM_REQUIRED_RUNTIME_PATH "${EPREFIX}/usr/${CHOST}/lib/gcc;${EPREFIX}/usr/${CHOST}/lib;${EPREFIX}/usr/$(get_libdir);${EPREFIX}/$(get_libdir)" CACHE STRING "" FORCE) ELSE () SET (CMAKE_PREFIX_PATH "${EPREFIX}/usr" CACHE STRING "" FORCE) SET (CMAKE_MACOSX_RPATH ON CACHE BOOL "" FORCE) SET (CMAKE_SKIP_BUILD_RPATH OFF CACHE BOOL "" FORCE) SET (CMAKE_SKIP_RPATH OFF CACHE BOOL "" FORCE) SET (CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE CACHE BOOL "" FORCE) ENDIF (NOT APPLE) _EOF_ die; fi local common_config=${BUILD_DIR}/gentoo_common_config.cmake; local libdir=$(get_libdir); cat > "${common_config}" <<-_EOF_ || SET (CMAKE_GENTOO_BUILD ON CACHE BOOL "Indicate Gentoo package build") SET (LIB_SUFFIX ${libdir/lib} CACHE STRING "library path suffix" FORCE) SET (CMAKE_INSTALL_LIBDIR ${libdir} CACHE PATH "Output directory for libraries") SET (CMAKE_INSTALL_INFODIR "${EPREFIX}/usr/share/info" CACHE PATH "") SET (CMAKE_INSTALL_MANDIR "${EPREFIX}/usr/share/man" CACHE PATH "") SET (CMAKE_USER_MAKE_RULES_OVERRIDE "${build_rules}" CACHE FILEPATH "Gentoo override rules") _EOF_ die [[ "${NOCOLOR}" = true || "${NOCOLOR}" = yes ]] && echo 'SET (CMAKE_COLOR_MAKEFILE OFF CACHE BOOL "pretty colors during make" FORCE)' >> "${common_config}"; if [[ ${EAPI} != [56] ]]; then cat >> "${common_config}" <<-_EOF_ || SET (CMAKE_INSTALL_DOCDIR "${EPREFIX}/usr/share/doc/${PF}" CACHE PATH "") SET (BUILD_SHARED_LIBS ON CACHE BOOL "") _EOF_ die; fi if [[ ${CMAKE_BUILD_TYPE} != Gentoo && ${EAPI} != 5 ]]; then cat >> ${common_config} <<-_EOF_ || SET (CMAKE_ASM_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "") SET (CMAKE_ASM-ATT_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "") SET (CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "") SET (CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "") SET (CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "") SET (CMAKE_EXE_LINKER_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "") SET (CMAKE_MODULE_LINKER_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "") SET (CMAKE_SHARED_LINKER_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "") SET (CMAKE_STATIC_LINKER_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "") _EOF_ die; fi local mycmakeargstype=$(declare -p mycmakeargs 2>&-); if [[ "${mycmakeargstype}" != "declare -a mycmakeargs="* ]]; then if [[ -n "${mycmakeargstype}" ]]; then if [[ ${EAPI} == 5 ]]; then eqawarn "Declaring mycmakeargs as a variable is deprecated. Please use an array instead."; else die "Declaring mycmakeargs as a variable is banned in EAPI=${EAPI}. Please use an array instead."; fi; fi; local mycmakeargs_local=(${mycmakeargs}); else local mycmakeargs_local=("${mycmakeargs[@]}"); fi; if [[ ${CMAKE_WARN_UNUSED_CLI} == no ]]; then local warn_unused_cli="--no-warn-unused-cli"; else local warn_unused_cli=""; fi; local cmakeargs=(${warn_unused_cli} -C "${common_config}" -G "$(_cmake_generator_to_use)" -DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr" "${mycmakeargs_local[@]}" -DCMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE}" $([[ ${EAPI} == 5 ]] && echo -DCMAKE_INSTALL_DO_STRIP=OFF) -DCMAKE_TOOLCHAIN_FILE="${toolchain_file}" "${MYCMAKEARGS}"); if [[ -n "${CMAKE_EXTRA_CACHE_FILE}" ]]; then cmakeargs+=(-C "${CMAKE_EXTRA_CACHE_FILE}"); fi; pushd "${BUILD_DIR}" > /dev/null || die; debug-print "${LINENO} ${ECLASS} ${FUNCNAME}: mycmakeargs is ${mycmakeargs_local[*]}"; echo "${CMAKE_BINARY}" "${cmakeargs[@]}" "${CMAKE_USE_DIR}"; "${CMAKE_BINARY}" "${cmakeargs[@]}" "${CMAKE_USE_DIR}" || die "cmake failed"; popd > /dev/null || die } cmake-utils_src_install () { debug-print-function ${FUNCNAME} "$@"; _cmake_check_build_dir; pushd "${BUILD_DIR}" > /dev/null || die; DESTDIR="${D}" ${CMAKE_MAKEFILE_GENERATOR} install "$@" || die "died running ${CMAKE_MAKEFILE_GENERATOR} install"; popd > /dev/null || die; pushd "${S}" > /dev/null || die; einstalldocs; popd > /dev/null || die } cmake-utils_src_make () { debug-print-function ${FUNCNAME} "$@"; _cmake_check_build_dir; pushd "${BUILD_DIR}" > /dev/null || die; _cmake_${CMAKE_MAKEFILE_GENERATOR}_src_make "$@"; popd > /dev/null || die } cmake-utils_src_prepare () { debug-print-function ${FUNCNAME} "$@"; pushd "${S}" > /dev/null || die; if [[ ${EAPI} != 5 ]]; then default_src_prepare; _cmake_cleanup_cmake; else debug-print "$FUNCNAME: PATCHES=$PATCHES"; [[ -n ${PATCHES[@]} ]] && epatch "${PATCHES[@]}"; debug-print "$FUNCNAME: applying user patches"; epatch_user; fi; popd > /dev/null || die; if [[ -n ${CMAKE_UTILS_QA_SRC_DIR_READONLY} && ! -n ${CMAKE_IN_SOURCE_BUILD} ]]; then chmod -R a-w "${S}"; fi; _CMAKE_UTILS_SRC_PREPARE_HAS_RUN=1 } cmake-utils_src_test () { debug-print-function ${FUNCNAME} "$@"; _cmake_check_build_dir; pushd "${BUILD_DIR}" > /dev/null || die; [[ -e CTestTestfile.cmake ]] || { echo "No tests found. Skipping."; return 0 }; [[ -n ${TEST_VERBOSE} ]] && myctestargs+=(--extra-verbose --output-on-failure); set -- ctest -j "$(makeopts_jobs)" --test-load "$(makeopts_loadavg)" "${myctestargs[@]}" "$@"; echo "$@" 1>&2; if "$@"; then einfo "Tests succeeded."; popd > /dev/null || die; return 0; else if [[ -n "${CMAKE_YES_I_WANT_TO_SEE_THE_TEST_LOG}" ]]; then eerror "Tests failed. Test log ${BUILD_DIR}/Testing/Temporary/LastTest.log follows:"; eerror "--START TEST LOG--------------------------------------------------------------"; cat "${BUILD_DIR}/Testing/Temporary/LastTest.log"; eerror "--END TEST LOG----------------------------------------------------------------"; die "Tests failed."; else die "Tests failed. When you file a bug, please attach the following file: \n\t${BUILD_DIR}/Testing/Temporary/LastTest.log"; fi; popd > /dev/null || die; return 1; fi } cmake-utils_use () { _cmake_use_me_now "" "$@" } cmake-utils_use_build () { _cmake_use_me_now BUILD_ "$@" } cmake-utils_use_disable () { _cmake_use_me_now_inverted DISABLE_ "$@" } cmake-utils_use_enable () { _cmake_use_me_now ENABLE_ "$@" } cmake-utils_use_find_package () { if [[ ${EAPI} != 5 && "$#" != 2 ]]; then die "Usage: cmake-utils_use_find_package "; fi; _cmake_use_me_now_inverted CMAKE_DISABLE_FIND_PACKAGE_ "$@" } cmake-utils_use_has () { _cmake_use_me_now HAVE_ "$@" } cmake-utils_use_no () { _cmake_use_me_now_inverted NO_ "$@" } cmake-utils_use_use () { _cmake_use_me_now USE_ "$@" } cmake-utils_use_want () { _cmake_use_me_now WANT_ "$@" } cmake-utils_use_with () { _cmake_use_me_now WITH_ "$@" } cmake-utils_useno () { _cmake_use_me_now_inverted "" "$@" } cmake_comment_add_subdirectory () { if [[ -z ${1} ]]; then die "comment_add_subdirectory must be passed at least one directory name to comment"; fi; if [[ -e "CMakeLists.txt" ]]; then local d; for d in $@; do sed -e "/add_subdirectory[[:space:]]*([[:space:]]*${d//\//\\/}[[:space:]]*)/I s/^/#DONOTCOMPILE /" -i CMakeLists.txt || die "failed to comment add_subdirectory(${d})"; done; fi } cmake_use_find_package () { if [[ "$#" != 2 ]]; then die "Usage: cmake_use_find_package "; fi; cmake-utils_use_find_package "$@" } comment_add_subdirectory () { [[ ${EAPI} == 5 ]] || die "comment_add_subdirectory is banned in EAPI 6 and later - use cmake_comment_add_subdirectory instead"; cmake_comment_add_subdirectory "$@" } eapply () { local failed patch_cmd=patch; local -x LC_COLLATE=POSIX; type -P gpatch > /dev/null && patch_cmd=gpatch; function _eapply_patch () { local f=${1}; local prefix=${2}; ebegin "${prefix:-Applying }${f##*/}"; local all_opts=(-p1 -f -g0 --no-backup-if-mismatch "${patch_options[@]}"); if ${patch_cmd} "${all_opts[@]}" --dry-run -s -F0 < "${f}" &> /dev/null; then all_opts+=(-s -F0); fi; ${patch_cmd} "${all_opts[@]}" < "${f}"; failed=${?}; if ! eend "${failed}"; then __helpers_die "patch -p1 ${patch_options[*]} failed with ${f}"; fi }; local patch_options=() files=(); local i found_doublehyphen; for ((i = 1; i <= ${#@}; ++i )) do if [[ ${@:i:1} == -- ]]; then patch_options=("${@:1:i-1}"); files=("${@:i+1}"); found_doublehyphen=1; break; fi; done; if [[ -z ${found_doublehyphen} ]]; then for ((i = 1; i <= ${#@}; ++i )) do if [[ ${@:i:1} != -* ]]; then patch_options=("${@:1:i-1}"); files=("${@:i}"); break; fi; done; for i in "${files[@]}"; do if [[ ${i} == -* ]]; then die "eapply: all options must be passed before non-options"; fi; done; fi; if [[ ${#files[@]} -eq 0 ]]; then die "eapply: no files specified"; fi; local f; for f in "${files[@]}"; do if [[ -d ${f} ]]; then function _eapply_get_files () { local LC_ALL=POSIX; local prev_shopt=$(shopt -p nullglob); shopt -s nullglob; local f; for f in "${1}"/*; do if [[ ${f} == *.diff || ${f} == *.patch ]]; then files+=("${f}"); fi; done; ${prev_shopt} }; local files=(); _eapply_get_files "${f}"; [[ ${#files[@]} -eq 0 ]] && die "No *.{patch,diff} files in directory ${f}"; einfo "Applying patches from ${f} ..."; local f2; for f2 in "${files[@]}"; do _eapply_patch "${f2}" ' '; [[ ${failed} -ne 0 ]] && return "${failed}"; done; else _eapply_patch "${f}"; [[ ${failed} -ne 0 ]] && return "${failed}"; fi; done; return 0 } eapply_user () { [[ ${EBUILD_PHASE} == prepare ]] || die "eapply_user() called during invalid phase: ${EBUILD_PHASE}"; local tagfile=${T}/.portage_user_patches_applied; [[ -f ${tagfile} ]] && return; >> "${tagfile}"; local basedir=${PORTAGE_CONFIGROOT%/}/etc/portage/patches; local applied d f; local -A _eapply_user_patches; local prev_shopt=$(shopt -p nullglob); shopt -s nullglob; for d in "${basedir}"/${CATEGORY}/{${P}-${PR},${P},${PN}}{:${SLOT%/*},}; do for f in "${d}"/*; do if [[ ( ${f} == *.diff || ${f} == *.patch ) && -z ${_eapply_user_patches[${f##*/}]} ]]; then _eapply_user_patches[${f##*/}]=${f}; fi; done; done; if [[ ${#_eapply_user_patches[@]} -gt 0 ]]; then while read -r -d '' f; do f=${_eapply_user_patches[${f}]}; if [[ -s ${f} ]]; then eapply "${f}"; applied=1; fi; done < <(printf -- '%s\0' "${!_eapply_user_patches[@]}" | LC_ALL=C sort -z); fi; ${prev_shopt}; [[ -n ${applied} ]] && ewarn "User patches applied." } econf_build () { local CBUILD=${CBUILD:-${CHOST}}; tc-env_build econf --build=${CBUILD} --host=${CBUILD} "$@" } edos2unix () { [[ $# -eq 0 ]] && return 0; sed -i 's/\r$//' -- "$@" || die } 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 ) } emktemp () { local exe="touch"; [[ $1 == -d ]] && exe="mkdir" && shift; local topdir=$1; if [[ -z ${topdir} ]]; then [[ -z ${T} ]] && topdir="/tmp" || topdir=${T}; fi; if ! type -P mktemp > /dev/null; then local tmp=/; while [[ -e ${tmp} ]]; do tmp=${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}; done; ${exe} "${tmp}" || ${exe} -p "${tmp}"; echo "${tmp}"; else if [[ ${exe} == "touch" ]]; then TMPDIR="${topdir}" mktemp -t tmp.XXXXXXXXXX; else TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX; fi; fi } eninja () { local nonfatal_args=(); [[ ${EAPI:-0} != [245] ]] && nonfatal_args+=(-n); if [[ -z ${NINJAOPTS+set} ]]; then NINJAOPTS="-j$(makeopts_jobs) -l$(makeopts_loadavg "${MAKEOPTS}" 0)"; fi; set -- ninja -v ${NINJAOPTS} "$@"; echo "$@" 1>&2; "$@" || die "${nonfatal_args[@]}" "${*} failed" } eprefixify () { [[ $# -lt 1 ]] && die "at least one argument required"; einfo "Adjusting to prefix ${EPREFIX:-/}"; local x; for x in "$@"; do if [[ -e ${x} ]]; then ebegin " ${x##*/}"; sed -i -e "s|@GENTOO_PORTAGE_EPREFIX@|${EPREFIX}|g" "${x}"; eend $? || die "failed to eprefixify ${x}"; else die "${x} does not exist"; fi; done; return 0 } filter-flags () { _filter-hardened "$@"; local v; for v in $(all-flag-vars); do _filter-var ${v} "$@"; done; return 0 } filter-ldflags () { _filter-var LDFLAGS "$@"; return 0 } filter-lfs-flags () { [[ $# -ne 0 ]] && die "filter-lfs-flags takes no arguments"; filter-flags -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE } filter-mfpmath () { local orig_mfpmath new_math prune_math; orig_mfpmath=$(get-flag -mfpmath); new_math=$(get-flag mfpmath); new_math=${new_math/both/387,sse}; new_math=" ${new_math//[,+]/ } "; prune_math=""; for prune_math in "$@"; do new_math=${new_math/ ${prune_math} / }; done; new_math=$(echo ${new_math}); new_math=${new_math// /,}; if [[ -z ${new_math} ]]; then filter-flags ${orig_mfpmath}; else replace-flags ${orig_mfpmath} -mfpmath=${new_math}; fi; return 0 } gcc-fullversion () { _gcc_fullversion '$1.$2.$3' "$@" } gcc-major-version () { _gcc_fullversion '$1' "$@" } gcc-micro-version () { _gcc_fullversion '$3' "$@" } gcc-minor-version () { _gcc_fullversion '$2' "$@" } gcc-specs-directive () { local directive subdname subdirective; directive="$(_gcc-specs-directive_raw $1)"; while [[ ${directive} == *%\(*\)* ]]; do subdname=${directive/*%\(}; subdname=${subdname/\)*}; subdirective="$(_gcc-specs-directive_raw ${subdname})"; directive="${directive//\%(${subdname})/${subdirective}}"; done; echo "${directive}"; return 0 } gcc-specs-nostrict () { local directive; directive=$(gcc-specs-directive cc1); [[ "${directive/\{!fstrict-overflow:}" != "${directive}" ]] } gcc-specs-now () { local directive; directive=$(gcc-specs-directive link_command); [[ "${directive/\{!nonow:}" != "${directive}" ]] } gcc-specs-pie () { local directive; directive=$(gcc-specs-directive cc1); [[ "${directive/\{!nopie:}" != "${directive}" ]] } gcc-specs-relro () { local directive; directive=$(gcc-specs-directive link_command); [[ "${directive/\{!norelro:}" != "${directive}" ]] } gcc-specs-ssp () { local directive; directive=$(gcc-specs-directive cc1); [[ "${directive/\{!fno-stack-protector:}" != "${directive}" ]] } gcc-specs-ssp-to-all () { local directive; directive=$(gcc-specs-directive cc1); [[ "${directive/\{!fno-stack-protector-all:}" != "${directive}" ]] } gcc-specs-stack-check () { local directive; directive=$(gcc-specs-directive cc1); [[ "${directive/\{!fno-stack-check:}" != "${directive}" ]] } gcc-version () { _gcc_fullversion '$1.$2' "$@" } gen_usr_ldscript () { ewarn "${FUNCNAME}: Please migrate to usr-ldscript.eclass"; local lib libdir=$(get_libdir) output_format="" auto=false suffix=$(get_libname); [[ -z ${ED+set} ]] && local ED=${D%/}${EPREFIX}/; tc-is-static-only && return; if [[ $(type -t multilib_is_native_abi) == "function" ]]; then multilib_is_native_abi || return 0; fi; case ${CTARGET:-${CHOST}} in *-darwin*) ;; *-android*) return 0 ;; *linux* | *-freebsd* | *-openbsd* | *-netbsd*) use prefix && return 0 ;; *) return 0 ;; esac; dodir /usr/${libdir}; if [[ $1 == "-a" ]]; then auto=true; shift; dodir /${libdir}; fi; local flags=(${CFLAGS} ${LDFLAGS} -Wl,--verbose); if $(tc-getLD) --version | grep -q 'GNU gold'; then local d="${T}/bfd-linker"; mkdir -p "${d}"; ln -sf $(which ${CHOST}-ld.bfd) "${d}"/ld; flags+=(-B"${d}"); fi; output_format=$($(tc-getCC) "${flags[@]}" 2>&1 | sed -n 's/^OUTPUT_FORMAT("\([^"]*\)",.*/\1/p'); [[ -n ${output_format} ]] && output_format="OUTPUT_FORMAT ( ${output_format} )"; for lib in "$@"; do local tlib; if ${auto}; then lib="lib${lib}${suffix}"; else [[ -r ${ED}/${libdir}/${lib} ]] || continue; fi; case ${CTARGET:-${CHOST}} in *-darwin*) if ${auto}; then tlib=$(scanmacho -qF'%S#F' "${ED}"/usr/${libdir}/${lib}); else tlib=$(scanmacho -qF'%S#F' "${ED}"/${libdir}/${lib}); fi; [[ -z ${tlib} ]] && die "unable to read install_name from ${lib}"; tlib=${tlib##*/}; if ${auto}; then mv "${ED}"/usr/${libdir}/${lib%${suffix}}.*${suffix#.} "${ED}"/${libdir}/ || die; if [[ ${tlib} != ${lib%${suffix}}.*${suffix#.} ]]; then mv "${ED}"/usr/${libdir}/${tlib%${suffix}}.*${suffix#.} "${ED}"/${libdir}/ || die; fi; rm -f "${ED}"/${libdir}/${lib}; fi; if [[ ! -w "${ED}/${libdir}/${tlib}" ]]; then chmod u+w "${ED}${libdir}/${tlib}"; local nowrite=yes; fi; install_name_tool -id "${EPREFIX}"/${libdir}/${tlib} "${ED}"/${libdir}/${tlib} || die "install_name_tool failed"; [[ -n ${nowrite} ]] && chmod u-w "${ED}${libdir}/${tlib}"; pushd "${ED}/usr/${libdir}" > /dev/null; ln -snf "../../${libdir}/${tlib}" "${lib}"; popd > /dev/null ;; *) if ${auto}; then tlib=$(scanelf -qF'%S#F' "${ED}"/usr/${libdir}/${lib}); [[ -z ${tlib} ]] && die "unable to read SONAME from ${lib}"; mv "${ED}"/usr/${libdir}/${lib}* "${ED}"/${libdir}/ || die; if [[ ${tlib} != ${lib}* ]]; then mv "${ED}"/usr/${libdir}/${tlib}* "${ED}"/${libdir}/ || die; fi; rm -f "${ED}"/${libdir}/${lib}; else tlib=${lib}; fi; cat > "${ED}/usr/${libdir}/${lib}" <<-END_LDSCRIPT /* GNU ld script Since Gentoo has critical dynamic libraries in /lib, and the static versions in /usr/lib, we need to have a "fake" dynamic lib in /usr/lib, otherwise we run into linking problems. This "fake" dynamic lib is a linker script that redirects the linker to the real lib. And yes, this works in the cross- compiling scenario as the sysroot-ed linker will prepend the real path. See bug https://bugs.gentoo.org/4411 for more info. */ ${output_format} GROUP ( ${EPREFIX}/${libdir}/${tlib} ) END_LDSCRIPT ;; esac fperms a+x "/usr/${libdir}/${lib}" || die "could not change perms on ${lib}"; done } get-flag () { [[ $# -ne 1 ]] && die "usage: "; local f var findflag="$1"; for var in $(all-flag-vars); do for f in ${!var}; do if [ "${f/${findflag}}" != "${f}" ]; then printf "%s\n" "${f/-${findflag}=}"; return 0; fi; done; done; return 1 } get_abi_CFLAGS () { get_abi_var CFLAGS "$@" } get_abi_CHOST () { get_abi_var CHOST "$@" } get_abi_CTARGET () { get_abi_var CTARGET "$@" } get_abi_FAKE_TARGETS () { get_abi_var FAKE_TARGETS "$@" } get_abi_LDFLAGS () { get_abi_var LDFLAGS "$@" } get_abi_LIBDIR () { get_abi_var LIBDIR "$@" } get_abi_var () { local flag=$1; local abi=${2:-${ABI:-${DEFAULT_ABI:-default}}}; local var="${flag}_${abi}"; echo ${!var} } get_all_abis () { local x order="" mvar dvar; mvar="MULTILIB_ABIS"; dvar="DEFAULT_ABI"; if [[ -n $1 ]]; then mvar="$1_${mvar}"; dvar="$1_${dvar}"; fi; if [[ -z ${!mvar} ]]; then echo "default"; return 0; fi; for x in ${!mvar}; do if [[ ${x} != ${!dvar} ]]; then order="${order:+${order} }${x}"; fi; done; order="${order:+${order} }${!dvar}"; echo ${order}; return 0 } get_all_libdirs () { local libdirs abi; for abi in ${MULTILIB_ABIS}; do libdirs+=" $(get_abi_LIBDIR ${abi})"; done; [[ " ${libdirs} " != *" lib "* ]] && libdirs+=" lib"; echo "${libdirs}" } get_exeext () { case ${CHOST} in *-cygwin* | mingw* | *-mingw*) echo ".exe" ;; esac } get_install_abis () { local x order=""; if [[ -z ${MULTILIB_ABIS} ]]; then echo "default"; return 0; fi; if [[ ${EMULTILIB_PKG} == "true" ]]; then for x in ${MULTILIB_ABIS}; do if [[ ${x} != "${DEFAULT_ABI}" ]]; then has ${x} ${ABI_DENY} || order="${order} ${x}"; fi; done; has ${DEFAULT_ABI} ${ABI_DENY} || order="${order} ${DEFAULT_ABI}"; if [[ -n ${ABI_ALLOW} ]]; then local ordera=""; for x in ${order}; do if has ${x} ${ABI_ALLOW}; then ordera="${ordera} ${x}"; fi; done; order=${ordera}; fi; else order=${DEFAULT_ABI}; fi; if [[ -z ${order} ]]; then die "The ABI list is empty. Are you using a proper multilib profile? Perhaps your USE flags or MULTILIB_ABIS are too restrictive for this package."; fi; echo ${order}; return 0 } get_libdir () { local libdir_var="LIBDIR_${ABI}"; local libdir="lib"; [[ -n ${ABI} && -n ${!libdir_var} ]] && libdir=${!libdir_var}; echo "${libdir}" } get_libname () { local libname; local ver=$1; case ${CHOST} in *-cygwin*) libname="dll.a" ;; mingw* | *-mingw*) libname="dll" ;; *-darwin*) libname="dylib" ;; *-mint*) libname="irrelevant" ;; hppa*-hpux*) libname="sl" ;; *) libname="so" ;; esac; if [[ -z $* ]]; then echo ".${libname}"; else for ver in "$@"; do case ${CHOST} in *-cygwin*) echo ".${ver}.${libname}" ;; *-darwin*) echo ".${ver}.${libname}" ;; *-mint*) echo ".${libname}" ;; *) echo ".${libname}.${ver}" ;; esac; done; fi } get_localversion () { local lv_list i x; local shopt_save=$(shopt -p nullglob); shopt -s nullglob; local files=(${1}/localversion*); ${shopt_save}; for i in "${files[@]}"; do [[ -n ${i//*~*} ]] && lv_list="${lv_list} ${i}"; done; for i in ${lv_list}; do x="${x}$(<${i})"; done; x=${x/ /}; echo ${x} } get_makefile_extract_function () { local a='' b='' mkfunc='getfilevar'; a="$(getfilevar VERSION ${KERNEL_MAKEFILE})"; b="$(getfilevar_noexec VERSION ${KERNEL_MAKEFILE})"; [[ "${a}" != "${b}" ]] && mkfunc='getfilevar_noexec'; echo "${mkfunc}" } 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; KV_FULL=$(uname -r); if [[ -f ${ROOT%/}/lib/modules/${KV_FULL}/source/Makefile && -f ${ROOT%/}/lib/modules/${KV_FULL}/build/Makefile ]]; then KERNEL_DIR=$(readlink -f ${ROOT%/}/lib/modules/${KV_FULL}/source); KBUILD_OUTPUT=$(readlink -f ${ROOT%/}/lib/modules/${KV_FULL}/build); unset KV_FULL; get_version; return $?; else if [[ -f ${ROOT%/}/lib/modules/${KV_FULL}/source/Makefile ]]; then KERNEL_DIR=$(readlink -f ${ROOT%/}/lib/modules/${KV_FULL}/source); unset KV_FULL; get_version; return $?; else if [[ -f ${ROOT%/}/lib/modules/${KV_FULL}/build/Makefile ]]; then KERNEL_DIR=$(readlink -f ${ROOT%/}/lib/modules/${KV_FULL}/build); unset KV_FULL; get_version; return $?; else 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}; fi; fi; fi; return 0 } get_version () { if ! use kernel_linux; then die "${FUNCNAME}() called on non-Linux system, please fix the ebuild"; fi; local tmplocal; [ -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}" -a -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; if [ ! -s "${KV_DIR}/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}; KERNEL_MAKEFILE="${KV_DIR}/Makefile"; if [[ -z ${OUTPUT_DIR} ]]; then local mkfunc=$(get_makefile_extract_function "${KERNEL_MAKEFILE}"); OUTPUT_DIR=$(${mkfunc} KBUILD_OUTPUT "${KERNEL_MAKEFILE}"); fi; KV_MAJOR=$(getfilevar_noexec VERSION "${KERNEL_MAKEFILE}"); KV_MINOR=$(getfilevar_noexec PATCHLEVEL "${KERNEL_MAKEFILE}"); KV_PATCH=$(getfilevar_noexec SUBLEVEL "${KERNEL_MAKEFILE}"); KV_EXTRA=$(getfilevar_noexec EXTRAVERSION "${KERNEL_MAKEFILE}"); if [ -z "${KV_MAJOR}" -o -z "${KV_MINOR}" -o -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}" M="${S}"; 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; [[ ${EAPI:-0} == [0123] ]] && function nonfatal () { "$@" }; case ${EBUILD_PHASE_FUNC} in pkg_info | pkg_nofetch | pkg_pretend) M="${T}" ;; esac; echo -e "e:\\n\\t@echo \$(${1})\\ninclude ${basefname}" | nonfatal emake -C "${basedname}" M="${M}" ${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/ /}" ] } hprefixify () { use prefix || return 0; local xl=() x; while [[ $# -gt 0 ]]; do case $1 in -e) local PREFIX_EXTRA_REGEX="$2"; shift ;; -w) local PREFIX_LINE_MATCH="$2"; shift ;; -q) local PREFIX_QUOTE_CHAR="${EPREFIX:+$2}"; shift ;; *) xl+=("$1") ;; esac; shift; done; local dirs="/(usr|lib(|[onx]?32|n?64)|etc|bin|sbin|var|opt|run)" eprefix="${PREFIX_QUOTE_CHAR}${EPREFIX}${PREFIX_QUOTE_CHAR}"; [[ ${#xl[@]} -lt 1 ]] && die "at least one file operand is required"; einfo "Adjusting to prefix ${EPREFIX:-/}"; for x in "${xl[@]}"; do if [[ -e ${x} ]]; then ebegin " ${x##*/}"; sed -r -e "${PREFIX_LINE_MATCH}s,([^[:alnum:]}\)\.])${dirs},\1${eprefix}/\2,g" -e "${PREFIX_LINE_MATCH}s,^${dirs},${eprefix}/\1," -e "${PREFIX_EXTRA_REGEX}" -i "${x}"; eend $? || die "failed to prefixify ${x}"; else die "${x} does not exist"; fi; done } in_iuse () { local use=${1}; if [[ -z "${use}" ]]; then echo "!!! in_iuse() called without a parameter." 1>&2; echo "!!! in_iuse " 1>&2; die "in_iuse() called without a parameter"; fi; local liuse=(${IUSE_EFFECTIVE}); has "${use}" "${liuse[@]#[+-]}" } is-flag () { is-flagq "$@" && echo true } is-flagq () { [[ -n $2 ]] && die "Usage: is-flag "; local var; for var in $(all-flag-vars); do _is_flagq ${var} "$1" && return 0; done; return 1 } is-ldflag () { is-ldflagq "$@" && echo true } is-ldflagq () { [[ -n $2 ]] && die "Usage: is-ldflag "; _is_flagq LDFLAGS $1 } is_final_abi () { has_multilib_profile || return 0; set -- $(get_install_abis); local LAST_ABI=$#; [[ ${!LAST_ABI} == ${ABI} ]] } 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 test value; 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 kernel-2_kernel_is(): too many parameters"; : $(( test = (KV_MAJOR << 16) + (KV_MINOR << 8) + KV_PATCH )); : $(( value = (${1:-${KV_MAJOR}} << 16) + (${2:-${KV_MINOR}} << 8) + ${3:-${KV_PATCH}} )); [ ${test} ${operator} ${value} ] } 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; if kernel_is 2 4; then if [ "$( gcc-major-version )" -eq "4" ]; then echo; ewarn "Be warned !! >=sys-devel/gcc-4.0.0 isn't supported with"; ewarn "linux-2.4 (or modules building against a linux-2.4 kernel)!"; echo; ewarn "Either switch to another gcc-version (via gcc-config) or use a"; ewarn "newer kernel that supports gcc-4."; echo; ewarn "Also be aware that bugreports about gcc-4 not working"; ewarn "with linux-2.4 based ebuilds will be closed as INVALID!"; echo; fi; fi; [ -n "${CONFIG_CHECK}" ] && check_extra_config } linux_chkconfig_builtin () { linux_config_qa_check linux_chkconfig_builtin; [[ $(getfilevar_noexec "CONFIG_$1" "$(linux_config_path)") == y ]] } linux_chkconfig_module () { linux_config_qa_check linux_chkconfig_module; [[ $(getfilevar_noexec "CONFIG_$1" "$(linux_config_path)") == m ]] } linux_chkconfig_present () { linux_config_qa_check linux_chkconfig_present; [[ $(getfilevar_noexec "CONFIG_$1" "$(linux_config_path)") == [my] ]] } linux_chkconfig_string () { 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 ]] } make_wrapper () { local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5; local tmpwrapper=$(emktemp); has "${EAPI:-0}" 0 1 2 && local EPREFIX=""; ( echo '#!/bin/sh'; if [[ -n ${libdir} ]]; then local var; if [[ ${CHOST} == *-darwin* ]]; then var=DYLD_LIBRARY_PATH; else var=LD_LIBRARY_PATH; fi; cat <<-EOF if [ "\${${var}+set}" = "set" ] ; then export ${var}="\${${var}}:${EPREFIX}${libdir}" else export ${var}="${EPREFIX}${libdir}" fi EOF fi [[ -n ${chdir} ]] && printf 'cd "%s" &&\n' "${EPREFIX}${chdir}"; printf 'exec %s "$@"\n' "${bin/#\//${EPREFIX}/}" ) > "${tmpwrapper}"; chmod go+rx "${tmpwrapper}"; if [[ -n ${path} ]]; then ( exeopts -m 0755; exeinto "${path}"; newexe "${tmpwrapper}" "${wrapper}" ) || die; else newbin "${tmpwrapper}" "${wrapper}" || die; fi } makeopts_jobs () { [[ $# -eq 0 ]] && set -- "${MAKEOPTS}"; local jobs=$(echo " $* " | sed -r -n -e 's:.*[[:space:]](-[a-z]*j|--jobs[=[:space:]])[[:space:]]*([0-9]+).*:\2:p' -e "s:.*[[:space:]](-[a-z]*j|--jobs)[[:space:]].*:${2:-999}:p"); echo ${jobs:-1} } makeopts_loadavg () { [[ $# -eq 0 ]] && set -- "${MAKEOPTS}"; local lavg=$(echo " $* " | sed -r -n -e 's:.*[[:space:]](-[a-z]*l|--(load-average|max-load)[=[:space:]])[[:space:]]*([0-9]+(\.[0-9]+)?)[[:space:]].*:\3:p' -e "s:.*[[:space:]](-[a-z]*l|--(load-average|max-load))[[:space:]].*:${2:-999}:p"); echo ${lavg:-${2:-999}} } multilib_env () { local CTARGET=${1:-${CTARGET}}; local cpu=${CTARGET%%*-}; case ${cpu} in aarch64*) export CFLAGS_arm=${CFLAGS_arm-}; case ${cpu} in aarch64*be) export CHOST_arm="armv8b-${CTARGET#*-}" ;; *) export CHOST_arm="armv8l-${CTARGET#*-}" ;; esac; CHOST_arm=${CHOST_arm/%-gnu/-gnueabi}; export CTARGET_arm=${CHOST_arm}; export LIBDIR_arm="lib"; export CFLAGS_arm64=${CFLAGS_arm64-}; export CHOST_arm64=${CTARGET}; export CTARGET_arm64=${CHOST_arm64}; export LIBDIR_arm64="lib64"; : ${MULTILIB_ABIS=arm64}; : ${DEFAULT_ABI=arm64} ;; x86_64*) export CFLAGS_x86=${CFLAGS_x86--m32}; export CHOST_x86=${CTARGET/x86_64/i686}; CHOST_x86=${CHOST_x86/%-gnux32/-gnu}; export CTARGET_x86=${CHOST_x86}; if [[ ${SYMLINK_LIB} == "yes" ]]; then export LIBDIR_x86="lib32"; else export LIBDIR_x86="lib"; fi; export CFLAGS_amd64=${CFLAGS_amd64--m64}; export CHOST_amd64=${CTARGET/%-gnux32/-gnu}; export CTARGET_amd64=${CHOST_amd64}; export LIBDIR_amd64="lib64"; export CFLAGS_x32=${CFLAGS_x32--mx32}; export CHOST_x32=${CTARGET/%-gnu/-gnux32}; export CTARGET_x32=${CHOST_x32}; export LIBDIR_x32="libx32"; case ${CTARGET} in *-gnux32) : ${MULTILIB_ABIS=x32 amd64 x86}; : ${DEFAULT_ABI=x32} ;; *) : ${MULTILIB_ABIS=amd64 x86}; : ${DEFAULT_ABI=amd64} ;; esac ;; mips64* | mipsisa64*) export CFLAGS_o32=${CFLAGS_o32--mabi=32}; export CHOST_o32=${CTARGET/mips64/mips}; export CHOST_o32=${CHOST_o32/mipsisa64/mipsisa32}; export CTARGET_o32=${CHOST_o32}; export LIBDIR_o32="lib"; export CFLAGS_n32=${CFLAGS_n32--mabi=n32}; export CHOST_n32=${CTARGET}; export CTARGET_n32=${CHOST_n32}; export LIBDIR_n32="lib32"; export CFLAGS_n64=${CFLAGS_n64--mabi=64}; export CHOST_n64=${CTARGET}; export CTARGET_n64=${CHOST_n64}; export LIBDIR_n64="lib64"; : ${MULTILIB_ABIS=n64 n32 o32}; : ${DEFAULT_ABI=n32} ;; powerpc64*) export CFLAGS_ppc=${CFLAGS_ppc--m32}; export CHOST_ppc=${CTARGET/powerpc64/powerpc}; export CTARGET_ppc=${CHOST_ppc}; export LIBDIR_ppc="lib"; export CFLAGS_ppc64=${CFLAGS_ppc64--m64}; export CHOST_ppc64=${CTARGET}; export CTARGET_ppc64=${CHOST_ppc64}; export LIBDIR_ppc64="lib64"; : ${MULTILIB_ABIS=ppc64 ppc}; : ${DEFAULT_ABI=ppc64} ;; riscv64*) export CFLAGS_lp64d=${CFLAGS_lp64d--mabi=lp64d}; export CHOST_lp64d=${CTARGET}; export CTARGET_lp64d=${CTARGET}; export LIBDIR_lp64d="lib64/lp64d"; export CFLAGS_lp64=${CFLAGS_lp64--mabi=lp64}; export CHOST_lp64=${CTARGET}; export CTARGET_lp64=${CTARGET}; export LIBDIR_lp64="lib64/lp64"; : ${MULTILIB_ABIS=lp64d lp64}; : ${DEFAULT_ABI=lp64d} ;; s390x*) export CFLAGS_s390=${CFLAGS_s390--m31}; export CHOST_s390=${CTARGET/s390x/s390}; export CTARGET_s390=${CHOST_s390}; export LIBDIR_s390="lib"; export CFLAGS_s390x=${CFLAGS_s390x--m64}; export CHOST_s390x=${CTARGET}; export CTARGET_s390x=${CHOST_s390x}; export LIBDIR_s390x="lib64"; : ${MULTILIB_ABIS=s390x s390}; : ${DEFAULT_ABI=s390x} ;; sparc64*) export CFLAGS_sparc32=${CFLAGS_sparc32--m32}; export CHOST_sparc32=${CTARGET/sparc64/sparc}; export CTARGET_sparc32=${CHOST_sparc32}; export LIBDIR_sparc32="lib"; export CFLAGS_sparc64=${CFLAGS_sparc64--m64}; export CHOST_sparc64=${CTARGET}; export CTARGET_sparc64=${CHOST_sparc64}; export LIBDIR_sparc64="lib64"; : ${MULTILIB_ABIS=sparc64 sparc32}; : ${DEFAULT_ABI=sparc64} ;; *) : ${MULTILIB_ABIS=default}; : ${DEFAULT_ABI=default} ;; esac; export MULTILIB_ABIS DEFAULT_ABI } multilib_toolchain_setup () { local v vv; export ABI=$1; if [[ ${_DEFAULT_ABI_SAVED} == "true" ]]; then for v in CHOST CBUILD AS CC CXX F77 FC LD PKG_CONFIG_{LIBDIR,PATH}; do vv="_abi_saved_${v}"; [[ ${!vv+set} == "set" ]] && export ${v}="${!vv}" || unset ${v}; unset ${vv}; done; unset _DEFAULT_ABI_SAVED; fi; if [[ ${ABI} != ${DEFAULT_ABI} ]]; then for v in CHOST CBUILD AS CC CXX F77 FC LD PKG_CONFIG_{LIBDIR,PATH}; do vv="_abi_saved_${v}"; [[ ${!v+set} == "set" ]] && export ${vv}="${!v}" || unset ${vv}; done; export _DEFAULT_ABI_SAVED="true"; if [[ ${CBUILD} == "${CHOST}" ]]; then export CBUILD=$(get_abi_CHOST $1); fi; export CHOST=$(get_abi_CHOST ${DEFAULT_ABI}); export CC="$(tc-getCC) $(get_abi_CFLAGS)"; export CXX="$(tc-getCXX) $(get_abi_CFLAGS)"; export F77="$(tc-getF77) $(get_abi_CFLAGS)"; export FC="$(tc-getFC) $(get_abi_CFLAGS)"; export LD="$(tc-getLD) $(get_abi_LDFLAGS)"; export CHOST=$(get_abi_CHOST $1); export PKG_CONFIG_LIBDIR=${EPREFIX}/usr/$(get_libdir)/pkgconfig; export PKG_CONFIG_PATH=${EPREFIX}/usr/share/pkgconfig; fi } mysql_init_vars () { : ${MY_SHAREDSTATEDIR="${EPREFIX}/usr/share/mysql"}; : ${MY_SYSCONFDIR="${EPREFIX}/etc/mysql"}; : ${MY_LOCALSTATEDIR="${EPREFIX}/var/lib/mysql"}; : ${MY_LOGDIR="${EPREFIX}/var/log/mysql"}; MY_DATADIR="${MY_LOCALSTATEDIR}"; export MY_SHAREDSTATEDIR MY_SYSCONFDIR; export MY_LOCALSTATEDIR MY_LOGDIR; export MY_DATADIR } no-as-needed () { [[ $# -ne 0 ]] && die "no-as-needed takes no arguments"; case $($(tc-getLD) -v 2>&1 /dev/null); if [[ -z "${MYSQL_USER}" ]]; then die "Failed to determine current username!"; fi; fi; fi; if [[ -z "${MYSQL_GROUP}" ]]; then MYSQL_GROUP=mysql; if use prefix; then MYSQL_GROUP=$(id -g -n 2>/dev/null); if [[ -z "${MYSQL_GROUP}" ]]; then die "Failed to determine current user groupname!"; fi; fi; fi; einfo "Will use username '${MYSQL_USER}' and group '${MYSQL_GROUP}' ..."; function _getoptval () { local section="$1"; local flag="--${2}="; local extra_options="${3}"; local cmd=("${my_print_defaults_binary}" "${extra_options}" "${section}"); local results=($(eval "${cmd[@]}" 2>/dev/null | sed -n "/^${flag}/s,${flag},,gp")); if [[ ${#results[@]} -gt 0 ]]; then echo "${results[-1]}"; fi }; function _mktemp_dry () { local template="${1}"; if [[ -z "${template}" ]]; then if [[ -z "${T}" ]]; then template="/tmp/XXXXXXX"; else template="${T}/XXXXXXX"; fi; fi; local template_wo_X=${template//X/}; local n_X; let n_X=${#template}-${#template_wo_X}; if [[ ${n_X} -lt 3 ]]; then echo "${FUNCNAME[0]}: too few X's in template ‘${template}’" 1>&2; return; fi; local attempts=0; local character tmpfile; while [[ -n true ]]; do let attempts=attempts+1; new_file=; while read -n1 character; do if [[ "${character}" == "X" ]]; then tmpfile+="${RANDOM:0:1}"; else tmpfile+="${character}"; fi; done < <(echo -n "${template}"); if [[ ! -f "${tmpfile}" ]]; then echo "${tmpfile}"; return; fi; if [[ ${attempts} -ge 100 ]]; then echo "${FUNCNAME[0]}: Cannot create temporary file after 100 attempts." 1>&2; return; fi; done }; local -x HOME="${EROOT}/root"; mysql_init_vars; MY_DATADIR="$(_getoptval mysqld datadir "--defaults-file='${MY_SYSCONFDIR}/my.cnf'")"; [[ "${HOSTNAME}" == "localhost" ]] && die "Your machine must NOT be named localhost"; if [[ -z "${MY_DATADIR}" ]]; then die "Sorry, unable to find MY_DATADIR!"; else if [[ -d "${MY_DATADIR}/mysql" ]]; then ewarn "Looks like your data directory '${MY_DATADIR}' is already initialized!"; ewarn "Please rename or delete its content if you wish to initialize a new data directory."; die "${PN} data directory at '${MY_DATADIR}' looks already initialized!"; else einfo "${PN} data directory detected as '${MY_DATADIR}' ..."; fi; fi; MYSQL_TMPDIR="$(_getoptval mysqld tmpdir "--defaults-file='${MY_SYSCONFDIR}/my.cnf'")"; MYSQL_LOG_BIN="$(_getoptval mysqld log-bin "--defaults-file='${MY_SYSCONFDIR}/my.cnf'")"; MYSQL_LOG_BIN=${MYSQL_LOG_BIN%/*}; MYSQL_RELAY_LOG="$(_getoptval mysqld relay-log "--defaults-file='${MY_SYSCONFDIR}/my.cnf'")"; MYSQL_RELAY_LOG=${MYSQL_RELAY_LOG%/*}; PID_DIR="${EROOT}/run/mysqld"; if [[ ! -d "${PID_DIR}" ]]; then einfo "Creating ${PN} PID directory '${PID_DIR}' ..."; install -d -m 755 -o ${MYSQL_USER} -g ${MYSQL_GROUP} "${PID_DIR}" || die "Failed to create PID directory '${PID_DIR}'!"; fi; local _pid_dir_testfile="$(_mktemp_dry "${PID_DIR}/.pkg_config-access-test.XXXXXXXXX")"; [[ -z "${_pid_dir_testfile}" ]] && die "_mktemp_dry() for '${PID_DIR}/.pkg_config-access-test.XXXXXXXXX' failed!"; if use prefix; then touch "${_pid_dir_testfile}" &> /dev/null; else su -s /bin/sh -c "touch ${_pid_dir_testfile}" ${MYSQL_USER} &> /dev/null; fi; if [[ $? -ne 0 ]]; then die "${MYSQL_USER} user cannot write into PID dir '${PID_DIR}'!"; else rm "${_pid_dir_testfile}" || die; unset _pid_dir_testfile; fi; if [[ ! -d "${MY_DATADIR}" ]]; then einfo "Creating ${PN} data directory '${MY_DATADIR}' ..."; install -d -m 770 -o ${MYSQL_USER} -g ${MYSQL_GROUP} "${MY_DATADIR}" || die "Failed to create ${PN} data directory '${MY_DATADIR}'!"; fi; local _my_datadir_testfile="$(_mktemp_dry "${MY_DATADIR}/.pkg_config-access-test.XXXXXXXXX")"; [[ -z "${_my_datadir_testfile}" ]] && die "_mktemp_dry() for '${MY_DATADIR}/.pkg_config-access-test.XXXXXXXXX' failed!"; if use prefix; then touch "${_my_datadir_testfile}" &> /dev/null; else su -s /bin/sh -c "touch ${_my_datadir_testfile}" ${MYSQL_USER} &> /dev/null; fi; if [[ $? -ne 0 ]]; then die "${MYSQL_USER} user cannot write into data directory '${MY_DATADIR}'!"; else rm "${_my_datadir_testfile}" || die; unset _my_datadir_testfile; fi; if [[ -n "${MYSQL_TMPDIR}" && ! -d "${MYSQL_TMPDIR}" ]]; then einfo "Creating ${PN} tmpdir '${MYSQL_TMPDIR}' ..."; install -d -m 770 -o ${MYSQL_USER} -g ${MYSQL_GROUP} "${MYSQL_TMPDIR}" || die "Failed to create ${PN} tmpdir '${MYSQL_TMPDIR}'!"; fi; if [[ -n "${MYSQL_TMPDIR}" ]]; then local _my_tmpdir_testfile="$(_mktemp_dry "${MYSQL_TMPDIR}/.pkg_config-access-test.XXXXXXXXX")"; [[ -z "${_my_tmpdir_testfile}" ]] && die "_mktemp_dry() for '${MYSQL_TMPDIR}/.pkg_config-access-test.XXXXXXXXX' failed!"; if use prefix; then touch "${_my_tmpdir_testfile}" &> /dev/null; else su -s /bin/sh -c "touch ${_my_tmpdir_testfile}" ${MYSQL_USER} &> /dev/null; fi; if [[ $? -ne 0 ]]; then die "${MYSQL_USER} user cannot write into data directory '${MYSQL_TMPDIR}'!"; else rm "${_my_tmpdir_testfile}" || die; unset _my_tmpdir_testfile; fi; else MYSQL_TMPDIR="$(_mktemp_dry "${T}/mysqld-tmp.XXXXXXXXX")"; [[ -z "${MYSQL_TMPDIR}" ]] && die "_mktemp_dry() for '${MYSQL_TMPDIR}' failed!"; mkdir "${MYSQL_TMPDIR}" || die; chown ${MYSQL_USER} "${MYSQL_TMPDIR}" || die; fi; if [[ -n "${MYSQL_LOG_BIN}" && ! -d "${MYSQL_LOG_BIN}" ]]; then einfo "Creating ${PN} log-bin directory '${MYSQL_LOG_BIN}' ..."; install -d -m 770 -o ${MYSQL_USER} -g ${MYSQL_GROUP} "${MYSQL_LOG_BIN}" || die "Failed to create ${PN} log-bin directory '${MYSQL_LOG_BIN}'"; fi; if [[ -n "${MYSQL_LOG_BIN}" ]]; then local _my_logbin_testfile="$(_mktemp_dry "${MYSQL_LOG_BIN}/.pkg_config-access-test.XXXXXXXXX")"; [[ -z "${_my_logbin_testfile}" ]] && die "_mktemp_dry() for '${MYSQL_LOG_BIN}/.pkg_config-access-test.XXXXXXXXX' failed!"; if use prefix; then touch "${_my_logbin_testfile}" &> /dev/null; else su -s /bin/sh -c "touch ${_my_logbin_testfile}" ${MYSQL_USER} &> /dev/null; fi; if [[ $? -ne 0 ]]; then die "${MYSQL_USER} user cannot write into log-bin directory '${MYSQL_LOG_BIN}'!"; else rm "${_my_logbin_testfile}" || die; unset _my_logbin_testfile; fi; fi; if [[ -n "${MYSQL_RELAY_LOG}" && ! -d "${MYSQL_RELAY_LOG}" ]]; then einfo "Creating ${PN} relay-log directory '${MYSQL_RELAY_LOG}' ..."; install -d -m 770 -o ${MYSQL_USER} -g ${MYSQL_GROUP} "${MYSQL_RELAY_LOG}" || die "Failed to create ${PN} relay-log directory '${MYSQL_RELAY_LOG}'!"; fi; if [[ -n "${MYSQL_RELAY_LOG}" ]]; then local _my_relaylog_testfile="$(_mktemp_dry "${MYSQL_RELAY_LOG}/.pkg_config-access-test.XXXXXXXXX")"; [[ -z "${_my_relaylog_testfile}" ]] && die "_mktemp_dry() for '${MYSQL_RELAY_LOG}/.pkg_config-access-test.XXXXXXXXX' failed!"; if use prefix; then touch "${_my_relaylog_testfile}" &> /dev/null; else su -s /bin/sh -c "touch ${_my_relaylog_testfile}" ${MYSQL_USER} &> /dev/null; fi; if [[ $? -ne 0 ]]; then die "${MYSQL_USER} user cannot write into relay-log directory '${MYSQL_RELAY_LOG}'!"; else rm "${_my_relaylog_testfile}" || die; unset _my_relaylog_testfile; fi; fi; local -a config_files; local config_file="${EROOT}/etc/mysql/mysql.d/50-distro-client.cnf"; if [[ -f "${config_file}" ]]; then config_files+=("${config_file}"); else ewarn "Client configuration '${config_file}' not found; Skipping configuration of default authentication plugin for client ..."; fi; config_file="${EROOT}/etc/mysql/mysql.d/50-distro-server.cnf"; if [[ -f "${config_file}" ]]; then config_files+=("${config_file}"); else ewarn "Server configuration '${config_file}' not found; Skipping configuration of default authentication plugin for mysqld ..."; fi; if [[ ${#config_files[@]} -gt 0 ]]; then if [[ -z "${MYSQL_DEFAULT_AUTHENTICATION_PLUGIN}" ]]; then local user_answer; echo; einfo "Please select default authentication plugin (enter number or plugin name):"; einfo "1) caching_sha2_password [MySQL 8.0 default]"; einfo "2) mysql_native_password [MySQL 5.7 default]"; einfo; einfo "For details see:"; einfo "https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password"; read -p " >" user_answer; echo; case "${user_answer}" in 1 | caching_sha2_password) MYSQL_DEFAULT_AUTHENTICATION_PLUGIN=caching_sha2_password ;; 2 | mysql_native_password) MYSQL_DEFAULT_AUTHENTICATION_PLUGIN=mysql_native_password ;; '') die "No authentication plugin selected!" ;; *) die "Authentication plugin '${user_answer}' is unknown/unsupported!" ;; esac; unset user_answer; fi; local cfg_option cfg_option_tabs cfg_section; for config_file in "${config_files[@]}"; do cfg_option="default-authentication-plugin"; cfg_section="mysqld"; cfg_option_tabs="\t\t"; if [[ "${config_file}" == *client.cnf ]]; then cfg_option="default-auth"; cfg_section="client"; cfg_option_tabs="\t\t\t\t"; fi; if grep -qE "^(loose-)?${cfg_option}\b.*=" "${config_file}" 2> /dev/null; then einfo "Ensuring that ${cfg_option} is set to '${MYSQL_DEFAULT_AUTHENTICATION_PLUGIN}' in '${config_file}' ..."; sed -i -e "s/^\(loose-\)\?${cfg_option}\b.*=.*/loose-${cfg_option}${cfg_option_tabs}= ${MYSQL_DEFAULT_AUTHENTICATION_PLUGIN}/" "${config_file}" || die "Failed to change ${cfg_option} in '${config_file}'!"; else einfo "Setting ${cfg_option} to '${MYSQL_DEFAULT_AUTHENTICATION_PLUGIN}' in '${config_file}' ..."; sed -i -e "/^\[${cfg_section}\]$/a loose-${cfg_option}${cfg_option_tabs}= ${MYSQL_DEFAULT_AUTHENTICATION_PLUGIN}" "${config_file}" || die "Failed to add ${cfg_option} to '${config_file}'!"; fi; done; unset cfg_option cfg_option_tabs cfg_section; fi; unset config_files config_file; echo; if [[ -z "${MYSQL_ROOT_PASSWORD}" ]]; then local tmp_mysqld_password_source=; for tmp_mysqld_password_source in mysql client; do einfo "Trying to get password for mysql 'root' user from '${tmp_mysqld_password_source}' section ..."; MYSQL_ROOT_PASSWORD="$(_getoptval "${tmp_mysqld_password_source}" password)"; if [[ -n "${MYSQL_ROOT_PASSWORD}" ]]; then if [[ ${MYSQL_ROOT_PASSWORD} == *' '* ]]; then ewarn "Ignoring password from '${tmp_mysqld_password_source}' section due to newline character (do you have multiple password options set?)!"; MYSQL_ROOT_PASSWORD=; continue; fi; einfo "Found password in '${tmp_mysqld_password_source}' section!"; break; fi; done; if [[ "${MYSQL_ROOT_PASSWORD}" == '*****' ]]; then MYSQL_ROOT_PASSWORD="$(_getoptval "${tmp_mysqld_password_source}" password --show)"; fi; unset tmp_mysqld_password_source; fi; if [[ -z "${MYSQL_ROOT_PASSWORD}" ]]; then local pwd1="a"; local pwd2="b"; echo; einfo "No password for mysql 'root' user was specified via environment"; einfo "variable MYSQL_ROOT_PASSWORD and no password was found in config"; einfo "file like '${HOME}/.my.cnf'."; einfo "To continue please provide a password for the mysql 'root' user"; einfo "now on console:"; ewarn "NOTE: Please avoid [\"'\\_%] characters in the password!"; read -rsp " >" pwd1; echo; einfo "Retype the password"; read -rsp " >" pwd2; echo; if [[ "x$pwd1" != "x$pwd2" ]]; then die "Passwords are not the same!"; fi; MYSQL_ROOT_PASSWORD="${pwd1}"; unset pwd1 pwd2; echo; fi; local -a mysqld_options; use prefix && mysqld_options+=("--defaults-file='${MY_SYSCONFDIR}/my.cnf'"); local helpfile="${TMPDIR}/mysqld-help"; "${EROOT}/usr/sbin/mysqld" --verbose --help > "${helpfile}" 2> /dev/null; local opt optexp optfull; for opt in host-cache name-resolve networking slave-start federated ssl log-bin relay-log slow-query-log external-locking log-slave-updates; do optexp="--(skip-)?${opt}" optfull="--loose-skip-${opt}"; egrep -sq -- "${optexp}" "${helpfile}" && mysqld_options+=("${optfull}"); done; local tz_sql="${TMPDIR}/tz.sql"; echo "USE mysql;" > "${tz_sql}"; "${EROOT}/usr/bin/mysql_tzinfo_to_sql" "${EROOT}/usr/share/zoneinfo" >> "${tz_sql}" 2> /dev/null; if [[ $? -ne 0 ]]; then die "mysql_tzinfo_to_sql failed!"; fi; chown ${MYSQL_USER} "${tz_sql}" || die; local mysql_install_log="${TMPDIR}/mysql_install_db.log"; touch "${mysql_install_log}" || die; chown ${MYSQL_USER} "${mysql_install_log}" || die; local cmd=("${mysqld_binary}" "${mysqld_options[@]}" "--initialize-insecure" "--init-file='${tz_sql}'" "--basedir='${EROOT}/usr'" "--datadir='${MY_DATADIR}'" "--tmpdir='${MYSQL_TMPDIR}'" "--log-error='${mysql_install_log}'" "--user=${MYSQL_USER}"); einfo "Initializing ${PN} data directory: ${cmd[@]}"; eval "${cmd[@]}" >> "${mysql_install_log}" 2>&1; if [[ $? -ne 0 || ! -f "${MY_DATADIR}/mysql.ibd" ]]; then grep -B5 -A999 -iE "(Aborting|ERROR|errno)" "${mysql_install_log}" 1>&2; die "Failed to initialize ${PN} data directory. Please review '${mysql_install_log}'!"; fi; local x=${RANDOM}; local socket="${EROOT}/run/mysqld/mysqld${x}.sock"; local pidfile="${EROOT}/run/mysqld/mysqld${x}.pid"; unset x; local mysqld_logfile="${TMPDIR}/mysqld.log"; touch "${mysqld_logfile}" || die; chown ${MYSQL_USER} "${mysqld_logfile}" || die; cmd=("${mysqld_binary}" "${mysqld_options[@]}" "--basedir='${EROOT}/usr'" "--datadir='${MY_DATADIR}'" "--tmpdir='${MYSQL_TMPDIR}'" --max_allowed_packet=8M --net_buffer_length=16K "--socket='${socket}'" "--pid-file='${pidfile}'" "--log-error='${mysqld_logfile}'" "--user=${MYSQL_USER}"); einfo "Starting mysqld to finalize initialization: ${cmd[@]}"; eval "${cmd[@]}" >> "${mysqld_logfile}" 2>&1 & echo -n "Waiting for mysqld to accept connections "; local maxtry=15; while [[ ! -S "${socket}" && "${maxtry}" -gt 1 ]]; do maxtry=$((${maxtry}-1)); echo -n "."; sleep 1; done; if [[ -S "${socket}" ]]; then maxtry=5; while [[ -S "${socket}" && "${maxtry}" -gt 1 ]]; do maxtry=$((${maxtry}-1)); echo -n "."; sleep 1; done; fi; echo; if [[ ! -S "${socket}" ]]; then grep -B5 -A999 -iE "(Aborting|ERROR|errno)" "${mysqld_logfile}" 1>&2; die "mysqld was unable to start from initialized data directory. Please review '${mysqld_logfile}'!"; fi; local mysql_logfile="${TMPDIR}/set_root_pw.log"; touch "${mysql_logfile}" || die; ebegin "Setting root password"; local sql="ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}'"; cmd=("${mysql_binary}" --no-defaults "--socket='${socket}'" -hlocalhost "-e \"${sql}\""); eval "${cmd[@]}" > "${mysql_logfile}" 2>&1; local rc=$?; eend ${rc}; if [[ ${rc} -ne 0 ]]; then sed -i -e "s/${MYSQL_ROOT_PASSWORD}/*****/" "${mysql_logfile}" 2> /dev/null; grep -B5 -A999 -iE "(Aborting|ERROR|errno)" "${mysql_logfile}"; die "Failed to set ${PN} root password. Please review '${mysql_logfile}'!"; fi; if [[ -f "${pidfile}" ]] && pgrep -F "${pidfile}" &> /dev/null; then echo -n "Stopping the server "; pkill -F "${pidfile}" &> /dev/null; maxtry=10; while [[ -f "${pidfile}" ]] && pgrep -F "${pidfile}" &> /dev/null; do maxtry=$((${maxtry}-1)); echo -n "."; sleep 1; done; echo; if [[ -f "${pidfile}" ]] && pgrep -F "${pidfile}" &> /dev/null; then ewarn "WARNING: mysqld[$(cat "${pidfile}")] is still running!"; fi; fi; einfo "${PN} data directory at '${MY_DATADIR}' successfully initialized!" } pkg_nofetch () { default } pkg_postinst () { mysql_init_vars; [[ -d "${MY_LOGDIR}" ]] || install -d -m0750 -o mysql -g mysql "${MY_LOGDIR}"; einfo; elog "This version of ${PN} reorganizes the configuration from a single my.cnf"; elog "to several files in /etc/mysql/mysql.d."; elog "Please backup any changes you made to /etc/mysql/my.cnf"; elog "and add them as a new file under /etc/mysql/mysql.d with a .cnf extension."; elog "You may have as many files as needed and they are read alphabetically."; elog "Be sure the options have the appropriate section headers, i.e. [mysqld]."; einfo; if [[ -z "${REPLACING_VERSIONS}" ]]; then einfo; elog "You might want to run:"; elog " \"emerge --config =${CATEGORY}/${PF}\""; elog "if this is a new install."; einfo; else einfo; elog "Upgrade process for ${PN}-8.x has changed. Please read"; elog "https://dev.mysql.com/doc/refman/8.0/en/upgrade-binary-package.html"; einfo; fi } pkg_pretend () { [[ ${MERGE_TYPE} == binary ]] && return; use server && check-reqs_pkg_pretend } pkg_setup () { [[ ${MERGE_TYPE} == binary ]] && return; if has test ${FEATURES}; then [[ "${HOSTNAME}" == "localhost" ]] && die "Your machine must NOT be named localhost"; if ! has userpriv ${FEATURES}; then die "Testing with FEATURES=-userpriv is no longer supported by upstream. Tests MUST be run as non-root."; fi; local aio_max_nr=$(sysctl -n fs.aio-max-nr 2>/dev/null); [[ -z "${aio_max_nr}" || ${aio_max_nr} -lt 250000 ]] && die "FEATURES=test will require fs.aio-max-nr=250000 at minimum!"; if use latin1; then die "Testing with USE=latin1 is not supported."; fi; fi; if use kernel_linux; then if use numa; then linux-info_get_any_version; local CONFIG_CHECK="~NUMA"; local WARNING_NUMA="This package expects NUMA support in kernel which this system does not have at the moment;"; WARNING_NUMA+=" Either expect runtime errors, enable NUMA support in kernel or rebuild the package without NUMA support"; check_extra_config; fi; fi; use server && check-reqs_pkg_setup } prefixify_ro () { if [[ -e $1 ]]; then local f=${1##*/}; cp "$1" "${T}" || die "failed to copy file"; local x="${T}"/${f}; if grep -qs @GENTOO_PORTAGE_EPREFIX@ "${x}"; then eprefixify "${T}"/${f} 1>&2; else hprefixify "${T}"/${f} 1>&2; fi; echo "${x}"; else die "$1 does not exist"; fi } qeerror () { qout eerror "${@}" } qeinfo () { qout einfo "${@}" } 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}" } raw-ldflags () { local x input="$@"; [[ -z ${input} ]] && input=${LDFLAGS}; set --; for x in ${input}; do case ${x} in -Wl,*) x=${x#-Wl,}; set -- "$@" ${x//,/ } ;; *) ;; esac; done; echo "$@" } replace-cpu-flags () { local newcpu="$#"; newcpu="${!newcpu}"; while [ $# -gt 1 ]; do replace-flags "-march=${1}" "-march=${newcpu}"; replace-flags "-mcpu=${1}" "-mcpu=${newcpu}"; replace-flags "-mtune=${1}" "-mtune=${newcpu}"; shift; done; return 0 } replace-flags () { [[ $# != 2 ]] && die "Usage: replace-flags "; local f var new; for var in $(all-flag-vars); do new=(); for f in ${!var}; do [[ ${f} == ${1} ]] && f=${2}; new+=("${f}"); done; export ${var}="${new[*]}"; done; return 0 } replace-sparc64-flags () { [[ $# -ne 0 ]] && die "replace-sparc64-flags takes no arguments"; local SPARC64_CPUS="ultrasparc3 ultrasparc v9"; if [ "${CFLAGS/mtune}" != "${CFLAGS}" ]; then for x in ${SPARC64_CPUS}; do CFLAGS="${CFLAGS/-mcpu=${x}/-mcpu=v8}"; done; else for x in ${SPARC64_CPUS}; do CFLAGS="${CFLAGS/-mcpu=${x}/-mcpu=v8 -mtune=${x}}"; done; fi; if [ "${CXXFLAGS/mtune}" != "${CXXFLAGS}" ]; then for x in ${SPARC64_CPUS}; do CXXFLAGS="${CXXFLAGS/-mcpu=${x}/-mcpu=v8}"; done; else for x in ${SPARC64_CPUS}; do CXXFLAGS="${CXXFLAGS/-mcpu=${x}/-mcpu=v8 -mtune=${x}}"; done; fi; export CFLAGS CXXFLAGS } require_configured_kernel () { 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" } set_arch_to_kernel () { export ARCH=$(tc-arch-kernel) } set_arch_to_portage () { export ARCH=$(tc-arch) } setup-allowed-flags () { ALLOWED_FLAGS=(-pipe -O '-O[12sg]' -mcpu -march -mtune '-fstack-protector*' '-fsanitize*' '-fstack-check*' -fno-stack-check -fbounds-check -fbounds-checking -fno-strict-overflow -fno-PIE -fno-pie -nopie -no-pie -fno-unit-at-a-time -g '-g[0-9]' -ggdb '-ggdb[0-9]' '-gdwarf-*' gstabs -gstabs+ -gz -fno-ident -fpermissive -frecord-gcc-switches '-fdiagnostics*' '-fplugin*' '-W*' -w '-[DUILR]*' '-Wl,*' '-fuse-ld'); ALLOWED_FLAGS+=('-fno-stack-protector*' '-fabi-version=*' -fno-strict-aliasing -fno-bounds-check -fno-bounds-checking -fstrict-overflow -fno-omit-frame-pointer '-fno-builtin*'); ALLOWED_FLAGS+=(-mregparm -mno-app-regs -mapp-regs -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-ssse3 -mno-sse4 -mno-sse4.1 -mno-sse4.2 -mno-avx -mno-aes -mno-pclmul -mno-sse4a -mno-3dnow -mno-popcnt -mno-abm -mips1 -mips2 -mips3 -mips4 -mips32 -mips64 -mips16 -mplt -msoft-float -mno-soft-float -mhard-float -mno-hard-float -mfpu -mieee -mieee-with-inexact -mschedule -mfloat-gprs -mspe -mno-spe -mtls-direct-seg-refs -mno-tls-direct-seg-refs -mflat -mno-flat -mno-faster-structs -mfaster-structs -m32 -m64 -mx32 -mabi -mlittle-endian -mbig-endian -EL -EB -fPIC -mlive-g0 -mcmodel -mstack-bias -mno-stack-bias -msecure-plt '-m*-toc' -mfloat-abi -mfix-r10000 -mno-fix-r10000 -mthumb -marm -mno-fma4 -mno-movbe -mno-xop -mno-lwp -mno-fsgsbase -mno-rdrnd -mno-f16c -mno-bmi -mno-tbm -mno-avx2 -mno-bmi2 -mno-fma -mno-lzcnt -mno-fxsr -mno-hle -mno-rtm -mno-xsave -mno-xsaveopt -mno-avx512cd -mno-avx512er -mno-avx512f -mno-avx512pf -mno-sha); ALLOWED_FLAGS+=(-mstackrealign) } src_compile () { cmake-utils_src_compile "$@" } src_configure () { filter-flags "-O" "-O[01]"; append-cxxflags -felide-constructors; append-flags -fno-strict-aliasing; CMAKE_BUILD_TYPE="RelWithDebInfo"; mycmakeargs=(-DCMAKE_C_FLAGS_RELWITHDEBINFO="$(usex debug '' '-DNDEBUG')" -DCMAKE_CXX_FLAGS_RELWITHDEBINFO="$(usex debug '' '-DNDEBUG')" -DMYSQL_DATADIR="${EPREFIX}/var/lib/mysql" -DSYSCONFDIR="${EPREFIX}/etc/mysql" -DINSTALL_BINDIR=bin -DINSTALL_DOCDIR=share/doc/${PF} -DINSTALL_DOCREADMEDIR=share/doc/${PF} -DINSTALL_INCLUDEDIR=include/mysql -DINSTALL_INFODIR=share/info -DINSTALL_LIBDIR=$(get_libdir) -DINSTALL_MANDIR=share/man -DINSTALL_MYSQLSHAREDIR=share/mysql -DINSTALL_PLUGINDIR=$(get_libdir)/mysql/plugin -DINSTALL_MYSQLDATADIR="${EPREFIX}/var/lib/mysql" -DINSTALL_SBINDIR=sbin -DINSTALL_SUPPORTFILESDIR="${EPREFIX}/usr/share/mysql" -DCOMPILATION_COMMENT="Gentoo Linux ${PF}" -DWITH_UNIT_TESTS=$(usex test ON OFF) -DWITH_EDITLINE=bundled -DWITH_ZLIB=system -DWITH_SSL=system -DWITH_LIBWRAP=0 -DENABLED_LOCAL_INFILE=1 -DMYSQL_UNIX_ADDR="${EPREFIX}/var/run/mysqld/mysqld.sock" -DWITH_DEFAULT_COMPILER_OPTIONS=0 -DWITH_DEFAULT_FEATURE_SET=0 -DSTACK_DIRECTION=$(tc-stack-grows-down && echo -1 || echo 1) -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DWITH_CURL=system -DWITH_BOOST="${WORKDIR}/boost_$(ver_rs 1- _ ${MY_BOOST_VERSION})" -DWITH_ROUTER=$(usex router ON OFF)); if is-flagq -fno-lto; then einfo "LTO disabled via {C,CXX,F,FC}FLAGS"; mycmakeargs+=(-DWITH_LTO=OFF); else if is-flagq -flto; then einfo "LTO forced via {C,CXX,F,FC}FLAGS"; myconf+=(-DWITH_LTO=ON); else myconf+=(-DWITH_LTO=OFF); fi; fi; if use test; then mycmakeargs+=(-DINSTALL_MYSQLTESTDIR=share/mysql/mysql-test); else mycmakeargs+=(-DINSTALL_MYSQLTESTDIR=''); fi; mycmakeargs+=(-DWITHOUT_CLIENTLIBS=YES); mycmakeargs+=(-DWITH_ICU=system -DWITH_LZ4=system -DWITH_RAPIDJSON=bundled); if [[ -n "${MYSQL_DEFAULT_CHARSET}" && -n "${MYSQL_DEFAULT_COLLATION}" ]]; then ewarn "You are using a custom charset of ${MYSQL_DEFAULT_CHARSET}"; ewarn "and a collation of ${MYSQL_DEFAULT_COLLATION}."; ewarn "You MUST file bugs without these variables set."; ewarn "Tests will probably fail!"; mycmakeargs+=(-DDEFAULT_CHARSET=${MYSQL_DEFAULT_CHARSET} -DDEFAULT_COLLATION=${MYSQL_DEFAULT_COLLATION}); else if use latin1; then mycmakeargs+=(-DDEFAULT_CHARSET=latin1 -DDEFAULT_COLLATION=latin1_swedish_ci); else mycmakeargs+=(-DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_0900_ai_ci); fi; fi; if use server; then mycmakeargs+=(-DWITH_EXTRA_CHARSETS=all -DWITH_DEBUG=$(usex debug) -DWITH_LIBEVENT=system -DWITH_MECAB=$(usex cjk system OFF) -DWITH_NUMA=$(usex numa ON OFF) -DWITH_PAM=$(usex pam) -DWITH_PROTOBUF=system); if use profiling; then mycmakeargs+=(-DENABLED_PROFILING=ON); fi; mycmakeargs+=(-DWITH_EXAMPLE_STORAGE_ENGINE=0 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_CSV_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_HEAP_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_INNODB_MEMCACHED=0 -DWITH_MYISAMMRG_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_ROCKSDB=$(usex rocksdb 1 0) -DWITH_TOKUDB=$(usex tokudb 1 0)); else mycmakeargs+=(-DWITHOUT_SERVER=1 -DWITH_SYSTEMD=no); fi; cmake-utils_src_configure } src_install () { cmake-utils_src_install; mysql_init_vars; einfo "Making Convenience links for mysqlcheck multi-call binary"; dosym "mysqlcheck" "/usr/bin/mysqlanalyze"; dosym "mysqlcheck" "/usr/bin/mysqlrepair"; dosym "mysqlcheck" "/usr/bin/mysqloptimize"; if [[ -d "${ED}/usr/data" ]]; then rm -Rf "${ED}/usr/data" || die; fi; if ! use test; then rm -rf "${ED}/${MY_SHAREDSTATEDIR#${EPREFIX}}/mysql-test"; fi; einfo "Building default configuration ..."; insinto "${MY_SYSCONFDIR#${EPREFIX}}"; [[ -f "${S}/scripts/mysqlaccess.conf" ]] && doins "${S}"/scripts/mysqlaccess.conf; cp "${FILESDIR}/my.cnf-5.7" "${TMPDIR}/my.cnf" || die; eprefixify "${TMPDIR}/my.cnf"; doins "${TMPDIR}/my.cnf"; insinto "${MY_SYSCONFDIR#${EPREFIX}}/mysql.d"; cp "${FILESDIR}/my.cnf-8.0.distro-client" "${TMPDIR}/50-distro-client.cnf" || die; eprefixify "${TMPDIR}/50-distro-client.cnf"; doins "${TMPDIR}/50-distro-client.cnf"; mycnf_src="my.cnf-8.0.distro-server"; sed -e "s!@DATADIR@!${MY_DATADIR}!g" "${FILESDIR}/${mycnf_src}" > "${TMPDIR}/my.cnf.ok" || die; if use prefix; then sed -i -r -e '/^user[[:space:]]*=[[:space:]]*mysql$/d' "${TMPDIR}/my.cnf.ok" || die; fi; if use latin1; then sed -i -e "/character-set/s|utf8mb4|latin1|g" "${TMPDIR}/my.cnf.ok" || die; fi; eprefixify "${TMPDIR}/my.cnf.ok"; newins "${TMPDIR}/my.cnf.ok" 50-distro-server.cnf; [[ -e "${ED}/usr/bin/mytop" ]] && ! use perl && rm -f "${ED}/usr/bin/mytop"; if use router; then rm -rf "${ED}/usr/LICENSE.router" "${ED}/usr/README.router" "${ED}/usr/run" "${ED}/usr/var" || die; fi; find "${D}" -name 'libmysqlclient_r.*' -type l -delete || die } src_prepare () { sed -i -e 's/MY_RPM rpm/MY_RPM rpmNOTEXISTENT/' CMakeLists.txt || die; if use jemalloc; then echo "TARGET_LINK_LIBRARIES(mysqld jemalloc)" >> "${S}/sql/CMakeLists.txt" || die; fi; if use tcmalloc; then echo "TARGET_LINK_LIBRARIES(mysqld tcmalloc)" >> "${S}/sql/CMakeLists.txt" || die; fi; if [[ -d "${S}/support-files/SELinux" ]]; then echo > "${S}/support-files/SELinux/CMakeLists.txt" || die; fi; rm man/my_print_defaults.1 man/perror.1 man/zlib_decompress.1 || die; cmake-utils_src_prepare } src_test () { function _disable_test () { local rawtestname bug reason; rawtestname="${1}"; shift; bug="${1}"; shift; reason="${@}"; ewarn "test '${rawtestname}' disabled: '${reason}' (BUG#${bug})"; echo ${rawtestname} : BUG#${bug} ${reason} >> "${T}/disabled.def" }; local TESTDIR="${BUILD_DIR}/mysql-test"; local retstatus_unit; local retstatus_tests; cmake-utils_src_test; retstatus_unit=$?; export MTR_BUILD_THREAD="$((${RANDOM} % 100))"; if [[ -z "${MTR_PARALLEL}" ]]; then local -x MTR_PARALLEL=$(makeopts_jobs); if [[ ${MTR_PARALLEL} -gt 4 ]]; then local info_msg="Parallel MySQL test suite jobs limited to 4 (MAKEOPTS=${MTR_PARALLEL})"; info_msg+=" to avoid test failures. Set MTR_PARALLEL if you know what you are doing!"; einfo "${info_msg}"; unset info_msg; MTR_PARALLEL=4; fi; else einfo "MTR_PARALLEL is set to '${MTR_PARALLEL}'"; fi; mkdir -p "${T}"/var-tests{,/log} || die; pushd "${TESTDIR}" &> /dev/null || die; touch "${T}/disabled.def"; local -a disabled_tests; disabled_tests+=("auth_sec.keyring_file_data_qa;0;Won't work with user privileges"); disabled_tests+=("gis.spatial_analysis_functions_buffer;5452;Known rounding error with latest AMD processors (PS)"); disabled_tests+=("gis.gis_bugs_crashes;5452;Known rounding error with latest AMD processors (PS)"); disabled_tests+=("gis.geometry_class_attri_prop;5452;Known rounding error with latest AMD processors (PS)"); disabled_tests+=("gis.spatial_utility_function_distance_sphere;5452;Known rounding error with latest AMD processors (PS)"); disabled_tests+=("gis.geometry_property_function_issimple;5452;Known rounding error with latest AMD processors (PS)"); disabled_tests+=("gis.spatial_analysis_functions_centroid;5452;Known rounding error with latest AMD processors (PS)"); disabled_tests+=("gis.spatial_operators_intersection;5452;Known rounding error with latest AMD processors (PS)"); disabled_tests+=("gis.spatial_utility_function_simplify;5452;Known rounding error with latest AMD processors (PS)"); disabled_tests+=("gis.spatial_op_testingfunc_mix;5452;Known rounding error with latest AMD processors (PS)"); disabled_tests+=("gis.spatial_analysis_functions_distance;5452;Known rounding error with latest AMD processors (PS)"); disabled_tests+=("main.window_std_var;0;Known rounding error with latest AMD processors -- no upstream bug yet"); disabled_tests+=("main.window_std_var_optimized;0;Known rounding error with latest AMD processors -- no upstream bug yet"); disabled_tests+=("rpl_gtid.rpl_gtid_stm_drop_table;90612;Known test failure"); disabled_tests+=("rpl_gtid.rpl_multi_source_mtr_includes;0;Know failure - no upstream bug yet"); disabled_tests+=("sys_vars.myisam_data_pointer_size_func;87935;Test will fail on slow hardware"); disabled_tests+=("main.mysqlpump_basic_lz4;6042;Extra tool output causes false positive"); disabled_tests+=("main.ssl_bug75311;5996;Known test failure"); disabled_tests+=("x.message_protobuf_nested;6803;False positive caused by protobuff-3.11+"); disabled_tests+=("main.ssl_san;6808;False positive on IPv6-enabled hosts"); local test_ds; for test_infos_str in "${disabled_tests[@]}"; do IFS=';' read -r -a test_infos_arr <<< "${test_infos_str}"; if [[ ${#test_infos_arr[@]} != 3 ]]; then die "Invalid test data set, not matching format: ${test_infos_str}"; fi; _disable_test "${test_infos_arr[0]}" "${test_infos_arr[1]}" "${test_infos_arr[2]}"; done; unset test_ds test_infos_str test_infos_arr; if ! ulimit -n 16500 > /dev/null 2>&1; then ewarn "For maximum test coverage please raise open file limit to 16500 (ulimit -n 16500) before calling the package manager."; if ! ulimit -n 4162 > /dev/null 2>&1; then ewarn "For medium test coverage please raise open file limit to 4162 (ulimit -n 4162) before calling the package manager."; if ! ulimit -n 3000 > /dev/null 2>&1; then ewarn "For minimum test coverage please raise open file limit to 3000 (ulimit -n 3000) before calling the package manager."; else einfo "Will run test suite with open file limit set to 3000 (minimum test coverage)."; fi; else einfo "Will run test suite with open file limit set to 4162 (medium test coverage)."; fi; else einfo "Will run test suite with open file limit set to 16500 (best test coverage)."; fi; perl mysql-test-run.pl --force --vardir="${T}/var-tests" --reorder --skip-test=tokudb --skip-test-list="${T}/disabled.def"; retstatus_tests=$?; popd &> /dev/null || die; pkill -9 -f "${S}/ndb" 2> /dev/null; pkill -9 -f "${S}/sql" 2> /dev/null; local failures=""; [[ $retstatus_unit -eq 0 ]] || failures="${failures} test-unit"; [[ $retstatus_tests -eq 0 ]] || failures="${failures} tests"; [[ -z "$failures" ]] || die "Test failures: $failures"; einfo "Tests successfully completed" } src_unpack () { unpack ${A}; [[ "${MY_EXTRAS_VER}" == "live" ]] && S="${WORKDIR}/mysql-extras" git-r3_src_unpack; mv -f "${WORKDIR}/${MY_P}" "${S}" || die } strip-flags () { [[ $# -ne 0 ]] && die "strip-flags takes no arguments"; local x y var; local ALLOWED_FLAGS; setup-allowed-flags; set -f; for var in $(all-flag-vars); do local new=(); for x in ${!var}; do local flag=${x%%=*}; for y in "${ALLOWED_FLAGS[@]}"; do if [[ -z ${flag%%${y}} ]]; then new+=("${x}"); break; fi; done; done; if _is_flagq ${var} "-O*" && ! _is_flagq new "-O*"; then new+=(-O2); fi; if [[ ${!var} != "${new[*]}" ]]; then einfo "strip-flags: ${var}: changed '${!var}' to '${new[*]}'"; fi; export ${var}="${new[*]}"; done; set +f; return 0 } strip-linguas () { local ls newls nols; if [[ $1 == "-i" ]] || [[ $1 == "-u" ]]; then local op=$1; shift; ls=$(find "$1" -name '*.po' -exec basename {} .po ';'); shift; local d f; for d in "$@"; do if [[ ${op} == "-u" ]]; then newls=${ls}; else newls=""; fi; for f in $(find "$d" -name '*.po' -exec basename {} .po ';'); do if [[ ${op} == "-i" ]]; then has ${f} ${ls} && newls="${newls} ${f}"; else has ${f} ${ls} || newls="${newls} ${f}"; fi; done; ls=${newls}; done; else ls="$@"; fi; nols=""; newls=""; for f in ${LINGUAS}; do if has ${f} ${ls}; then newls="${newls} ${f}"; else nols="${nols} ${f}"; fi; done; [[ -n ${nols} ]] && einfo "Sorry, but ${PN} does not support the LINGUAS:" ${nols}; export LINGUAS=${newls:1} } strip-unsupported-flags () { [[ $# -ne 0 ]] && die "strip-unsupported-flags takes no arguments"; export CFLAGS=$(test-flags-CC ${CFLAGS}); export CXXFLAGS=$(test-flags-CXX ${CXXFLAGS}); export FFLAGS=$(test-flags-F77 ${FFLAGS}); export FCFLAGS=$(test-flags-FC ${FCFLAGS}); export LDFLAGS=$(test-flags-CCLD ${LDFLAGS}) } tc-arch () { tc-ninja_magic_to_arch portage "$@" } tc-arch-kernel () { tc-ninja_magic_to_arch kern "$@" } tc-check-openmp () { if ! tc-has-openmp; then eerror "Your current compiler does not support OpenMP!"; if tc-is-gcc; then eerror "Enable OpenMP support by building sys-devel/gcc with USE=\"openmp\"."; else if tc-is-clang; then eerror "OpenMP support in sys-devel/clang is provided by sys-libs/libomp."; fi; fi; die "Active compiler does not have required support for OpenMP"; fi } tc-cpp-is-true () { local CONDITION=${1}; shift; $(tc-getTARGET_CPP) "${@}" -P - <<-EOF > /dev/null 2>&1 #if ${CONDITION} true #else #error false #endif EOF } tc-detect-is-softfloat () { [[ $(tc-getTARGET_CPP) == "gcc -E" ]] && return 1; case ${CTARGET:-${CHOST}} in *-newlib | *-elf | *-eabi) return 1 ;; arm*) if tc-cpp-is-true "defined(__ARM_PCS_VFP)"; then echo "no"; else if tc-cpp-is-true "defined(__SOFTFP__)"; then echo "yes"; else echo "softfp"; fi; fi; return 0 ;; *) return 1 ;; esac } tc-enables-pie () { tc-cpp-is-true "defined(__PIE__)" ${CPPFLAGS} ${CFLAGS} } tc-enables-ssp () { tc-cpp-is-true "defined(__SSP__) || defined(__SSP_STRONG__) || defined(__SSP_ALL__)" ${CPPFLAGS} ${CFLAGS} } tc-enables-ssp-all () { tc-cpp-is-true "defined(__SSP_ALL__)" ${CPPFLAGS} ${CFLAGS} } tc-enables-ssp-strong () { tc-cpp-is-true "defined(__SSP_STRONG__) || defined(__SSP_ALL__)" ${CPPFLAGS} ${CFLAGS} } tc-endian () { local host=$1; [[ -z ${host} ]] && host=${CTARGET:-${CHOST}}; host=${host%%-*}; case ${host} in aarch64*be) echo big ;; aarch64) echo little ;; alpha*) echo little ;; arm*b*) echo big ;; arm*) echo little ;; cris*) echo little ;; hppa*) echo big ;; i?86*) echo little ;; ia64*) echo little ;; m68*) echo big ;; mips*l*) echo little ;; mips*) echo big ;; powerpc*le) echo little ;; powerpc*) echo big ;; riscv*) echo little ;; s390*) echo big ;; sh*b*) echo big ;; sh*) echo little ;; sparc*) echo big ;; x86_64*) echo little ;; *) echo wtf ;; esac } tc-env_build () { tc-export_build_env; CFLAGS=${BUILD_CFLAGS} CXXFLAGS=${BUILD_CXXFLAGS} CPPFLAGS=${BUILD_CPPFLAGS} LDFLAGS=${BUILD_LDFLAGS} AR=$(tc-getBUILD_AR) AS=$(tc-getBUILD_AS) CC=$(tc-getBUILD_CC) CPP=$(tc-getBUILD_CPP) CXX=$(tc-getBUILD_CXX) LD=$(tc-getBUILD_LD) NM=$(tc-getBUILD_NM) PKG_CONFIG=$(tc-getBUILD_PKG_CONFIG) RANLIB=$(tc-getBUILD_RANLIB) "$@" } tc-export () { local var; for var in "$@"; do [[ $(type -t "tc-get${var}") != "function" ]] && die "tc-export: invalid export variable '${var}'"; "tc-get${var}" > /dev/null; done } tc-export_build_env () { tc-export "$@"; if tc-is-cross-compiler; then : ${BUILD_CFLAGS:=-O1 -pipe}; : ${BUILD_CXXFLAGS:=-O1 -pipe}; : ${BUILD_CPPFLAGS:= }; : ${BUILD_LDFLAGS:= }; else : ${BUILD_CFLAGS:=${CFLAGS}}; : ${BUILD_CXXFLAGS:=${CXXFLAGS}}; : ${BUILD_CPPFLAGS:=${CPPFLAGS}}; : ${BUILD_LDFLAGS:=${LDFLAGS}}; fi; export BUILD_{C,CXX,CPP,LD}FLAGS; local v; for v in BUILD_{C,CXX,CPP,LD}FLAGS; do export ${v#BUILD_}_FOR_BUILD="${!v}"; done } tc-get-compiler-type () { local code=' #if defined(__PATHSCALE__) HAVE_PATHCC #elif defined(__clang__) HAVE_CLANG #elif defined(__GNUC__) HAVE_GCC #endif '; local res=$($(tc-getCPP "$@") -E -P - <<<"${code}"); case ${res} in *HAVE_PATHCC*) echo pathcc ;; *HAVE_CLANG*) echo clang ;; *HAVE_GCC*) echo gcc ;; *) echo unknown ;; esac } tc-getAR () { tc-getPROG AR ar "$@" } tc-getAS () { tc-getPROG AS as "$@" } tc-getBUILD_AR () { tc-getBUILD_PROG AR ar "$@" } tc-getBUILD_AS () { tc-getBUILD_PROG AS as "$@" } tc-getBUILD_CC () { tc-getBUILD_PROG CC gcc "$@" } tc-getBUILD_CPP () { tc-getBUILD_PROG CPP "$(tc-getBUILD_CC) -E" "$@" } tc-getBUILD_CXX () { tc-getBUILD_PROG CXX g++ "$@" } tc-getBUILD_LD () { tc-getBUILD_PROG LD ld "$@" } tc-getBUILD_NM () { tc-getBUILD_PROG NM nm "$@" } tc-getBUILD_OBJCOPY () { tc-getBUILD_PROG OBJCOPY objcopy "$@" } tc-getBUILD_PKG_CONFIG () { tc-getBUILD_PROG PKG_CONFIG pkg-config "$@" } tc-getBUILD_PROG () { local vars="BUILD_$1 $1_FOR_BUILD HOST$1"; tc-is-cross-compiler || vars+=" $1"; _tc-getPROG CBUILD "${vars}" "${@:2}" } tc-getBUILD_RANLIB () { tc-getBUILD_PROG RANLIB ranlib "$@" } tc-getBUILD_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-getSTRIP () { tc-getPROG STRIP strip "$@" } tc-getTARGET_CPP () { if [[ -n ${CTARGET} ]]; then _tc-getPROG CTARGET TARGET_CPP "gcc -E" "$@"; else tc-getCPP "$@"; fi } tc-has-openmp () { local base="${T}/test-tc-openmp"; cat <<-EOF > "${base}.c" #include int main() { int nthreads, tid, ret = 0; #pragma omp parallel private(nthreads, tid) { tid = omp_get_thread_num(); nthreads = omp_get_num_threads(); ret += tid + nthreads; } return ret; } EOF $(tc-getCC "$@") -fopenmp "${base}.c" -o "${base}" &> /dev/null; local ret=$?; rm -f "${base}"*; return ${ret} } tc-has-tls () { local base="${T}/test-tc-tls"; cat <<-EOF > "${base}.c" int foo(int *i) { static __thread int j = 0; return *i ? j : *i; } EOF local flags; case $1 in -s) flags="-S" ;; -c) flags="-c" ;; -l) ;; -*) die "Usage: tc-has-tls [-c|-l] [toolchain prefix]" ;; esac; : ${flags:=-fPIC -shared -Wl,-z,defs}; [[ $1 == -* ]] && shift; $(tc-getCC "$@") ${flags} "${base}.c" -o "${base}" &> /dev/null; local ret=$?; rm -f "${base}"*; return ${ret} } tc-is-clang () { [[ $(tc-get-compiler-type) == clang ]] } tc-is-cross-compiler () { [[ ${CBUILD:-${CHOST}} != ${CHOST} ]] } tc-is-gcc () { [[ $(tc-get-compiler-type) == gcc ]] } tc-is-softfloat () { tc-detect-is-softfloat || tc-tuple-is-softfloat } tc-is-static-only () { local host=${CTARGET:-${CHOST}}; [[ ${host} == *-mint* ]] } tc-ld-disable-gold () { if ! tc-ld-is-gold "$@"; then return; fi; ewarn "Forcing usage of the BFD linker instead of GOLD"; local ld=$(tc-getLD "$@"); local bfd_ld="${ld%% *}.bfd"; local path_ld=$(which "${bfd_ld}" 2>/dev/null); [[ -e ${path_ld} ]] && export LD=${bfd_ld}; local fallback="true"; if tc-is-gcc; then local major=$(gcc-major-version "$@"); local minor=$(gcc-minor-version "$@"); if [[ ${major} -gt 4 ]] || [[ ${major} -eq 4 && ${minor} -ge 8 ]]; then export LDFLAGS="${LDFLAGS} -fuse-ld=bfd"; fallback="false"; fi; else if tc-is-clang; then local major=$(clang-major-version "$@"); local minor=$(clang-minor-version "$@"); if [[ ${major} -gt 3 ]] || [[ ${major} -eq 3 && ${minor} -ge 5 ]]; then export LDFLAGS="${LDFLAGS} -fuse-ld=bfd"; fallback="false"; fi; fi; fi; if [[ ${fallback} == "true" ]]; then if [[ -e ${path_ld} ]]; then local d="${T}/bfd-linker"; mkdir -p "${d}"; ln -sf "${path_ld}" "${d}"/ld; export LDFLAGS="${LDFLAGS} -B${d}"; else die "unable to locate a BFD linker to bypass gold"; fi; fi } tc-ld-is-gold () { local out; out=$($(tc-getLD "$@") --version 2>&1); if [[ ${out} == *"GNU gold"* ]]; then return 0; fi; local base="${T}/test-tc-gold"; cat <<-EOF > "${base}.c" int main() { return 0; } EOF out=$($(tc-getCC "$@") ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} -Wl,--version "${base}.c" -o "${base}" 2>&1); rm -f "${base}"*; if [[ ${out} == *"GNU gold"* ]]; then return 0; fi; return 1 } tc-ld-is-lld () { local out; out=$($(tc-getLD "$@") --version 2>&1); if [[ ${out} == *"LLD"* ]]; then return 0; fi; local base="${T}/test-tc-lld"; cat <<-EOF > "${base}.c" int main() { return 0; } EOF out=$($(tc-getCC "$@") ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} -Wl,--version "${base}.c" -o "${base}" 2>&1); rm -f "${base}"*; if [[ ${out} == *"LLD"* ]]; then return 0; fi; return 1 } tc-ninja_magic_to_arch () { function ninj () { [[ ${type} == "kern" ]] && echo $1 || echo $2 }; local type=$1; local host=$2; [[ -z ${host} ]] && host=${CTARGET:-${CHOST}}; case ${host} in aarch64*) echo arm64 ;; alpha*) echo alpha ;; arm*) echo arm ;; avr*) ninj avr32 avr ;; bfin*) ninj blackfin bfin ;; c6x*) echo c6x ;; cris*) echo cris ;; frv*) echo frv ;; hexagon*) echo hexagon ;; hppa*) ninj parisc hppa ;; i?86*) if [[ ${type} == "kern" && ${host} == *freebsd* ]]; then echo i386; else echo x86; fi ;; ia64*) echo ia64 ;; m68*) echo m68k ;; metag*) echo metag ;; microblaze*) echo microblaze ;; mips*) echo mips ;; nios2*) echo nios2 ;; nios*) echo nios ;; or1k | or32*) echo openrisc ;; powerpc*) if [[ ${type} == "kern" ]]; then echo powerpc; else if [[ ${host} == powerpc64* ]]; then echo ppc64; else echo ppc; fi; fi ;; riscv*) echo riscv ;; s390*) echo s390 ;; score*) echo score ;; sh64*) ninj sh64 sh ;; sh*) echo sh ;; sparc64*) ninj sparc64 sparc ;; sparc*) [[ ${PROFILE_ARCH} == "sparc64" ]] && ninj sparc64 sparc || echo sparc ;; tile*) echo tile ;; vax*) echo vax ;; x86_64*freebsd*) echo amd64 ;; x86_64*) if [[ ${type} == "kern" ]]; then echo x86; else echo amd64; fi ;; xtensa*) echo xtensa ;; *) echo unknown ;; esac } tc-stack-grows-down () { case ${ARCH} in hppa | metag) return 1 ;; esac; return 0 } tc-tuple-is-softfloat () { local CTARGET=${CTARGET:-${CHOST}}; case ${CTARGET//_/-} in bfin* | h8300*) echo "only" ;; *-softfloat-*) echo "yes" ;; *-softfp-*) echo "softfp" ;; arm*-hardfloat-* | arm*eabihf) echo "no" ;; *-newlib | *-elf | *-eabi) echo "no" ;; arm*) echo "yes" ;; *) echo "no" ;; esac } test-flag-CC () { test-flag-PROG "CC" c "$@" } test-flag-CCLD () { test-flag-PROG "CC" c+ld "$@" } test-flag-CXX () { test-flag-PROG "CXX" c++ "$@" } test-flag-F77 () { test-flag-PROG "F77" f77 "$@" } test-flag-FC () { test-flag-PROG "FC" f95 "$@" } test-flag-PROG () { local comp=$1; local lang=$2; shift 2; if [[ -z ${comp} ]]; then return 1; fi; if [[ -z $1 ]]; then return 1; fi; comp=($(tc-get${comp})); if ! type -p ${comp[0]} > /dev/null; then return 1; fi; local in_src in_ext cmdline_extra=(); case "${lang}" in c) in_ext='c'; in_src='int main(void) { return 0; }'; cmdline_extra+=(-xc -c) ;; c++) in_ext='cc'; in_src='int main(void) { return 0; }'; cmdline_extra+=(-xc++ -c) ;; f77) in_ext='f'; in_src=' end'; cmdline_extra+=(-xf77 -c) ;; f95) in_ext='f90'; in_src='end'; cmdline_extra+=(-xf95 -c) ;; c+ld) in_ext='c'; in_src='int main(void) { return 0; }'; cmdline_extra+=(-xc) ;; esac; local test_in=${T}/test-flag.${in_ext}; local test_out=${T}/test-flag.exe; printf "%s\n" "${in_src}" > "${test_in}" || die "Failed to create '${test_in}'"; local cmdline=("${comp[@]}" "$@" "${cmdline_extra[@]}" "${test_in}" -o "${test_out}"); "${cmdline[@]}" &> /dev/null } test-flags () { test-flags-CC "$@" } test-flags-CC () { test-flags-PROG "CC" "$@" } test-flags-CCLD () { test-flags-PROG "CCLD" "$@" } test-flags-CXX () { test-flags-PROG "CXX" "$@" } test-flags-F77 () { test-flags-PROG "F77" "$@" } test-flags-FC () { test-flags-PROG "FC" "$@" } test-flags-PROG () { local comp=$1; local flags=(); local x; shift; [[ -z ${comp} ]] && return 1; while (( $# )); do case "$1" in --param | -B) if test-flag-${comp} "$1" "$2"; then flags+=("$1" "$2"); fi; shift 2 ;; *) if test-flag-${comp} "$1"; then flags+=("$1"); fi; shift 1 ;; esac; done; echo "${flags[*]}"; [[ ${#flags[@]} -gt 0 ]] } test_version_info () { if [[ $($(tc-getCC) --version 2>&1) == *$1* ]]; then return 0; else return 1; fi } use_if_iuse () { in_iuse $1 || return 1; use $1 } ver_cut () { local range=${1}; local v=${2:-${PV}}; local start end; local -a comp; __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_RUNTIME_DIR="${T}/run"; mkdir -p "${XDG_DATA_HOME}" "${XDG_CONFIG_HOME}" "${XDG_CACHE_HOME}" "${XDG_RUNTIME_DIR}" || die; chmod 0700 "${XDG_RUNTIME_DIR}" || die; unset DBUS_SESSION_BUS_ADDRESS } xdg_icon_cache_update () { if [[ ${EBUILD_PHASE} != post* ]]; then die "xdg_icon_cache_update must be used in pkg_post* phases."; fi; if ! type gtk-update-icon-cache &> /dev/null; then debug-print "gtk-update-icon-cache is not found"; return; fi; ebegin "Updating icons cache"; local dir f retval=0; local fails=(); for dir in "${EROOT%/}"/usr/share/icons/*; do if [[ -f "${dir}/index.theme" ]]; then local rv=0; gtk-update-icon-cache -qf "${dir}"; rv=$?; if [[ ! $rv -eq 0 ]]; then debug-print "Updating cache failed on ${dir}"; fails+=("${dir}"); retval=2; fi; else if [[ $(ls "${dir}") = "icon-theme.cache" ]]; then rm "${dir}/icon-theme.cache"; fi; fi; if [[ -z $(ls "${dir}") ]]; then rmdir "${dir}"; fi; done; eend ${retval}; for f in "${fails[@]}"; do eerror "Failed to update cache with icon $f"; done } xdg_mimeinfo_database_update () { if [[ ${EBUILD_PHASE} != post* ]]; then die "xdg_mimeinfo_database_update must be used in pkg_post* phases."; fi; if ! type update-mime-database &> /dev/null; then debug-print "update-mime-database is not found"; return; fi; ebegin "Updating shared mime info database"; update-mime-database "${EROOT%/}${MIMEINFO_DATABASE_DIR}"; eend $? }