Created
July 28, 2017 11:22
-
-
Save Althorion/06c94eea445f93bc187fc468513021d5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
declare -x ABI="amd64" | |
declare -x ABI_X86="64" | |
declare -x ALSA_CARDS="ali5451 als4000 atiixp atiixp-modem bt87x ca0106 cmipci emu10k1x ens1370 ens1371 es1938 es1968 fm801 hda-intel intel8x0 intel8x0m maestro3 trident usb-audio via82xx via82xx-modem ymfpci" | |
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 -x BOOTSTRAP_USE="cxx unicode internal-glib python_targets_python3_4 python_targets_python2_7 multilib systemd udev" | |
declare -x CALLIGRA_FEATURES="kexi words flow plan sheets stage tables krita karbon braindump author" | |
declare -x CBUILD="x86_64-pc-linux-gnu" | |
declare -x CFLAGS="-march=native -O2 -pipe" | |
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 CPU_FLAGS_X86="aes avx f16c fma3 fma4 mmx mmxext popcnt sse sse2 sse3 sse4_1 sse4_2 sse4a ssse3 xop" | |
declare -x CTARGET_default="x86_64-pc-linux-gnu" | |
declare -x CXXFLAGS="-march=native -O2 -pipe" | |
declare -x DEFAULT_ABI="amd64" | |
declare -x DEFINED_PHASES=" compile configure install prepare test unpack" | |
declare DEPEND=" | |
>=dev-python/fonttools-3.5.0[python_targets_python2_7(-)?,python_targets_python3_4(-)?,python_targets_python3_5(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_4(-),-python_single_target_python3_5(-),-python_single_target_python3_6(-)] | |
dev-python/setuptools[python_targets_python2_7(-)?,python_targets_python3_4(-)?,python_targets_python3_5(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_4(-),-python_single_target_python3_5(-),-python_single_target_python3_6(-)] | |
cython? ( >=dev-python/cython-0.24[python_targets_python2_7(-)?,python_targets_python3_4(-)?,python_targets_python3_5(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_4(-),-python_single_target_python3_5(-),-python_single_target_python3_6(-)] ) | |
test? ( dev-python/pytest-runner[python_targets_python2_7(-)?,python_targets_python3_4(-)?,python_targets_python3_5(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_4(-),-python_single_target_python3_5(-),-python_single_target_python3_6(-)] ) | |
python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_4? ( dev-lang/python:3.4 ) python_targets_python3_5? ( dev-lang/python:3.5 ) python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_4(-)?,python_targets_python3_5(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_4(-),-python_single_target_python3_5(-),-python_single_target_python3_6(-)]" | |
declare DESCRIPTION="A CFF table subroutinizer for FontTools" | |
declare -- DESKTOP_DATABASE_DIR="/usr/share/applications" | |
declare -- DESKTOP_DATABASE_UPDATE_BIN="/usr/bin/update-desktop-database" | |
declare -x DESTTREE="/usr" | |
declare -x DIROPTIONS="-m0755" | |
declare -x EAPI="6" | |
declare -x ELIBC="glibc" | |
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= ; exec rsync --rsh=\\\"ssh \\\${port:+-p\\\${port}} \\\${3}\\\" -avP \\\"\\\${host}:/\\\${x#*/}\\\" \\\"\\\$1\\\"\" rsync \"\${DISTDIR}/\${FILE}\" \"\${URI}\" \"\${PORTAGE_SSH_OPTS}\"" | |
declare -x FFLAGS="-O2 -pipe" | |
declare -x FLTK_DOCDIR="/usr/share/doc/fltk-1.3.3-r3/html" | |
declare -x GCC_SPECS="" | |
declare -x GPSD_PROTOCOLS="ashtech aivdm earthmate evermore fv18 garmin garmintxt gpsclock isync itrax mtk3301 nmea ntrip navcom oceanserver oldstyle oncore rtcm104v2 rtcm104v3 sirf skytraq superstar2 timing tsip tripmate tnt ublox ubx" | |
declare -x GRUB_PLATFORMS="efi-64" | |
declare -x GSETTINGS_BACKEND="dconf" | |
declare HDEPEND="" | |
declare HOMEPAGE="https://github.com/googlei18n/compreffor" | |
declare -x INHERITED=" vcs-snapshot toolchain-funcs multilib xdg-utils multiprocessing multibuild python-utils-r1 python-r1 distutils-r1" | |
declare -x INPUT_DEVICES="libinput" | |
declare -x INSDESTTREE="" | |
declare -x INSOPTIONS="-m0644" | |
declare IUSE="+cython test python_targets_python2_7 python_targets_python3_4 python_targets_python3_5 python_targets_python3_6" | |
declare -x IUSE_EFFECTIVE="abi_x86_64 alpha amd64 amd64-fbsd amd64-linux arm arm-linux arm64 cython elibc_AIX elibc_Cygwin elibc_Darwin elibc_DragonFly elibc_FreeBSD elibc_HPUX elibc_Interix elibc_NetBSD elibc_OpenBSD elibc_SunOS elibc_Winnt elibc_bionic elibc_glibc elibc_mingw elibc_mintlib elibc_musl elibc_uclibc hppa ia64 kernel_AIX kernel_Darwin kernel_FreeBSD kernel_HPUX kernel_NetBSD kernel_OpenBSD kernel_SunOS kernel_Winnt kernel_freemint kernel_linux m68k m68k-mint mips nios2 ppc ppc-aix ppc-macos ppc64 ppc64-linux prefix prefix-chain prefix-guest python_targets_python2_7 python_targets_python3_4 python_targets_python3_5 python_targets_python3_6 riscv s390 sh sparc sparc-fbsd sparc-solaris sparc64-solaris test userland_BSD userland_GNU x64-cygwin x64-macos x64-solaris x86 x86-cygwin x86-fbsd x86-linux x86-macos x86-solaris x86-winnt" | |
declare -x IUSE_IMPLICIT="abi_x86_64 prefix prefix-chain prefix-guest" | |
declare -x KERNEL="linux" | |
declare -x KERNEL_ABI="amd64" | |
declare -x KEYWORDS="~amd64 ~x86" | |
declare -x L10N="en-GB en-US en-CA pl-PL en pl" | |
declare -x LANG="pl_PL.UTF-8" | |
declare -x LCD_DEVICES="bayrad cfontz cfontz633 glk hd44780 lb216 lcdm001 mtxorb ncurses text" | |
declare -x LC_COLLATE="C" | |
declare -x LC_CTYPE="pl_PL.UTF-8" | |
declare -x LC_MESSAGES="C" | |
declare -x LDFLAGS="-Wl,-O1 -Wl,--as-needed" | |
declare -x LDFLAGS_amd64="-m elf_x86_64" | |
declare -x LDFLAGS_default | |
declare -x LDFLAGS_x32="-m elf32_x86_64" | |
declare -x LDFLAGS_x86="-m elf_i386" | |
declare -x LIBDIR_amd64="lib64" | |
declare -x LIBDIR_default="lib" | |
declare -x LIBDIR_x32="libx32" | |
declare -x LIBDIR_x86="lib32" | |
declare -x LIBOPTIONS="-m0644" | |
declare -x LIBREOFFICE_EXTENSIONS="presenter-console presenter-minimizer" | |
declare -x LICENSE="Apache-2.0" | |
declare -x LINGUAS="en_GB en_US en_CA pl_PL en pl" | |
declare -x MAIL="/var/mail/root" | |
declare -x MAKEOPTS="-j8" | |
declare -x MANPAGER="manpager" | |
declare -- MIMEINFO_DATABASE_DIR="/usr/share/mime" | |
declare -- MIMEINFO_DATABASE_UPDATE_BIN="/usr/bin/update-mime-database" | |
declare -x MULTILIB_ABIS="amd64 x86" | |
declare -x MULTILIB_STRICT_DENY="64-bit.*shared object" | |
declare -x MULTILIB_STRICT_DIRS="/lib32 /lib /usr/lib32 /usr/lib /usr/kde/*/lib32 /usr/kde/*/lib /usr/qt/*/lib32 /usr/qt/*/lib /usr/X11R6/lib32 /usr/X11R6/lib" | |
declare -x MULTILIB_STRICT_EXEMPT="(perl5|gcc|gcc-lib|binutils|eclipse-3|debug|portage|udev|systemd|clang|python-exec|llvm)" | |
declare -x MULTIOSDIRS="../lib64:../lib32" | |
declare -- MY_PV="0.4.5" | |
declare -x NETBEANS="apisupport cnd groovy gsf harness ide identity j2ee java mobility nb php profiler soa visualweb webcommon websvccommon xml" | |
declare -x OFFICE_IMPLEMENTATION="libreoffice" | |
declare -x OPENGL_PROFILE="xorg-x11" | |
declare -x PATH="/usr/lib/portage/python3.4/ebuild-helpers/xattr:/usr/lib/portage/python3.4/ebuild-helpers:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/5.4.0:/usr/lib/llvm/4/bin" | |
declare PDEPEND="" | |
declare -x PHP_TARGETS="php5-6" | |
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 -x PORTAGE_DOCOMPRESS_SIZE_LIMIT="128" | |
declare -a PORTAGE_DOCOMPRESS_SKIP='([0]="/usr/share/doc/compreffor-0.4.5/html")' | |
declare -x PORTAGE_NICENESS="15" | |
declare -x POSTGRES_TARGETS="postgres9_5" | |
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 -a PYTHON_COMPAT='([0]="python2_7" [1]="python3_4" [2]="python3_5" [3]="python3_6")' | |
declare -- PYTHON_DEPS="python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_4? ( dev-lang/python:3.4 ) python_targets_python3_5? ( dev-lang/python:3.5 ) python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_4(-)?,python_targets_python3_5(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_4(-),-python_single_target_python3_5(-),-python_single_target_python3_6(-)]" | |
declare -- PYTHON_REQUIRED_USE="|| ( python_targets_python2_7 python_targets_python3_4 python_targets_python3_5 python_targets_python3_6 )" | |
declare -x PYTHON_SINGLE_TARGET="python3_4" | |
declare -x PYTHON_TARGETS="python2_7 python3_4" | |
declare -- PYTHON_USEDEP="python_targets_python2_7(-)?,python_targets_python3_4(-)?,python_targets_python3_5(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_4(-),-python_single_target_python3_5(-),-python_single_target_python3_6(-)" | |
declare -x QT_GRAPHICSSYSTEM="raster" | |
declare -x QT_QPA_PLATFORMTHEME="qt5ct" | |
declare RDEPEND=" | |
>=dev-python/fonttools-3.5.0[python_targets_python2_7(-)?,python_targets_python3_4(-)?,python_targets_python3_5(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_4(-),-python_single_target_python3_5(-),-python_single_target_python3_6(-)] | |
python_targets_python2_7? ( >=dev-lang/python-2.7.5-r2:2.7 ) python_targets_python3_4? ( dev-lang/python:3.4 ) python_targets_python3_5? ( dev-lang/python:3.5 ) python_targets_python3_6? ( dev-lang/python:3.6 ) >=dev-lang/python-exec-2:=[python_targets_python2_7(-)?,python_targets_python3_4(-)?,python_targets_python3_5(-)?,python_targets_python3_6(-)?,-python_single_target_python2_7(-),-python_single_target_python3_4(-),-python_single_target_python3_5(-),-python_single_target_python3_6(-)]" | |
declare REPOSITORY | |
declare REQUIRED_USE="|| ( python_targets_python2_7 python_targets_python3_4 python_targets_python3_5 python_targets_python3_6 )" | |
declare -x RESTRICT="primaryuri" | |
declare -x RESUMECOMMAND_SSH="bash -c \"x=\\\${2#ssh://} ; host=\\\${x%%/*} ; port=\\\${host##*:} ; host=\\\${host%:*} ; [[ \\\${host} = \\\${port} ]] && port= ; exec rsync --rsh=\\\"ssh \\\${port:+-p\\\${port}} \\\${3}\\\" -avP \\\"\\\${host}:/\\\${x#*/}\\\" \\\"\\\$1\\\"\" rsync \"\${DISTDIR}/\${FILE}\" \"\${URI}\" \"\${PORTAGE_SSH_OPTS}\"" | |
declare -x RUBY_TARGETS="ruby21 ruby22" | |
declare -x R_HOME="/usr/lib64/R" | |
declare -x S="/var/tmp/portage/dev-python/compreffor-0.4.5/work/compreffor-0.4.5" | |
declare -x SANDBOX_DEBUG="0" | |
declare -x SANDBOX_DENY="" | |
declare -x SANDBOX_PREDICT="/var/tmp/portage/dev-python/compreffor-0.4.5/homedir:/dev/crypto:/dev/random:/proc/self/coredump_filter:/var/cache/fontconfig" | |
declare -x SANDBOX_READ="/:/var/tmp" | |
declare -x SANDBOX_VERBOSE="1" | |
declare -x SANDBOX_WRITE=":/dev/console:/dev/fd:/dev/full:/dev/null:/dev/ptmx:/dev/pts/:/dev/pty:/dev/shm:/dev/tts:/dev/tty:/dev/vc/:/dev/zero:/proc/self/fd:/tmp/:/usr/lib/cf:/usr/lib/conftest:/usr/lib32/cf:/usr/lib32/conftest:/usr/lib64/cf:/usr/lib64/conftest:/usr/tmp/cf:/usr/tmp/conftest:/var/tmp:/var/tmp/:/var/tmp/portage/dev-python/compreffor-0.4.5/homedir/.bash_history" | |
declare -x SHELL="/bin/bash" | |
declare -x SLOT="0" | |
declare SRC_URI=" | |
mirror://githubcl/googlei18n/compreffor/tar.gz/0.4.5 -> compreffor-0.4.5.tar.gz | |
" | |
declare -x SUDO_COMMAND="/usr/bin/emerge -avquDN --with-bdeps=y --backtrack=666 @world" | |
declare -x SUDO_GID="1000" | |
declare -x SUDO_UID="1000" | |
declare -x SUDO_USER="althorion" | |
declare -x SYMLINK_LIB="yes" | |
declare -x TWISTED_DISABLE_WRITING_OF_PLUGIN_CACHE="1" | |
declare -x USE="abi_x86_64 amd64 cython elibc_glibc kernel_linux python_targets_python2_7 python_targets_python3_4 userland_GNU" | |
declare -x USERLAND="GNU" | |
declare -x USERNAME="root" | |
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 arm64 hppa ia64 m68k m68k-mint mips nios2 ppc ppc64 ppc64-linux ppc-aix ppc-macos riscv s390 sh sparc sparc64-solaris sparc-fbsd sparc-solaris x64-cygwin x64-macos x64-solaris x86 x86-cygwin x86-fbsd x86-linux x86-macos x86-solaris x86-winnt" | |
declare -x USE_EXPAND_VALUES_ELIBC="AIX bionic Cygwin Darwin DragonFly FreeBSD glibc HPUX Interix mingw mintlib musl NetBSD OpenBSD SunOS uclibc Winnt" | |
declare -x USE_EXPAND_VALUES_KERNEL="AIX Darwin FreeBSD freemint HPUX linux NetBSD OpenBSD SunOS Winnt" | |
declare -x USE_EXPAND_VALUES_USERLAND="BSD GNU" | |
declare -x VIDEO_CARDS="amdgpu radeonsi" | |
declare -x XDG_CACHE_HOME="/var/tmp/portage/dev-python/compreffor-0.4.5/homedir/.cache" | |
declare -x XDG_CONFIG_DIRS="/etc/xdg" | |
declare -x XDG_CONFIG_HOME="/var/tmp/portage/dev-python/compreffor-0.4.5/homedir/.config" | |
declare -x XDG_DATA_DIRS="/usr/local/share:/usr/share:/usr/share/gdm" | |
declare -x XDG_DATA_HOME="/var/tmp/portage/dev-python/compreffor-0.4.5/homedir/.local/share" | |
declare -x XDG_RUNTIME_DIR="/var/tmp/portage/dev-python/compreffor-0.4.5/temp/run" | |
declare -x XFCE_PLUGINS="" | |
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 -- _DISTUTILS_R1="1" | |
declare -x _E_DOCDESTTREE_="" | |
declare -x _E_EXEDESTTREE_="" | |
declare -- _MULTIBUILD="1" | |
declare -- _MULTILIB_ECLASS="1" | |
declare -- _MULTIPROCESSING_ECLASS="1" | |
declare -a _PYTHON_ALL_IMPLS='([0]="jython2_7" [1]="pypy" [2]="pypy3" [3]="python2_7" [4]="python3_4" [5]="python3_5" [6]="python3_6")' | |
declare -- _PYTHON_R1="1" | |
declare -a _PYTHON_SUPPORTED_IMPLS='([0]="python2_7" [1]="python3_4" [2]="python3_5" [3]="python3_6")' | |
declare -a _PYTHON_UNSUPPORTED_IMPLS='([0]="jython2_7" [1]="pypy" [2]="pypy3")' | |
declare -- _PYTHON_UTILS_R1="1" | |
declare -- _TOOLCHAIN_FUNCS_ECLASS="1" | |
declare -- phase_func | |
PYTHON () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#.24.28PYTHON.29.2C_.24.7BEPYTHON.7D" | |
} | |
__eapi6_src_install () | |
{ | |
if [[ -f Makefile || -f GNUmakefile || -f makefile ]]; then | |
emake DESTDIR="${D}" install; | |
fi; | |
einstalldocs | |
} | |
__eapi6_src_prepare () | |
{ | |
if [[ $(declare -p PATCHES 2>/dev/null) == "declare -a"* ]]; then | |
[[ -n ${PATCHES[@]} ]] && eapply "${PATCHES[@]}"; | |
else | |
if [[ -n ${PATCHES} ]]; then | |
eapply ${PATCHES}; | |
fi; | |
fi; | |
eapply_user | |
} | |
_clang_fullversion () | |
{ | |
local ver="$1"; | |
shift; | |
set -- $($(tc-getCPP "$@") -E -P - <<<"__clang_major__ __clang_minor__ __clang_patchlevel__"); | |
eval echo "$ver" | |
} | |
_distutils-r1_check_namespace_pth () | |
{ | |
local f pth=(); | |
while IFS= read -r -d '' f; do | |
pth+=("${f}"); | |
done < <(find "${ED}" -name '*-nspkg.pth' -print0); | |
if [[ -n ${pth[@]} ]]; then | |
ewarn "The following *-nspkg.pth files were found installed:"; | |
ewarn; | |
for f in "${pth[@]}"; | |
do | |
ewarn " ${f#${ED%/}}"; | |
done; | |
ewarn; | |
ewarn "The presence of those files may break namespaces in Python 3.5+. Please"; | |
ewarn "read our documentation on reliable handling of namespaces and update"; | |
ewarn "the ebuild accordingly:"; | |
ewarn; | |
ewarn " https://wiki.gentoo.org/wiki/Project:Python/Namespace_packages"; | |
fi | |
} | |
_distutils-r1_clean_egg_info () | |
{ | |
rm -rf "${BUILD_DIR}"/lib/*.egg-info || die | |
} | |
_distutils-r1_copy_egg_info () | |
{ | |
mkdir -p "${BUILD_DIR}" || die; | |
find -name '*.egg-info' -type d -exec cp -R -p {} "${BUILD_DIR}"/ ';' || die | |
} | |
_distutils-r1_create_setup_cfg () | |
{ | |
cat > "${HOME}"/.pydistutils.cfg <<-_EOF_ || | |
[build] | |
build-base = ${BUILD_DIR} | |
# using a single directory for them helps us export | |
# ${PYTHONPATH} and ebuilds find the sources independently | |
# of whether the package installs extensions or not | |
# | |
# note: due to some packages (wxpython) relying on separate | |
# platlib & purelib dirs, we do not set --build-lib (which | |
# can not be overriden with --build-*lib) | |
build-platlib = %(build-base)s/lib | |
build-purelib = %(build-base)s/lib | |
# make the ebuild writer lives easier | |
build-scripts = %(build-base)s/scripts | |
# this is needed by distutils_install_for_testing since | |
# setuptools like to create .egg files for install --home. | |
[bdist_egg] | |
dist-dir = ${BUILD_DIR}/dist | |
_EOF_ | |
die | |
if [[ ${EBUILD_PHASE} == install ]]; then | |
cat >> "${HOME}"/.pydistutils.cfg <<-_EOF_ || | |
# installation paths -- allow calling extra install targets | |
# without the default 'install' | |
[install] | |
compile = True | |
optimize = 2 | |
root = ${D} | |
_EOF_ | |
die | |
if [[ ! -n ${DISTUTILS_SINGLE_IMPL} ]]; then | |
cat >> "${HOME}"/.pydistutils.cfg <<-_EOF_ || | |
install-scripts = $(python_get_scriptdir) | |
_EOF_ | |
die; | |
fi; | |
fi | |
} | |
_distutils-r1_disable_ez_setup () | |
{ | |
local stub="def use_setuptools(*args, **kwargs): pass"; | |
if [[ -f ez_setup.py ]]; then | |
echo "${stub}" > ez_setup.py || die; | |
fi; | |
if [[ -f distribute_setup.py ]]; then | |
echo "${stub}" > distribute_setup.py || die; | |
fi | |
} | |
_distutils-r1_run_common_phase () | |
{ | |
local DISTUTILS_ORIG_BUILD_DIR=${BUILD_DIR}; | |
if [[ -n ${DISTUTILS_SINGLE_IMPL} ]]; then | |
_distutils-r1_run_foreach_impl "${@}"; | |
else | |
local -x EPYTHON PYTHON; | |
local -x PATH=${PATH} PKG_CONFIG_PATH=${PKG_CONFIG_PATH}; | |
python_setup "${DISTUTILS_ALL_SUBPHASE_IMPLS[@]}"; | |
local MULTIBUILD_VARIANTS=("${EPYTHON/./_}"); | |
local _DISTUTILS_INITIAL_CWD=${PWD}; | |
multibuild_foreach_variant distutils-r1_run_phase "${@}"; | |
fi | |
} | |
_distutils-r1_run_foreach_impl () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local _DISTUTILS_INITIAL_CWD=${PWD}; | |
set -- distutils-r1_run_phase "${@}"; | |
if [[ ! -n ${DISTUTILS_SINGLE_IMPL} ]]; then | |
python_foreach_impl "${@}"; | |
else | |
if [[ ! -n ${EPYTHON} ]]; then | |
die "EPYTHON unset, python-single-r1_pkg_setup not called?!"; | |
fi; | |
local BUILD_DIR=${BUILD_DIR:-${S}}; | |
BUILD_DIR=${BUILD_DIR%%/}_${EPYTHON}; | |
"${@}"; | |
fi | |
} | |
_distutils-r1_wrap_scripts () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ ${#} -eq 2 ]] || die "usage: ${FUNCNAME} <path> <bindir>"; | |
local path=${1}; | |
local bindir=${2}; | |
local PYTHON_SCRIPTDIR; | |
python_export PYTHON_SCRIPTDIR; | |
local f python_files=() non_python_files=(); | |
if [[ -d ${path}${PYTHON_SCRIPTDIR} ]]; then | |
for f in "${path}${PYTHON_SCRIPTDIR}"/*; | |
do | |
[[ -d ${f} ]] && die "Unexpected directory: ${f}"; | |
debug-print "${FUNCNAME}: found executable at ${f#${path}/}"; | |
local shebang; | |
read -r shebang < "${f}"; | |
if [[ ${shebang} == '#!'*${EPYTHON}* ]]; then | |
debug-print "${FUNCNAME}: matching shebang: ${shebang}"; | |
python_files+=("${f}"); | |
else | |
debug-print "${FUNCNAME}: non-matching shebang: ${shebang}"; | |
non_python_files+=("${f}"); | |
fi; | |
mkdir -p "${path}${bindir}" || die; | |
done; | |
for f in "${python_files[@]}"; | |
do | |
local basename=${f##*/}; | |
debug-print "${FUNCNAME}: installing wrapper at ${bindir}/${basename}"; | |
_python_ln_rel "${path}${EPREFIX}"/usr/lib/python-exec/python-exec2 "${path}${bindir}/${basename}" || die; | |
done; | |
for f in "${non_python_files[@]}"; | |
do | |
local basename=${f##*/}; | |
debug-print "${FUNCNAME}: moving ${f#${path}/} to ${bindir}/${basename}"; | |
mv "${f}" "${path}${bindir}/${basename}" || die; | |
done; | |
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" | |
} | |
_multijob_fork () | |
{ | |
[[ $# -eq 1 ]] || die "incorrect number of arguments"; | |
local ret=0; | |
[[ $1 == "post" ]] && : $(( ++mj_num_jobs )); | |
if [[ ${mj_num_jobs} -ge ${mj_max_jobs} ]]; then | |
multijob_finish_one; | |
ret=$?; | |
fi; | |
[[ $1 == "pre" ]] && : $(( ++mj_num_jobs )); | |
return ${ret} | |
} | |
_python_check_dead_variables () | |
{ | |
local v; | |
for v in PYTHON_DEPEND PYTHON_USE_WITH{,_OR,_OPT} {RESTRICT,SUPPORT}_PYTHON_ABIS; | |
do | |
if [[ -n ${!v} ]]; then | |
die "${v} is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#Ebuild_head"; | |
fi; | |
done; | |
for v in PYTHON_{CPPFLAGS,CFLAGS,CXXFLAGS,LDFLAGS}; | |
do | |
if [[ -n ${!v} ]]; then | |
die "${v} is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#PYTHON_CFLAGS"; | |
fi; | |
done; | |
for v in PYTHON_TESTS_RESTRICTED_ABIS PYTHON_EXPORT_PHASE_FUNCTIONS PYTHON_VERSIONED_{SCRIPTS,EXECUTABLES} PYTHON_NONVERSIONED_EXECUTABLES; | |
do | |
if [[ -n ${!v} ]]; then | |
die "${v} is invalid for python-r1 suite"; | |
fi; | |
done; | |
for v in DISTUTILS_USE_SEPARATE_SOURCE_DIRECTORIES DISTUTILS_SETUP_FILES DISTUTILS_GLOBAL_OPTIONS DISTUTILS_SRC_TEST PYTHON_MODNAME; | |
do | |
if [[ -n ${!v} ]]; then | |
die "${v} is invalid for distutils-r1, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#${v}"; | |
fi; | |
done; | |
if [[ -n ${DISTUTILS_DISABLE_TEST_DEPENDENCY} ]]; then | |
die "${v} is invalid for distutils-r1, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#DISTUTILS_SRC_TEST"; | |
fi; | |
for v in PYTHON_BDEPEND PYTHON_MULTIPLE_ABIS PYTHON_ABI_TYPE PYTHON_RESTRICTED_ABIS PYTHON_TESTS_FAILURES_TOLERANT_ABIS PYTHON_CFFI_MODULES_GENERATION_COMMANDS; | |
do | |
if [[ -n ${!v} ]]; then | |
die "${v} is invalid for python-r1 suite"; | |
fi; | |
done | |
} | |
_python_check_locale_sanity () | |
{ | |
local -x LC_ALL=${1}; | |
local IFS=; | |
local lc=({a..z}); | |
local uc=({A..Z}); | |
local input="${lc[*]}${uc[*]}"; | |
local output=$(tr '[:lower:][:upper:]' '[:upper:][:lower:]' <<<"${input}"); | |
[[ ${output} == "${uc[*]}${lc[*]}" ]] | |
} | |
_python_impl_matches () | |
{ | |
[[ ${#} -ge 2 ]] || die "${FUNCNAME}: takes at least 2 parameters"; | |
local impl=${1} pattern; | |
shift; | |
for pattern in "$@"; | |
do | |
if [[ ${pattern} == -2 ]]; then | |
! python_is_python3 "${impl}"; | |
return; | |
else | |
if [[ ${pattern} == -3 ]]; then | |
python_is_python3 "${impl}"; | |
return; | |
else | |
if [[ ${impl/./_} == ${pattern/./_} ]]; then | |
return 0; | |
fi; | |
fi; | |
fi; | |
done; | |
return 1 | |
} | |
_python_impl_supported () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ ${#} -eq 1 ]] || die "${FUNCNAME}: takes exactly 1 argument (impl)."; | |
local impl=${1}; | |
case "${impl}" in | |
python2_7 | python3_[456] | jython2_7) | |
return 0 | |
;; | |
pypy1_[89] | pypy2_0 | python2_[56] | python3_[123]) | |
return 1 | |
;; | |
pypy | pypy3) | |
if [[ ${EAPI:-0} == [01234] ]]; then | |
die "PyPy is supported in EAPI 5 and newer only."; | |
fi | |
;; | |
*) | |
[[ -n ${PYTHON_COMPAT_NO_STRICT} ]] && return 1; | |
die "Invalid implementation in PYTHON_COMPAT: ${impl}" | |
;; | |
esac | |
} | |
_python_ln_rel () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local target=${1}; | |
local symname=${2}; | |
local tgpath=${target%/*}/; | |
local sympath=${symname%/*}/; | |
local rel_target=; | |
while [[ -n ${sympath} ]]; do | |
local tgseg= symseg=; | |
while [[ ! -n ${tgseg} && -n ${tgpath} ]]; do | |
tgseg=${tgpath%%/*}; | |
tgpath=${tgpath#${tgseg}/}; | |
done; | |
while [[ ! -n ${symseg} && -n ${sympath} ]]; do | |
symseg=${sympath%%/*}; | |
sympath=${sympath#${symseg}/}; | |
done; | |
if [[ ${tgseg} != ${symseg} ]]; then | |
rel_target=../${rel_target}${tgseg:+${tgseg}/}; | |
fi; | |
done; | |
rel_target+=${tgpath}${target##*/}; | |
debug-print "${FUNCNAME}: ${symname} -> ${target}"; | |
debug-print "${FUNCNAME}: rel_target = ${rel_target}"; | |
ln -fs "${rel_target}" "${symname}" | |
} | |
_python_multibuild_wrapper () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local -x EPYTHON PYTHON; | |
local -x PATH=${PATH} PKG_CONFIG_PATH=${PKG_CONFIG_PATH}; | |
python_export "${MULTIBUILD_VARIANT}" EPYTHON PYTHON; | |
python_wrapper_setup; | |
"${@}" | |
} | |
_python_obtain_impls () | |
{ | |
_python_validate_useflags; | |
if [[ -n ${PYTHON_COMPAT_OVERRIDE} ]]; then | |
MULTIBUILD_VARIANTS=(${PYTHON_COMPAT_OVERRIDE}); | |
return; | |
fi; | |
MULTIBUILD_VARIANTS=(); | |
local impl; | |
for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; | |
do | |
has "${impl}" "${PYTHON_COMPAT[@]}" && use "python_targets_${impl}" && MULTIBUILD_VARIANTS+=("${impl}"); | |
done | |
} | |
_python_set_impls () | |
{ | |
local i; | |
if ! declare -p PYTHON_COMPAT &> /dev/null; then | |
die 'PYTHON_COMPAT not declared.'; | |
fi; | |
if [[ $(declare -p PYTHON_COMPAT) != "declare -a"* ]]; then | |
die 'PYTHON_COMPAT must be an array.'; | |
fi; | |
for i in "${PYTHON_COMPAT[@]}"; | |
do | |
_python_impl_supported "${i}"; | |
done; | |
local supp=() unsupp=(); | |
for i in "${_PYTHON_ALL_IMPLS[@]}"; | |
do | |
if has "${i}" "${PYTHON_COMPAT[@]}"; then | |
supp+=("${i}"); | |
else | |
unsupp+=("${i}"); | |
fi; | |
done; | |
if [[ ! -n ${supp[@]} ]]; then | |
die "No supported implementation in PYTHON_COMPAT."; | |
fi; | |
if [[ -n ${_PYTHON_SUPPORTED_IMPLS[@]} ]]; then | |
if [[ ${_PYTHON_SUPPORTED_IMPLS[@]} != ${supp[@]} ]]; then | |
eerror "Supported impls (PYTHON_COMPAT) changed between inherits!"; | |
eerror "Before: ${_PYTHON_SUPPORTED_IMPLS[*]}"; | |
eerror "Now : ${supp[*]}"; | |
die "_PYTHON_SUPPORTED_IMPLS integrity check failed"; | |
fi; | |
if [[ ${_PYTHON_UNSUPPORTED_IMPLS[@]} != ${unsupp[@]} ]]; then | |
eerror "Unsupported impls changed between inherits!"; | |
eerror "Before: ${_PYTHON_UNSUPPORTED_IMPLS[*]}"; | |
eerror "Now : ${unsupp[*]}"; | |
die "_PYTHON_UNSUPPORTED_IMPLS integrity check failed"; | |
fi; | |
else | |
_PYTHON_SUPPORTED_IMPLS=("${supp[@]}"); | |
_PYTHON_UNSUPPORTED_IMPLS=("${unsupp[@]}"); | |
readonly _PYTHON_SUPPORTED_IMPLS _PYTHON_UNSUPPORTED_IMPLS; | |
fi | |
} | |
_python_validate_useflags () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
if [[ -n ${PYTHON_COMPAT_OVERRIDE} ]]; then | |
if [[ ! -n ${_PYTHON_COMPAT_OVERRIDE_WARNED} ]]; then | |
ewarn "WARNING: PYTHON_COMPAT_OVERRIDE in effect. The following Python"; | |
ewarn "implementations will be enabled:"; | |
ewarn; | |
ewarn " ${PYTHON_COMPAT_OVERRIDE}"; | |
ewarn; | |
ewarn "Dependencies won't be satisfied, and PYTHON_TARGETS will be ignored."; | |
_PYTHON_COMPAT_OVERRIDE_WARNED=1; | |
fi; | |
return; | |
fi; | |
local i; | |
for i in "${_PYTHON_SUPPORTED_IMPLS[@]}"; | |
do | |
use "python_targets_${i}" && return 0; | |
done; | |
eerror "No Python implementation selected for the build. Please add one"; | |
eerror "of the following values to your PYTHON_TARGETS (in make.conf):"; | |
eerror; | |
eerror "${PYTHON_COMPAT[@]}"; | |
echo; | |
die "No supported Python implementation in PYTHON_TARGETS." | |
} | |
_tc-getPROG () | |
{ | |
local tuple=$1; | |
local v var vars=$2; | |
local prog=($3); | |
var=${vars%% *}; | |
for v in ${vars}; | |
do | |
if [[ -n ${!v} ]]; then | |
export ${var}="${!v}"; | |
echo "${!v}"; | |
return 0; | |
fi; | |
done; | |
local search=; | |
[[ -n $4 ]] && search=$(type -p $4-${prog[0]}); | |
[[ -z ${search} && -n ${!tuple} ]] && search=$(type -p ${!tuple}-${prog[0]}); | |
[[ -n ${search} ]] && prog[0]=${search##*/}; | |
export ${var}="${prog[*]}"; | |
echo "${!var}" | |
} | |
bashpid () | |
{ | |
sh -c 'echo ${PPID}' | |
} | |
clang-fullversion () | |
{ | |
_clang_fullversion '$1.$2.$3' "$@" | |
} | |
clang-major-version () | |
{ | |
_clang_fullversion '$1' "$@" | |
} | |
clang-micro-version () | |
{ | |
_clang_fullversion '$3' "$@" | |
} | |
clang-minor-version () | |
{ | |
_clang_fullversion '$2' "$@" | |
} | |
clang-version () | |
{ | |
_clang_fullversion '$1.$2' "$@" | |
} | |
distutils-r1_python_compile () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
_distutils-r1_copy_egg_info; | |
esetup.py build "${@}" | |
} | |
distutils-r1_python_configure () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ ${EAPI} == [45] ]] || die "${FUNCNAME} is banned in EAPI 6 (it was a no-op)" | |
} | |
distutils-r1_python_install () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local args=("${@}"); | |
local -x PYTHONDONTWRITEBYTECODE=; | |
addpredict "${EPREFIX}/usr/$(get_libdir)/${EPYTHON}"; | |
addpredict /usr/lib/portage/pym; | |
addpredict /usr/local; | |
if [[ ! -n ${DISTUTILS_SINGLE_IMPL} ]]; then | |
local mydistutilsargs=("${mydistutilsargs[@]}"); | |
local scriptdir=${EPREFIX}/usr/bin; | |
local arg arg_vars; | |
[[ -n ${mydistutilsargs[@]} ]] && eval arg_vars+=('mydistutilsargs['{0..$(( ${#mydistutilsargs[@]} - 1 ))}']'); | |
[[ -n ${args[@]} ]] && eval arg_vars+=('args['{0..$(( ${#args[@]} - 1 ))}']'); | |
set -- "${arg_vars[@]}"; | |
while [[ -n ${@} ]]; do | |
local arg_var=${1}; | |
shift; | |
local a=${!arg_var}; | |
case "${a}" in | |
--install-scripts=*) | |
scriptdir=${a#--install-scripts=}; | |
unset "${arg_var}" | |
;; | |
--install-scripts) | |
scriptdir=${!1}; | |
unset "${arg_var}" "${1}"; | |
shift | |
;; | |
esac; | |
done; | |
fi; | |
local root=${D%/}/_${EPYTHON}; | |
[[ -n ${DISTUTILS_SINGLE_IMPL} ]] && root=${D%/}; | |
esetup.py install --root="${root}" "${args[@]}"; | |
local forbidden_package_names=(examples test tests); | |
local p; | |
for p in "${forbidden_package_names[@]}"; | |
do | |
if [[ -d ${root}$(python_get_sitedir)/${p} ]]; then | |
die "Package installs '${p}' package which is forbidden and likely a bug in the build system."; | |
fi; | |
done; | |
if [[ -d ${root}/usr/$(get_libdir)/pypy/share ]]; then | |
local cmd=die; | |
[[ ${EAPI} == [45] ]] && cmd=eqawarn; | |
"${cmd}" "Package installs 'share' in PyPy prefix, see bug #465546."; | |
fi; | |
if [[ ! -n ${DISTUTILS_SINGLE_IMPL} ]]; then | |
_distutils-r1_wrap_scripts "${root}" "${scriptdir}"; | |
multibuild_merge_root "${root}" "${D}"; | |
fi | |
} | |
distutils-r1_python_install_all () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
einstalldocs; | |
if declare -p EXAMPLES &> /dev/null; then | |
[[ ${EAPI} != [45] ]] && die "EXAMPLES are banned in EAPI ${EAPI}"; | |
( docinto examples; | |
dodoc -r "${EXAMPLES[@]}" ); | |
docompress -x "/usr/share/doc/${PF}/examples"; | |
fi; | |
_DISTUTILS_DEFAULT_CALLED=1 | |
} | |
distutils-r1_python_prepare () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ ${EAPI} == [45] ]] || die "${FUNCNAME} is banned in EAPI 6 (it was a no-op)" | |
} | |
distutils-r1_python_prepare_all () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
if [[ ! -n ${DISTUTILS_OPTIONAL} ]]; then | |
if [[ ${EAPI} != [45] ]]; then | |
default; | |
else | |
[[ -n ${PATCHES} ]] && epatch "${PATCHES[@]}"; | |
epatch_user; | |
fi; | |
fi; | |
if [[ ! -n ${DISTUTILS_IN_SOURCE_BUILD+1} ]]; then | |
if declare -f python_prepare > /dev/null; then | |
DISTUTILS_IN_SOURCE_BUILD=1; | |
fi; | |
fi; | |
_distutils-r1_disable_ez_setup; | |
if [[ -n ${DISTUTILS_IN_SOURCE_BUILD} && ! -n ${DISTUTILS_SINGLE_IMPL} ]]; then | |
python_copy_sources; | |
fi; | |
_DISTUTILS_DEFAULT_CALLED=1 | |
} | |
distutils-r1_run_phase () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
if [[ -n ${DISTUTILS_IN_SOURCE_BUILD} ]]; then | |
if [[ ! -n ${DISTUTILS_SINGLE_IMPL} ]]; then | |
cd "${BUILD_DIR}" || die; | |
fi; | |
local BUILD_DIR=${BUILD_DIR}/build; | |
fi; | |
local -x PYTHONPATH="${BUILD_DIR}/lib:${PYTHONPATH}"; | |
mkdir -p "${BUILD_DIR}/lib" || die; | |
local -x AR=${AR} CC=${CC} CPP=${CPP} CXX=${CXX}; | |
tc-export AR CC CPP CXX; | |
local ldopts; | |
case "${CHOST}" in | |
*-aix*) | |
ldopts='-shared -Wl,-berok' | |
;; | |
*-darwin*) | |
ldopts='-bundle -undefined dynamic_lookup' | |
;; | |
*) | |
ldopts='-shared' | |
;; | |
esac; | |
local -x LDSHARED="${CC} ${ldopts}" LDCXXSHARED="${CXX} ${ldopts}"; | |
"${@}"; | |
cd "${_DISTUTILS_INITIAL_CWD}" || die | |
} | |
distutils-r1_src_compile () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
if declare -f python_compile > /dev/null; then | |
_distutils-r1_run_foreach_impl python_compile; | |
else | |
_distutils-r1_run_foreach_impl distutils-r1_python_compile; | |
fi; | |
if declare -f python_compile_all > /dev/null; then | |
_distutils-r1_run_common_phase python_compile_all; | |
fi | |
} | |
distutils-r1_src_configure () | |
{ | |
python_export_utf8_locale; | |
xdg_environment_reset; | |
if declare -f python_configure > /dev/null; then | |
_distutils-r1_run_foreach_impl python_configure; | |
fi; | |
if declare -f python_configure_all > /dev/null; then | |
_distutils-r1_run_common_phase python_configure_all; | |
fi | |
} | |
distutils-r1_src_install () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
if declare -f python_install > /dev/null; then | |
_distutils-r1_run_foreach_impl python_install; | |
else | |
_distutils-r1_run_foreach_impl distutils-r1_python_install; | |
fi; | |
local _DISTUTILS_DEFAULT_CALLED; | |
if declare -f python_install_all > /dev/null; then | |
_distutils-r1_run_common_phase python_install_all; | |
else | |
_distutils-r1_run_common_phase distutils-r1_python_install_all; | |
fi; | |
if [[ ! -n ${_DISTUTILS_DEFAULT_CALLED} ]]; then | |
local cmd=die; | |
[[ ${EAPI} == [45] ]] && cmd=eqawarn; | |
"${cmd}" "QA: python_install_all() didn't call distutils-r1_python_install_all"; | |
fi; | |
_distutils-r1_check_namespace_pth | |
} | |
distutils-r1_src_prepare () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local _DISTUTILS_DEFAULT_CALLED; | |
if declare -f python_prepare_all > /dev/null; then | |
python_prepare_all; | |
else | |
distutils-r1_python_prepare_all; | |
fi; | |
if [[ ! -n ${_DISTUTILS_DEFAULT_CALLED} ]]; then | |
local cmd=die; | |
[[ ${EAPI} == [45] ]] && cmd=eqawarn; | |
"${cmd}" "QA: python_prepare_all() didn't call distutils-r1_python_prepare_all"; | |
fi; | |
if declare -f python_prepare > /dev/null; then | |
_distutils-r1_run_foreach_impl python_prepare; | |
fi | |
} | |
distutils-r1_src_test () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
if declare -f python_test > /dev/null; then | |
_distutils-r1_run_foreach_impl python_test; | |
_distutils-r1_run_foreach_impl _distutils-r1_clean_egg_info; | |
fi; | |
if declare -f python_test_all > /dev/null; then | |
_distutils-r1_run_common_phase python_test_all; | |
fi | |
} | |
distutils_get_intermediate_installation_image () | |
{ | |
die "${FUNCNAME}() is invalid for distutils-r1" | |
} | |
distutils_install_for_testing () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
TEST_DIR=${BUILD_DIR}/test; | |
local bindir=${TEST_DIR}/scripts; | |
local libdir=${TEST_DIR}/lib; | |
PYTHONPATH=${libdir}:${PYTHONPATH}; | |
local add_args=(install --home="${TEST_DIR}" --install-lib="${libdir}" --install-scripts="${bindir}"); | |
mkdir -p "${libdir}" || die; | |
esetup.py "${add_args[@]}" "${@}" | |
} | |
distutils_pkg_postinst () | |
{ | |
die "${FUNCNAME}() is invalid for distutils-r1, and pkg_postinst is unnecessary" | |
} | |
distutils_pkg_postrm () | |
{ | |
die "${FUNCNAME}() is invalid for distutils-r1, and pkg_postrm is unnecessary" | |
} | |
distutils_src_compile () | |
{ | |
die "${FUNCNAME}() is invalid for distutils-r1, you probably want: ${FUNCNAME/_/-r1_}" | |
} | |
distutils_src_install () | |
{ | |
die "${FUNCNAME}() is invalid for distutils-r1, you probably want: ${FUNCNAME/_/-r1_}" | |
} | |
distutils_src_prepare () | |
{ | |
die "${FUNCNAME}() is invalid for distutils-r1, you probably want: ${FUNCNAME/_/-r1_}" | |
} | |
distutils_src_test () | |
{ | |
die "${FUNCNAME}() is invalid for distutils-r1, you probably want: ${FUNCNAME/_/-r1_}" | |
} | |
distutils_src_unpack () | |
{ | |
die "${FUNCNAME}() is invalid for distutils-r1, and you don't want it in EAPI ${EAPI} anyway" | |
} | |
eapply () | |
{ | |
local failed patch_cmd=patch; | |
local -x LC_COLLATE=POSIX; | |
type -P gpatch > /dev/null && patch_cmd=gpatch; | |
function _eapply_patch () | |
{ | |
local f=${1}; | |
local prefix=${2}; | |
started_applying=1; | |
ebegin "${prefix:-Applying }${f##*/}"; | |
${patch_cmd} -p1 -f -s -g0 --no-backup-if-mismatch "${patch_options[@]}" < "${f}"; | |
failed=${?}; | |
if ! eend "${failed}"; then | |
__helpers_die "patch -p1 ${patch_options[*]} failed with ${f}"; | |
fi | |
}; | |
local patch_options=() files=(); | |
local i found_doublehyphen; | |
for ((i = 1; i <= ${#@}; ++i )) | |
do | |
if [[ ${@:i:1} == -- ]]; then | |
patch_options=("${@:1:i-1}"); | |
files=("${@:i+1}"); | |
found_doublehyphen=1; | |
break; | |
fi; | |
done; | |
if [[ -z ${found_doublehyphen} ]]; then | |
for ((i = 1; i <= ${#@}; ++i )) | |
do | |
if [[ ${@:i:1} != -* ]]; then | |
patch_options=("${@:1:i-1}"); | |
files=("${@:i}"); | |
break; | |
fi; | |
done; | |
for i in "${files[@]}"; | |
do | |
if [[ ${i} == -* ]]; then | |
die "eapply: all options must be passed before non-options"; | |
fi; | |
done; | |
fi; | |
if [[ -z ${files[@]} ]]; then | |
die "eapply: no files specified"; | |
fi; | |
local f; | |
for f in "${files[@]}"; | |
do | |
if [[ -d ${f} ]]; then | |
function _eapply_get_files () | |
{ | |
local LC_ALL=POSIX; | |
local prev_shopt=$(shopt -p nullglob); | |
shopt -s nullglob; | |
local f; | |
for f in "${1}"/*; | |
do | |
if [[ ${f} == *.diff || ${f} == *.patch ]]; then | |
files+=("${f}"); | |
fi; | |
done; | |
${prev_shopt} | |
}; | |
local files=(); | |
_eapply_get_files "${f}"; | |
[[ -z ${files[@]} ]] && die "No *.{patch,diff} files in directory ${f}"; | |
einfo "Applying patches from ${f} ..."; | |
local f2; | |
for f2 in "${files[@]}"; | |
do | |
_eapply_patch "${f2}" ' '; | |
[[ ${failed} -ne 0 ]] && return "${failed}"; | |
done; | |
else | |
_eapply_patch "${f}"; | |
[[ ${failed} -ne 0 ]] && return "${failed}"; | |
fi; | |
done; | |
return 0 | |
} | |
eapply_user () | |
{ | |
[[ ${EBUILD_PHASE} == prepare ]] || die "eapply_user() called during invalid phase: ${EBUILD_PHASE}"; | |
local tagfile=${T}/.portage_user_patches_applied; | |
[[ -f ${tagfile} ]] && return; | |
>> "${tagfile}"; | |
local basedir=${PORTAGE_CONFIGROOT%/}/etc/portage/patches; | |
local d applied; | |
local prev_shopt=$(shopt -p nullglob); | |
shopt -s nullglob; | |
for d in "${basedir}"/${CATEGORY}/{${P}-${PR},${P},${PN}}{,:${SLOT%/*}}; | |
do | |
if [[ -n $(echo "${d}"/*.diff) || -n $(echo "${d}"/*.patch) ]]; then | |
eapply "${d}"; | |
applied=1; | |
fi; | |
done; | |
${prev_shopt}; | |
[[ -n ${applied} ]] && ewarn "User patches applied." | |
} | |
econf_build () | |
{ | |
local CBUILD=${CBUILD:-${CHOST}}; | |
tc-env_build econf --build=${CBUILD} --host=${CBUILD} "$@" | |
} | |
einstalldocs () | |
{ | |
( if ! declare -p DOCS &> /dev/null; then | |
local d; | |
for d in README* ChangeLog AUTHORS NEWS TODO CHANGES THANKS BUGS FAQ CREDITS CHANGELOG; | |
do | |
[[ -f ${d} && -s ${d} ]] && docinto / && dodoc "${d}"; | |
done; | |
else | |
if [[ $(declare -p DOCS) == "declare -a"* ]]; then | |
[[ -n ${DOCS[@]} ]] && docinto / && dodoc -r "${DOCS[@]}"; | |
else | |
[[ -n ${DOCS} ]] && docinto / && dodoc -r ${DOCS}; | |
fi; | |
fi ); | |
( if [[ $(declare -p HTML_DOCS 2>/dev/null) == "declare -a"* ]]; then | |
[[ -n ${HTML_DOCS[@]} ]] && docinto html && dodoc -r "${HTML_DOCS[@]}"; | |
else | |
[[ -n ${HTML_DOCS} ]] && docinto html && dodoc -r ${HTML_DOCS}; | |
fi ) | |
} | |
esetup.py () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local die_args=(); | |
[[ ${EAPI} != [45] ]] && die_args+=(-n); | |
[[ -n ${BUILD_DIR} ]] && _distutils-r1_create_setup_cfg; | |
set -- "${PYTHON:-python}" setup.py "${mydistutilsargs[@]}" "${@}"; | |
echo "${@}" 1>&2; | |
"${@}" || die "${die_args[@]}"; | |
local ret=${?}; | |
if [[ -n ${BUILD_DIR} ]]; then | |
rm "${HOME}"/.pydistutils.cfg || die "${die_args[@]}"; | |
fi; | |
return ${ret} | |
} | |
gcc-fullversion () | |
{ | |
_gcc_fullversion '$1.$2.$3' "$@" | |
} | |
gcc-major-version () | |
{ | |
_gcc_fullversion '$1' "$@" | |
} | |
gcc-micro-version () | |
{ | |
_gcc_fullversion '$3' "$@" | |
} | |
gcc-minor-version () | |
{ | |
_gcc_fullversion '$2' "$@" | |
} | |
gcc-specs-directive () | |
{ | |
local directive subdname subdirective; | |
directive="$(_gcc-specs-directive_raw $1)"; | |
while [[ ${directive} == *%\(*\)* ]]; do | |
subdname=${directive/*%\(}; | |
subdname=${subdname/\)*}; | |
subdirective="$(_gcc-specs-directive_raw ${subdname})"; | |
directive="${directive//\%(${subdname})/${subdirective}}"; | |
done; | |
echo "${directive}"; | |
return 0 | |
} | |
gcc-specs-nostrict () | |
{ | |
local directive; | |
directive=$(gcc-specs-directive cc1); | |
[[ "${directive/\{!fstrict-overflow:}" != "${directive}" ]] | |
} | |
gcc-specs-now () | |
{ | |
local directive; | |
directive=$(gcc-specs-directive link_command); | |
[[ "${directive/\{!nonow:}" != "${directive}" ]] | |
} | |
gcc-specs-pie () | |
{ | |
local directive; | |
directive=$(gcc-specs-directive cc1); | |
[[ "${directive/\{!nopie:}" != "${directive}" ]] | |
} | |
gcc-specs-relro () | |
{ | |
local directive; | |
directive=$(gcc-specs-directive link_command); | |
[[ "${directive/\{!norelro:}" != "${directive}" ]] | |
} | |
gcc-specs-ssp () | |
{ | |
local directive; | |
directive=$(gcc-specs-directive cc1); | |
[[ "${directive/\{!fno-stack-protector:}" != "${directive}" ]] | |
} | |
gcc-specs-ssp-to-all () | |
{ | |
local directive; | |
directive=$(gcc-specs-directive cc1); | |
[[ "${directive/\{!fno-stack-protector-all:}" != "${directive}" ]] | |
} | |
gcc-specs-stack-check () | |
{ | |
local directive; | |
directive=$(gcc-specs-directive cc1); | |
[[ "${directive/\{!fno-stack-check:}" != "${directive}" ]] | |
} | |
gcc-version () | |
{ | |
_gcc_fullversion '$1.$2' "$@" | |
} | |
gen_usr_ldscript () | |
{ | |
local lib libdir=$(get_libdir) output_format="" auto=false suffix=$(get_libname); | |
[[ -z ${ED+set} ]] && local ED=${D%/}${EPREFIX}/; | |
tc-is-static-only && return; | |
if [[ $(type -t multilib_is_native_abi) == "function" ]]; then | |
multilib_is_native_abi || return 0; | |
fi; | |
case ${CTARGET:-${CHOST}} in | |
*-darwin*) | |
;; | |
*-android*) | |
return 0 | |
;; | |
*linux* | *-freebsd* | *-openbsd* | *-netbsd*) | |
use prefix && return 0 | |
;; | |
*) | |
return 0 | |
;; | |
esac; | |
dodir /usr/${libdir}; | |
if [[ $1 == "-a" ]]; then | |
auto=true; | |
shift; | |
dodir /${libdir}; | |
fi; | |
local flags=(${CFLAGS} ${LDFLAGS} -Wl,--verbose); | |
if $(tc-getLD) --version | grep -q 'GNU gold'; then | |
local d="${T}/bfd-linker"; | |
mkdir -p "${d}"; | |
ln -sf $(which ${CHOST}-ld.bfd) "${d}"/ld; | |
flags+=(-B"${d}"); | |
fi; | |
output_format=$($(tc-getCC) "${flags[@]}" 2>&1 | sed -n 's/^OUTPUT_FORMAT("\([^"]*\)",.*/\1/p'); | |
[[ -n ${output_format} ]] && output_format="OUTPUT_FORMAT ( ${output_format} )"; | |
for lib in "$@"; | |
do | |
local tlib; | |
if ${auto}; then | |
lib="lib${lib}${suffix}"; | |
else | |
[[ -r ${ED}/${libdir}/${lib} ]] || continue; | |
fi; | |
case ${CTARGET:-${CHOST}} in | |
*-darwin*) | |
if ${auto}; then | |
tlib=$(scanmacho -qF'%S#F' "${ED}"/usr/${libdir}/${lib}); | |
else | |
tlib=$(scanmacho -qF'%S#F' "${ED}"/${libdir}/${lib}); | |
fi; | |
[[ -z ${tlib} ]] && die "unable to read install_name from ${lib}"; | |
tlib=${tlib##*/}; | |
if ${auto}; then | |
mv "${ED}"/usr/${libdir}/${lib%${suffix}}.*${suffix#.} "${ED}"/${libdir}/ || die; | |
if [[ ${tlib} != ${lib%${suffix}}.*${suffix#.} ]]; then | |
mv "${ED}"/usr/${libdir}/${tlib%${suffix}}.*${suffix#.} "${ED}"/${libdir}/ || die; | |
fi; | |
rm -f "${ED}"/${libdir}/${lib}; | |
fi; | |
if [[ ! -w "${ED}/${libdir}/${tlib}" ]]; then | |
chmod u+w "${ED}${libdir}/${tlib}"; | |
local nowrite=yes; | |
fi; | |
install_name_tool -id "${EPREFIX}"/${libdir}/${tlib} "${ED}"/${libdir}/${tlib} || die "install_name_tool failed"; | |
[[ -n ${nowrite} ]] && chmod u-w "${ED}${libdir}/${tlib}"; | |
pushd "${ED}/usr/${libdir}" > /dev/null; | |
ln -snf "../../${libdir}/${tlib}" "${lib}"; | |
popd > /dev/null | |
;; | |
*) | |
if ${auto}; then | |
tlib=$(scanelf -qF'%S#F' "${ED}"/usr/${libdir}/${lib}); | |
[[ -z ${tlib} ]] && die "unable to read SONAME from ${lib}"; | |
mv "${ED}"/usr/${libdir}/${lib}* "${ED}"/${libdir}/ || die; | |
if [[ ${tlib} != ${lib}* ]]; then | |
mv "${ED}"/usr/${libdir}/${tlib}* "${ED}"/${libdir}/ || die; | |
fi; | |
rm -f "${ED}"/${libdir}/${lib}; | |
else | |
tlib=${lib}; | |
fi; | |
cat > "${ED}/usr/${libdir}/${lib}" <<-END_LDSCRIPT | |
/* GNU ld script | |
Since Gentoo has critical dynamic libraries in /lib, and the static versions | |
in /usr/lib, we need to have a "fake" dynamic lib in /usr/lib, otherwise we | |
run into linking problems. This "fake" dynamic lib is a linker script that | |
redirects the linker to the real lib. And yes, this works in the cross- | |
compiling scenario as the sysroot-ed linker will prepend the real path. | |
See bug https://bugs.gentoo.org/4411 for more info. | |
*/ | |
${output_format} | |
GROUP ( ${EPREFIX}/${libdir}/${tlib} ) | |
END_LDSCRIPT | |
;; | |
esac | |
fperms a+x "/usr/${libdir}/${lib}" || die "could not change perms on ${lib}"; | |
done | |
} | |
get_abi_CFLAGS () | |
{ | |
get_abi_var CFLAGS "$@" | |
} | |
get_abi_CHOST () | |
{ | |
get_abi_var CHOST "$@" | |
} | |
get_abi_CTARGET () | |
{ | |
get_abi_var CTARGET "$@" | |
} | |
get_abi_FAKE_TARGETS () | |
{ | |
get_abi_var FAKE_TARGETS "$@" | |
} | |
get_abi_LDFLAGS () | |
{ | |
get_abi_var LDFLAGS "$@" | |
} | |
get_abi_LIBDIR () | |
{ | |
get_abi_var LIBDIR "$@" | |
} | |
get_abi_var () | |
{ | |
local flag=$1; | |
local abi=${2:-${ABI:-${DEFAULT_ABI:-default}}}; | |
local var="${flag}_${abi}"; | |
echo ${!var} | |
} | |
get_all_abis () | |
{ | |
local x order="" mvar dvar; | |
mvar="MULTILIB_ABIS"; | |
dvar="DEFAULT_ABI"; | |
if [[ -n $1 ]]; then | |
mvar="$1_${mvar}"; | |
dvar="$1_${dvar}"; | |
fi; | |
if [[ -z ${!mvar} ]]; then | |
echo "default"; | |
return 0; | |
fi; | |
for x in ${!mvar}; | |
do | |
if [[ ${x} != ${!dvar} ]]; then | |
order="${order:+${order} }${x}"; | |
fi; | |
done; | |
order="${order:+${order} }${!dvar}"; | |
echo ${order}; | |
return 0 | |
} | |
get_all_libdirs () | |
{ | |
local libdirs abi; | |
for abi in ${MULTILIB_ABIS}; | |
do | |
libdirs+=" $(get_abi_LIBDIR ${abi})"; | |
done; | |
[[ " ${libdirs} " != *" lib "* ]] && libdirs+=" lib"; | |
echo "${libdirs}" | |
} | |
get_exeext () | |
{ | |
case ${CHOST} in | |
*-cygwin* | mingw* | *-mingw*) | |
echo ".exe" | |
;; | |
esac | |
} | |
get_install_abis () | |
{ | |
local x order=""; | |
if [[ -z ${MULTILIB_ABIS} ]]; then | |
echo "default"; | |
return 0; | |
fi; | |
if [[ ${EMULTILIB_PKG} == "true" ]]; then | |
for x in ${MULTILIB_ABIS}; | |
do | |
if [[ ${x} != "${DEFAULT_ABI}" ]]; then | |
has ${x} ${ABI_DENY} || order="${order} ${x}"; | |
fi; | |
done; | |
has ${DEFAULT_ABI} ${ABI_DENY} || order="${order} ${DEFAULT_ABI}"; | |
if [[ -n ${ABI_ALLOW} ]]; then | |
local ordera=""; | |
for x in ${order}; | |
do | |
if has ${x} ${ABI_ALLOW}; then | |
ordera="${ordera} ${x}"; | |
fi; | |
done; | |
order=${ordera}; | |
fi; | |
else | |
order=${DEFAULT_ABI}; | |
fi; | |
if [[ -z ${order} ]]; then | |
die "The ABI list is empty. Are you using a proper multilib profile? Perhaps your USE flags or MULTILIB_ABIS are too restrictive for this package."; | |
fi; | |
echo ${order}; | |
return 0 | |
} | |
get_libdir () | |
{ | |
local libdir_var="LIBDIR_${ABI}"; | |
local libdir="lib"; | |
[[ -n ${ABI} && -n ${!libdir_var} ]] && libdir=${!libdir_var}; | |
echo "${libdir}" | |
} | |
get_libname () | |
{ | |
local libname; | |
local ver=$1; | |
case ${CHOST} in | |
*-cygwin*) | |
libname="dll.a" | |
;; | |
mingw* | *-mingw*) | |
libname="dll" | |
;; | |
*-darwin*) | |
libname="dylib" | |
;; | |
*-mint*) | |
libname="irrelevant" | |
;; | |
hppa*-hpux*) | |
libname="sl" | |
;; | |
*) | |
libname="so" | |
;; | |
esac; | |
if [[ -z $* ]]; then | |
echo ".${libname}"; | |
else | |
for ver in "$@"; | |
do | |
case ${CHOST} in | |
*-cygwin*) | |
echo ".${ver}.${libname}" | |
;; | |
*-darwin*) | |
echo ".${ver}.${libname}" | |
;; | |
*-mint*) | |
echo ".${libname}" | |
;; | |
*) | |
echo ".${libname}.${ver}" | |
;; | |
esac; | |
done; | |
fi | |
} | |
get_modname () | |
{ | |
local modname; | |
local ver=$1; | |
case ${CHOST} in | |
*-darwin*) | |
modname="bundle" | |
;; | |
*) | |
modname="so" | |
;; | |
esac; | |
echo ".${modname}" | |
} | |
get_nproc () | |
{ | |
local nproc; | |
if type -P nproc &> /dev/null; then | |
nproc=$(nproc); | |
fi; | |
if [[ -z ${nproc} ]] && type -P sysctl &> /dev/null; then | |
nproc=$(sysctl -n hw.ncpu 2>/dev/null); | |
fi; | |
if [[ -z ${nproc} ]] && type -P python &> /dev/null; then | |
nproc=$(python -c 'import multiprocessing; print(multiprocessing.cpu_count());' 2>/dev/null); | |
fi; | |
if [[ -n ${nproc} ]]; then | |
echo "${nproc}"; | |
else | |
echo "${1:-1}"; | |
fi | |
} | |
has_multilib_profile () | |
{ | |
[ -n "${MULTILIB_ABIS}" -a "${MULTILIB_ABIS}" != "${MULTILIB_ABIS/ /}" ] | |
} | |
in_iuse () | |
{ | |
local use=${1}; | |
if [[ -z "${use}" ]]; then | |
echo "!!! in_iuse() called without a parameter." 1>&2; | |
echo "!!! in_iuse <USEFLAG>" 1>&2; | |
die "in_iuse() called without a parameter"; | |
fi; | |
local liuse=(${IUSE_EFFECTIVE}); | |
has "${use}" "${liuse[@]#[+-]}" | |
} | |
is_final_abi () | |
{ | |
has_multilib_profile || return 0; | |
set -- $(get_install_abis); | |
local LAST_ABI=$#; | |
[[ ${!LAST_ABI} == ${ABI} ]] | |
} | |
makeopts_jobs () | |
{ | |
[[ $# -eq 0 ]] && set -- "${MAKEOPTS}"; | |
local jobs=$(echo " $* " | sed -r -n -e 's:.*[[:space:]](-[a-z]*j|--jobs[=[:space:]])[[:space:]]*([0-9]+).*:\2:p' -e "s:.*[[:space:]](-[a-z]*j|--jobs)[[:space:]].*:${2:-999}:p"); | |
echo ${jobs:-1} | |
} | |
makeopts_loadavg () | |
{ | |
[[ $# -eq 0 ]] && set -- "${MAKEOPTS}"; | |
local lavg=$(echo " $* " | sed -r -n -e 's:.*[[:space:]](-[a-z]*l|--(load-average|max-load)[=[:space:]])[[:space:]]*([0-9]+|[0-9]+\.[0-9]+).*:\3:p' -e "s:.*[[:space:]](-[a-z]*l|--(load-average|max-load))[[:space:]].*:${2:-999}:p"); | |
echo ${lavg:-${2:-999}} | |
} | |
multibuild_copy_sources () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local _MULTIBUILD_INITIAL_BUILD_DIR=${BUILD_DIR:-${S}}; | |
einfo "Will copy sources from ${_MULTIBUILD_INITIAL_BUILD_DIR}"; | |
local cp_args=(); | |
if cp --reflink=auto --version &> /dev/null; then | |
cp_args+=(--reflink=auto); | |
fi; | |
function _multibuild_create_source_copy () | |
{ | |
einfo "${MULTIBUILD_VARIANT}: copying to ${BUILD_DIR}"; | |
cp -p -R "${cp_args[@]}" "${_MULTIBUILD_INITIAL_BUILD_DIR}" "${BUILD_DIR}" || die | |
}; | |
multibuild_foreach_variant _multibuild_create_source_copy | |
} | |
multibuild_for_best_variant () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ -n ${MULTIBUILD_VARIANTS} ]] || die "MULTIBUILD_VARIANTS need to be set"; | |
local MULTIBUILD_VARIANTS=("${MULTIBUILD_VARIANTS[$(( ${#MULTIBUILD_VARIANTS[@]} - 1 ))]}"); | |
multibuild_foreach_variant "${@}" | |
} | |
multibuild_foreach_variant () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ -n ${MULTIBUILD_VARIANTS} ]] || die "MULTIBUILD_VARIANTS need to be set"; | |
local bdir=${BUILD_DIR:-${S}}; | |
[[ ${bdir%%/} == ${WORKDIR%%/} ]] && bdir=${WORKDIR}/build; | |
local prev_id=${MULTIBUILD_ID:+${MULTIBUILD_ID}-}; | |
local ret=0 lret=0 v; | |
debug-print "${FUNCNAME}: initial build_dir = ${bdir}"; | |
for v in "${MULTIBUILD_VARIANTS[@]}"; | |
do | |
local MULTIBUILD_VARIANT=${v}; | |
local MULTIBUILD_ID=${prev_id}${v}; | |
local BUILD_DIR=${bdir%%/}-${v}; | |
function _multibuild_run () | |
{ | |
local i=1; | |
while [[ ${!i} == _* ]]; do | |
(( i += 1 )); | |
done; | |
[[ ${i} -le ${#} ]] && einfo "${v}: running ${@:${i}}"; | |
"${@}" | |
}; | |
_multibuild_run "${@}" > >(exec tee -a "${T}/build-${MULTIBUILD_ID}.log") 2>&1; | |
lret=${?}; | |
done; | |
[[ ${ret} -eq 0 && ${lret} -ne 0 ]] && ret=${lret}; | |
return ${ret} | |
} | |
multibuild_merge_root () | |
{ | |
local src=${1}; | |
local dest=${2}; | |
local ret; | |
if use userland_BSD; then | |
tar -C "${src}" -f - -c . | tar -x -f - -C "${dest}"; | |
[[ ${PIPESTATUS[*]} == '0 0' ]]; | |
ret=${?}; | |
else | |
local cp_args=(); | |
if cp -a --version &> /dev/null; then | |
cp_args+=(-a); | |
else | |
cp_args+=(-P -R -p); | |
fi; | |
if cp --reflink=auto --version &> /dev/null; then | |
cp_args+=(--reflink=auto); | |
fi; | |
cp "${cp_args[@]}" "${src}"/. "${dest}"/; | |
ret=${?}; | |
fi; | |
if [[ ${ret} -ne 0 ]]; then | |
die "${MULTIBUILD_VARIANT:-(unknown)}: merging image failed."; | |
fi; | |
rm -rf "${src}" | |
} | |
multibuild_parallel_foreach_variant () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ ${EAPI} == [45] ]] || die "${FUNCNAME} is banned in EAPI ${EAPI}"; | |
multibuild_foreach_variant "${@}" | |
} | |
multijob_child_init () | |
{ | |
local mode="pre"; | |
case $1 in | |
--pre) | |
mode="pre"; | |
shift | |
;; | |
--post) | |
mode="post"; | |
shift | |
;; | |
esac; | |
if [[ $# -eq 0 ]]; then | |
trap 'echo ${BASHPID:-$(bashpid)} $? >&'${mj_write_fd} EXIT; | |
trap 'exit 1' INT TERM; | |
else | |
local ret; | |
[[ ${mode} == "pre" ]] && { | |
multijob_pre_fork; | |
ret=$? | |
}; | |
( multijob_child_init; | |
"$@" ) & [[ ${mode} == "post" ]] && { | |
multijob_post_fork; | |
ret=$? | |
}; | |
return ${ret}; | |
fi | |
} | |
multijob_finish () | |
{ | |
local ret=0; | |
while [[ ${mj_num_jobs} -gt 0 ]]; do | |
multijob_finish_one; | |
: $(( ret |= $? )); | |
done; | |
wait; | |
[[ $# -eq 0 ]] || die "${FUNCNAME} takes no arguments"; | |
EBUILD_DEATH_HOOKS=${EBUILD_DEATH_HOOKS/ wait / }; | |
return ${ret} | |
} | |
multijob_finish_one () | |
{ | |
[[ $# -eq 0 ]] || die "${FUNCNAME} takes no arguments"; | |
local pid ret; | |
read -r -u ${mj_read_fd} pid ret || die; | |
: $(( --mj_num_jobs )); | |
return ${ret} | |
} | |
multijob_init () | |
{ | |
has wait ${EBUILD_DEATH_HOOKS} || EBUILD_DEATH_HOOKS+=" wait "; | |
local pipe="${T}/multijob.pipe"; | |
mkfifo -m 600 "${pipe}"; | |
redirect_alloc_fd mj_read_fd "${pipe}"; | |
redirect_alloc_fd mj_write_fd "${pipe}" '>'; | |
rm -f "${pipe}"; | |
mj_max_jobs=$(makeopts_jobs "$@"); | |
mj_num_jobs=0 | |
} | |
multijob_post_fork () | |
{ | |
_multijob_fork post "$@" | |
} | |
multijob_pre_fork () | |
{ | |
_multijob_fork pre "$@" | |
} | |
multilib_env () | |
{ | |
local CTARGET=${1:-${CTARGET}}; | |
local cpu=${CTARGET%%*-}; | |
case ${cpu} in | |
aarch64*) | |
export CFLAGS_arm=${CFLAGS_arm-}; | |
case ${cpu} in | |
aarch64*be) | |
export CHOST_arm="armv8b-${CTARGET#*-}" | |
;; | |
*) | |
export CHOST_arm="armv8l-${CTARGET#*-}" | |
;; | |
esac; | |
CHOST_arm=${CHOST_arm/%-gnu/-gnueabi}; | |
export CTARGET_arm=${CHOST_arm}; | |
export LIBDIR_arm="lib"; | |
export CFLAGS_arm64=${CFLAGS_arm64-}; | |
export CHOST_arm64=${CTARGET}; | |
export CTARGET_arm64=${CHOST_arm64}; | |
export LIBDIR_arm64="lib64"; | |
: ${MULTILIB_ABIS=arm64}; | |
: ${DEFAULT_ABI=arm64} | |
;; | |
x86_64*) | |
export CFLAGS_x86=${CFLAGS_x86--m32}; | |
export CHOST_x86=${CTARGET/x86_64/i686}; | |
CHOST_x86=${CHOST_x86/%-gnux32/-gnu}; | |
export CTARGET_x86=${CHOST_x86}; | |
if [[ ${SYMLINK_LIB} == "yes" ]]; then | |
export LIBDIR_x86="lib32"; | |
else | |
export LIBDIR_x86="lib"; | |
fi; | |
export CFLAGS_amd64=${CFLAGS_amd64--m64}; | |
export CHOST_amd64=${CTARGET/%-gnux32/-gnu}; | |
export CTARGET_amd64=${CHOST_amd64}; | |
export LIBDIR_amd64="lib64"; | |
export CFLAGS_x32=${CFLAGS_x32--mx32}; | |
export CHOST_x32=${CTARGET/%-gnu/-gnux32}; | |
export CTARGET_x32=${CHOST_x32}; | |
export LIBDIR_x32="libx32"; | |
case ${CTARGET} in | |
*-gnux32) | |
: ${MULTILIB_ABIS=x32 amd64 x86}; | |
: ${DEFAULT_ABI=x32} | |
;; | |
*) | |
: ${MULTILIB_ABIS=amd64 x86}; | |
: ${DEFAULT_ABI=amd64} | |
;; | |
esac | |
;; | |
mips64*) | |
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 F77 FC LD PKG_CONFIG_{LIBDIR,PATH}; | |
do | |
vv="_abi_saved_${v}"; | |
[[ ${!vv+set} == "set" ]] && export ${v}="${!vv}" || unset ${v}; | |
unset ${vv}; | |
done; | |
unset _DEFAULT_ABI_SAVED; | |
fi; | |
if [[ ${ABI} != ${DEFAULT_ABI} ]]; then | |
for v in CHOST CBUILD AS CC CXX F77 FC LD PKG_CONFIG_{LIBDIR,PATH}; | |
do | |
vv="_abi_saved_${v}"; | |
[[ ${!v+set} == "set" ]] && export ${vv}="${!v}" || unset ${vv}; | |
done; | |
export _DEFAULT_ABI_SAVED="true"; | |
if [[ ${CBUILD} == "${CHOST}" ]]; then | |
export CBUILD=$(get_abi_CHOST $1); | |
fi; | |
export CHOST=$(get_abi_CHOST ${DEFAULT_ABI}); | |
export CC="$(tc-getCC) $(get_abi_CFLAGS)"; | |
export CXX="$(tc-getCXX) $(get_abi_CFLAGS)"; | |
export F77="$(tc-getF77) $(get_abi_CFLAGS)"; | |
export FC="$(tc-getFC) $(get_abi_CFLAGS)"; | |
export LD="$(tc-getLD) $(get_abi_LDFLAGS)"; | |
export CHOST=$(get_abi_CHOST $1); | |
export PKG_CONFIG_LIBDIR=${EPREFIX}/usr/$(get_libdir)/pkgconfig; | |
export PKG_CONFIG_PATH=${EPREFIX}/usr/share/pkgconfig; | |
fi | |
} | |
number_abis () | |
{ | |
set -- `get_install_abis`; | |
echo $# | |
} | |
pkg_nofetch () | |
{ | |
default | |
} | |
python_abi_depend () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_byte-compile_modules () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_clean_byte-compiled_modules () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_clean_installation_image () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_clean_py-compile_files () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_convert_shebangs () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#python_convert_shebangs" | |
} | |
python_copy_sources () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local MULTIBUILD_VARIANTS; | |
_python_obtain_impls; | |
multibuild_copy_sources | |
} | |
python_disable_pyc () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_doexe () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local f; | |
for f in "$@"; | |
do | |
python_newexe "${f}" "${f##*/}"; | |
done | |
} | |
python_doheader () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ -n ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).'; | |
if [[ ${EAPI:-0} == [0123] ]]; then | |
die "python_do* and python_new* helpers are banned in EAPIs older than 4."; | |
fi; | |
local d PYTHON_INCLUDEDIR=${PYTHON_INCLUDEDIR}; | |
[[ -n ${PYTHON_INCLUDEDIR} ]] || python_export PYTHON_INCLUDEDIR; | |
d=${PYTHON_INCLUDEDIR#${EPREFIX}}; | |
( insinto "${d}"; | |
doins -r "${@}" || return ${?} ) | |
} | |
python_domodule () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ -n ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).'; | |
if [[ ${EAPI:-0} == [0123] ]]; then | |
die "python_do* and python_new* helpers are banned in EAPIs older than 4."; | |
fi; | |
local d; | |
if [[ ${python_moduleroot} == /* ]]; then | |
d=${python_moduleroot}; | |
else | |
local PYTHON_SITEDIR=${PYTHON_SITEDIR}; | |
[[ -n ${PYTHON_SITEDIR} ]] || python_export PYTHON_SITEDIR; | |
d=${PYTHON_SITEDIR#${EPREFIX}}/${python_moduleroot//.//}; | |
fi; | |
( insinto "${d}"; | |
doins -r "${@}" || return ${?} ); | |
python_optimize "${ED}/${d}" | |
} | |
python_doscript () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local _PYTHON_REWRITE_SHEBANG=1; | |
python_doexe "${@}" | |
} | |
python_enable_pyc () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_execute_function () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#python_execute_function" | |
} | |
python_execute_nosetests () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_execute_py.test () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_execute_trial () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_export () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local impl var; | |
case "${1}" in | |
python* | jython*) | |
impl=${1/_/.}; | |
shift | |
;; | |
pypy | pypy3) | |
impl=${1}; | |
shift | |
;; | |
*) | |
impl=${EPYTHON}; | |
if [[ -z ${impl} ]]; then | |
die "python_export called without a python implementation and EPYTHON is unset"; | |
fi | |
;; | |
esac; | |
debug-print "${FUNCNAME}: implementation: ${impl}"; | |
for var in "$@"; | |
do | |
case "${var}" in | |
EPYTHON) | |
export EPYTHON=${impl}; | |
debug-print "${FUNCNAME}: EPYTHON = ${EPYTHON}" | |
;; | |
PYTHON) | |
export PYTHON=${EPREFIX}/usr/bin/${impl}; | |
debug-print "${FUNCNAME}: PYTHON = ${PYTHON}" | |
;; | |
PYTHON_SITEDIR) | |
[[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it"; | |
PYTHON_SITEDIR=$("${PYTHON}" -c 'import distutils.sysconfig; print(distutils.sysconfig.get_python_lib())') || die; | |
export PYTHON_SITEDIR; | |
debug-print "${FUNCNAME}: PYTHON_SITEDIR = ${PYTHON_SITEDIR}" | |
;; | |
PYTHON_INCLUDEDIR) | |
[[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it"; | |
PYTHON_INCLUDEDIR=$("${PYTHON}" -c 'import distutils.sysconfig; print(distutils.sysconfig.get_python_inc())') || die; | |
export PYTHON_INCLUDEDIR; | |
debug-print "${FUNCNAME}: PYTHON_INCLUDEDIR = ${PYTHON_INCLUDEDIR}"; | |
if [[ ! -d ${PYTHON_INCLUDEDIR} ]]; then | |
die "${impl} does not install any header files!"; | |
fi | |
;; | |
PYTHON_LIBPATH) | |
[[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it"; | |
PYTHON_LIBPATH=$("${PYTHON}" -c 'import os.path, sysconfig; print(os.path.join(sysconfig.get_config_var("LIBDIR"), sysconfig.get_config_var("LDLIBRARY")) if sysconfig.get_config_var("LDLIBRARY") else "")') || die; | |
export PYTHON_LIBPATH; | |
debug-print "${FUNCNAME}: PYTHON_LIBPATH = ${PYTHON_LIBPATH}"; | |
if [[ ! -n ${PYTHON_LIBPATH} ]]; then | |
die "${impl} lacks a (usable) dynamic library"; | |
fi | |
;; | |
PYTHON_CFLAGS) | |
local val; | |
case "${impl}" in | |
python*) | |
val=$($(tc-getPKG_CONFIG) --cflags ${impl/n/n-}) || die | |
;; | |
*) | |
die "${impl}: obtaining ${var} not supported" | |
;; | |
esac; | |
export PYTHON_CFLAGS=${val}; | |
debug-print "${FUNCNAME}: PYTHON_CFLAGS = ${PYTHON_CFLAGS}" | |
;; | |
PYTHON_LIBS) | |
local val; | |
case "${impl}" in | |
python*) | |
val=$($(tc-getPKG_CONFIG) --libs ${impl/n/n-}) || die | |
;; | |
*) | |
die "${impl}: obtaining ${var} not supported" | |
;; | |
esac; | |
export PYTHON_LIBS=${val}; | |
debug-print "${FUNCNAME}: PYTHON_LIBS = ${PYTHON_LIBS}" | |
;; | |
PYTHON_CONFIG) | |
local flags val; | |
case "${impl}" in | |
python*) | |
[[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it"; | |
flags=$("${PYTHON}" -c 'import sysconfig; print(sysconfig.get_config_var("ABIFLAGS") or "")') || die; | |
val=${PYTHON}${flags}-config | |
;; | |
*) | |
die "${impl}: obtaining ${var} not supported" | |
;; | |
esac; | |
export PYTHON_CONFIG=${val}; | |
debug-print "${FUNCNAME}: PYTHON_CONFIG = ${PYTHON_CONFIG}" | |
;; | |
PYTHON_PKG_DEP) | |
local d; | |
case ${impl} in | |
python2.7) | |
PYTHON_PKG_DEP='>=dev-lang/python-2.7.5-r2:2.7' | |
;; | |
python3.3) | |
PYTHON_PKG_DEP='>=dev-lang/python-3.3.2-r2:3.3' | |
;; | |
python*) | |
PYTHON_PKG_DEP="dev-lang/python:${impl#python}" | |
;; | |
pypy) | |
PYTHON_PKG_DEP='>=virtual/pypy-5:0=' | |
;; | |
pypy3) | |
PYTHON_PKG_DEP='>=virtual/pypy3-5:0=' | |
;; | |
jython2.7) | |
PYTHON_PKG_DEP='dev-java/jython:2.7' | |
;; | |
*) | |
die "Invalid implementation: ${impl}" | |
;; | |
esac; | |
if [[ -n ${PYTHON_REQ_USE} ]]; then | |
PYTHON_PKG_DEP+=[${PYTHON_REQ_USE}]; | |
fi; | |
export PYTHON_PKG_DEP; | |
debug-print "${FUNCNAME}: PYTHON_PKG_DEP = ${PYTHON_PKG_DEP}" | |
;; | |
PYTHON_SCRIPTDIR) | |
local dir; | |
export PYTHON_SCRIPTDIR=${EPREFIX}/usr/lib/python-exec/${impl}; | |
debug-print "${FUNCNAME}: PYTHON_SCRIPTDIR = ${PYTHON_SCRIPTDIR}" | |
;; | |
*) | |
die "python_export: unknown variable ${var}" | |
;; | |
esac; | |
done | |
} | |
python_export_best () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ ${EAPI} == [45] ]] || die "${FUNCNAME} is banned in EAPI ${EAPI}"; | |
eqawarn "python_export_best() is deprecated. Please use python_setup instead,"; | |
eqawarn "combined with python_export if necessary."; | |
[[ ${#} -gt 0 ]] || set -- EPYTHON PYTHON; | |
local best MULTIBUILD_VARIANTS; | |
_python_obtain_impls; | |
function _python_set_best () | |
{ | |
best=${MULTIBUILD_VARIANT} | |
}; | |
multibuild_for_best_variant _python_set_best; | |
unset -f _python_set_best; | |
debug-print "${FUNCNAME}: Best implementation is: ${best}"; | |
python_export "${best}" "${@}"; | |
python_wrapper_setup | |
} | |
python_export_utf8_locale () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
type locale > /dev/null || return 0; | |
if [[ $(locale charmap) != UTF-8 ]]; then | |
local lang locales="C.UTF-8 en_US.UTF-8 en_GB.UTF-8 $(locale -a)"; | |
for lang in ${locales}; | |
do | |
if [[ $(LC_ALL=${lang} locale charmap 2>/dev/null) == UTF-8 ]]; then | |
if _python_check_locale_sanity "${lang}"; then | |
export LC_CTYPE=${lang}; | |
if [[ -n ${LC_ALL} ]]; then | |
export LC_NUMERIC=${LC_ALL}; | |
export LC_TIME=${LC_ALL}; | |
export LC_COLLATE=${LC_ALL}; | |
export LC_MONETARY=${LC_ALL}; | |
export LC_MESSAGES=${LC_ALL}; | |
export LC_PAPER=${LC_ALL}; | |
export LC_NAME=${LC_ALL}; | |
export LC_ADDRESS=${LC_ALL}; | |
export LC_TELEPHONE=${LC_ALL}; | |
export LC_MEASUREMENT=${LC_ALL}; | |
export LC_IDENTIFICATION=${LC_ALL}; | |
export LC_ALL=; | |
fi; | |
return 0; | |
fi; | |
fi; | |
done; | |
ewarn "Could not find a UTF-8 locale. This may trigger build failures in"; | |
ewarn "some python packages. Please ensure that a UTF-8 locale is listed in"; | |
ewarn "/etc/locale.gen and run locale-gen."; | |
return 1; | |
fi; | |
return 0 | |
} | |
python_fix_shebang () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ -n ${EPYTHON} ]] || die "${FUNCNAME}: EPYTHON unset (pkg_setup not called?)"; | |
local force quiet; | |
while [[ -n ${@} ]]; do | |
case "${1}" in | |
-f | --force) | |
force=1; | |
shift | |
;; | |
-q | --quiet) | |
quiet=1; | |
shift | |
;; | |
--) | |
shift; | |
break | |
;; | |
*) | |
break | |
;; | |
esac; | |
done; | |
[[ -n ${1} ]] || die "${FUNCNAME}: no paths given"; | |
local path f; | |
for path in "$@"; | |
do | |
local any_correct any_fixed is_recursive; | |
[[ -d ${path} ]] && is_recursive=1; | |
while IFS= read -r -d '' f; do | |
local shebang i; | |
local error= from=; | |
IFS= read -r shebang < "${f}"; | |
if [[ ${shebang} == '#!'* ]]; then | |
local split_shebang=(); | |
read -r -a split_shebang <<< ${shebang} || die; | |
for i in "${split_shebang[@]}"; | |
do | |
case "${i}" in | |
*"${EPYTHON}") | |
debug-print "${FUNCNAME}: in file ${f#${D}}"; | |
debug-print "${FUNCNAME}: shebang matches EPYTHON: ${shebang}"; | |
any_correct=1; | |
from=${EPYTHON}; | |
break | |
;; | |
*python | *python[23]) | |
debug-print "${FUNCNAME}: in file ${f#${D}}"; | |
debug-print "${FUNCNAME}: rewriting shebang: ${shebang}"; | |
if [[ ${i} == *python2 ]]; then | |
from=python2; | |
if [[ ! -n ${force} ]]; then | |
python_is_python3 "${EPYTHON}" && error=1; | |
fi; | |
else | |
if [[ ${i} == *python3 ]]; then | |
from=python3; | |
if [[ ! -n ${force} ]]; then | |
python_is_python3 "${EPYTHON}" || error=1; | |
fi; | |
else | |
from=python; | |
fi; | |
fi; | |
break | |
;; | |
*python[23].[0123456789] | *pypy | *pypy3 | *jython[23].[0123456789]) | |
if [[ ! -n ${force} ]]; then | |
error=1; | |
else | |
case "${i}" in | |
*python[23].[0123456789]) | |
from="python[23].[0123456789]" | |
;; | |
*pypy) | |
from="pypy" | |
;; | |
*pypy3) | |
from="pypy3" | |
;; | |
*jython[23].[0123456789]) | |
from="jython[23].[0123456789]" | |
;; | |
*) | |
die "${FUNCNAME}: internal error in 2nd pattern match" | |
;; | |
esac; | |
fi; | |
break | |
;; | |
esac; | |
done; | |
fi; | |
if [[ ! -n ${error} && ! -n ${from} ]]; then | |
[[ -n ${is_recursive} ]] && continue; | |
error=1; | |
fi; | |
if [[ ! -n ${quiet} ]]; then | |
einfo "Fixing shebang in ${f#${D}}."; | |
fi; | |
if [[ ! -n ${error} ]]; then | |
if [[ ${shebang} == *${from}" "* ]]; then | |
sed -i -e "1s:${from} :${EPYTHON} :" "${f}" || die; | |
else | |
sed -i -e "1s:${from}$:${EPYTHON}:" "${f}" || die; | |
fi; | |
any_fixed=1; | |
else | |
eerror "The file has incompatible shebang:"; | |
eerror " file: ${f#${D}}"; | |
eerror " current shebang: ${shebang}"; | |
eerror " requested impl: ${EPYTHON}"; | |
die "${FUNCNAME}: conversion of incompatible shebang requested"; | |
fi; | |
done < <(find -H "${path}" -type f -print0 || die); | |
if [[ ! -n ${any_fixed} ]]; then | |
local cmd=eerror; | |
[[ ${EAPI:-0} == [012345] ]] && cmd=eqawarn; | |
"${cmd}" "QA warning: ${FUNCNAME}, ${path#${D}} did not match any fixable files."; | |
if [[ -n ${any_correct} ]]; then | |
"${cmd}" "All files have ${EPYTHON} shebang already."; | |
else | |
"${cmd}" "There are no Python files in specified directory."; | |
fi; | |
[[ ${cmd} == eerror ]] && die "${FUNCNAME} did not match any fixable files (QA warning fatal in EAPI ${EAPI})"; | |
fi; | |
done | |
} | |
python_foreach_impl () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local MULTIBUILD_VARIANTS; | |
_python_obtain_impls; | |
multibuild_foreach_variant _python_multibuild_wrapper "${@}" | |
} | |
python_gen_any_dep () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local depstr=${1}; | |
[[ -n ${depstr} ]] || die "No dependency string provided"; | |
shift; | |
local i PYTHON_PKG_DEP out=; | |
for i in "${_PYTHON_SUPPORTED_IMPLS[@]}"; | |
do | |
if _python_impl_matches "${i}" "${@-*}"; then | |
local PYTHON_USEDEP="python_targets_${i}(-),python_single_target_${i}(+)"; | |
python_export "${i}" PYTHON_PKG_DEP; | |
local i_depstr=${depstr//\$\{PYTHON_USEDEP\}/${PYTHON_USEDEP}}; | |
out="( ${PYTHON_PKG_DEP%=} ${i_depstr} ) ${out}"; | |
fi; | |
done; | |
echo "|| ( ${out})" | |
} | |
python_gen_cond_dep () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local impl matches=(); | |
local dep=${1}; | |
shift; | |
for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; | |
do | |
if _python_impl_matches "${impl}" "${@}"; then | |
if [[ ${dep} == *'${PYTHON_USEDEP}'* ]]; then | |
local usedep=$(python_gen_usedep "${@}"); | |
dep=${dep//\$\{PYTHON_USEDEP\}/${usedep}}; | |
fi; | |
matches+=("python_targets_${impl}? ( ${dep} )"); | |
fi; | |
done; | |
echo "${matches[@]}" | |
} | |
python_gen_impl_dep () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local impl matches=(); | |
local PYTHON_REQ_USE=${1}; | |
shift; | |
local patterns=("${@-*}"); | |
for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; | |
do | |
if _python_impl_matches "${impl}" "${patterns[@]}"; then | |
local PYTHON_PKG_DEP; | |
python_export "${impl}" PYTHON_PKG_DEP; | |
matches+=("python_targets_${impl}? ( ${PYTHON_PKG_DEP} )"); | |
fi; | |
done; | |
echo "${matches[@]}" | |
} | |
python_gen_usedep () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local impl matches=(); | |
for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; | |
do | |
if _python_impl_matches "${impl}" "${@}"; then | |
matches+=("python_targets_${impl}(-)?" "-python_single_target_${impl}(-)"); | |
fi; | |
done; | |
[[ -n ${matches[@]} ]] || die "No supported implementations match python_gen_usedep patterns: ${@}"; | |
local out=${matches[@]}; | |
echo "${out// /,}" | |
} | |
python_gen_useflags () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local impl matches=(); | |
for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; | |
do | |
if _python_impl_matches "${impl}" "${@}"; then | |
matches+=("python_targets_${impl}"); | |
fi; | |
done; | |
echo "${matches[@]}" | |
} | |
python_generate_cffi_modules () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_generate_wrapper_scripts () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_get_CFLAGS () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
python_export "${@}" PYTHON_CFLAGS; | |
echo "${PYTHON_CFLAGS}" | |
} | |
python_get_LIBS () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
python_export "${@}" PYTHON_LIBS; | |
echo "${PYTHON_LIBS}" | |
} | |
python_get_PYTHON_CONFIG () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
python_export "${@}" PYTHON_CONFIG; | |
echo "${PYTHON_CONFIG}" | |
} | |
python_get_extension_module_suffix () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_get_implementation () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_get_implementation_and_version () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_get_implementational_package () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_get_includedir () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
python_export "${@}" PYTHON_INCLUDEDIR; | |
echo "${PYTHON_INCLUDEDIR}" | |
} | |
python_get_libdir () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_get_library () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_get_library_path () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
python_export "${@}" PYTHON_LIBPATH; | |
echo "${PYTHON_LIBPATH}" | |
} | |
python_get_scriptdir () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
python_export "${@}" PYTHON_SCRIPTDIR; | |
echo "${PYTHON_SCRIPTDIR}" | |
} | |
python_get_sitedir () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
python_export "${@}" PYTHON_SITEDIR; | |
echo "${PYTHON_SITEDIR}" | |
} | |
python_get_version () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_install_executables () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_is_installed () | |
{ | |
local impl=${1:-${EPYTHON}}; | |
[[ -n ${impl} ]] || die "${FUNCNAME}: no impl nor EPYTHON"; | |
local -x ROOT=/; | |
case "${impl}" in | |
pypy | pypy3) | |
local append=; | |
if [[ -n ${PYTHON_REQ_USE} ]]; then | |
append=[${PYTHON_REQ_USE}]; | |
fi; | |
has_version "dev-python/${impl}${append}" || has_version "dev-python/${impl}-bin${append}" | |
;; | |
*) | |
local PYTHON_PKG_DEP; | |
python_export "${impl}" PYTHON_PKG_DEP; | |
has_version "${PYTHON_PKG_DEP}" | |
;; | |
esac | |
} | |
python_is_python3 () | |
{ | |
local impl=${1:-${EPYTHON}}; | |
[[ -n ${impl} ]] || die "python_is_python3: no impl nor EPYTHON"; | |
[[ ${impl} == python3* || ${impl} == pypy3 ]] | |
} | |
python_merge_intermediate_installation_images () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_mod_cleanup () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#Python_byte-code_compilation" | |
} | |
python_mod_optimize () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#Python_byte-code_compilation" | |
} | |
python_moduleinto () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
python_moduleroot=${1} | |
} | |
python_need_rebuild () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite" | |
} | |
python_newexe () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ -n ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).'; | |
[[ ${#} -eq 2 ]] || die "Usage: ${FUNCNAME} <path> <new-name>"; | |
if [[ ${EAPI:-0} == [0123] ]]; then | |
die "python_do* and python_new* helpers are banned in EAPIs older than 4."; | |
fi; | |
local wrapd=${python_scriptroot:-/usr/bin}; | |
local f=${1}; | |
local newfn=${2}; | |
local PYTHON_SCRIPTDIR d; | |
python_export PYTHON_SCRIPTDIR; | |
d=${PYTHON_SCRIPTDIR#${EPREFIX}}; | |
( dodir "${wrapd}"; | |
exeinto "${d}"; | |
newexe "${f}" "${newfn}" || return ${?} ); | |
_python_ln_rel "${ED%/}"/usr/lib/python-exec/python-exec2 "${ED%/}/${wrapd}/${newfn}" || die; | |
if [[ -n ${_PYTHON_REWRITE_SHEBANG} ]]; then | |
python_fix_shebang -q "${ED%/}/${d}/${newfn}"; | |
fi | |
} | |
python_newscript () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local _PYTHON_REWRITE_SHEBANG=1; | |
python_newexe "${@}" | |
} | |
python_optimize () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
if [[ ${EBUILD_PHASE} == pre* || ${EBUILD_PHASE} == post* ]]; then | |
eerror "The new Python eclasses expect the compiled Python files to"; | |
eerror "be controlled by the Package Manager. For this reason,"; | |
eerror "the python_optimize function can be used only during src_* phases"; | |
eerror "(src_install most commonly) and not during pkg_* phases."; | |
echo; | |
die "python_optimize is not to be used in pre/post* phases"; | |
fi; | |
[[ -n ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).'; | |
local PYTHON=${PYTHON}; | |
[[ -n ${PYTHON} ]] || python_export PYTHON; | |
if [[ ${#} -eq 0 ]]; then | |
local f; | |
while IFS= read -r -d '' f; do | |
if [[ ${f} == /* && -d ${D}${f} ]]; then | |
set -- "${D}${f}" "${@}"; | |
fi; | |
done < <("${PYTHON}" -c 'import sys; print("\0".join(sys.path))' || die); | |
debug-print "${FUNCNAME}: using sys.path: ${*/%/;}"; | |
fi; | |
local d; | |
for d in "$@"; | |
do | |
local instpath=${d#${D}}; | |
instpath=/${instpath##/}; | |
case "${EPYTHON}" in | |
python2.7 | python3.[34]) | |
"${PYTHON}" -m compileall -q -f -d "${instpath}" "${d}"; | |
"${PYTHON}" -OO -m compileall -q -f -d "${instpath}" "${d}" | |
;; | |
python* | pypy3) | |
"${PYTHON}" -m compileall -q -f -d "${instpath}" "${d}"; | |
"${PYTHON}" -O -m compileall -q -f -d "${instpath}" "${d}"; | |
"${PYTHON}" -OO -m compileall -q -f -d "${instpath}" "${d}" | |
;; | |
*) | |
"${PYTHON}" -m compileall -q -f -d "${instpath}" "${d}" | |
;; | |
esac; | |
done | |
} | |
python_pkg_setup () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#pkg_setup" | |
} | |
python_prepare_all () | |
{ | |
use cython && rm -f "${S}"/src/cython/_compreffor.cpp; | |
distutils-r1_python_prepare_all | |
} | |
python_replicate_script () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
function _python_replicate_script () | |
{ | |
local _PYTHON_FIX_SHEBANG_QUIET=1; | |
local PYTHON_SCRIPTDIR; | |
python_export PYTHON_SCRIPTDIR; | |
( exeinto "${PYTHON_SCRIPTDIR#${EPREFIX}}"; | |
doexe "${files[@]}" ); | |
python_fix_shebang -q "${files[@]/*\//${D%/}/${PYTHON_SCRIPTDIR}/}" | |
}; | |
local files=("${@}"); | |
python_foreach_impl _python_replicate_script; | |
unset -f _python_replicate_script; | |
local f; | |
for f in "$@"; | |
do | |
_python_ln_rel "${ED%/}/usr/lib/python-exec/python-exec2" "${f}" || die; | |
done | |
} | |
python_scriptinto () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
python_scriptroot=${1} | |
} | |
python_set_active_version () | |
{ | |
die "${FUNCNAME}() is invalid for python-r1 suite, please take a look @ https://wiki.gentoo.org/wiki/Project:Python/Python.eclass_conversion#pkg_setup" | |
} | |
python_setup () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
_python_validate_useflags; | |
local pycompat=("${PYTHON_COMPAT[@]}"); | |
if [[ -n ${PYTHON_COMPAT_OVERRIDE} ]]; then | |
pycompat=(${PYTHON_COMPAT_OVERRIDE}); | |
fi; | |
local has_check_deps; | |
declare -f python_check_deps > /dev/null && has_check_deps=1; | |
local found; | |
for ((i = ${#_PYTHON_SUPPORTED_IMPLS[@]} - 1; i >= 0; i-- )) | |
do | |
local impl=${_PYTHON_SUPPORTED_IMPLS[i]}; | |
has "${impl}" "${pycompat[@]}" || continue; | |
if [[ ! -n ${PYTHON_COMPAT_OVERRIDE} && ! -n ${has_check_deps} ]]; then | |
use "python_targets_${impl}" || continue; | |
fi; | |
_python_impl_matches "${impl}" "${@-*}" || continue; | |
python_export "${impl}" EPYTHON PYTHON; | |
if [[ -n ${has_check_deps} ]]; then | |
python_is_installed "${impl}" || continue; | |
local PYTHON_USEDEP="python_targets_${impl}(-),python_single_target_${impl}(+)"; | |
python_check_deps || continue; | |
fi; | |
found=1; | |
break; | |
done; | |
if [[ ! -n ${found} ]]; then | |
eerror "${FUNCNAME}: none of the enabled implementation matched the patterns."; | |
eerror " patterns: ${@-'(*)'}"; | |
eerror "Likely a REQUIRED_USE constraint (possibly USE-conditional) is missing."; | |
eerror " suggested: || ( \$(python_gen_useflags ${@}) )"; | |
eerror "(remember to quote all the patterns with '')"; | |
die "${FUNCNAME}: no enabled implementation satisfy requirements"; | |
fi; | |
python_wrapper_setup | |
} | |
python_test () | |
{ | |
esetup.py test | |
} | |
python_wrapper_setup () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local workdir=${1:-${T}/${EPYTHON}}; | |
local impl=${2:-${EPYTHON}}; | |
[[ -n ${workdir} ]] || die "${FUNCNAME}: no workdir specified."; | |
[[ -n ${impl} ]] || die "${FUNCNAME}: no impl nor EPYTHON specified."; | |
if [[ ! -x ${workdir}/bin/python ]]; then | |
_python_check_dead_variables; | |
mkdir -p "${workdir}"/{bin,pkgconfig} || die; | |
rm -f "${workdir}"/bin/python{,2,3}{,-config} || die; | |
rm -f "${workdir}"/bin/2to3 || die; | |
rm -f "${workdir}"/pkgconfig/python{,2,3}.pc || die; | |
local EPYTHON PYTHON; | |
python_export "${impl}" EPYTHON PYTHON; | |
local pyver pyother; | |
if python_is_python3; then | |
pyver=3; | |
pyother=2; | |
else | |
pyver=2; | |
pyother=3; | |
fi; | |
cat > "${workdir}/bin/python" <<-_EOF_ || | |
#!/bin/sh | |
exec "${PYTHON}" "\${@}" | |
_EOF_ | |
die | |
cp "${workdir}/bin/python" "${workdir}/bin/python${pyver}" || die; | |
chmod +x "${workdir}/bin/python" "${workdir}/bin/python${pyver}" || die; | |
local nonsupp=("python${pyother}" "python${pyother}-config"); | |
if [[ ${EPYTHON} == python* ]]; then | |
cat > "${workdir}/bin/python-config" <<-_EOF_ || | |
#!/bin/sh | |
exec "${PYTHON}-config" "\${@}" | |
_EOF_ | |
die | |
cp "${workdir}/bin/python-config" "${workdir}/bin/python${pyver}-config" || die; | |
chmod +x "${workdir}/bin/python-config" "${workdir}/bin/python${pyver}-config" || die; | |
ln -s "${PYTHON/python/2to3-}" "${workdir}"/bin/2to3 || die; | |
ln -s "${EPREFIX}"/usr/$(get_libdir)/pkgconfig/${EPYTHON/n/n-}.pc "${workdir}"/pkgconfig/python.pc || die; | |
ln -s python.pc "${workdir}"/pkgconfig/python${pyver}.pc || die; | |
else | |
nonsupp+=(2to3 python-config "python${pyver}-config"); | |
fi; | |
local x; | |
for x in "${nonsupp[@]}"; | |
do | |
cat > "${workdir}"/bin/${x} <<-_EOF_ || | |
#!/bin/sh | |
echo "${ECLASS}: ${FUNCNAME}: ${x} is not supported by ${EPYTHON} (PYTHON_COMPAT)" >&2 | |
exit 127 | |
_EOF_ | |
die | |
chmod +x "${workdir}"/bin/${x} || die; | |
done; | |
fi; | |
if [[ ${PATH##:*} != ${workdir}/bin ]]; then | |
PATH=${workdir}/bin${PATH:+:${PATH}}; | |
fi; | |
if [[ ${PKG_CONFIG_PATH##:*} != ${workdir}/pkgconfig ]]; then | |
PKG_CONFIG_PATH=${workdir}/pkgconfig${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}; | |
fi; | |
export PATH PKG_CONFIG_PATH | |
} | |
redirect_alloc_fd () | |
{ | |
local var=$1 file=$2 redir=${3:-"<>"}; | |
if [[ ! -L /dev/fd && ${CBUILD} == *linux* ]]; then | |
eerror "You're missing a /dev/fd symlink to /proc/self/fd."; | |
eerror "Please fix the symlink and check your boot scripts (udev/etc...)."; | |
die "/dev/fd is broken"; | |
fi; | |
if [[ $(( (BASH_VERSINFO[0] << 8) + BASH_VERSINFO[1] )) -ge $(( (4 << 8) + 1 )) ]]; then | |
eval "exec {${var}}${redir}'${file}'"; | |
else | |
local fd=10; | |
while :; do | |
if [[ ! -e /dev/fd/${fd} ]] && [[ ! -L /dev/fd/${fd} ]]; then | |
eval "exec ${fd}${redir}'${file}'" && break; | |
fi; | |
[[ ${fd} -gt 1024 ]] && die 'could not locate a free temp fd !?'; | |
: $(( ++fd )); | |
done; | |
: $(( ${var} = fd )); | |
fi | |
} | |
run_in_build_dir () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local ret; | |
[[ ${#} -ne 0 ]] || die "${FUNCNAME}: no command specified."; | |
[[ -n ${BUILD_DIR} ]] || die "${FUNCNAME}: BUILD_DIR not set."; | |
mkdir -p "${BUILD_DIR}" || die; | |
pushd "${BUILD_DIR}" > /dev/null || die; | |
"${@}"; | |
ret=${?}; | |
popd > /dev/null || die; | |
return ${ret} | |
} | |
src_compile () | |
{ | |
distutils-r1_src_compile "$@" | |
} | |
src_configure () | |
{ | |
distutils-r1_src_configure "$@" | |
} | |
src_install () | |
{ | |
distutils-r1_src_install "$@" | |
} | |
src_prepare () | |
{ | |
distutils-r1_src_prepare "$@" | |
} | |
src_test () | |
{ | |
distutils-r1_src_test "$@" | |
} | |
src_unpack () | |
{ | |
vcs-snapshot_src_unpack "$@" | |
} | |
tc-arch () | |
{ | |
tc-ninja_magic_to_arch portage "$@" | |
} | |
tc-arch-kernel () | |
{ | |
tc-ninja_magic_to_arch kern "$@" | |
} | |
tc-check-openmp () | |
{ | |
if ! tc-has-openmp; then | |
eerror "Your current compiler does not support OpenMP!"; | |
if tc-is-gcc; then | |
eerror "Enable OpenMP support by building sys-devel/gcc with USE=\"openmp\"."; | |
else | |
if tc-is-clang; then | |
eerror "OpenMP support in sys-devel/clang is provided by sys-libs/libomp."; | |
fi; | |
fi; | |
die "Active compiler does not have required support for OpenMP"; | |
fi | |
} | |
tc-enables-pie () | |
{ | |
local ret="$($(tc-getCC) ${CPPFLAGS} ${CFLAGS} -E -P - <<-EOF 2> /dev/null | |
#if defined(__PIE__) | |
true | |
#endif | |
EOF | |
)"; | |
[[ ${ret} == true ]] | |
} | |
tc-enables-ssp () | |
{ | |
local ret="$($(tc-getCC) ${CPPFLAGS} ${CFLAGS} -E -P - <<-EOF 2> /dev/null | |
#if defined(__SSP__) || defined(__SSP_STRONG__) || defined(__SSP_ALL__) | |
true | |
#endif | |
EOF | |
)"; | |
[[ ${ret} == true ]] | |
} | |
tc-enables-ssp-all () | |
{ | |
local ret="$($(tc-getCC) ${CPPFLAGS} ${CFLAGS} -E -P - <<-EOF 2> /dev/null | |
#if defined(__SSP_ALL__) | |
true | |
#endif | |
EOF | |
)"; | |
[[ ${ret} == true ]] | |
} | |
tc-enables-ssp-strong () | |
{ | |
local ret="$($(tc-getCC) ${CPPFLAGS} ${CFLAGS} -E -P - <<-EOF 2> /dev/null | |
#if defined(__SSP_STRONG__) || defined(__SSP_ALL__) | |
true | |
#endif | |
EOF | |
)"; | |
[[ ${ret} == true ]] | |
} | |
tc-endian () | |
{ | |
local host=$1; | |
[[ -z ${host} ]] && host=${CTARGET:-${CHOST}}; | |
host=${host%%-*}; | |
case ${host} in | |
aarch64*be) | |
echo big | |
;; | |
aarch64) | |
echo little | |
;; | |
alpha*) | |
echo little | |
;; | |
arm*b*) | |
echo big | |
;; | |
arm*) | |
echo little | |
;; | |
cris*) | |
echo little | |
;; | |
hppa*) | |
echo big | |
;; | |
i?86*) | |
echo little | |
;; | |
ia64*) | |
echo little | |
;; | |
m68*) | |
echo big | |
;; | |
mips*l*) | |
echo little | |
;; | |
mips*) | |
echo big | |
;; | |
powerpc*le) | |
echo little | |
;; | |
powerpc*) | |
echo big | |
;; | |
s390*) | |
echo big | |
;; | |
sh*b*) | |
echo big | |
;; | |
sh*) | |
echo little | |
;; | |
sparc*) | |
echo big | |
;; | |
x86_64*) | |
echo little | |
;; | |
*) | |
echo wtf | |
;; | |
esac | |
} | |
tc-env_build () | |
{ | |
tc-export_build_env; | |
CFLAGS=${BUILD_CFLAGS} CXXFLAGS=${BUILD_CXXFLAGS} CPPFLAGS=${BUILD_CPPFLAGS} LDFLAGS=${BUILD_LDFLAGS} AR=$(tc-getBUILD_AR) AS=$(tc-getBUILD_AS) CC=$(tc-getBUILD_CC) CPP=$(tc-getBUILD_CPP) CXX=$(tc-getBUILD_CXX) LD=$(tc-getBUILD_LD) NM=$(tc-getBUILD_NM) PKG_CONFIG=$(tc-getBUILD_PKG_CONFIG) RANLIB=$(tc-getBUILD_RANLIB) "$@" | |
} | |
tc-export () | |
{ | |
local var; | |
for var in "$@"; | |
do | |
[[ $(type -t "tc-get${var}") != "function" ]] && die "tc-export: invalid export variable '${var}'"; | |
"tc-get${var}" > /dev/null; | |
done | |
} | |
tc-export_build_env () | |
{ | |
tc-export "$@"; | |
: ${BUILD_CFLAGS:=-O1 -pipe}; | |
: ${BUILD_CXXFLAGS:=-O1 -pipe}; | |
: ${BUILD_CPPFLAGS:= }; | |
: ${BUILD_LDFLAGS:= }; | |
export BUILD_{C,CXX,CPP,LD}FLAGS; | |
local v; | |
for v in BUILD_{C,CXX,CPP,LD}FLAGS; | |
do | |
export ${v#BUILD_}_FOR_BUILD="${!v}"; | |
done | |
} | |
tc-get-compiler-type () | |
{ | |
local code=' | |
#if defined(__PATHSCALE__) | |
HAVE_PATHCC | |
#elif defined(__clang__) | |
HAVE_CLANG | |
#elif defined(__GNUC__) | |
HAVE_GCC | |
#endif | |
'; | |
local res=$($(tc-getCPP "$@") -E -P - <<<"${code}"); | |
case ${res} in | |
*HAVE_PATHCC*) | |
echo pathcc | |
;; | |
*HAVE_CLANG*) | |
echo clang | |
;; | |
*HAVE_GCC*) | |
echo gcc | |
;; | |
*) | |
echo unknown | |
;; | |
esac | |
} | |
tc-getAR () | |
{ | |
tc-getPROG AR ar "$@" | |
} | |
tc-getAS () | |
{ | |
tc-getPROG AS as "$@" | |
} | |
tc-getBUILD_AR () | |
{ | |
tc-getBUILD_PROG AR ar "$@" | |
} | |
tc-getBUILD_AS () | |
{ | |
tc-getBUILD_PROG AS as "$@" | |
} | |
tc-getBUILD_CC () | |
{ | |
tc-getBUILD_PROG CC gcc "$@" | |
} | |
tc-getBUILD_CPP () | |
{ | |
tc-getBUILD_PROG CPP "$(tc-getBUILD_CC) -E" "$@" | |
} | |
tc-getBUILD_CXX () | |
{ | |
tc-getBUILD_PROG CXX g++ "$@" | |
} | |
tc-getBUILD_LD () | |
{ | |
tc-getBUILD_PROG LD ld "$@" | |
} | |
tc-getBUILD_NM () | |
{ | |
tc-getBUILD_PROG NM nm "$@" | |
} | |
tc-getBUILD_OBJCOPY () | |
{ | |
tc-getBUILD_PROG OBJCOPY objcopy "$@" | |
} | |
tc-getBUILD_PKG_CONFIG () | |
{ | |
tc-getBUILD_PROG PKG_CONFIG pkg-config "$@" | |
} | |
tc-getBUILD_PROG () | |
{ | |
_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 "${CC:-gcc} -E" "$@" | |
} | |
tc-getCXX () | |
{ | |
tc-getPROG CXX g++ "$@" | |
} | |
tc-getDLLWRAP () | |
{ | |
tc-getPROG DLLWRAP dllwrap "$@" | |
} | |
tc-getF77 () | |
{ | |
tc-getPROG F77 gfortran "$@" | |
} | |
tc-getFC () | |
{ | |
tc-getPROG FC gfortran "$@" | |
} | |
tc-getGCJ () | |
{ | |
tc-getPROG GCJ gcj "$@" | |
} | |
tc-getGO () | |
{ | |
tc-getPROG GO gccgo "$@" | |
} | |
tc-getLD () | |
{ | |
tc-getPROG LD ld "$@" | |
} | |
tc-getNM () | |
{ | |
tc-getPROG NM nm "$@" | |
} | |
tc-getOBJCOPY () | |
{ | |
tc-getPROG OBJCOPY objcopy "$@" | |
} | |
tc-getOBJDUMP () | |
{ | |
tc-getPROG OBJDUMP objdump "$@" | |
} | |
tc-getPKG_CONFIG () | |
{ | |
tc-getPROG PKG_CONFIG pkg-config "$@" | |
} | |
tc-getPROG () | |
{ | |
_tc-getPROG CHOST "$@" | |
} | |
tc-getRANLIB () | |
{ | |
tc-getPROG RANLIB ranlib "$@" | |
} | |
tc-getRC () | |
{ | |
tc-getPROG RC windres "$@" | |
} | |
tc-getSTRIP () | |
{ | |
tc-getPROG STRIP strip "$@" | |
} | |
tc-has-openmp () | |
{ | |
local base="${T}/test-tc-openmp"; | |
cat > "${base}.c" <<-EOF | |
#include <omp.h> | |
int main() { | |
int nthreads, tid, ret = 0; | |
#pragma omp parallel private(nthreads, tid) | |
{ | |
tid = omp_get_thread_num(); | |
nthreads = omp_get_num_threads(); ret += tid + nthreads; | |
} | |
return ret; | |
} | |
EOF | |
$(tc-getCC "$@") -fopenmp "${base}.c" -o "${base}" &> /dev/null; | |
local ret=$?; | |
rm -f "${base}"*; | |
return ${ret} | |
} | |
tc-has-tls () | |
{ | |
local base="${T}/test-tc-tls"; | |
cat > "${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-clang () | |
{ | |
[[ $(tc-get-compiler-type) == clang ]] | |
} | |
tc-is-cross-compiler () | |
{ | |
[[ ${CBUILD:-${CHOST}} != ${CHOST} ]] | |
} | |
tc-is-gcc () | |
{ | |
[[ $(tc-get-compiler-type) == gcc ]] | |
} | |
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}}; | |
[[ ${host} == *-mint* ]] | |
} | |
tc-ld-disable-gold () | |
{ | |
if ! tc-ld-is-gold "$@"; then | |
return; | |
fi; | |
ewarn "Forcing usage of the BFD linker instead of GOLD"; | |
local ld=$(tc-getLD "$@"); | |
local bfd_ld="${ld%% *}.bfd"; | |
local path_ld=$(which "${bfd_ld}" 2>/dev/null); | |
[[ -e ${path_ld} ]] && export LD=${bfd_ld}; | |
local major=$(gcc-major-version "$@"); | |
local minor=$(gcc-minor-version "$@"); | |
if [[ ${major} -lt 4 ]] || [[ ${major} -eq 4 && ${minor} -lt 8 ]]; then | |
if [[ -e ${path_ld} ]]; then | |
local d="${T}/bfd-linker"; | |
mkdir -p "${d}"; | |
ln -sf "${path_ld}" "${d}"/ld; | |
export LDFLAGS="${LDFLAGS} -B${d}"; | |
else | |
die "unable to locate a BFD linker to bypass gold"; | |
fi; | |
else | |
export LDFLAGS="${LDFLAGS} -fuse-ld=bfd"; | |
fi | |
} | |
tc-ld-is-gold () | |
{ | |
local out; | |
out=$($(tc-getLD "$@") --version 2>&1); | |
if [[ ${out} == *"GNU gold"* ]]; then | |
return 0; | |
fi; | |
local base="${T}/test-tc-gold"; | |
cat > "${base}.c" <<-EOF | |
int main() { return 0; } | |
EOF | |
out=$($(tc-getCC "$@") ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} -Wl,--version "${base}.c" -o "${base}" 2>&1); | |
rm -f "${base}"*; | |
if [[ ${out} == *"GNU gold"* ]]; then | |
return 0; | |
fi; | |
return 1 | |
} | |
tc-ninja_magic_to_arch () | |
{ | |
function ninj () | |
{ | |
[[ ${type} == "kern" ]] && echo $1 || echo $2 | |
}; | |
local type=$1; | |
local host=$2; | |
[[ -z ${host} ]] && host=${CTARGET:-${CHOST}}; | |
case ${host} in | |
aarch64*) | |
echo arm64 | |
;; | |
alpha*) | |
echo alpha | |
;; | |
arm*) | |
echo arm | |
;; | |
avr*) | |
ninj avr32 avr | |
;; | |
bfin*) | |
ninj blackfin bfin | |
;; | |
c6x*) | |
echo c6x | |
;; | |
cris*) | |
echo cris | |
;; | |
frv*) | |
echo frv | |
;; | |
hexagon*) | |
echo hexagon | |
;; | |
hppa*) | |
ninj parisc hppa | |
;; | |
i?86*) | |
if [[ ${type} == "kern" && ${host} == *freebsd* ]]; then | |
echo i386; | |
else | |
echo x86; | |
fi | |
;; | |
ia64*) | |
echo ia64 | |
;; | |
m68*) | |
echo m68k | |
;; | |
metag*) | |
echo metag | |
;; | |
microblaze*) | |
echo microblaze | |
;; | |
mips*) | |
echo mips | |
;; | |
nios2*) | |
echo nios2 | |
;; | |
nios*) | |
echo nios | |
;; | |
or1k | or32*) | |
echo openrisc | |
;; | |
powerpc*) | |
if [[ ${type} == "kern" ]]; then | |
echo powerpc; | |
else | |
if [[ ${host} == powerpc64* ]]; then | |
echo ppc64; | |
else | |
echo ppc; | |
fi; | |
fi | |
;; | |
riscv*) | |
echo riscv | |
;; | |
s390*) | |
echo s390 | |
;; | |
score*) | |
echo score | |
;; | |
sh64*) | |
ninj sh64 sh | |
;; | |
sh*) | |
echo sh | |
;; | |
sparc64*) | |
ninj sparc64 sparc | |
;; | |
sparc*) | |
[[ ${PROFILE_ARCH} == "sparc64" ]] && ninj sparc64 sparc || echo sparc | |
;; | |
tile*) | |
echo tile | |
;; | |
vax*) | |
echo vax | |
;; | |
x86_64*freebsd*) | |
echo amd64 | |
;; | |
x86_64*) | |
if [[ ${type} == "kern" ]]; then | |
echo x86; | |
else | |
echo amd64; | |
fi | |
;; | |
xtensa*) | |
echo xtensa | |
;; | |
*) | |
echo unknown | |
;; | |
esac | |
} | |
tc-stack-grows-down () | |
{ | |
case ${ARCH} in | |
hppa | metag) | |
return 1 | |
;; | |
esac; | |
return 0 | |
} | |
vcs-snapshot_src_unpack () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local f; | |
for f in ${A}; | |
do | |
case "${f}" in | |
*.tar | *.tar.gz | *.tar.bz2 | *.tar.xz) | |
local destdir=${WORKDIR}/${f%.tar*}; | |
debug-print "${FUNCNAME}: unpacking ${f} to ${destdir}"; | |
mkdir "${destdir}" || die; | |
tar -C "${destdir}" -x --strip-components 1 -f "${DISTDIR}/${f}" || die | |
;; | |
*) | |
debug-print "${FUNCNAME}: falling back to unpack for ${f}"; | |
unpack "${f}" | |
;; | |
esac; | |
done | |
} | |
xdg_desktop_database_update () | |
{ | |
local updater="${EROOT}${DESKTOP_DATABASE_UPDATE_BIN}"; | |
if [[ ${EBUILD_PHASE} != post* ]]; then | |
die "xdg_desktop_database_update must be used in pkg_post* phases."; | |
fi; | |
if [[ ! -x "${updater}" ]]; then | |
debug-print "${updater} is not executable"; | |
return; | |
fi; | |
ebegin "Updating .desktop files database"; | |
"${updater}" -q "${EROOT}${DESKTOP_DATABASE_DIR}"; | |
eend $? | |
} | |
xdg_environment_reset () | |
{ | |
export XDG_DATA_HOME="${HOME}/.local/share"; | |
export XDG_CONFIG_HOME="${HOME}/.config"; | |
export XDG_CACHE_HOME="${HOME}/.cache"; | |
export XDG_RUNTIME_DIR="${T}/run"; | |
mkdir -p "${XDG_DATA_HOME}" "${XDG_CONFIG_HOME}" "${XDG_CACHE_HOME}" "${XDG_RUNTIME_DIR}" || die; | |
chmod 0700 "${XDG_RUNTIME_DIR}" || die; | |
unset DBUS_SESSION_BUS_ADDRESS | |
} | |
xdg_mimeinfo_database_update () | |
{ | |
local updater="${EROOT}${MIMEINFO_DATABASE_UPDATE_BIN}"; | |
if [[ ${EBUILD_PHASE} != post* ]]; then | |
die "xdg_mimeinfo_database_update must be used in pkg_post* phases."; | |
fi; | |
if [[ ! -x "${updater}" ]]; then | |
debug-print "${updater} is not executable"; | |
return; | |
fi; | |
ebegin "Updating shared mime info database"; | |
"${updater}" "${EROOT}${MIMEINFO_DATABASE_DIR}"; | |
eend $? | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment