declare -x ABI="amd64" declare -x ALSA_CARDS="" declare -x ALSA_PCM_PLUGINS="adpcm alaw asym copy dmix dshare dsnoop empty extplug file hooks iec958 ioplug ladspa lfloat linear meter mmap_emul mulaw multi null plug rate route share shm softvol" declare -x ANT_HOME="/usr/share/ant" declare -x APACHE2_MODULES="authn_core authz_core socache_shmcb unixd actions alias auth_basic authn_alias authn_anon authn_dbm authn_default authn_file authz_dbm authz_default authz_groupfile authz_host authz_owner authz_user autoindex cache cgi cgid dav dav_fs dav_lock deflate dir disk_cache env expires ext_filter file_cache filter headers include info log_config logio mem_cache mime mime_magic negotiation rewrite setenvif speling status unique_id userdir usertrack vhost_alias" declare -x ARCH="amd64" declare -- AUTOMAKE_VERSION="1.11" declare -x BOOTSTRAP_USE="cxx unicode multilib" declare -x CALLIGRA_FEATURES="kexi words flow plan sheets stage tables krita karbon braindump" declare -x CAMERAS="ptp2" declare -x CBUILD="x86_64-pc-linux-gnu" declare -x CFLAGS="-O2 -march=native -pipe -fomit-frame-pointer" declare -x CFLAGS_amd64="-m64" declare -x CFLAGS_default declare -x CFLAGS_x32="-mx32" declare -x CFLAGS_x86="-m32" declare -x CHOST="x86_64-pc-linux-gnu" declare -x CHOST_amd64="x86_64-pc-linux-gnu" declare -x CHOST_default="x86_64-pc-linux-gnu" declare -x CHOST_x32="x86_64-pc-linux-gnux32" declare -x CHOST_x86="i686-pc-linux-gnu" declare -x COLLECTD_PLUGINS="df interface irq load memory rrdtool swap syslog" declare -x CROSSCOMPILE_OPTS="" declare -x CTARGET_default="x86_64-pc-linux-gnu" declare -- CURRENT_FRIBIDI_CFLAGS="-I/usr/include/fribidi -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include " declare -x CXXFLAGS="-O2 -march=native -pipe -fomit-frame-pointer" declare -x DBUS_SESSION_BUS_ADDRESS="unix:abstract=/tmp/dbus-7Xd9F7wf8Q,guid=312dda34180637042f2e9db150ee245d" declare -x DCCC_PATH="/usr/lib64/distcc/bin" declare -x DEFAULT_ABI="amd64" declare -x DEFINED_PHASES=" compile configure install postinst postrm preinst prepare setup unpack" declare DEPEND="sys-libs/zlib app-arch/bzip2 dev-libs/fribidi dev-libs/glib:2 gtk? ( >=dev-libs/dbus-glib-0.98 x11-libs/gtk+:2 >=sys-fs/udev-171[gudev] x11-libs/libnotify ) gstreamer? ( media-libs/gstreamer media-libs/gst-plugins-base ) =dev-lang/python-2* sys-devel/automake:1.11 virtual/pkgconfig gtk? ( dev-util/intltool ) >=sys-apps/sed-4" declare DESCRIPTION="Open-source DVD to Video converter" declare -x DESKTOP_SESSION="gnome" declare -x DESTTREE="/usr" declare -x DIROPTIONS="-m0755" declare -x EAPI="2" declare -x ELIBC="glibc" declare -x EPYTHON="python2.7" declare -x EXEOPTIONS="-m0755" declare -x FCFLAGS="-O2 -pipe" declare -x FETCHCOMMAND_SSH="bash -c \"x=\\\${2#ssh://} ; host=\\\${x%%/*} ; port=\\\${host##*:} ; host=\\\${host%:*} ; [[ \\\${host} = \\\${port} ]] && port=22 ; exec rsync --rsh=\\\"ssh -p\\\${port}\\\" -avP \\\"\\\${host}:/\\\${x#*/}\\\" \\\"\\\$1\\\"\" rsync \"\${DISTDIR}/\${FILE}\" \"\${URI}\"" declare -x FFLAGS="-O2 -pipe" declare -- FRIBIDI_FIX_PATH="/var/tmp/portage/media-video/handbrake-0.9.8/work/HandBrake-0.9.8/build/GNUmakefile.custom.defs" declare -x GCC_SPECS="" declare -- GCONFTOOL_BIN="/usr/bin/gconftool-2" declare -x GDMSESSION="gnome" declare -x GJS_DEBUG_OUTPUT="stderr" declare -x GJS_DEBUG_TOPICS="JS ERROR;JS LOG" declare -- GLIB_COMPILE_SCHEMAS="/usr/bin/glib-compile-schemas" declare -x GNOME_DESKTOP_SESSION_ID="this-is-deprecated" declare -x GNOME_KEYRING_CONTROL="/home/chris/.cache/keyring-lc6rtN" declare -x GNOME_KEYRING_PID="3693" declare -x GPSD_PROTOCOLS="ashtech aivdm earthmate evermore fv18 garmin garmintxt gpsclock itrax mtk3301 nmea ntrip navcom oceanserver oldstyle oncore rtcm104v2 rtcm104v3 sirf superstar2 timing tsip tripmate tnt ubx" declare -x GRUB_PLATFORMS="" declare -x GSETTINGS_BACKEND="dconf" declare -- GTK_UPDATE_ICON_CACHE="/usr/bin/gtk-update-icon-cache" declare -x GUILE_LOAD_PATH="/usr/share/guile/1.8" declare HDEPEND="" declare -x HG="/usr/bin/hg" declare HOMEPAGE="http://handbrake.fr" declare -x INHERITED=" multilib toolchain-funcs python gnome2-utils" declare -x INPUT_DEVICES="evdev keyboard mouse" declare -x INSDESTTREE="" declare -x INSOPTIONS="-m0644" declare IUSE="gtk gstreamer ffmpeg2 " declare -x IUSE_IMPLICIT="prefix" declare -x JAVAC="/etc/java-config-2/current-system-vm/bin/javac" declare -x JAVA_HOME="/etc/java-config-2/current-system-vm" declare -x JDK_HOME="/etc/java-config-2/current-system-vm" declare -x KERNEL="linux" declare -x KERNEL_ABI="amd64" declare -x KEYWORDS="~amd64 ~x86" declare -x KV="3.7.1-gentoo" declare -x LCD_DEVICES="" 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 LESS_ADVANCED_PREPROCESSOR="1" declare -x LIBBLURAY_CP="/usr/share/libbluray/lib/libbluray.jar" declare -x LIBDIR_amd64="lib64" declare -x LIBDIR_amd64_fbsd="lib64" declare -x LIBDIR_default="lib" declare -x LIBDIR_n32="lib32" declare -x LIBDIR_n64="lib64" declare -x LIBDIR_o32="lib" declare -x LIBDIR_ppc="lib32" declare -x LIBDIR_ppc64="lib64" declare -x LIBDIR_s390="lib32" declare -x LIBDIR_s390x="lib64" declare -x LIBDIR_sparc32="lib32" declare -x LIBDIR_sparc64="lib64" declare -x LIBDIR_x32="libx32" declare -x LIBDIR_x86="lib32" declare -x LIBDIR_x86_fbsd="lib32" declare -x LIBOPTIONS="-m0644" declare -x LIBREOFFICE_EXTENSIONS="presenter-console presenter-minimizer nlpsolver pdfimport" declare -x LICENSE="GPL-2 GPL-3 BSD MIT" declare -x LINGUAS="en en_US es es_LA es_MX ja ko zh_CN zh_TW zh" declare -x MAIL="/var/mail/chris" declare -x MAKEOPTS="-j5" declare -x MULTILIB_ABIS="amd64 x86" declare -x MULTILIB_STRICT_DENY="64-bit.*shared object" declare -x MULTILIB_STRICT_DIRS="/lib32 /lib /usr/lib32 /usr/lib /usr/kde/*/lib32 /usr/kde/*/lib /usr/qt/*/lib32 /usr/qt/*/lib /usr/X11R6/lib32 /usr/X11R6/lib" declare -x MULTILIB_STRICT_EXEMPT="(perl5|gcc|gcc-lib|binutils|eclipse-3|debug|portage|udev)" declare -- MY_P="HandBrake-0.9.8" declare -x NETBEANS="apisupport cnd groovy gsf harness ide identity j2ee java mobility nb php profiler soa visualweb webcommon websvccommon xml" declare -x NETBEANS_MODULES="apisupport cnd dlight enterprise ergonomics groovy java javacard javafx mobility php profiler websvccommon" declare -x OPENCL_PROFILE="nvidia" declare -x OPENGL_PROFILE="nvidia" declare -x PALUDIS_OPTIONS="--debug-build split --resume-command-template /tmp/RESUME_PALUDIS --log-level warning --dl-upgrade always --dl-reinstall if-use-changed --dl-installed-deps-pre pre-or-post" declare -x PATH="/usr/lib64/ccache/bin:/usr/lib64/portage/bin/ebuild-helpers:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/4.6.3" declare PDEPEND="" declare -x PHP_TARGETS="" declare -x PKG_CONFIG_PATH="/usr/lib64/pkgconfig" declare -a PORTAGE_DOCOMPRESS='([0]="/usr/share/doc" [1]="/usr/share/info" [2]="/usr/share/man")' declare -a PORTAGE_DOCOMPRESS_SKIP='([0]="/usr/share/doc/handbrake-0.9.8/html")' declare -x PORTAGE_NICENESS="19" declare -x PRELINK_PATH_MASK="/usr/lib64/klibc:/usr/lib64/libfreebl3.so:/usr/lib64/libnssdbm3.so:/usr/lib64/libsoftokn3.so" declare -x PROFILE_ONLY_VARIABLES="ARCH ELIBC IUSE_IMPLICIT KERNEL USERLAND USE_EXPAND_IMPLICIT USE_EXPAND_UNPREFIXED USE_EXPAND_VALUES_ARCH USE_EXPAND_VALUES_ELIBC USE_EXPAND_VALUES_KERNEL USE_EXPAND_VALUES_USERLAND" declare -x PROPERTIES="" declare -x PROVIDE="" declare -x PYTHONDONTWRITEBYTECODE="1" declare -x PYTHONPATH="/usr/lib/portage/pym" declare -- PYTHON_ABI="2.7" declare -- PYTHON_COLORS="0" declare -- PYTHON_REQUESTED_ACTIVE_VERSION="2" declare -- PYTHON_SANITY_CHECKS_EXECUTED="1" declare -x PYTHON_SINGLE_TARGET="" declare -x PYTHON_TARGETS="" declare -- PYTHON_TEST_VERBOSITY="1" declare -x QT_GRAPHICSSYSTEM="raster" declare -x QT_IM_MODULE="ibus" declare -x RDEPEND="sys-libs/zlib app-arch/bzip2 dev-libs/fribidi dev-libs/glib:2 gtk? ( >=dev-libs/dbus-glib-0.98 x11-libs/gtk+:2 >=sys-fs/udev-171[gudev] x11-libs/libnotify ) gstreamer? ( media-libs/gstreamer media-libs/gst-plugins-base ) " declare REPOSITORY declare REQUIRED_USE="" declare -x RESTRICT="" declare -x RESUMECOMMAND_SSH="bash -c \"x=\\\${2#ssh://} ; host=\\\${x%%/*} ; port=\\\${host##*:} ; host=\\\${host%:*} ; [[ \\\${host} = \\\${port} ]] && port=22 ; exec rsync --rsh=\\\"ssh -p\\\${port}\\\" -avP \\\"\\\${host}:/\\\${x#*/}\\\" \\\"\\\$1\\\"\" rsync \"\${DISTDIR}/\${FILE}\" \"\${URI}\"" declare -x RUBYOPT="-rauto_gem" declare -x RUBY_TARGETS="ruby18 ruby19" declare -x S="/var/tmp/portage/media-video/handbrake-0.9.8/work/HandBrake-0.9.8" declare -x SANDBOX_DEBUG="0" declare -x SANDBOX_DENY="" declare -x SANDBOX_PID="4932" declare -x SANDBOX_PREDICT="/var/tmp/portage/media-video/handbrake-0.9.8/homedir:/dev/crypto:/proc/self/coredump_filter:/var/cache/fontconfig" declare -x SANDBOX_READ="/:/var/tmp:/var/tmp/ccache" declare -x SANDBOX_VERBOSE="1" declare -x SANDBOX_WRITE=":/dev/console:/dev/fd:/dev/full:/dev/null:/dev/pts/:/dev/pty:/dev/shm:/dev/tts:/dev/tty:/dev/vc/:/dev/zero:/proc/self/fd:/tmp/:/usr/lib/cf:/usr/lib/conftest:/usr/lib32/cf:/usr/lib32/conftest:/usr/lib64/cf:/usr/lib64/conftest:/usr/tmp/cf:/usr/tmp/conftest:/var/tmp:/var/tmp/:/var/tmp/ccache:/var/tmp/portage/media-video/handbrake-0.9.8/homedir/.bash_history" declare -- SCROLLKEEPER_DIR="/var/lib/scrollkeeper" declare -- SCROLLKEEPER_UPDATE_BIN="/usr/bin/scrollkeeper-update" declare -x SESSION_MANAGER="local/desktop:@/tmp/.ICE-unix/3709,unix/desktop:/tmp/.ICE-unix/3709" declare -x SLOT="0" declare SRC_URI="mirror://sourceforge/handbrake/0.9.8/HandBrake-0.9.8.tar.bz2 http://download.handbrake.fr/handbrake/contrib/a52dec-0.7.4.tar.gz -> a52dec-0.7.4-handbrake.tar.gz http://download.handbrake.fr/handbrake/contrib/faac-1.28.tar.gz -> faac-1.28-handbrake.tar.gz http://download.handbrake.fr/handbrake/contrib/faad2-2.7.tar.gz -> faad2-2.7-handbrake.tar.gz http://download.handbrake.fr/handbrake/contrib/ffmpeg-v0.7-1696-gcae4f4b.tar.bz2 -> ffmpeg-v0.7-1696-gcae4f4b-handbrake.tar.bz2 http://download.handbrake.fr/handbrake/contrib/fontconfig-2.8.0.tar.gz -> fontconfig-2.8.0-handbrake.tar.gz http://download.handbrake.fr/handbrake/contrib/freetype-2.4.7.tar.bz2 -> freetype-2.4.7-handbrake.tar.bz2 http://download.handbrake.fr/handbrake/contrib/lame-3.98.tar.gz -> lame-3.98-handbrake.tar.gz http://download.handbrake.fr/handbrake/contrib/libass-0.10.0-1.tar.gz -> libass-0.10.0-1-handbrake.tar.gz http://download.handbrake.fr/handbrake/contrib/libbluray-0.0.1-pre-213-ga869da8.tar.gz -> libbluray-0.0.1-pre-213-ga869da8-handbrake.tar.gz http://download.handbrake.fr/handbrake/contrib/libdca-r81-strapped.tar.gz -> libdca-r81-strapped-handbrake.tar.gz http://download.handbrake.fr/handbrake/contrib/libdvdnav-svn1168.tar.gz -> libdvdnav-svn1168-handbrake.tar.gz http://download.handbrake.fr/handbrake/contrib/libdvdread-svn1168.tar.gz -> libdvdread-svn1168-handbrake.tar.gz http://download.handbrake.fr/handbrake/contrib/libiconv-1.13.tar.bz2 -> libiconv-1.13-handbrake.tar.bz2 http://download.handbrake.fr/handbrake/contrib/libmkv-0.6.5-0-g82075ae.tar.gz -> libmkv-0.6.5-0-g82075ae-handbrake.tar.gz http://download.handbrake.fr/handbrake/contrib/libogg-1.3.0.tar.gz -> libogg-1.3.0-handbrake.tar.gz http://download.handbrake.fr/handbrake/contrib/libsamplerate-0.1.4.tar.gz -> libsamplerate-0.1.4-handbrake.tar.gz http://download.handbrake.fr/handbrake/contrib/libtheora-1.1.0.tar.bz2 -> libtheora-1.1.0-handbrake.tar.bz2 http://download.handbrake.fr/handbrake/contrib/libvorbis-aotuv_b6.03.tar.bz2 -> libvorbis-aotuv_b6.03-handbrake.tar.bz2 http://download.handbrake.fr/handbrake/contrib/libxml2-2.7.7.tar.gz -> libxml2-2.7.7-handbrake.tar.gz http://download.handbrake.fr/handbrake/contrib/mp4v2-trunk-r355.tar.bz2 -> mp4v2-trunk-r355-handbrake.tar.bz2 http://download.handbrake.fr/handbrake/contrib/mpeg2dec-0.5.1.tar.gz -> mpeg2dec-0.5.1-handbrake.tar.gz http://download.handbrake.fr/handbrake/contrib/x264-r2146-bcd41db.tar.gz -> x264-r2146-bcd41db-handbrake.tar.gz http://download.handbrake.fr/handbrake/contrib/yasm-1.1.0.tar.gz -> yasm-1.1.0-handbrake.tar.gz" declare -x SYMLINK_LIB="yes" declare -x USE="amd64 elibc_glibc gstreamer gtk kernel_linux multilib userland_GNU" declare -x USERLAND="GNU" declare -x USERNAME="chris" declare -x USE_EXPAND_IMPLICIT="ARCH ELIBC KERNEL USERLAND" declare -x USE_EXPAND_UNPREFIXED="ARCH" declare -x USE_EXPAND_VALUES_ARCH="alpha amd64 amd64-fbsd amd64-linux arm arm-linux hppa hppa-hpux ia64 ia64-hpux ia64-linux m68k m68k-mint mips ppc ppc64 ppc64-linux ppc-aix ppc-macos ppc-openbsd s390 sh sparc sparc64-freebsd sparc64-solaris sparc-fbsd sparc-solaris x64-freebsd x64-macos x64-openbsd x64-solaris x86 x86-cygwin x86-fbsd x86-freebsd x86-interix x86-linux x86-macos x86-netbsd x86-openbsd x86-solaris x86-winnt" declare -x USE_EXPAND_VALUES_ELIBC="AIX Cygwin Darwin FreeBSD glibc HPUX Interix mintlib NetBSD OpenBSD SunOS uclibc Winnt" declare -x USE_EXPAND_VALUES_KERNEL="AIX Cygwin Darwin FreeBSD freemint HPUX Interix linux NetBSD OpenBSD SunOS Winnt" declare -x USE_EXPAND_VALUES_USERLAND="BSD GNU" declare -x VBOX_APP_HOME="/opt/VirtualBox" declare -x VIDEO_CARDS="" declare -x WINDOWID="29360133" declare -x WINDOWPATH="7" declare -x XDG_CONFIG_DIRS="/etc/xdg" declare -x XDG_DATA_DIRS="/usr/share/gnome:/usr/local/share:/usr/share:/usr/share/gdm" declare -x XDG_MENU_PREFIX="gnome-" declare -x XDG_SESSION_COOKIE="704c143fe8bff359dcea589950b6a97c-1357784156.580350-1510092409" declare -x XMODIFIERS="@im=ibus" declare -x XSESSION="Gnome" declare -x XTABLES_ADDONS="quota2 psd pknock lscan length2 ipv4options ipset ipp2p iface geoip fuzzy condition tee tarpit sysrq steal rawnat logmark ipmark dhcpmac delude chaos account" declare -a _CPYTHON2_GLOBALLY_SUPPORTED_ABIS='([0]="2.4" [1]="2.5" [2]="2.6" [3]="2.7")' declare -a _CPYTHON3_GLOBALLY_SUPPORTED_ABIS='([0]="3.1" [1]="3.2" [2]="3.3")' declare -x _E_DOCDESTTREE_="" declare -x _E_EXEDESTTREE_="" declare -a _JYTHON_GLOBALLY_SUPPORTED_ABIS='([0]="2.5-jython")' declare -a _PYPY_GLOBALLY_SUPPORTED_ABIS='([0]="2.7-pypy-1.7" [1]="2.7-pypy-1.8" [2]="2.7-pypy-1.9" [3]="2.7-pypy-2.0")' declare -- _PYTHON_ABI_EXTRACTION_COMMAND="import platform import sys sys.stdout.write(\".\".join(str(x) for x in sys.version_info[:2])) if platform.system()[:4] == \"Java\": sys.stdout.write(\"-jython\") elif hasattr(platform, \"python_implementation\") and platform.python_implementation() == \"PyPy\": sys.stdout.write(\"-pypy-\" + \".\".join(str(x) for x in sys.pypy_version_info[:2]))" declare -- _PYTHON_ABI_PATTERN_REGEX="([[:alnum:]]|\\.|-|\\*|\\[|\\])+" declare -- _PYTHON_ECLASS_INHERITED="1" declare -a _PYTHON_GLOBALLY_SUPPORTED_ABIS='([0]="2.4" [1]="2.5" [2]="2.6" [3]="2.7" [4]="3.1" [5]="3.2" [6]="3.3" [7]="2.5-jython" [8]="2.7-pypy-1.7" [9]="2.7-pypy-1.8" [10]="2.7-pypy-1.9" [11]="2.7-pypy-2.0")' declare -- _PYTHON_SHEBANG_BASE_PART_REGEX="^#![[:space:]]*([^[:space:]]*/usr/bin/env[[:space:]]+)?([^[:space:]]*/)?(jython|pypy-c|python)" declare -- ___ECLASS_ONCE_MULTILIB="recur -_+^+_- spank" declare -- ___ECLASS_ONCE_TOOLCHAIN_FUNCS="recur -_+^+_- spank" declare -- phase_func PYTHON () { _python_check_python_pkg_setup_execution; local ABI_output="0" absolute_path_output="0" final_ABI="0" PYTHON_ABI="${PYTHON_ABI}" python_interpreter python2="0" python3="0"; while (($#)); do case "$1" in -2) python2="1" ;; -3) python3="1" ;; --ABI) ABI_output="1" ;; -a | --absolute-path) absolute_path_output="1" ;; -f | --final-ABI) final_ABI="1" ;; --) shift; break ;; -*) die "${FUNCNAME}(): Unrecognized option '$1'" ;; *) break ;; esac; shift; done; if [[ "${ABI_output}" == "1" && "${absolute_path_output}" == "1" ]]; then die "${FUNCNAME}(): '--ABI' and '--absolute-path' options cannot be specified simultaneously"; fi; if [[ "$((${python2} + ${python3} + ${final_ABI}))" -gt 1 ]]; then die "${FUNCNAME}(): '-2', '-3' or '--final-ABI' options cannot be specified simultaneously"; fi; if [[ "$#" -eq 0 ]]; then if [[ "${final_ABI}" == "1" ]]; then if ! _python_package_supporting_installation_for_multiple_python_abis; then die "${FUNCNAME}(): '--final-ABI' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"; fi; _python_calculate_PYTHON_ABIS; PYTHON_ABI="${PYTHON_ABIS##* }"; else if [[ "${python2}" == "1" ]]; then PYTHON_ABI="$(ROOT="/" eselect python show --python2 --ABI)"; if [[ -z "${PYTHON_ABI}" ]]; then die "${FUNCNAME}(): Active version of CPython 2 not set"; else if [[ "${PYTHON_ABI}" != "2."* ]]; then die "${FUNCNAME}(): Internal error in \`eselect python show --python2\`"; fi; fi; else if [[ "${python3}" == "1" ]]; then PYTHON_ABI="$(ROOT="/" eselect python show --python3 --ABI)"; if [[ -z "${PYTHON_ABI}" ]]; then die "${FUNCNAME}(): Active version of CPython 3 not set"; else if [[ "${PYTHON_ABI}" != "3."* ]]; then die "${FUNCNAME}(): Internal error in \`eselect python show --python3\`"; fi; fi; else if _python_package_supporting_installation_for_multiple_python_abis; then if ! _python_abi-specific_local_scope; then die "${FUNCNAME}() should be used in ABI-specific local scope"; fi; else PYTHON_ABI="$("${EPREFIX}/usr/bin/python" -c "${_PYTHON_ABI_EXTRACTION_COMMAND}")"; if [[ -z "${PYTHON_ABI}" ]]; then die "${FUNCNAME}(): Failure of extraction of locally active version of Python"; fi; fi; fi; fi; fi; else if [[ "$#" -eq 1 ]]; then if [[ "${final_ABI}" == "1" ]]; then die "${FUNCNAME}(): '--final-ABI' option and Python ABI cannot be specified simultaneously"; fi; if [[ "${python2}" == "1" ]]; then die "${FUNCNAME}(): '-2' option and Python ABI cannot be specified simultaneously"; fi; if [[ "${python3}" == "1" ]]; then die "${FUNCNAME}(): '-3' option and Python ABI cannot be specified simultaneously"; fi; PYTHON_ABI="$1"; else die "${FUNCNAME}(): Invalid usage"; fi; fi; if [[ "${ABI_output}" == "1" ]]; then echo -n "${PYTHON_ABI}"; return; else if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "CPython" ]]; then python_interpreter="python${PYTHON_ABI}"; else if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "Jython" ]]; then python_interpreter="jython${PYTHON_ABI%-jython}"; else if [[ "$(_python_get_implementation "${PYTHON_ABI}")" == "PyPy" ]]; then python_interpreter="pypy-c${PYTHON_ABI#*-pypy-}"; fi; fi; fi; if [[ "${absolute_path_output}" == "1" ]]; then echo -n "${EPREFIX}/usr/bin/${python_interpreter}"; else echo -n "${python_interpreter}"; fi; fi; if [[ -n "${ABI}" && "${ABI}" != "${DEFAULT_ABI}" && "${DEFAULT_ABI}" != "default" ]]; then echo -n "-${ABI}"; fi } _gcc-install-dir () { echo "$(LC_ALL=C $(tc-getCC) -print-search-dirs 2> /dev/null | awk '$1=="install:" {print $2}')" } _gcc-specs-directive_raw () { local cc=$(tc-getCC); local specfiles=$(LC_ALL=C ${cc} -v 2>&1 | awk '$1=="Reading" {print $NF}'); ${cc} -dumpspecs 2> /dev/null | cat - ${specfiles} | awk -v directive=$1 'BEGIN { pspec=""; spec=""; outside=1 } $1=="*"directive":" { pspec=spec; spec=""; outside=0; next } outside || NF==0 || ( substr($1,1,1)=="*" && substr($1,length($1),1)==":" ) { outside=1; next } spec=="" && substr($0,1,1)=="+" { spec=pspec " " substr($0,2); next } { spec=spec $0 } END { print spec }'; return 0 } _gcc-specs-exists () { [[ -f $(_gcc-install-dir)/$1 ]] } _gcc_fullversion () { local ver="$1"; shift; set -- `$(tc-getCPP "$@") -E -P - <<<"__GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__"`; eval echo "$ver" } _python_abi-specific_local_scope () { [[ " ${FUNCNAME[@]:2} " =~ " "(_python_final_sanity_checks|python_execute_function|python_mod_optimize|python_mod_cleanup)" " ]] } _python_calculate_PYTHON_ABIS () { if ! _python_package_supporting_installation_for_multiple_python_abis; then die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"; fi; _python_initial_sanity_checks; if [[ "$(declare -p PYTHON_ABIS 2> /dev/null)" != "declare -x PYTHON_ABIS="* ]]; then local PYTHON_ABI; if [[ "$(declare -p USE_PYTHON 2> /dev/null)" == "declare -x USE_PYTHON="* ]]; then local cpython_enabled="0"; if [[ -z "${USE_PYTHON}" ]]; then die "USE_PYTHON variable is empty"; fi; for PYTHON_ABI in ${USE_PYTHON}; do if ! has "${PYTHON_ABI}" "${_PYTHON_GLOBALLY_SUPPORTED_ABIS[@]}"; then die "USE_PYTHON variable contains invalid value '${PYTHON_ABI}'"; fi; if has "${PYTHON_ABI}" "${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}" "${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}"; then cpython_enabled="1"; fi; if ! _python_check_python_abi_matching --patterns-list "${PYTHON_ABI}" "${RESTRICT_PYTHON_ABIS}"; then export PYTHON_ABIS+="${PYTHON_ABIS:+ }${PYTHON_ABI}"; fi; done; if [[ -z "${PYTHON_ABIS//[${IFS}]/}" ]]; then die "USE_PYTHON variable does not enable any Python ABI supported by ${CATEGORY}/${PF}"; fi; if [[ "${cpython_enabled}" == "0" ]]; then die "USE_PYTHON variable does not enable any CPython ABI"; fi; else local python_version python2_version python3_version support_python_major_version; if ! has_version "dev-lang/python"; then die "${FUNCNAME}(): 'dev-lang/python' is not installed"; fi; python_version="$("${EPREFIX}/usr/bin/python" -c 'from sys import version_info; print(".".join(str(x) for x in version_info[:2]))')"; if has_version "=dev-lang/python-2*"; then if [[ "$(readlink "${EPREFIX}/usr/bin/python2")" != "python2."* ]]; then die "'${EPREFIX}/usr/bin/python2' is not valid symlink"; fi; python2_version="$("${EPREFIX}/usr/bin/python2" -c 'from sys import version_info; print(".".join(str(x) for x in version_info[:2]))')"; support_python_major_version="0"; for PYTHON_ABI in "${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}"; do if ! _python_check_python_abi_matching --patterns-list "${PYTHON_ABI}" "${RESTRICT_PYTHON_ABIS}"; then support_python_major_version="1"; break; fi; done; if [[ "${support_python_major_version}" == "1" ]]; then if _python_check_python_abi_matching --patterns-list "${python2_version}" "${RESTRICT_PYTHON_ABIS}"; then die "Active version of CPython 2 is not supported by ${CATEGORY}/${PF}"; fi; else python2_version=""; fi; fi; if has_version "=dev-lang/python-3*"; then if [[ "$(readlink "${EPREFIX}/usr/bin/python3")" != "python3."* ]]; then die "'${EPREFIX}/usr/bin/python3' is not valid symlink"; fi; python3_version="$("${EPREFIX}/usr/bin/python3" -c 'from sys import version_info; print(".".join(str(x) for x in version_info[:2]))')"; support_python_major_version="0"; for PYTHON_ABI in "${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}"; do if ! _python_check_python_abi_matching --patterns-list "${PYTHON_ABI}" "${RESTRICT_PYTHON_ABIS}"; then support_python_major_version="1"; break; fi; done; if [[ "${support_python_major_version}" == "1" ]]; then if _python_check_python_abi_matching --patterns-list "${python3_version}" "${RESTRICT_PYTHON_ABIS}"; then die "Active version of CPython 3 is not supported by ${CATEGORY}/${PF}"; fi; else python3_version=""; fi; fi; if [[ -z "${python2_version}" && -z "${python3_version}" ]]; then eerror "${CATEGORY}/${PF} requires at least one of the following packages:"; for PYTHON_ABI in "${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}" "${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}"; do if ! _python_check_python_abi_matching --patterns-list "${PYTHON_ABI}" "${RESTRICT_PYTHON_ABIS}"; then eerror " dev-lang/python:${PYTHON_ABI}"; fi; done; die "No supported version of CPython installed"; fi; if [[ -n "${python2_version}" && "${python_version}" == "2."* && "${python_version}" != "${python2_version}" ]]; then eerror "Python wrapper is configured incorrectly or '${EPREFIX}/usr/bin/python2' symlink"; eerror "is set incorrectly. Use \`eselect python\` to fix configuration."; die "Incorrect configuration of Python"; fi; if [[ -n "${python3_version}" && "${python_version}" == "3."* && "${python_version}" != "${python3_version}" ]]; then eerror "Python wrapper is configured incorrectly or '${EPREFIX}/usr/bin/python3' symlink"; eerror "is set incorrectly. Use \`eselect python\` to fix configuration."; die "Incorrect configuration of Python"; fi; PYTHON_ABIS="${python2_version} ${python3_version}"; PYTHON_ABIS="${PYTHON_ABIS# }"; export PYTHON_ABIS="${PYTHON_ABIS% }"; fi; fi; _python_final_sanity_checks } _python_check_python_abi_matching () { local pattern patterns patterns_list="0" PYTHON_ABI; while (($#)); do case "$1" in --patterns-list) patterns_list="1" ;; --) shift; break ;; -*) die "${FUNCNAME}(): Unrecognized option '$1'" ;; *) break ;; esac; shift; done; if [[ "$#" -ne 2 ]]; then die "${FUNCNAME}() requires 2 arguments"; fi; PYTHON_ABI="$1"; if [[ "${patterns_list}" == "0" ]]; then pattern="$2"; if [[ "${pattern}" == *"-cpython" ]]; then [[ "${PYTHON_ABI}" =~ ^[[:digit:]]+\.[[:digit:]]+$ && "${PYTHON_ABI}" == ${pattern%-cpython} ]]; else if [[ "${pattern}" == *"-jython" ]]; then [[ "${PYTHON_ABI}" == ${pattern} ]]; else if [[ "${pattern}" == *"-pypy-"* ]]; then [[ "${PYTHON_ABI}" == ${pattern} ]]; else if [[ "${PYTHON_ABI}" =~ ^[[:digit:]]+\.[[:digit:]]+$ ]]; then [[ "${PYTHON_ABI}" == ${pattern} ]]; else if [[ "${PYTHON_ABI}" =~ ^[[:digit:]]+\.[[:digit:]]+-jython$ ]]; then [[ "${PYTHON_ABI%-jython}" == ${pattern} ]]; else if [[ "${PYTHON_ABI}" =~ ^[[:digit:]]+\.[[:digit:]]+-pypy-[[:digit:]]+\.[[:digit:]]+$ ]]; then [[ "${PYTHON_ABI%-pypy-*}" == ${pattern} ]]; else die "${FUNCNAME}(): Unrecognized Python ABI '${PYTHON_ABI}'"; fi; fi; fi; fi; fi; fi; else patterns="${2// / }"; while read pattern; do if _python_check_python_abi_matching "${PYTHON_ABI}" "${pattern}"; then return 0; fi; done <<< "${patterns}"; return 1; fi } _python_check_python_pkg_setup_execution () { [[ " ${FUNCNAME[@]:1} " =~ " "(python_set_active_version|python_pkg_setup)" " ]] && return; if ! has "${EAPI:-0}" 0 1 2 3 && [[ -z "${PYTHON_PKG_SETUP_EXECUTED}" ]]; then die "python_pkg_setup() not called"; fi } _python_clean_compiled_modules () { _python_initialize_prefix_variables; _python_set_color_variables; [[ "${FUNCNAME[1]}" =~ ^(python_mod_optimize|python_mod_cleanup)$ ]] || die "${FUNCNAME}(): Invalid usage"; local base_module_name compiled_file compiled_files=() dir path py_file root; root="${EROOT%/}"; for path in "$@"; do compiled_files=(); if [[ -d "${path}" ]]; then while read -d '' -r compiled_file; do compiled_files+=("${compiled_file}"); done < <(find "${path}" "(" -name "*.py[co]" -o -name "*\$py.class" ")" -print0); if [[ "${EBUILD_PHASE}" == "postrm" ]]; then find "${path}" -type d | sort -r | while read -r dir; do if rmdir "${dir}" 2> /dev/null; then _python_vecho "<<< ${dir}"; fi; done; fi; else if [[ "${path}" == *.py ]]; then base_module_name="${path##*/}"; base_module_name="${base_module_name%.py}"; if [[ -d "${path%/*}/__pycache__" ]]; then while read -d '' -r compiled_file; do compiled_files+=("${compiled_file}"); done < <(find "${path%/*}/__pycache__" "(" -name "${base_module_name}.*.py[co]" -o -name "${base_module_name}\$py.class" ")" -print0); fi; compiled_files+=("${path}c" "${path}o" "${path%.py}\$py.class"); fi; fi; for compiled_file in "${compiled_files[@]}"; do [[ ! -f "${compiled_file}" ]] && continue; dir="${compiled_file%/*}"; dir="${dir##*/}"; if [[ "${compiled_file}" == *.py[co] ]]; then if [[ "${dir}" == "__pycache__" ]]; then base_module_name="${compiled_file##*/}"; base_module_name="${base_module_name%.*py[co]}"; base_module_name="${base_module_name%.*}"; py_file="${compiled_file%__pycache__/*}${base_module_name}.py"; else py_file="${compiled_file%[co]}"; fi; if [[ "${EBUILD_PHASE}" == "postinst" ]]; then [[ -f "${py_file}" && "${compiled_file}" -nt "${py_file}" ]] && continue; else [[ -f "${py_file}" ]] && continue; fi; _python_vecho "<<< ${compiled_file%[co]}[co]"; rm -f "${compiled_file%[co]}"[co]; else if [[ "${compiled_file}" == *\$py.class ]]; then if [[ "${dir}" == "__pycache__" ]]; then base_module_name="${compiled_file##*/}"; base_module_name="${base_module_name%\$py.class}"; py_file="${compiled_file%__pycache__/*}${base_module_name}.py"; else py_file="${compiled_file%\$py.class}.py"; fi; if [[ "${EBUILD_PHASE}" == "postinst" ]]; then [[ -f "${py_file}" && "${compiled_file}" -nt "${py_file}" ]] && continue; else [[ -f "${py_file}" ]] && continue; fi; _python_vecho "<<< ${compiled_file}"; rm -f "${compiled_file}"; else die "${FUNCNAME}(): Unrecognized file type: '${compiled_file}'"; fi; fi; dir="${compiled_file%/*}"; while [[ "${dir}" != "${root}" ]]; do if rmdir "${dir}" 2> /dev/null; then _python_vecho "<<< ${dir}"; else break; fi; dir="${dir%/*}"; done; done; done } _python_final_sanity_checks () { if ! _python_implementation && [[ "$(declare -p PYTHON_SANITY_CHECKS_EXECUTED 2> /dev/null)" != "declare -- PYTHON_SANITY_CHECKS_EXECUTED="* || " ${FUNCNAME[@]:1} " =~ " "(python_set_active_version|python_pkg_setup)" " && -z "${PYTHON_SKIP_SANITY_CHECKS}" ]]; then local PYTHON_ABI="${PYTHON_ABI}"; for PYTHON_ABI in ${PYTHON_ABIS-${PYTHON_ABI}}; do if ! has_version "$(python_get_implementational_package)"; then die "$(python_get_implementational_package) is not installed"; fi; if [[ "$(EPYTHON="$(PYTHON)" python -c "${_PYTHON_ABI_EXTRACTION_COMMAND}")" != "${PYTHON_ABI}" ]]; then eerror "Path to 'python': '$(type -p python)'"; eerror "ABI: '${ABI}'"; eerror "DEFAULT_ABI: '${DEFAULT_ABI}'"; eerror "EPYTHON: '$(PYTHON)'"; eerror "PYTHON_ABI: '${PYTHON_ABI}'"; eerror "Locally active version of Python: '$(EPYTHON="$(PYTHON)" python -c "${_PYTHON_ABI_EXTRACTION_COMMAND}")'"; die "'python' does not respect EPYTHON variable"; fi; done; fi; PYTHON_SANITY_CHECKS_EXECUTED="1" } _python_get_implementation () { local ignore_invalid="0"; while (($#)); do case "$1" in --ignore-invalid) ignore_invalid="1" ;; --) shift; break ;; -*) die "${FUNCNAME}(): Unrecognized option '$1'" ;; *) break ;; esac; shift; done; if [[ "$#" -ne 1 ]]; then die "${FUNCNAME}() requires 1 argument"; fi; if [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+$ ]]; then echo "CPython"; else if [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+-jython$ ]]; then echo "Jython"; else if [[ "$1" =~ ^[[:digit:]]+\.[[:digit:]]+-pypy-[[:digit:]]+\.[[:digit:]]+$ ]]; then echo "PyPy"; else if [[ "${ignore_invalid}" == "0" ]]; then die "${FUNCNAME}(): Unrecognized Python ABI '$1'"; fi; fi; fi; fi } _python_implementation () { if [[ "${CATEGORY}/${PN}" == "dev-lang/python" ]]; then return 0; else if [[ "${CATEGORY}/${PN}" == "dev-java/jython" ]]; then return 0; else if [[ "${CATEGORY}/${PN}" == "dev-python/pypy" ]]; then return 0; else return 1; fi; fi; fi } _python_initial_sanity_checks () { if [[ "$(declare -p PYTHON_SANITY_CHECKS_EXECUTED 2> /dev/null)" != "declare -- PYTHON_SANITY_CHECKS_EXECUTED="* || " ${FUNCNAME[@]:1} " =~ " "(python_set_active_version|python_pkg_setup)" " && -z "${PYTHON_SKIP_SANITY_CHECKS}" ]]; then if [[ "$(readlink "${EPREFIX}/usr/bin/python")" != "python-wrapper" ]]; then eerror "'${EPREFIX}/usr/bin/python' is not valid symlink."; eerror "Use \`eselect python set \${python_interpreter}\` to fix this problem."; die "'${EPREFIX}/usr/bin/python' is not valid symlink"; fi; if [[ "$(<"${EPREFIX}/usr/bin/python-config")" != *"Gentoo python-config wrapper script"* ]]; then eerror "'${EPREFIX}/usr/bin/python-config' is not valid script"; eerror "Use \`eselect python set \${python_interpreter}\` to fix this problem."; die "'${EPREFIX}/usr/bin/python-config' is not valid script"; fi; fi } _python_initialize_prefix_variables () { if has "${EAPI:-0}" 0 1 2; then if [[ -n "${ROOT}" && -z "${EROOT}" ]]; then EROOT="${ROOT%/}${EPREFIX}/"; fi; if [[ -n "${D}" && -z "${ED}" ]]; then ED="${D%/}${EPREFIX}/"; fi; fi } _python_package_supporting_installation_for_multiple_python_abis () { [[ -n "${SUPPORT_PYTHON_ABIS}" ]] } _python_prepare_flags () { local array=() deleted_flag element flags new_value old_flag old_value operator pattern prefix variable; for variable in CPPFLAGS CFLAGS CXXFLAGS LDFLAGS; do eval "_PYTHON_SAVED_${variable}=\"\${!variable}\""; for prefix in PYTHON_USER_ PYTHON_; do if [[ "$(declare -p ${prefix}${variable} 2> /dev/null)" == "declare -a ${prefix}${variable}="* ]]; then eval "array=(\"\${${prefix}${variable}[@]}\")"; for element in "${array[@]}"; do if [[ "${element}" =~ ^${_PYTHON_ABI_PATTERN_REGEX}\ (\+|-)\ .+ ]]; then pattern="${element%% *}"; element="${element#* }"; operator="${element%% *}"; flags="${element#* }"; if _python_check_python_abi_matching "${PYTHON_ABI}" "${pattern}"; then if [[ "${operator}" == "+" ]]; then eval "export ${variable}+=\"\${variable:+ }${flags}\""; else if [[ "${operator}" == "-" ]]; then flags="${flags// / }"; old_value="${!variable// / }"; new_value=""; while read old_flag; do while read deleted_flag; do if [[ "${old_flag}" == ${deleted_flag} ]]; then continue 2; fi; done <<< "${flags}"; new_value+="${new_value:+ }${old_flag}"; done <<< "${old_value}"; eval "export ${variable}=\"\${new_value}\""; fi; fi; fi; else die "Element '${element}' of ${prefix}${variable} array has invalid syntax"; fi; done; else if [[ -n "$(declare -p ${prefix}${variable} 2> /dev/null)" ]]; then die "${prefix}${variable} should be indexed array"; fi; fi; done; done } _python_restore_flags () { local variable; for variable in CPPFLAGS CFLAGS CXXFLAGS LDFLAGS; do eval "${variable}=\"\${_PYTHON_SAVED_${variable}}\""; unset _PYTHON_SAVED_${variable}; done } _python_set_color_variables () { if [[ "${PYTHON_COLORS}" != "0" && "${NOCOLOR:-false}" =~ ^(false|no)$ ]]; then _BOLD=''; _RED=''; _GREEN=''; _BLUE=''; _CYAN=''; _NORMAL=''; else _BOLD=; _RED=; _GREEN=; _BLUE=; _CYAN=; _NORMAL=; fi } _python_test_hook () { if [[ "$#" -ne 1 ]]; then die "${FUNCNAME}() requires 1 argument"; fi; if _python_package_supporting_installation_for_multiple_python_abis && [[ "$(type -t "${_PYTHON_TEST_FUNCTION}_$1_hook")" == "function" ]]; then "${_PYTHON_TEST_FUNCTION}_$1_hook"; fi } _python_vecho () { [[ -z ${PORTAGE_VERBOSE} ]] || echo "$@" } _tc-getPROG () { local tuple=$1; local v var vars=$2; local prog=$3; var=${vars%% *}; for v in ${vars}; do if [[ -n ${!v} ]]; then export ${var}="${!v}"; echo "${!v}"; return 0; fi; done; local search=; [[ -n $4 ]] && search=$(type -p "$4-${prog}"); [[ -z ${search} && -n ${!tuple} ]] && search=$(type -p "${!tuple}-${prog}"); [[ -n ${search} ]] && prog=${search##*/}; export ${var}=${prog}; echo "${!var}" } econf_build () { tc-env_build econf --build=${CBUILD:-${CHOST}} "$@" } 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); return $([[ "${directive/\{!fstrict-overflow:}" != "${directive}" ]]) } gcc-specs-now () { local directive; directive=$(gcc-specs-directive link_command); return $([[ "${directive/\{!nonow:}" != "${directive}" ]]) } gcc-specs-pie () { local directive; directive=$(gcc-specs-directive cc1); return $([[ "${directive/\{!nopie:}" != "${directive}" ]]) } gcc-specs-relro () { local directive; directive=$(gcc-specs-directive link_command); return $([[ "${directive/\{!norelro:}" != "${directive}" ]]) } gcc-specs-ssp () { local directive; directive=$(gcc-specs-directive cc1); return $([[ "${directive/\{!fno-stack-protector:}" != "${directive}" ]]) } gcc-specs-ssp-to-all () { local directive; directive=$(gcc-specs-directive cc1); return $([[ "${directive/\{!fno-stack-protector-all:}" != "${directive}" ]]) } gcc-version () { _gcc_fullversion '$1.$2' "$@" } gen_usr_ldscript () { local lib libdir=$(get_libdir) output_format="" auto=false suffix=$(get_libname); [[ -z ${ED+set} ]] && local ED=${D%/}${EPREFIX}/; tc-is-static-only && return; case ${CTARGET:-${CHOST}} in *-darwin*) ;; *linux* | *-freebsd* | *-openbsd* | *-netbsd*) use prefix && return 0 ;; *) return 0 ;; esac; dodir /usr/${libdir}; if [[ $1 == "-a" ]]; then auto=true; shift; dodir /${libdir}; fi; output_format=$($(tc-getCC) ${CFLAGS} ${LDFLAGS} -Wl,--verbose 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 http://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_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_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 CONF_LIBDIR; if [ -n "${CONF_LIBDIR_OVERRIDE}" ]; then echo ${CONF_LIBDIR_OVERRIDE}; else get_abi_LIBDIR; fi } get_libname () { local libname; local ver=$1; case ${CHOST} in *-cygwin | mingw* | *-mingw*) libname="dll" ;; *-darwin*) libname="dylib" ;; *-mint*) libname="irrelevant" ;; hppa*-hpux*) libname="sl" ;; *) libname="so" ;; esac; if [[ -z $* ]]; then echo ".${libname}"; else for ver in "$@"; do case ${CHOST} in *-darwin*) echo ".${ver}.${libname}" ;; *-mint*) echo ".${libname}" ;; *) echo ".${libname}.${ver}" ;; esac; done; fi } get_modname () { local modname; local ver=$1; case ${CHOST} in *-darwin*) modname="bundle" ;; *) modname="so" ;; esac; echo ".${modname}" } gnome2_disable_deprecation_warning () { local retval=0; local fails=(); local makefile; ebegin "Disabling deprecation warnings"; while read makefile; do if ! grep -qE "(DISABLE_DEPRECATED|GSEAL_ENABLE)" "${makefile}"; then continue; fi; LC_ALL=C sed -r -i -e 's:-D[A-Z_]+_DISABLE_DEPRECATED:$(NULL):g' -e 's:-DGSEAL_ENABLE:$(NULL):g' -i "${makefile}"; if [[ $? -ne 0 ]]; then fails+=("${makefile}"); retval=2; fi; done < <(find "${S}" -name "Makefile.in" -o -name "Makefile.am" -o -name "Makefile.decl" | sort; echo configure); eend ${retval}; for makefile in "${fails[@]}"; do ewarn "Failed to disable deprecation warnings in ${makefile}"; done } gnome2_environment_reset () { export G_HOME="${T}"; export GST_REGISTRY="${T}/registry.xml"; export XDG_DATA_HOME="${T}/.local/share"; export XDG_CONFIG_HOME="${T}/.config"; export XDG_CACHE_HOME="${T}/.cache"; export XDG_RUNTIME_DIR="${T}/run"; mkdir -p "${XDG_DATA_HOME}" "${XDG_CONFIG_HOME}" "${XDG_CACHE_HOME}" "${XDG_RUNTIME_DIR}"; chmod 0700 "${XDG_RUNTIME_DIR}" } gnome2_gconf_install () { has ${EAPI:-0} 0 1 2 && ! use prefix && EROOT="${ROOT}"; local updater="${EROOT}${GCONFTOOL_BIN}"; if [[ ! -x "${updater}" ]]; then debug-print "${updater} is not executable"; return; fi; if [[ -z "${GNOME2_ECLASS_SCHEMAS}" ]]; then debug-print "No GNOME 2 GConf schemas found"; return; fi; unset GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL; export GCONF_CONFIG_SOURCE="$("${updater}" --get-default-source | sed "s;:/;:${ROOT};")"; einfo "Installing GNOME 2 GConf schemas"; local F; for F in ${GNOME2_ECLASS_SCHEMAS}; do if [[ -e "${EROOT}${F}" ]]; then debug-print "Installing schema: ${F}"; "${updater}" --makefile-install-rule "${EROOT}${F}" > /dev/null; fi; done; pids=$(pgrep -x gconfd-2); if [[ $? == 0 ]]; then ebegin "Reloading GConf schemas"; kill -HUP ${pids}; eend $?; fi } gnome2_gconf_savelist () { has ${EAPI:-0} 0 1 2 && ! use prefix && ED="${D}"; pushd "${ED}" &>/dev/null; export GNOME2_ECLASS_SCHEMAS=$(find 'etc/gconf/schemas/' -name '*.schemas' 2> /dev/null); popd &>/dev/null } gnome2_gconf_uninstall () { has ${EAPI:-0} 0 1 2 && ! use prefix && EROOT="${ROOT}"; local updater="${EROOT}${GCONFTOOL_BIN}"; if [[ ! -x "${updater}" ]]; then debug-print "${updater} is not executable"; return; fi; if [[ -z "${GNOME2_ECLASS_SCHEMAS}" ]]; then debug-print "No GNOME 2 GConf schemas found"; return; fi; unset GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL; export GCONF_CONFIG_SOURCE="$("${updater}" --get-default-source | sed "s;:/;:${ROOT};")"; einfo "Uninstalling GNOME 2 GConf schemas"; local F; for F in ${GNOME2_ECLASS_SCHEMAS}; do if [[ -e "${EROOT}${F}" ]]; then debug-print "Uninstalling gconf schema: ${F}"; "${updater}" --makefile-uninstall-rule "${EROOT}${F}" > /dev/null; fi; done; pids=$(pgrep -x gconfd-2); if [[ $? == 0 ]]; then ebegin "Reloading GConf schemas"; kill -HUP ${pids}; eend $?; fi } gnome2_icon_cache_update () { has ${EAPI:-0} 0 1 2 && ! use prefix && EROOT="${ROOT}"; local updater="${EROOT}${GTK_UPDATE_ICON_CACHE}"; if [[ ! -x "${updater}" ]]; then debug-print "${updater} is not executable"; return; fi; if [[ -z "${GNOME2_ECLASS_ICONS}" ]]; then debug-print "No icon cache to update"; return; fi; ebegin "Updating icons cache"; local retval=0; local fails=(); for dir in ${GNOME2_ECLASS_ICONS}; do if [[ -f "${EROOT}${dir}/index.theme" ]]; then local rv=0; "${updater}" -qf "${EROOT}${dir}"; rv=$?; if [[ ! $rv -eq 0 ]]; then debug-print "Updating cache failed on ${EROOT}${dir}"; fails[$(( ${#fails[@]} + 1 ))]="${EROOT}${dir}"; retval=2; fi; else if [[ $(ls "${EROOT}${dir}") = "icon-theme.cache" ]]; then rm "${EROOT}${dir}/icon-theme.cache"; fi; fi; if [[ -z $(ls "${EROOT}${dir}") ]]; then rmdir "${EROOT}${dir}"; fi; done; eend ${retval}; for f in "${fails[@]}"; do eerror "Failed to update cache with icon $f"; done } gnome2_icon_savelist () { has ${EAPI:-0} 0 1 2 && ! use prefix && ED="${D}"; pushd "${ED}" &>/dev/null; export GNOME2_ECLASS_ICONS=$(find 'usr/share/icons' -maxdepth 1 -mindepth 1 -type d 2> /dev/null); popd &>/dev/null } gnome2_omf_fix () { local omf_makefiles filename; omf_makefiles="$@"; if [[ -f ${S}/omf.make ]]; then omf_makefiles="${omf_makefiles} ${S}/omf.make"; fi; if [[ -f ${S}/gnome-doc-utils.make ]]; then omf_makefiles="${omf_makefiles} ${S}/gnome-doc-utils.make"; fi; for filename in $(find "${S}" -name "Makefile.in" -o -name "Makefile.am" |sort); do omf_makefiles="${omf_makefiles} ${filename}"; done; ebegin "Fixing OMF Makefiles"; local retval=0; local fails=(); for omf in ${omf_makefiles}; do sed -i -e 's:scrollkeeper-update:true:' "${omf}"; retval=$?; if [[ $retval -ne 0 ]]; then debug-print "updating of ${omf} failed"; fails[$(( ${#fails[@]} + 1 ))]=$omf; retval=2; fi; done; eend $retval; for f in "${fails[@]}"; do eerror "Failed to update OMF Makefile $f"; done } gnome2_query_immodules_gtk2 () { local GTK2_CONFDIR="/etc/gtk-2.0/$(get_abi_CHOST)"; local query_exec="${EPREFIX}/usr/bin/gtk-query-immodules-2.0"; local gtk_conf="${EPREFIX}${GTK2_CONFDIR}/gtk.immodules"; local gtk_conf_dir=$(dirname "${gtk_conf}"); einfo "Generating Gtk2 immodules/gdk-pixbuf loaders listing:"; einfo "-> ${gtk_conf}"; mkdir -p "${gtk_conf_dir}"; local tmp_file=$(mktemp -t tmp.XXXXXXXXXXgtk_query_immodules); if [ -z "${tmp_file}" ]; then ewarn "gtk_query_immodules: cannot create temporary file"; return 1; fi; if ${query_exec} > "${tmp_file}"; then cat "${tmp_file}" > "${gtk_conf}" || ewarn "Failed to write to ${gtk_conf}"; else ewarn "Cannot update gtk.immodules, file generation failed"; fi; rm "${tmp_file}" } gnome2_query_immodules_gtk3 () { "${EPREFIX}/usr/bin/gtk-query-immodules-3.0" --update-cache } gnome2_schemas_savelist () { has ${EAPI:-0} 0 1 2 && ! use prefix && ED="${D}"; pushd "${ED}" &>/dev/null; export GNOME2_ECLASS_GLIB_SCHEMAS=$(find 'usr/share/glib-2.0/schemas' -name '*.gschema.xml' 2>/dev/null); popd &>/dev/null } gnome2_schemas_update () { has ${EAPI:-0} 0 1 2 && ! use prefix && EROOT="${ROOT}"; local updater="${EROOT}${GLIB_COMPILE_SCHEMAS}"; if [[ ! -x ${updater} ]]; then debug-print "${updater} is not executable"; return; fi; if [[ -z ${GNOME2_ECLASS_GLIB_SCHEMAS} ]]; then debug-print "No GSettings schemas to update"; return; fi; ebegin "Updating GSettings schemas"; ${updater} --allow-any-name "$@" "${EROOT%/}/usr/share/glib-2.0/schemas" &>/dev/null; eend $? } gnome2_scrollkeeper_savelist () { has ${EAPI:-0} 0 1 2 && ! use prefix && ED="${D}"; pushd "${ED}" &>/dev/null; export GNOME2_ECLASS_SCROLLS=$(find 'usr/share/omf' -type f -name "*.omf" 2> /dev/null); popd &>/dev/null } gnome2_scrollkeeper_update () { has ${EAPI:-0} 0 1 2 && ! use prefix && EROOT="${ROOT}"; local updater="${EROOT}${SCROLLKEEPER_UPDATE_BIN}"; if [[ ! -x "${updater}" ]]; then debug-print "${updater} is not executable"; return; fi; if [[ -z "${GNOME2_ECLASS_SCROLLS}" ]]; then debug-print "No scroll cache to update"; return; fi; ebegin "Updating scrollkeeper database ..."; "${updater}" -q -p "${EROOT}${SCROLLKEEPER_DIR}"; eend $? } has_multilib_profile () { [ -n "${MULTILIB_ABIS}" -a "${MULTILIB_ABIS}" != "${MULTILIB_ABIS/ /}" ] } is_final_abi () { has_multilib_profile || return 0; set -- $(get_install_abis); local LAST_ABI=$#; [[ ${!LAST_ABI} == ${ABI} ]] } multilib_env () { local CTARGET=${1:-${CTARGET}}; case ${CTARGET} in x86_64*) export CFLAGS_x86=${CFLAGS_x86--m32}; export CHOST_x86=${CTARGET/x86_64/i686}; CHOST_x86=${CHOST_x86/%-gnux32/-gnu}; export CTARGET_x86=${CHOST_x86}; if [[ ${SYMLINK_LIB} == "yes" ]]; then export LIBDIR_x86="lib32"; else export LIBDIR_x86="lib"; fi; export CFLAGS_amd64=${CFLAGS_amd64--m64}; export CHOST_amd64=${CTARGET/%-gnux32/-gnu}; export CTARGET_amd64=${CHOST_amd64}; export LIBDIR_amd64="lib64"; export CFLAGS_x32=${CFLAGS_x32--mx32}; export CHOST_x32=${CTARGET/%-gnu/-gnux32}; export CTARGET_x32=${CHOST_x32}; export LIBDIR_x32="libx32"; case ${CTARGET} in *-gnux32) : ${MULTILIB_ABIS=x32 amd64 x86}; : ${DEFAULT_ABI=x32} ;; *) : ${MULTILIB_ABIS=amd64 x86}; : ${DEFAULT_ABI=amd64} ;; esac ;; mips64*) export CFLAGS_o32=${CFLAGS_o32--mabi=32}; export CHOST_o32=${CTARGET/mips64/mips}; export CTARGET_o32=${CHOST_o32}; export LIBDIR_o32="lib"; export CFLAGS_n32=${CFLAGS_n32--mabi=n32}; export CHOST_n32=${CTARGET}; export CTARGET_n32=${CHOST_n32}; export LIBDIR_n32="lib32"; export CFLAGS_n64=${CFLAGS_n64--mabi=64}; export CHOST_n64=${CTARGET}; export CTARGET_n64=${CHOST_n64}; export LIBDIR_n64="lib64"; : ${MULTILIB_ABIS=n64 n32 o32}; : ${DEFAULT_ABI=n32} ;; powerpc64*) export CFLAGS_ppc=${CFLAGS_ppc--m32}; export CHOST_ppc=${CTARGET/powerpc64/powerpc}; export CTARGET_ppc=${CHOST_ppc}; export LIBDIR_ppc="lib"; export CFLAGS_ppc64=${CFLAGS_ppc64--m64}; export CHOST_ppc64=${CTARGET}; export CTARGET_ppc64=${CHOST_ppc64}; export LIBDIR_ppc64="lib64"; : ${MULTILIB_ABIS=ppc64 ppc}; : ${DEFAULT_ABI=ppc64} ;; s390x*) export CFLAGS_s390=${CFLAGS_s390--m31}; export CHOST_s390=${CTARGET/s390x/s390}; export CTARGET_s390=${CHOST_s390}; export LIBDIR_s390="lib"; export CFLAGS_s390x=${CFLAGS_s390x--m64}; export CHOST_s390x=${CTARGET}; export CTARGET_s390x=${CHOST_s390x}; export LIBDIR_s390x="lib64"; : ${MULTILIB_ABIS=s390x s390}; : ${DEFAULT_ABI=s390x} ;; sparc64*) export CFLAGS_sparc32=${CFLAGS_sparc32--m32}; export CHOST_sparc32=${CTARGET/sparc64/sparc}; export CTARGET_sparc32=${CHOST_sparc32}; export LIBDIR_sparc32="lib"; export CFLAGS_sparc64=${CFLAGS_sparc64--m64}; export CHOST_sparc64=${CTARGET}; export CTARGET_sparc64=${CHOST_sparc64}; export LIBDIR_sparc64="lib64"; : ${MULTILIB_ABIS=sparc64 sparc32}; : ${DEFAULT_ABI=sparc64} ;; *) : ${MULTILIB_ABIS=default}; : ${DEFAULT_ABI=default} ;; esac; export MULTILIB_ABIS DEFAULT_ABI } multilib_toolchain_setup () { local v vv; export ABI=$1; if [[ ${__DEFAULT_ABI_SAVED} == "true" ]]; then for v in CHOST CBUILD AS CC CXX LD; do vv="__abi_saved_${v}"; export ${v}="${!vv}"; unset ${vv}; done; unset __DEFAULT_ABI_SAVED; fi; if [[ ${ABI} != ${DEFAULT_ABI} ]]; then for v in CHOST CBUILD AS CC CXX LD; do export __abi_saved_${v}="${!v}"; done; export __DEFAULT_ABI_SAVED="true"; export CHOST=$(get_abi_CHOST ${DEFAULT_ABI}); export CC="$(tc-getCC) $(get_abi_CFLAGS)"; export CXX="$(tc-getCXX) $(get_abi_CFLAGS)"; export LD="$(tc-getLD) $(get_abi_LDFLAGS)"; export CHOST=$(get_abi_CHOST $1); export CBUILD=$(get_abi_CHOST $1); fi } number_abis () { set -- `get_install_abis`; echo $# } pkg_nofetch () { __eapi0_pkg_nofetch "$@" } pkg_postinst () { gnome2_icon_cache_update } pkg_postrm () { gnome2_icon_cache_update } pkg_preinst () { gnome2_icon_savelist } pkg_setup () { python_set_active_version 2 } python_clean_installation_image () { if [[ "${EBUILD_PHASE}" != "install" ]]; then die "${FUNCNAME}() can be used only in src_install() phase"; fi; _python_check_python_pkg_setup_execution; _python_initialize_prefix_variables; local file files=() quiet="0"; while (($#)); do case "$1" in -q | --quiet) quiet="1" ;; -*) die "${FUNCNAME}(): Unrecognized option '$1'" ;; *) die "${FUNCNAME}(): Invalid usage" ;; esac; shift; done; while read -d '' -r file; do files+=("${file}"); done < <(find "${ED}" "(" -name "*.py[co]" -o -name "*\$py.class" ")" -type f -print0); if [[ "${#files[@]}" -gt 0 ]]; then if [[ "${quiet}" == "0" ]]; then ewarn "Deleting byte-compiled Python modules needlessly generated by build system:"; fi; for file in "${files[@]}"; do if [[ "${quiet}" == "0" ]]; then ewarn " ${file}"; fi; rm -f "${file}"; if [[ "${file%/*}" == *"/__pycache__" ]]; then rmdir "${file%/*}" 2> /dev/null; fi; done; fi; function python_clean_sitedirs () { if [[ -d "${ED}$(python_get_sitedir)" ]]; then find "${ED}$(python_get_sitedir)" "(" -name "*.c" -o -name "*.h" -o -name "*.la" ")" -type f -print0 | xargs -0 rm -f; fi }; if _python_package_supporting_installation_for_multiple_python_abis; then python_execute_function -q python_clean_sitedirs; else python_clean_sitedirs; fi; unset -f python_clean_sitedirs } python_clean_py-compile_files () { _python_check_python_pkg_setup_execution; local file files=() quiet="0"; while (($#)); do case "$1" in -q | --quiet) quiet="1" ;; -*) die "${FUNCNAME}(): Unrecognized option '$1'" ;; *) die "${FUNCNAME}(): Invalid usage" ;; esac; shift; done; while read -d '' -r file; do files+=("${file#./}"); done < <(find -name py-compile -type f -print0); for file in "${files[@]}"; do if [[ "${quiet}" == "0" ]]; then einfo "Cleaning '${file}' file"; fi; echo "#!/bin/sh" > "${file}"; done } python_convert_shebangs () { _python_check_python_pkg_setup_execution; local argument file files=() only_executables="0" python_interpreter quiet="0" recursive="0" shebangs_converted="0"; while (($#)); do case "$1" in -r | --recursive) recursive="1" ;; -q | --quiet) quiet="1" ;; -x | --only-executables) only_executables="1" ;; --) shift; break ;; -*) die "${FUNCNAME}(): Unrecognized option '$1'" ;; *) break ;; esac; shift; done; if [[ "$#" -eq 0 ]]; then die "${FUNCNAME}(): Missing Python version and files or directories"; else if [[ "$#" -eq 1 ]]; then die "${FUNCNAME}(): Missing files or directories"; fi; fi; if [[ -n "$(_python_get_implementation --ignore-invalid "$1")" ]]; then python_interpreter="$(PYTHON "$1")"; else python_interpreter="python$1"; fi; shift; for argument in "$@"; do if [[ ! -e "${argument}" ]]; then die "${FUNCNAME}(): '${argument}' does not exist"; else if [[ -f "${argument}" ]]; then files+=("${argument}"); else if [[ -d "${argument}" ]]; then if [[ "${recursive}" == "1" ]]; then while read -d '' -r file; do files+=("${file}"); done < <(find "${argument}" $([[ "${only_executables}" == "1" ]] && echo -perm /111) -type f -print0); else die "${FUNCNAME}(): '${argument}' is not a regular file"; fi; else die "${FUNCNAME}(): '${argument}' is not a regular file or a directory"; fi; fi; fi; done; for file in "${files[@]}"; do file="${file#./}"; [[ "${only_executables}" == "1" && ! -x "${file}" ]] && continue; if [[ "$(head -n1 "${file}")" =~ ${_PYTHON_SHEBANG_BASE_PART_REGEX} ]]; then [[ "$(sed -ne "2p" "${file}")" =~ ^"# Gentoo '".*"' wrapper script generated by python_generate_wrapper_scripts()"$ ]] && continue; shebangs_converted="1"; if [[ "${quiet}" == "0" ]]; then einfo "Converting shebang in '${file}'"; fi; sed -e "1s:^#![[:space:]]*\([^[:space:]]*/usr/bin/env[[:space:]]\)\?[[:space:]]*\([^[:space:]]*/\)\?\(jython\|pypy-c\|python\)\([[:digit:]]\+\(\.[[:digit:]]\+\)\?\)\?\(\$\|[[:space:]].*\):#!\1\2${python_interpreter}\6:" -i "${file}" || die "Conversion of shebang in '${file}' failed"; fi; done; if [[ "${shebangs_converted}" == "0" ]]; then ewarn "${FUNCNAME}(): Python scripts not found"; fi } python_copy_sources () { if ! _python_package_supporting_installation_for_multiple_python_abis; then die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"; fi; _python_check_python_pkg_setup_execution; local dir dirs=() PYTHON_ABI; if [[ "$#" -eq 0 ]]; then if [[ "${WORKDIR}" == "${S}" ]]; then die "${FUNCNAME}() cannot be used with current value of S variable"; fi; dirs=("${S%/}"); else dirs=("$@"); fi; _python_calculate_PYTHON_ABIS; for PYTHON_ABI in ${PYTHON_ABIS}; do for dir in "${dirs[@]}"; do cp -pr "${dir}" "${dir}-${PYTHON_ABI}" > /dev/null || die "Copying of sources failed"; done; done } python_disable_pyc () { _python_check_python_pkg_setup_execution; if [[ "$#" -ne 0 ]]; then die "${FUNCNAME}() does not accept arguments"; fi; export PYTHONDONTWRITEBYTECODE="1" } python_enable_pyc () { _python_check_python_pkg_setup_execution; if [[ "$#" -ne 0 ]]; then die "${FUNCNAME}() does not accept arguments"; fi; unset PYTHONDONTWRITEBYTECODE } python_execute_function () { if ! _python_package_supporting_installation_for_multiple_python_abis; then die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"; fi; _python_check_python_pkg_setup_execution; _python_set_color_variables; local action action_message action_message_template default_function="0" failure_message failure_message_template final_ABI="0" function iterated_PYTHON_ABIS nonfatal="0" previous_directory previous_directory_stack previous_directory_stack_length PYTHON_ABI quiet="0" return_code separate_build_dirs="0" source_dir; while (($#)); do case "$1" in --action-message) action_message_template="$2"; shift ;; -d | --default-function) default_function="1" ;; --failure-message) failure_message_template="$2"; shift ;; -f | --final-ABI) final_ABI="1" ;; --nonfatal) nonfatal="1" ;; -q | --quiet) quiet="1" ;; -s | --separate-build-dirs) separate_build_dirs="1" ;; --source-dir) source_dir="$2"; shift ;; --) shift; break ;; -*) die "${FUNCNAME}(): Unrecognized option '$1'" ;; *) break ;; esac; shift; done; if [[ -n "${source_dir}" && "${separate_build_dirs}" == 0 ]]; then die "${FUNCNAME}(): '--source-dir' option can be specified only with '--separate-build-dirs' option"; fi; if [[ "${default_function}" == "0" ]]; then if [[ "$#" -eq 0 ]]; then die "${FUNCNAME}(): Missing function name"; fi; function="$1"; shift; if [[ -z "$(type -t "${function}")" ]]; then die "${FUNCNAME}(): '${function}' function is not defined"; fi; else if has "${EAPI:-0}" 0 1; then die "${FUNCNAME}(): '--default-function' option cannot be used in this EAPI"; fi; if [[ "${EBUILD_PHASE}" == "configure" ]]; then if has "${EAPI}" 2 3; then function python_default_function () { econf "$@" }; else function python_default_function () { nonfatal econf "$@" }; fi; else if [[ "${EBUILD_PHASE}" == "compile" ]]; then function python_default_function () { emake "$@" }; else if [[ "${EBUILD_PHASE}" == "test" ]]; then function python_default_function () { local emake_cmd="${MAKE:-make} ${MAKEOPTS} ${EXTRA_EMAKE}"; if ${emake_cmd} -j1 -n check &>/dev/null; then ${emake_cmd} -j1 check "$@"; else if ${emake_cmd} -j1 -n test &>/dev/null; then ${emake_cmd} -j1 test "$@"; fi; fi }; else if [[ "${EBUILD_PHASE}" == "install" ]]; then function python_default_function () { emake DESTDIR="${D}" install "$@" }; else die "${FUNCNAME}(): '--default-function' option cannot be used in this ebuild phase"; fi; fi; fi; fi; function="python_default_function"; fi; if _python_abi-specific_local_scope; then die "${FUNCNAME}(): Invalid call stack"; fi; if [[ "${quiet}" == "0" ]]; then [[ "${EBUILD_PHASE}" == "setup" ]] && action="Setting up"; [[ "${EBUILD_PHASE}" == "unpack" ]] && action="Unpacking"; [[ "${EBUILD_PHASE}" == "prepare" ]] && action="Preparation"; [[ "${EBUILD_PHASE}" == "configure" ]] && action="Configuration"; [[ "${EBUILD_PHASE}" == "compile" ]] && action="Building"; [[ "${EBUILD_PHASE}" == "test" ]] && action="Testing"; [[ "${EBUILD_PHASE}" == "install" ]] && action="Installation"; [[ "${EBUILD_PHASE}" == "preinst" ]] && action="Preinstallation"; [[ "${EBUILD_PHASE}" == "postinst" ]] && action="Postinstallation"; [[ "${EBUILD_PHASE}" == "prerm" ]] && action="Preuninstallation"; [[ "${EBUILD_PHASE}" == "postrm" ]] && action="Postuninstallation"; fi; _python_calculate_PYTHON_ABIS; if [[ "${final_ABI}" == "1" ]]; then iterated_PYTHON_ABIS="$(PYTHON -f --ABI)"; else iterated_PYTHON_ABIS="${PYTHON_ABIS}"; fi; for PYTHON_ABI in ${iterated_PYTHON_ABIS}; do if [[ "${EBUILD_PHASE}" == "test" ]] && _python_check_python_abi_matching --patterns-list "${PYTHON_ABI}" "${PYTHON_TESTS_RESTRICTED_ABIS}"; then if [[ "${quiet}" == "0" ]]; then echo " ${_GREEN}*${_NORMAL} ${_BLUE}Testing of ${CATEGORY}/${PF} with $(python_get_implementation_and_version) skipped${_NORMAL}"; fi; continue; fi; _python_prepare_flags; if [[ "${quiet}" == "0" ]]; then if [[ -n "${action_message_template}" ]]; then eval "action_message=\"${action_message_template}\""; else action_message="${action} of ${CATEGORY}/${PF} with $(python_get_implementation_and_version)..."; fi; echo " ${_GREEN}*${_NORMAL} ${_BLUE}${action_message}${_NORMAL}"; fi; if [[ "${separate_build_dirs}" == "1" ]]; then if [[ -n "${source_dir}" ]]; then export BUILDDIR="${S}/${source_dir}-${PYTHON_ABI}"; else export BUILDDIR="${S}-${PYTHON_ABI}"; fi; pushd "${BUILDDIR}" > /dev/null || die "pushd failed"; else export BUILDDIR="${S}"; fi; previous_directory="$(pwd)"; previous_directory_stack="$(dirs -p)"; previous_directory_stack_length="$(dirs -p | wc -l)"; if ! has "${EAPI}" 0 1 2 3 && has "${PYTHON_ABI}" ${FAILURE_TOLERANT_PYTHON_ABIS}; then EPYTHON="$(PYTHON)" nonfatal "${function}" "$@"; else EPYTHON="$(PYTHON)" "${function}" "$@"; fi; return_code="$?"; _python_restore_flags; if [[ "${return_code}" -ne 0 ]]; then if [[ -n "${failure_message_template}" ]]; then eval "failure_message=\"${failure_message_template}\""; else failure_message="${action} failed with $(python_get_implementation_and_version) in ${function}() function"; fi; if [[ "${nonfatal}" == "1" ]]; then if [[ "${quiet}" == "0" ]]; then ewarn "${failure_message}"; fi; else if [[ "${final_ABI}" == "0" ]] && has "${PYTHON_ABI}" ${FAILURE_TOLERANT_PYTHON_ABIS}; then if [[ "${EBUILD_PHASE}" != "test" ]] || ! has test-fail-continue ${FEATURES}; then local enabled_PYTHON_ABIS= other_PYTHON_ABI; for other_PYTHON_ABI in ${PYTHON_ABIS}; do [[ "${other_PYTHON_ABI}" != "${PYTHON_ABI}" ]] && enabled_PYTHON_ABIS+="${enabled_PYTHON_ABIS:+ }${other_PYTHON_ABI}"; done; export PYTHON_ABIS="${enabled_PYTHON_ABIS}"; fi; if [[ "${quiet}" == "0" ]]; then ewarn "${failure_message}"; fi; if [[ -z "${PYTHON_ABIS}" ]]; then die "${function}() function failed with all enabled Python ABIs"; fi; else die "${failure_message}"; fi; fi; fi; if [[ "$(dirs -p | wc -l)" -lt "${previous_directory_stack_length}" ]]; then die "Directory stack decreased illegally"; fi; while [[ "$(dirs -p | wc -l)" -gt "${previous_directory_stack_length}" ]]; do popd > /dev/null || die "popd failed"; done; cd "${previous_directory}"; if [[ "$(dirs -p)" != "${previous_directory_stack}" ]]; then die "Directory stack changed illegally"; fi; if [[ "${separate_build_dirs}" == "1" ]]; then popd > /dev/null || die "popd failed"; fi; unset BUILDDIR; done; if [[ "${default_function}" == "1" ]]; then unset -f python_default_function; fi } python_execute_nosetests () { _python_check_python_pkg_setup_execution; _python_set_color_variables; local PYTHONPATH_template separate_build_dirs; while (($#)); do case "$1" in -P | --PYTHONPATH) PYTHONPATH_template="$2"; shift ;; -s | --separate-build-dirs) separate_build_dirs="1" ;; --) shift; break ;; -*) die "${FUNCNAME}(): Unrecognized option '$1'" ;; *) break ;; esac; shift; done; function python_test_function () { local evaluated_PYTHONPATH; eval "evaluated_PYTHONPATH=\"${PYTHONPATH_template}\""; _PYTHON_TEST_FUNCTION="python_execute_nosetests" _python_test_hook pre; if [[ -n "${evaluated_PYTHONPATH}" ]]; then echo ${_BOLD}PYTHONPATH="${evaluated_PYTHONPATH}" nosetests --verbosity="${PYTHON_TEST_VERBOSITY}" "$@"${_NORMAL}; PYTHONPATH="${evaluated_PYTHONPATH}" nosetests --verbosity="${PYTHON_TEST_VERBOSITY}" "$@" || return "$?"; else echo ${_BOLD}nosetests --verbosity="${PYTHON_TEST_VERBOSITY}" "$@"${_NORMAL}; nosetests --verbosity="${PYTHON_TEST_VERBOSITY}" "$@" || return "$?"; fi; _PYTHON_TEST_FUNCTION="python_execute_nosetests" _python_test_hook post }; if _python_package_supporting_installation_for_multiple_python_abis; then python_execute_function ${separate_build_dirs:+-s} python_test_function "$@"; else if [[ -n "${separate_build_dirs}" ]]; then die "${FUNCNAME}(): Invalid usage"; fi; python_test_function "$@" || die "Testing failed"; fi; unset -f python_test_function } python_execute_py.test () { _python_check_python_pkg_setup_execution; _python_set_color_variables; local PYTHONPATH_template separate_build_dirs; while (($#)); do case "$1" in -P | --PYTHONPATH) PYTHONPATH_template="$2"; shift ;; -s | --separate-build-dirs) separate_build_dirs="1" ;; --) shift; break ;; -*) die "${FUNCNAME}(): Unrecognized option '$1'" ;; *) break ;; esac; shift; done; function python_test_function () { local evaluated_PYTHONPATH; eval "evaluated_PYTHONPATH=\"${PYTHONPATH_template}\""; _PYTHON_TEST_FUNCTION="python_execute_py.test" _python_test_hook pre; if [[ -n "${evaluated_PYTHONPATH}" ]]; then echo ${_BOLD}PYTHONPATH="${evaluated_PYTHONPATH}" py.test $([[ "${PYTHON_TEST_VERBOSITY}" -ge 2 ]] && echo -v) "$@"${_NORMAL}; PYTHONPATH="${evaluated_PYTHONPATH}" py.test $([[ "${PYTHON_TEST_VERBOSITY}" -ge 2 ]] && echo -v) "$@" || return "$?"; else echo ${_BOLD}py.test $([[ "${PYTHON_TEST_VERBOSITY}" -gt 1 ]] && echo -v) "$@"${_NORMAL}; py.test $([[ "${PYTHON_TEST_VERBOSITY}" -gt 1 ]] && echo -v) "$@" || return "$?"; fi; _PYTHON_TEST_FUNCTION="python_execute_py.test" _python_test_hook post }; if _python_package_supporting_installation_for_multiple_python_abis; then python_execute_function ${separate_build_dirs:+-s} python_test_function "$@"; else if [[ -n "${separate_build_dirs}" ]]; then die "${FUNCNAME}(): Invalid usage"; fi; python_test_function "$@" || die "Testing failed"; fi; unset -f python_test_function } python_execute_trial () { _python_check_python_pkg_setup_execution; _python_set_color_variables; local PYTHONPATH_template separate_build_dirs; while (($#)); do case "$1" in -P | --PYTHONPATH) PYTHONPATH_template="$2"; shift ;; -s | --separate-build-dirs) separate_build_dirs="1" ;; --) shift; break ;; -*) die "${FUNCNAME}(): Unrecognized option '$1'" ;; *) break ;; esac; shift; done; function python_test_function () { local evaluated_PYTHONPATH; eval "evaluated_PYTHONPATH=\"${PYTHONPATH_template}\""; _PYTHON_TEST_FUNCTION="python_execute_trial" _python_test_hook pre; if [[ -n "${evaluated_PYTHONPATH}" ]]; then echo ${_BOLD}PYTHONPATH="${evaluated_PYTHONPATH}" trial $([[ "${PYTHON_TEST_VERBOSITY}" -ge 4 ]] && echo --spew) "$@"${_NORMAL}; PYTHONPATH="${evaluated_PYTHONPATH}" trial $([[ "${PYTHON_TEST_VERBOSITY}" -ge 4 ]] && echo --spew) "$@" || return "$?"; else echo ${_BOLD}trial $([[ "${PYTHON_TEST_VERBOSITY}" -ge 4 ]] && echo --spew) "$@"${_NORMAL}; trial $([[ "${PYTHON_TEST_VERBOSITY}" -ge 4 ]] && echo --spew) "$@" || return "$?"; fi; _PYTHON_TEST_FUNCTION="python_execute_trial" _python_test_hook post }; if _python_package_supporting_installation_for_multiple_python_abis; then python_execute_function ${separate_build_dirs:+-s} python_test_function "$@"; else if [[ -n "${separate_build_dirs}" ]]; then die "${FUNCNAME}(): Invalid usage"; fi; python_test_function "$@" || die "Testing failed"; fi; unset -f python_test_function } python_generate_wrapper_scripts () { if [[ "${EBUILD_PHASE}" != "install" ]]; then die "${FUNCNAME}() can be used only in src_install() phase"; fi; if ! _python_package_supporting_installation_for_multiple_python_abis; then die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"; fi; _python_check_python_pkg_setup_execution; _python_initialize_prefix_variables; local eselect_python_option file force="0" quiet="0" PYTHON_ABI PYTHON_ABIS_list python2_enabled="0" python3_enabled="0" respect_EPYTHON="0"; while (($#)); do case "$1" in -E | --respect-EPYTHON) respect_EPYTHON="1" ;; -f | --force) force="1" ;; -q | --quiet) quiet="1" ;; --) shift; break ;; -*) die "${FUNCNAME}(): Unrecognized option '$1'" ;; *) break ;; esac; shift; done; if [[ "$#" -eq 0 ]]; then die "${FUNCNAME}(): Missing arguments"; fi; _python_calculate_PYTHON_ABIS; for PYTHON_ABI in "${_CPYTHON2_GLOBALLY_SUPPORTED_ABIS[@]}"; do if has "${PYTHON_ABI}" ${PYTHON_ABIS}; then python2_enabled="1"; fi; done; for PYTHON_ABI in "${_CPYTHON3_GLOBALLY_SUPPORTED_ABIS[@]}"; do if has "${PYTHON_ABI}" ${PYTHON_ABIS}; then python3_enabled="1"; fi; done; if [[ "${python2_enabled}" == "1" && "${python3_enabled}" == "1" ]]; then eselect_python_option=; else if [[ "${python2_enabled}" == "1" && "${python3_enabled}" == "0" ]]; then eselect_python_option="--python2"; else if [[ "${python2_enabled}" == "0" && "${python3_enabled}" == "1" ]]; then eselect_python_option="--python3"; else die "${FUNCNAME}(): Unsupported environment"; fi; fi; fi; PYTHON_ABIS_list="$("$(PYTHON -f)" -c "print(', '.join('\"%s\"' % x for x in reversed('${PYTHON_ABIS}'.split())))")"; for file in "$@"; do if [[ -f "${file}" && "${force}" == "0" ]]; then die "${FUNCNAME}(): '${file}' already exists"; fi; if [[ "${quiet}" == "0" ]]; then einfo "Generating '${file#${ED%/}}' wrapper script"; fi; cat > "${file}" <> "${file}" <> "${file}" <> "${file}" < /dev/null || die "pushd failed"; for file in "${files[@]}"; do version_executable="0"; for regex in "/usr/bin/.*" "/usr/sbin/.*" "${PYTHON_VERSIONED_SCRIPTS[@]}"; do if [[ "/${file}" =~ ^${regex}$ ]]; then version_executable="1"; break; fi; done; for regex in "${PYTHON_VERSIONED_EXECUTABLES[@]}"; do if [[ "/${file}" =~ ^${regex}$ ]]; then version_executable="2"; break; fi; done; if [[ "${version_executable}" != "0" ]]; then for regex in "${PYTHON_NONVERSIONED_EXECUTABLES[@]}"; do if [[ "/${file}" =~ ^${regex}$ ]]; then version_executable="0"; break; fi; done; fi; [[ "${version_executable}" == "0" ]] && continue; if [[ -L "${file}" ]]; then absolute_file="$(readlink "${file}")"; if [[ "${absolute_file}" == /* ]]; then absolute_file="${intermediate_installation_images_directory}/${PYTHON_ABI}${EPREFIX}/${absolute_file##/}"; else if [[ "${file}" == */* ]]; then absolute_file="${intermediate_installation_images_directory}/${PYTHON_ABI}${EPREFIX}/${file%/*}/${absolute_file}"; else absolute_file="${intermediate_installation_images_directory}/${PYTHON_ABI}${EPREFIX}/${absolute_file}"; fi; fi; else absolute_file="${intermediate_installation_images_directory}/${PYTHON_ABI}${EPREFIX}/${file}"; fi; [[ ! -x "${absolute_file}" ]] && continue; shebang="$(head -n1 "${absolute_file}")" || die "Extraction of shebang from '${absolute_file}' failed"; if [[ "${version_executable}" == "2" ]]; then wrapper_scripts+=("${ED}${file}"); else if [[ "${version_executable}" == "1" ]]; then if [[ "${shebang}" =~ ${_PYTHON_SHEBANG_BASE_PART_REGEX}([[:digit:]]+(\.[[:digit:]]+)?)?($|[[:space:]]+) ]]; then wrapper_scripts+=("${ED}${file}"); else version_executable="0"; fi; fi; fi; [[ "${version_executable}" == "0" ]] && continue; if [[ -e "${file}-${PYTHON_ABI}" ]]; then die "${FUNCNAME}(): '${EPREFIX}/${file}-${PYTHON_ABI}' already exists"; fi; mv "${file}" "${file}-${PYTHON_ABI}" || die "Renaming of '${file}' failed"; if [[ "${shebang}" =~ ${_PYTHON_SHEBANG_BASE_PART_REGEX}[[:digit:]]*($|[[:space:]]+) ]]; then if [[ -L "${file}-${PYTHON_ABI}" ]]; then python_convert_shebangs $([[ "${quiet}" == "1" ]] && echo --quiet) "${PYTHON_ABI}" "${absolute_file}"; else python_convert_shebangs $([[ "${quiet}" == "1" ]] && echo --quiet) "${PYTHON_ABI}" "${file}-${PYTHON_ABI}"; fi; fi; done; popd > /dev/null || die "popd failed"; if ROOT="/" has_version '>=sys-apps/coreutils-6.9.90'; then cp -fr --preserve=all --no-preserve=context "${intermediate_installation_images_directory}/${PYTHON_ABI}/"* "${D}" || die "Merging of intermediate installation image for Python ABI '${PYTHON_ABI} into installation image failed"; else if ROOT="/" has_version sys-apps/coreutils; then cp -fr --preserve=all "${intermediate_installation_images_directory}/${PYTHON_ABI}/"* "${D}" || die "Merging of intermediate installation image for Python ABI '${PYTHON_ABI} into installation image failed"; else cp -fpr "${intermediate_installation_images_directory}/${PYTHON_ABI}/"* "${D}" || die "Merging of intermediate installation image for Python ABI '${PYTHON_ABI} into installation image failed"; fi; fi; done; rm -fr "${intermediate_installation_images_directory}"; if [[ "${#wrapper_scripts[@]}" -ge 1 ]]; then rm -f "${T}/python_wrapper_scripts"; for file in "${wrapper_scripts[@]}"; do echo -n "${file}" >> "${T}/python_wrapper_scripts"; echo -en "\x00" >> "${T}/python_wrapper_scripts"; done; while read -d '' -r file; do wrapper_scripts_set+=("${file}"); done < <("$(PYTHON -f)" -c "import sys if hasattr(sys.stdout, 'buffer'): # Python 3 stdout = sys.stdout.buffer else: # Python 2 stdout = sys.stdout python_wrapper_scripts_file = open('${T}/python_wrapper_scripts', 'rb') files = set(python_wrapper_scripts_file.read().rstrip(${b}'\x00').split(${b}'\x00')) python_wrapper_scripts_file.close() for file in sorted(files): stdout.write(file) stdout.write(${b}'\x00')" || die "${FUNCNAME}(): Failure of extraction of set of wrapper scripts"); python_generate_wrapper_scripts $([[ "${quiet}" == "1" ]] && echo --quiet) "${wrapper_scripts_set[@]}"; fi } python_mod_cleanup () { if [[ "${EBUILD_PHASE}" != "postrm" ]]; then die "${FUNCNAME}() can be used only in pkg_postrm() phase"; fi; _python_check_python_pkg_setup_execution; _python_initialize_prefix_variables; local allow_evaluated_non_sitedir_paths="0" dir iterated_PYTHON_ABIS PYTHON_ABI="${PYTHON_ABI}" root search_paths=() sitedir; if _python_package_supporting_installation_for_multiple_python_abis; then if has "${EAPI:-0}" 0 1 2 3 && [[ -z "${PYTHON_ABIS}" ]]; then die "${FUNCNAME}(): python_pkg_setup() or python_execute_function() not called"; fi; iterated_PYTHON_ABIS="${PYTHON_ABIS}"; else if has "${EAPI:-0}" 0 1 2 3; then iterated_PYTHON_ABIS="${PYTHON_ABI:-$(PYTHON --ABI)}"; else iterated_PYTHON_ABIS="${PYTHON_ABI}"; fi; fi; root="${EROOT%/}"; while (($#)); do case "$1" in --allow-evaluated-non-sitedir-paths) allow_evaluated_non_sitedir_paths="1" ;; --) shift; break ;; -*) die "${FUNCNAME}(): Unrecognized option '$1'" ;; *) break ;; esac; shift; done; if [[ "${allow_evaluated_non_sitedir_paths}" == "1" ]] && ! _python_package_supporting_installation_for_multiple_python_abis; then die "${FUNCNAME}(): '--allow-evaluated-non-sitedir-paths' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"; fi; if [[ "$#" -eq 0 ]]; then die "${FUNCNAME}(): Missing files or directories"; fi; if ! has "${EAPI:-0}" 0 1 2 || _python_package_supporting_installation_for_multiple_python_abis || _python_implementation || [[ "${CATEGORY}/${PN}" == "sys-apps/portage" ]]; then while (($#)); do if [[ "$1" =~ ^($|(\.|\.\.|/)($|/)) ]]; then die "${FUNCNAME}(): Invalid argument '$1'"; else if ! _python_implementation && [[ "$1" =~ ^/usr/lib(32|64)?/python[[:digit:]]+\.[[:digit:]]+ ]]; then die "${FUNCNAME}(): Paths of directories / files in site-packages directories must be relative to site-packages directories"; else if [[ "$1" =~ ^/ ]]; then if _python_package_supporting_installation_for_multiple_python_abis; then if [[ "${allow_evaluated_non_sitedir_paths}" != "1" ]]; then die "${FUNCNAME}(): Absolute paths cannot be used in ebuilds of packages supporting installation for multiple Python ABIs"; fi; if [[ "$1" != *\$* ]]; then die "${FUNCNAME}(): '$1' has invalid syntax"; fi; for PYTHON_ABI in ${iterated_PYTHON_ABIS}; do eval "search_paths+=(\"\${root}$1\")"; done; else search_paths+=("${root}$1"); fi; else for PYTHON_ABI in ${iterated_PYTHON_ABIS}; do search_paths+=("${root}$(python_get_sitedir)/$1"); done; fi; fi; fi; shift; done; else ewarn; ewarn "Deprecation Warning: Usage of ${FUNCNAME}() in packages not supporting installation"; ewarn "for multiple Python ABIs in EAPI <=2 is deprecated and will be disallowed on 2011-08-01."; ewarn "Use EAPI >=3 and call ${FUNCNAME}() with paths having appropriate syntax."; ewarn "The ebuild needs to be fixed. Please report a bug, if it has not been already reported."; ewarn; search_paths=("${@#/}"); search_paths=("${search_paths[@]/#/${root}/}"); fi; _python_clean_compiled_modules "${search_paths[@]}" } python_mod_optimize () { if [[ "${EBUILD_PHASE}" != "postinst" ]]; then die "${FUNCNAME}() can be used only in pkg_postinst() phase"; fi; _python_check_python_pkg_setup_execution; _python_initialize_prefix_variables; if ! has "${EAPI:-0}" 0 1 2 || _python_package_supporting_installation_for_multiple_python_abis || _python_implementation || [[ "${CATEGORY}/${PN}" == "sys-apps/portage" ]]; then local allow_evaluated_non_sitedir_paths="0" dir dirs=() evaluated_dirs=() evaluated_files=() file files=() iterated_PYTHON_ABIS options=() other_dirs=() other_files=() previous_PYTHON_ABI="${PYTHON_ABI}" return_code root site_packages_dirs=() site_packages_files=() stderr stderr_line; if _python_package_supporting_installation_for_multiple_python_abis; then if has "${EAPI:-0}" 0 1 2 3 && [[ -z "${PYTHON_ABIS}" ]]; then die "${FUNCNAME}(): python_pkg_setup() or python_execute_function() not called"; fi; iterated_PYTHON_ABIS="${PYTHON_ABIS}"; else if has "${EAPI:-0}" 0 1 2 3; then iterated_PYTHON_ABIS="${PYTHON_ABI:=$(PYTHON --ABI)}"; else iterated_PYTHON_ABIS="${PYTHON_ABI}"; fi; fi; root="${EROOT%/}"; while (($#)); do case "$1" in --allow-evaluated-non-sitedir-paths) allow_evaluated_non_sitedir_paths="1" ;; -l | -f | -q) options+=("$1") ;; -d | -x) options+=("$1" "$2"); shift ;; --) shift; break ;; -*) die "${FUNCNAME}(): Unrecognized option '$1'" ;; *) break ;; esac; shift; done; if [[ "${allow_evaluated_non_sitedir_paths}" == "1" ]] && ! _python_package_supporting_installation_for_multiple_python_abis; then die "${FUNCNAME}(): '--allow-evaluated-non-sitedir-paths' option cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"; fi; if [[ "$#" -eq 0 ]]; then die "${FUNCNAME}(): Missing files or directories"; fi; while (($#)); do if [[ "$1" =~ ^($|(\.|\.\.|/)($|/)) ]]; then die "${FUNCNAME}(): Invalid argument '$1'"; else if ! _python_implementation && [[ "$1" =~ ^/usr/lib(32|64)?/python[[:digit:]]+\.[[:digit:]]+ ]]; then die "${FUNCNAME}(): Paths of directories / files in site-packages directories must be relative to site-packages directories"; else if [[ "$1" =~ ^/ ]]; then if _python_package_supporting_installation_for_multiple_python_abis; then if [[ "${allow_evaluated_non_sitedir_paths}" != "1" ]]; then die "${FUNCNAME}(): Absolute paths cannot be used in ebuilds of packages supporting installation for multiple Python ABIs"; fi; if [[ "$1" != *\$* ]]; then die "${FUNCNAME}(): '$1' has invalid syntax"; fi; if [[ "$1" == *.py ]]; then evaluated_files+=("$1"); else evaluated_dirs+=("$1"); fi; else if [[ -d "${root}$1" ]]; then other_dirs+=("${root}$1"); else if [[ -f "${root}$1" ]]; then other_files+=("${root}$1"); else if [[ -e "${root}$1" ]]; then eerror "${FUNCNAME}(): '${root}$1' is not a regular file or a directory"; else eerror "${FUNCNAME}(): '${root}$1' does not exist"; fi; fi; fi; fi; else for PYTHON_ABI in ${iterated_PYTHON_ABIS}; do if [[ -d "${root}$(python_get_sitedir)/$1" ]]; then site_packages_dirs+=("$1"); break; else if [[ -f "${root}$(python_get_sitedir)/$1" ]]; then site_packages_files+=("$1"); break; else if [[ -e "${root}$(python_get_sitedir)/$1" ]]; then eerror "${FUNCNAME}(): '$1' is not a regular file or a directory"; else eerror "${FUNCNAME}(): '$1' does not exist"; fi; fi; fi; done; fi; fi; fi; shift; done; options+=("-q"); for PYTHON_ABI in ${iterated_PYTHON_ABIS}; do if ((${#site_packages_dirs[@]})) || ((${#site_packages_files[@]})) || ((${#evaluated_dirs[@]})) || ((${#evaluated_files[@]})); then return_code="0"; stderr=""; ebegin "Compilation and optimization of Python modules for $(python_get_implementation_and_version)"; if ((${#site_packages_dirs[@]})) || ((${#evaluated_dirs[@]})); then for dir in "${site_packages_dirs[@]}"; do dirs+=("${root}$(python_get_sitedir)/${dir}"); done; for dir in "${evaluated_dirs[@]}"; do eval "dirs+=(\"\${root}${dir}\")"; done; stderr+="${stderr:+ }$("$(PYTHON)" -m compileall "${options[@]}" "${dirs[@]}" 2>&1)" || return_code="1"; if ! has "$(_python_get_implementation "${PYTHON_ABI}")" Jython PyPy; then "$(PYTHON)" -O -m compileall "${options[@]}" "${dirs[@]}" &>/dev/null || return_code="1"; fi; _python_clean_compiled_modules "${dirs[@]}"; fi; if ((${#site_packages_files[@]})) || ((${#evaluated_files[@]})); then for file in "${site_packages_files[@]}"; do files+=("${root}$(python_get_sitedir)/${file}"); done; for file in "${evaluated_files[@]}"; do eval "files+=(\"\${root}${file}\")"; done; stderr+="${stderr:+ }$("$(PYTHON)" -m py_compile "${files[@]}" 2>&1)" || return_code="1"; if ! has "$(_python_get_implementation "${PYTHON_ABI}")" Jython PyPy; then "$(PYTHON)" -O -m py_compile "${files[@]}" &>/dev/null || return_code="1"; fi; _python_clean_compiled_modules "${files[@]}"; fi; eend "${return_code}"; if [[ -n "${stderr}" ]]; then eerror "Syntax errors / warnings in Python modules for $(python_get_implementation_and_version):" &>/dev/null; while read stderr_line; do eerror " ${stderr_line}"; done <<< "${stderr}"; fi; fi; unset dirs files; done; if _python_package_supporting_installation_for_multiple_python_abis; then if [[ -n "${previous_PYTHON_ABI}" ]]; then PYTHON_ABI="${previous_PYTHON_ABI}"; else unset PYTHON_ABI; fi; fi; if ((${#other_dirs[@]})) || ((${#other_files[@]})); then return_code="0"; stderr=""; ebegin "Compilation and optimization of Python modules placed outside of site-packages directories for $(python_get_implementation_and_version)"; if ((${#other_dirs[@]})); then stderr+="${stderr:+ }$("$(PYTHON ${PYTHON_ABI})" -m compileall "${options[@]}" "${other_dirs[@]}" 2>&1)" || return_code="1"; if ! has "$(_python_get_implementation "${PYTHON_ABI}")" Jython PyPy; then "$(PYTHON ${PYTHON_ABI})" -O -m compileall "${options[@]}" "${other_dirs[@]}" &>/dev/null || return_code="1"; fi; _python_clean_compiled_modules "${other_dirs[@]}"; fi; if ((${#other_files[@]})); then stderr+="${stderr:+ }$("$(PYTHON ${PYTHON_ABI})" -m py_compile "${other_files[@]}" 2>&1)" || return_code="1"; if ! has "$(_python_get_implementation "${PYTHON_ABI}")" Jython PyPy; then "$(PYTHON ${PYTHON_ABI})" -O -m py_compile "${other_files[@]}" &>/dev/null || return_code="1"; fi; _python_clean_compiled_modules "${other_files[@]}"; fi; eend "${return_code}"; if [[ -n "${stderr}" ]]; then eerror "Syntax errors / warnings in Python modules placed outside of site-packages directories for $(python_get_implementation_and_version):" &>/dev/null; while read stderr_line; do eerror " ${stderr_line}"; done <<< "${stderr}"; fi; fi; else ewarn; ewarn "Deprecation Warning: Usage of ${FUNCNAME}() in packages not supporting installation"; ewarn "for multiple Python ABIs in EAPI <=2 is deprecated and will be disallowed on 2011-08-01."; ewarn "Use EAPI >=3 and call ${FUNCNAME}() with paths having appropriate syntax."; ewarn "The ebuild needs to be fixed. Please report a bug, if it has not been already reported."; ewarn; local myroot mydirs=() myfiles=() myopts=() return_code="0"; myroot="${EROOT%/}"; while (($#)); do case "$1" in -l | -f | -q) myopts+=("$1") ;; -d | -x) myopts+=("$1" "$2"); shift ;; --) shift; break ;; -*) die "${FUNCNAME}(): Unrecognized option '$1'" ;; *) break ;; esac; shift; done; if [[ "$#" -eq 0 ]]; then die "${FUNCNAME}(): Missing files or directories"; fi; while (($#)); do if [[ "$1" =~ ^($|(\.|\.\.|/)($|/)) ]]; then die "${FUNCNAME}(): Invalid argument '$1'"; else if [[ -d "${myroot}/${1#/}" ]]; then mydirs+=("${myroot}/${1#/}"); else if [[ -f "${myroot}/${1#/}" ]]; then myfiles+=("${myroot}/${1#/}"); else if [[ -e "${myroot}/${1#/}" ]]; then eerror "${FUNCNAME}(): ${myroot}/${1#/} is not a regular file or directory"; else eerror "${FUNCNAME}(): ${myroot}/${1#/} does not exist"; fi; fi; fi; fi; shift; done; myopts+=(-q); PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"; ebegin "Compilation and optimization of Python modules for $(python_get_implementation) $(python_get_version)"; if ((${#mydirs[@]})); then "$(PYTHON ${PYTHON_ABI})" "${myroot}$(python_get_libdir)/compileall.py" "${myopts[@]}" "${mydirs[@]}" || return_code="1"; "$(PYTHON ${PYTHON_ABI})" -O "${myroot}$(python_get_libdir)/compileall.py" "${myopts[@]}" "${mydirs[@]}" &>/dev/null || return_code="1"; _python_clean_compiled_modules "${mydirs[@]}"; fi; if ((${#myfiles[@]})); then "$(PYTHON ${PYTHON_ABI})" "${myroot}$(python_get_libdir)/py_compile.py" "${myfiles[@]}" || return_code="1"; "$(PYTHON ${PYTHON_ABI})" -O "${myroot}$(python_get_libdir)/py_compile.py" "${myfiles[@]}" &>/dev/null || return_code="1"; _python_clean_compiled_modules "${myfiles[@]}"; fi; eend "${return_code}"; fi } python_need_rebuild () { if _python_package_supporting_installation_for_multiple_python_abis; then die "${FUNCNAME}() cannot be used in ebuilds of packages supporting installation for multiple Python ABIs"; fi; _python_check_python_pkg_setup_execution; if [[ "$#" -ne 0 ]]; then die "${FUNCNAME}() does not accept arguments"; fi; export PYTHON_NEED_REBUILD="$(PYTHON --ABI)" } python_pkg_setup () { if [[ "${EBUILD_PHASE}" != "setup" ]]; then die "${FUNCNAME}() can be used only in pkg_setup() phase"; fi; if [[ "$#" -ne 0 ]]; then die "${FUNCNAME}() does not accept arguments"; fi; export JYTHON_SYSTEM_CACHEDIR="1"; addwrite "${EPREFIX}/var/cache/jython"; if _python_package_supporting_installation_for_multiple_python_abis; then _python_calculate_PYTHON_ABIS; export EPYTHON="$(PYTHON -f)"; else PYTHON_ABI="${PYTHON_ABI:-$(PYTHON --ABI)}"; fi; if ! has "${EAPI:-0}" 0 1 && [[ -n "${PYTHON_USE_WITH}" || -n "${PYTHON_USE_WITH_OR}" ]]; then if [[ -n "${PYTHON_USE_WITH_OPT}" ]]; then if [[ "${PYTHON_USE_WITH_OPT}" == !* ]]; then use ${PYTHON_USE_WITH_OPT#!} && return; else use !${PYTHON_USE_WITH_OPT} && return; fi; fi; function python_pkg_setup_check_USE_flags () { local python_atom USE_flag; python_atom="$(python_get_implementational_package)"; for USE_flag in ${PYTHON_USE_WITH}; do if ! has_version "${python_atom}[${USE_flag}]"; then eerror "Please rebuild ${python_atom} with the following USE flags enabled: ${PYTHON_USE_WITH}"; die "Please rebuild ${python_atom} with the following USE flags enabled: ${PYTHON_USE_WITH}"; fi; done; for USE_flag in ${PYTHON_USE_WITH_OR}; do if has_version "${python_atom}[${USE_flag}]"; then return; fi; done; if [[ -n ${PYTHON_USE_WITH_OR} ]]; then eerror "Please rebuild ${python_atom} with at least one of the following USE flags enabled: ${PYTHON_USE_WITH_OR}"; die "Please rebuild ${python_atom} with at least one of the following USE flags enabled: ${PYTHON_USE_WITH_OR}"; fi }; if _python_package_supporting_installation_for_multiple_python_abis; then PYTHON_SKIP_SANITY_CHECKS="1" python_execute_function -q python_pkg_setup_check_USE_flags; else python_pkg_setup_check_USE_flags; fi; unset -f python_pkg_setup_check_USE_flags; fi; PYTHON_PKG_SETUP_EXECUTED="1" } python_set_active_version () { if [[ "${EBUILD_PHASE}" != "setup" ]]; then die "${FUNCNAME}() can be used only in pkg_setup() phase"; fi; if _python_package_supporting_installation_for_multiple_python_abis; then die "${FUNCNAME}() cannot be used in ebuilds of packages supporting installation for multiple Python ABIs"; fi; if [[ "$#" -ne 1 ]]; then die "${FUNCNAME}() requires 1 argument"; fi; _python_initial_sanity_checks; if [[ -z "${PYTHON_ABI}" ]]; then if [[ -n "$(_python_get_implementation --ignore-invalid "$1")" ]]; then PYTHON_ABI="$1"; if ! _python_implementation && ! has_version "$(python_get_implementational_package)"; then die "${FUNCNAME}(): '$(python_get_implementational_package)' is not installed"; fi; export EPYTHON="$(PYTHON "$1")"; else if [[ "$1" == "2" ]]; then if ! _python_implementation && ! has_version "=dev-lang/python-2*"; then die "${FUNCNAME}(): '=dev-lang/python-2*' is not installed"; fi; export EPYTHON="$(PYTHON -2)"; PYTHON_ABI="${EPYTHON#python}"; PYTHON_ABI="${PYTHON_ABI%%-*}"; else if [[ "$1" == "3" ]]; then if ! _python_implementation && ! has_version "=dev-lang/python-3*"; then die "${FUNCNAME}(): '=dev-lang/python-3*' is not installed"; fi; export EPYTHON="$(PYTHON -3)"; PYTHON_ABI="${EPYTHON#python}"; PYTHON_ABI="${PYTHON_ABI%%-*}"; else die "${FUNCNAME}(): Unrecognized argument '$1'"; fi; fi; fi; fi; _python_final_sanity_checks; PYTHON_REQUESTED_ACTIVE_VERSION="$1" } python_src_compile () { if [[ "${EBUILD_PHASE}" != "compile" ]]; then die "${FUNCNAME}() can be used only in src_compile() phase"; fi; if ! _python_package_supporting_installation_for_multiple_python_abis; then die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"; fi; _python_check_python_pkg_setup_execution; python_execute_function -d -s -- "$@" } python_src_configure () { if [[ "${EBUILD_PHASE}" != "configure" ]]; then die "${FUNCNAME}() can be used only in src_configure() phase"; fi; if ! _python_package_supporting_installation_for_multiple_python_abis; then die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"; fi; _python_check_python_pkg_setup_execution; python_execute_function -d -s -- "$@" } python_src_install () { if [[ "${EBUILD_PHASE}" != "install" ]]; then die "${FUNCNAME}() can be used only in src_install() phase"; fi; if ! _python_package_supporting_installation_for_multiple_python_abis; then die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"; fi; _python_check_python_pkg_setup_execution; if has "${EAPI:-0}" 0 1 2 3; then python_execute_function -d -s -- "$@"; else function python_installation () { emake DESTDIR="${T}/images/${PYTHON_ABI}" install "$@" }; python_execute_function -s python_installation "$@"; unset python_installation; python_merge_intermediate_installation_images "${T}/images"; fi } python_src_prepare () { if [[ "${EBUILD_PHASE}" != "prepare" ]]; then die "${FUNCNAME}() can be used only in src_prepare() phase"; fi; if ! _python_package_supporting_installation_for_multiple_python_abis; then die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"; fi; _python_check_python_pkg_setup_execution; if [[ "$#" -ne 0 ]]; then die "${FUNCNAME}() does not accept arguments"; fi; python_copy_sources } python_src_test () { if [[ "${EBUILD_PHASE}" != "test" ]]; then die "${FUNCNAME}() can be used only in src_test() phase"; fi; if ! _python_package_supporting_installation_for_multiple_python_abis; then die "${FUNCNAME}() cannot be used in ebuilds of packages not supporting installation for multiple Python ABIs"; fi; _python_check_python_pkg_setup_execution; python_execute_function -d -s -- "$@" } src_compile () { WANT_AUTOMAKE="${AUTOMAKE_VERSION}" emake -C build || die "failed compiling ${PN}" } src_configure () { local myconf=""; use gstreamer || myconf="${myconf} --disable-gst"; use ffmpeg2 && myconf="${myconf} --enable-ff-mpeg2"; ./configure --force --prefix=/usr $(use_enable gtk) --disable-gtk-update-checks ${myconf} || die "configure failed" } src_install () { emake -C build DESTDIR="${D}" install || die "failed installing ${PN}"; emake -C build doc || die "emake doc failed"; dodoc AUTHORS CREDITS NEWS THANKS || die "dodoc 1 failed"; dodoc build/doc/articles/txt/* || die "dodoc 2 failed" } src_prepare () { mkdir "${S}"/download || die; local x; for x in ${A}; do cp "${DISTDIR}/${x}" "${S}/download/${x/-${PN}}" || die "copying ${x} failed"; done; CURRENT_FRIBIDI_CFLAGS=$($(tc-getPKG_CONFIG) --cflags fribidi); FRIBIDI_FIX_PATH="${S}/build/GNUmakefile.custom.defs"; mkdir "${S}/build"; touch "${FRIBIDI_FIX_PATH}"; echo 'LIBASS.CONFIGURE.extra = \' >> "${FRIBIDI_FIX_PATH}"; echo '--disable-png --disable-enca \' >> "${FRIBIDI_FIX_PATH}"; echo 'FREETYPE_LIBS="-L$(call fn.ABSOLUTE,$(CONTRIB.build/))lib -lfreetype" \' >> "${FRIBIDI_FIX_PATH}"; echo 'FREETYPE_CFLAGS="-I$(call fn.ABSOLUTE,$(CONTRIB.build/))include/freetype2" \' >> "${FRIBIDI_FIX_PATH}"; echo 'FONTCONFIG_LIBS="-L$(call fn.ABSOLUTE,$(CONTRIB.build/))lib -lfontconfig" \' >> "${FRIBIDI_FIX_PATH}"; echo 'FONTCONFIG_CFLAGS="-I$(call fn.ABSOLUTE,$(CONTRIB.build/))include" \' >> "${FRIBIDI_FIX_PATH}"; echo 'FRIBIDI_LIBS="-L$(call fn.ABSOLUTE,$(CONTRIB.build/))lib -lfribidi" \' >> "${FRIBIDI_FIX_PATH}"; echo 'FRIBIDI_CFLAGS="-I$(call fn.ABSOLUTE,$(CONTRIB.build/))include '"${CURRENT_FRIBIDI_CFLAGS}" '"' >> "${FRIBIDI_FIX_PATH}" } src_test () { __eapi0_src_test "$@" } src_unpack () { unpack ${MY_P}.tar.bz2 } tc-arch () { tc-ninja_magic_to_arch portage "$@" } tc-arch-kernel () { tc-ninja_magic_to_arch kern "$@" } tc-endian () { local host=$1; [[ -z ${host} ]] && host=${CTARGET:-${CHOST}}; host=${host%%-*}; case ${host} in aarch64*be) echo big ;; aarch64) echo little ;; alpha*) echo big ;; arm*b*) echo big ;; arm*) echo little ;; cris*) echo little ;; hppa*) echo big ;; i?86*) echo little ;; ia64*) echo little ;; m68*) echo big ;; mips*l*) echo little ;; mips*) echo big ;; powerpc*) echo big ;; s390*) echo big ;; sh*b*) echo big ;; sh*) echo little ;; sparc*) echo big ;; x86_64*) echo little ;; *) echo wtf ;; esac } tc-env_build () { tc-export_build_env; CFLAGS=${BUILD_CFLAGS} CXXFLAGS=${BUILD_CXXFLAGS} CPPFLAGS=${BUILD_CPPFLAGS} LDFLAGS=${BUILD_LDFLAGS} AR=$(tc-getBUILD_AR) AS=$(tc-getBUILD_AS) CC=$(tc-getBUILD_CC) CPP=$(tc-getBUILD_CPP) CXX=$(tc-getBUILD_CXX) LD=$(tc-getBUILD_LD) NM=$(tc-getBUILD_NM) PKG_CONFIG=$(tc-getBUILD_PKG_CONFIG) RANLIB=$(tc-getBUILD_RANLIB) "$@" } tc-export () { local var; for var in "$@"; do [[ $(type -t tc-get${var}) != "function" ]] && die "tc-export: invalid export variable '${var}'"; eval tc-get${var} > /dev/null; done } tc-export_build_env () { tc-export "$@"; : ${BUILD_CFLAGS:=-O1 -pipe}; : ${BUILD_CXXFLAGS:=-O1 -pipe}; : ${BUILD_CPPFLAGS:=}; : ${BUILD_LDFLAGS:=}; export BUILD_{C,CXX,CPP,LD}FLAGS } tc-getAR () { tc-getPROG AR ar "$@" } tc-getAS () { tc-getPROG AS as "$@" } tc-getBUILD_AR () { tc-getBUILD_PROG AR ar "$@" } tc-getBUILD_AS () { tc-getBUILD_PROG AS as "$@" } tc-getBUILD_CC () { tc-getBUILD_PROG CC gcc "$@" } tc-getBUILD_CPP () { tc-getBUILD_PROG CPP cpp "$@" } tc-getBUILD_CXX () { tc-getBUILD_PROG CXX g++ "$@" } tc-getBUILD_LD () { tc-getBUILD_PROG LD ld "$@" } tc-getBUILD_NM () { tc-getBUILD_PROG NM nm "$@" } tc-getBUILD_OBJCOPY () { tc-getBUILD_PROG OBJCOPY objcopy "$@" } tc-getBUILD_PKG_CONFIG () { tc-getBUILD_PROG PKG_CONFIG pkg-config "$@" } tc-getBUILD_PROG () { _tc-getPROG CBUILD "BUILD_$1 $1_FOR_BUILD HOST$1" "${@:2}" } tc-getBUILD_RANLIB () { tc-getBUILD_PROG RANLIB ranlib "$@" } tc-getBUILD_STRIP () { tc-getBUILD_PROG STRIP strip "$@" } tc-getCC () { tc-getPROG CC gcc "$@" } tc-getCPP () { tc-getPROG CPP cpp "$@" } tc-getCXX () { tc-getPROG CXX g++ "$@" } tc-getDLLWRAP () { tc-getPROG DLLWRAP dllwrap "$@" } tc-getF77 () { tc-getPROG F77 gfortran "$@" } tc-getFC () { tc-getPROG FC gfortran "$@" } tc-getGCJ () { tc-getPROG GCJ gcj "$@" } tc-getLD () { tc-getPROG LD ld "$@" } tc-getNM () { tc-getPROG NM nm "$@" } tc-getOBJCOPY () { tc-getPROG OBJCOPY objcopy "$@" } tc-getPKG_CONFIG () { tc-getPROG PKG_CONFIG pkg-config "$@" } tc-getPROG () { _tc-getPROG CHOST "$@" } tc-getRANLIB () { tc-getPROG RANLIB ranlib "$@" } tc-getRC () { tc-getPROG RC windres "$@" } tc-getSTRIP () { tc-getPROG STRIP strip "$@" } tc-has-openmp () { local base="${T}/test-tc-openmp"; cat > "${base}.c" <<-EOF #include int main() { int nthreads, tid, ret = 0; #pragma omp parallel private(nthreads, tid) { tid = omp_get_thread_num(); nthreads = omp_get_num_threads(); ret += tid + nthreads; } return ret; } EOF $(tc-getCC "$@") -fopenmp "${base}.c" -o "${base}" &>/dev/null; local ret=$?; rm -f "${base}"*; return ${ret} } tc-has-tls () { local base="${T}/test-tc-tls"; cat > "${base}.c" <<-EOF int foo(int *i) { static __thread int j = 0; return *i ? j : *i; } EOF local flags; case $1 in -s) flags="-S" ;; -c) flags="-c" ;; -l) ;; -*) die "Usage: tc-has-tls [-c|-l] [toolchain prefix]" ;; esac; : ${flags:=-fPIC -shared -Wl,-z,defs}; [[ $1 == -* ]] && shift; $(tc-getCC "$@") ${flags} "${base}.c" -o "${base}" &>/dev/null; local ret=$?; rm -f "${base}"*; return ${ret} } tc-is-cross-compiler () { return $([[ ${CBUILD:-${CHOST}} != ${CHOST} ]]) } tc-is-softfloat () { local CTARGET=${CTARGET:-${CHOST}}; case ${CTARGET} in bfin* | h8300*) echo "only" ;; *) if [[ ${CTARGET//_/-} == *-softfloat-* ]]; then echo "yes"; else if [[ ${CTARGET//_/-} == *-softfp-* ]]; then echo "softfp"; else echo "no"; fi; fi ;; esac } tc-is-static-only () { local host=${CTARGET:-${CHOST}}; return $([[ ${host} == *-mint* ]]) } tc-ninja_magic_to_arch () { function ninj () { [[ ${type} == "kern" ]] && echo $1 || echo $2 }; local type=$1; local host=$2; [[ -z ${host} ]] && host=${CTARGET:-${CHOST}}; local KV=${KV:-${KV_FULL}}; [[ ${type} == "kern" ]] && [[ -z ${KV} ]] && ewarn "QA: Kernel version could not be determined, please inherit kernel-2 or linux-info"; case ${host} in aarch64*) ninj arm64 arm ;; alpha*) echo alpha ;; arm*) echo arm ;; avr*) ninj avr32 avr ;; bfin*) ninj blackfin bfin ;; cris*) echo cris ;; hppa*) ninj parisc hppa ;; i?86*) if [[ ${type} == "kern" ]] && [[ $(KV_to_int ${KV}) -lt $(KV_to_int 2.6.24) || ${host} == *freebsd* ]]; then echo i386; else echo x86; fi ;; ia64*) echo ia64 ;; m68*) echo m68k ;; mips*) echo mips ;; nios2*) echo nios2 ;; nios*) echo nios ;; powerpc*) if [[ ${type} == "kern" ]] && [[ $(KV_to_int ${KV}) -ge $(KV_to_int 2.6.16) ]]; then echo powerpc; else if [[ ${type} == "kern" ]] && [[ $(KV_to_int ${KV}) -eq $(KV_to_int 2.6.15) ]]; then if [[ ${host} == powerpc64* ]] || [[ ${PROFILE_ARCH} == "ppc64" ]]; then echo powerpc; else echo ppc; fi; else if [[ ${host} == powerpc64* ]]; then echo ppc64; else if [[ ${PROFILE_ARCH} == "ppc64" ]]; then ninj ppc64 ppc; else echo ppc; fi; fi; fi; fi ;; s390*) echo s390 ;; sh64*) ninj sh64 sh ;; sh*) echo sh ;; sparc64*) ninj sparc64 sparc ;; sparc*) [[ ${PROFILE_ARCH} == "sparc64" ]] && ninj sparc64 sparc || echo sparc ;; vax*) echo vax ;; x86_64*freebsd*) echo amd64 ;; x86_64*) if [[ ${type} == "kern" ]] && [[ $(KV_to_int ${KV}) -ge $(KV_to_int 2.6.24) ]]; then echo x86; else ninj x86_64 amd64; fi ;; *) echo unknown ;; esac }