Created
May 23, 2021 11:58
-
-
Save baybal/d94e0c16bf799b82bb4cddb7f7eb81d2 to your computer and use it in GitHub Desktop.
This file contains hidden or 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_MIPS="" | |
declare -x ABI_PPC="" | |
declare -x ABI_S390="" | |
declare -x ABI_X86="64" | |
declare -x ADA_TARGET="" | |
declare -- ALL_LOCALES=" | |
aa | |
af | |
af_ZA | |
am | |
am_ET | |
ang | |
ar | |
ar_AE | |
ar_BH | |
ar_DZ | |
ar_EG | |
ar_IN | |
ar_IQ | |
ar_JO | |
ar_KW | |
ar_LB | |
ar_LY | |
ar_MA | |
ar_OM | |
ar_QA | |
ar_SA | |
ar_SD | |
ar_SY | |
ar_TN | |
ar_YE | |
as | |
ast | |
az | |
az_AZ | |
az_IR | |
be | |
be@latin | |
be_BY | |
bg | |
bg_BG | |
bn | |
bn_IN | |
br | |
br_FR | |
bs | |
bs_BA | |
byn | |
ca | |
ca@valencia | |
ca_ES | |
ca_ES@euro | |
ca_ES@valencia | |
chs | |
cht | |
crh | |
cs | |
cs_CZ | |
cy | |
cy_GB | |
cz | |
da | |
da_DK | |
de | |
de_AT | |
de_AT@euro | |
de_BE | |
de_BE@euro | |
de_CH | |
de_DE | |
de_DE.UTF-8 | |
de_DE@euro | |
de_LU | |
de_LU@euro | |
dk | |
dv | |
dz | |
el | |
el_GR | |
el_GR.UTF-8 | |
el_GR@euro | |
en | |
en@IPA | |
en@boldquot | |
en@quot | |
en@shaw | |
en_AU | |
en_BW | |
en_CA | |
en_DK | |
en_GB | |
en_GB.UTF-8 | |
en_HK | |
en_IE | |
en_IE@euro | |
en_IN | |
en_NZ | |
en_PH | |
en_RN | |
en_SG | |
en_UK | |
en_US | |
en_US.UTF-8 | |
en_ZA | |
en_ZW | |
eo | |
eo_EO | |
es | |
es_AR | |
es_BO | |
es_CL | |
es_CO | |
es_CR | |
es_DO | |
es_EC | |
es_ES | |
es_ES.UTF-8 | |
es_ES@euro | |
es_GT | |
es_HN | |
es_MX | |
es_NI | |
es_PA | |
es_PE | |
es_PR | |
es_PY | |
es_SV | |
es_US | |
es_UY | |
es_VE | |
et | |
et_EE | |
eu | |
eu_ES | |
eu_ES@euro | |
fa | |
fa_IR | |
fa_IR.UTF-8 | |
fi | |
fi_FI | |
fi_FI@euro | |
fo | |
fo_FO | |
fr | |
fr_BE | |
fr_BE@euro | |
fr_CA | |
fr_CH | |
fr_FR | |
fr_FR.UTF-8 | |
fr_FR@euro | |
fr_LU | |
fr_LU@euro | |
fur | |
fy | |
ga | |
ga_IE | |
ga_IE@euro | |
gd | |
gd_GB | |
gez | |
gl | |
gl_ES | |
gl_ES@euro | |
gr | |
gu | |
gv | |
gv_GB | |
haw | |
he | |
he_IL | |
hi | |
hi_IN | |
hi_IN.UTF-8 | |
hr | |
hr_HR | |
hu | |
hu_HU | |
hy | |
hy_AM | |
ia | |
id | |
id_ID | |
is | |
is_IS | |
it | |
it_CH | |
it_IT | |
it_IT@euro | |
iu | |
iw | |
iw_IL | |
ja | |
ja_JP | |
ja_JP.EUC | |
ja_JP.EUC-JP | |
ja_JP.UTF-8 | |
ja_JP.eucJP | |
ka | |
ka_GE | |
kk | |
kl | |
kl_GL | |
km | |
km_KH | |
kn | |
ko | |
ko_KR | |
ko_KR.EUC-KR | |
ko_KR.UTF-8 | |
kok | |
ku | |
kw | |
kw_GB | |
ky | |
la | |
lg | |
li | |
lo | |
lt | |
lt_LT | |
lv | |
lv_LV | |
mai | |
mg | |
mhr | |
mi | |
mi_NZ | |
mk | |
mk_MK | |
ml | |
mn | |
mr | |
mr_IN | |
mr_IN.UTF-8 | |
ms | |
ms_MY | |
mt | |
mt_MT | |
my | |
my_MM | |
nb | |
nb_NO | |
nds | |
ne | |
nl | |
nl_BE | |
nl_BE@euro | |
nl_NL | |
nl_NL@euro | |
nn | |
nn_NO | |
no | |
no_NO | |
nso | |
nyc | |
oc | |
oc_FR | |
om | |
or | |
pa | |
pl | |
pl_PL | |
ps | |
pt | |
pt_BR | |
pt_PT | |
pt_PT@euro | |
rm | |
ro | |
ro_RO | |
ru | |
ru_RU | |
ru_RU.KOI8-R | |
ru_RU.UTF-8 | |
ru_UA | |
rw | |
sa | |
si | |
sid | |
sk | |
sk_SK | |
sl | |
sl_SI | |
so | |
sp | |
sq | |
sq_AL | |
sr | |
sr@Latn | |
sr@ije | |
sr@latin | |
sr_RS | |
sr_YU | |
sr_YU@cyrillic | |
sv | |
sv_FI | |
sv_FI@euro | |
sv_SE | |
sw | |
syr | |
ta | |
ta_IN | |
te | |
te_IN | |
tg | |
tg_TJ | |
th | |
th_TH | |
ti | |
ti_ER | |
ti_ET | |
tig | |
tk | |
tl | |
tl_PH | |
tr | |
tr_TR | |
tt | |
tt_RU | |
ug | |
uk | |
uk_UA | |
ur | |
ur_PK | |
uz | |
uz@Latn | |
uz_UZ | |
ve | |
vi | |
vi_VN | |
vi_VN.UTF-8 | |
wa | |
wal | |
wo | |
xh | |
yi | |
yi_US | |
zh | |
zh_CN | |
zh_CN.GB18030 | |
zh_CN.GB2312 | |
zh_CN.GBK | |
zh_CN.UTF-8 | |
zh_HK | |
zh_HK.UTF-8 | |
zh_SG | |
zh_TW | |
zh_TW.Big5 | |
zh_TW.EUC-TW | |
zh_TW.UTF-8 | |
zu | |
" | |
declare -x ALSA_CARDS="" | |
declare -x ANT_HOME="/usr/share/ant" | |
declare -x APACHE2_MODULES="" | |
declare -x APACHE2_MPMS="" | |
declare -x ARCH="amd64" | |
declare -- BASHRCD_CCACHE_BASEDIR="/var/tmp/portage" | |
declare -- BASHRCD_CCACHE_COMPRESS="true" | |
declare -- BASHRCD_CCACHE_DEPEND="true" | |
declare -- BASHRCD_CCACHE_DIR="/var/cache/ccache" | |
declare -- BASHRCD_CCACHE_NOHASHDIR="true" | |
declare -- BASHRCD_CCACHE_PREFIX="icecc" | |
declare -- BASHRCD_CCACHE_PREFIX_CPP="icecc" | |
declare BDEPEND="dev-util/ninja dev-util/cmake test? ( | |
x11-base/xorg-server[xvfb] | |
x11-apps/xhost | |
)" | |
declare -x BOOTSTRAP_USE="unicode internal-glib pkg-config split-usr python_targets_python3_8 multilib" | |
declare -- BUILD_DIR="/var/tmp/portage/dev-python/pyside2-5.15.1/work/pyside2-5.15.1_build" | |
declare -x CALLIGRA_FEATURES="" | |
declare -x CAMERAS="" | |
declare -x CBUILD="x86_64-pc-linux-gnu" | |
declare -x CFLAGS="-O3 -pipe -march=skylake -mabm -msgx -mavx256-split-unaligned-load -mavx256-split-unaligned-store -fomit-frame-pointer -fgraphite-identity -floop-nest-optimize -fipa-pta -fdevirtualize-at-ltrans -fno-semantic-interposition -flto=6 -fuse-linker-plugin -Wl,-O1 -Wl,--as-needed -Wl,-O2 -Wl,--hash-style=gnu -Wl,--relax -Wl,--sort-common" | |
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 -- CMAKE_BINARY="cmake" | |
declare -- CMAKE_BUILD_TYPE="Gentoo" | |
declare -x CMAKE_MAKEFILE_GENERATOR="ninja" | |
declare -- CMAKE_REMOVE_MODULES_LIST="FindBLAS FindLAPACK" | |
declare -- CMAKE_USE_DIR="/var/tmp/portage/dev-python/pyside2-5.15.1/work/pyside-setup-opensource-src-5.15.1/sources/pyside2" | |
declare -- CMAKE_VERBOSE="ON" | |
declare -- CMAKE_WARN_UNUSED_CLI="yes" | |
declare -x COLLECTD_PLUGINS="" | |
declare -x CPU_FLAGS_ARM="" | |
declare -x CPU_FLAGS_PPC="" | |
declare -x CPU_FLAGS_X86="" | |
declare -x CTARGET_default="x86_64-pc-linux-gnu" | |
declare -x CURL_SSL="" | |
declare -x CXXFLAGS="-O3 -pipe -march=skylake -mabm -msgx -mavx256-split-unaligned-load -mavx256-split-unaligned-store -fomit-frame-pointer -fgraphite-identity -floop-nest-optimize -fipa-pta -fdevirtualize-at-ltrans -fno-semantic-interposition -flto=6 -fuse-linker-plugin -Wl,-O1 -Wl,--as-needed -Wl,-O2 -Wl,--hash-style=gnu -Wl,--relax -Wl,--sort-common" | |
declare -x DEFAULT_ABI="amd64" | |
declare -x DEFINED_PHASES=" compile configure install prepare test" | |
declare DEPEND="python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_7(-),-python_single_target_python3_8(-)] | |
>=dev-python/shiboken2-5.15.1[python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_7(-),-python_single_target_python3_8(-)] | |
dev-qt/qtcore:5= | |
dev-qt/qtopengl:5= | |
dev-qt/qtserialport:5= | |
3d? ( >=dev-qt/qt3d-5.15:5[qml?] ) | |
charts? ( >=dev-qt/qtcharts-5.15:5[qml?] ) | |
concurrent? ( >=dev-qt/qtconcurrent-5.15:5 ) | |
datavis? ( >=dev-qt/qtdatavis3d-5.15:5[qml?] ) | |
designer? ( >=dev-qt/designer-5.15:5 ) | |
gui? ( >=dev-qt/qtgui-5.15:5[gles2-only?] ) | |
help? ( >=dev-qt/qthelp-5.15:5 ) | |
location? ( >=dev-qt/qtlocation-5.15:5 ) | |
multimedia? ( >=dev-qt/qtmultimedia-5.15:5[qml?,widgets?] ) | |
network? ( >=dev-qt/qtnetwork-5.15:5 ) | |
positioning? ( >=dev-qt/qtpositioning-5.15:5[qml?] ) | |
printsupport? ( >=dev-qt/qtprintsupport-5.15:5 ) | |
qml? ( >=dev-qt/qtdeclarative-5.15:5[widgets?] ) | |
script? ( >=dev-qt/qtscript-5.15:5 ) | |
scxml? ( >=dev-qt/qtscxml-5.15:5 ) | |
sensors? ( >=dev-qt/qtsensors-5.15:5[qml?] ) | |
speech? ( >=dev-qt/qtspeech-5.15:5 ) | |
sql? ( >=dev-qt/qtsql-5.15:5 ) | |
svg? ( >=dev-qt/qtsvg-5.15:5 ) | |
testlib? ( >=dev-qt/qttest-5.15:5 ) | |
webchannel? ( >=dev-qt/qtwebchannel-5.15:5[qml?] ) | |
webengine? ( >=dev-qt/qtwebengine-5.15:5[widgets?] ) | |
websockets? ( >=dev-qt/qtwebsockets-5.15:5[qml?] ) | |
widgets? ( >=dev-qt/qtwidgets-5.15:5 ) | |
x11extras? ( >=dev-qt/qtx11extras-5.15:5 ) | |
xml? ( >=dev-qt/qtxml-5.15:5 ) | |
xmlpatterns? ( >=dev-qt/qtxmlpatterns-5.15:5[qml?] ) | |
test? ( x11-misc/xvfb-run ) | |
" | |
declare DESCRIPTION="Python bindings for the Qt framework" | |
declare -- DESKTOP_DATABASE_DIR="/usr/share/applications" | |
declare -x DEVIRTLTO="-fdevirtualize-at-ltrans" | |
declare -x DIROPTIONS="-m0755" | |
declare -x EAPI="7" | |
declare -x ELIBC="glibc" | |
declare -x ENLIGHTENMENT_MODULES="" | |
declare -x ENV_UNSET="CARGO_HOME DBUS_SESSION_BUS_ADDRESS DISPLAY GOBIN GOPATH PERL5LIB PERL5OPT PERLPREFIX PERL_CORE PERL_MB_OPT PERL_MM_OPT XAUTHORITY XDG_CACHE_HOME XDG_CONFIG_HOME XDG_DATA_HOME XDG_RUNTIME_DIR" | |
declare -- EPOCHREALTIME="1621770957.787212" | |
declare -- EPOCHSECONDS="1621770957" | |
declare -x EXEOPTIONS="-m0755" | |
declare -x F77FLAGS="-O3 -pipe -march=skylake -mabm -msgx -mavx256-split-unaligned-load -mavx256-split-unaligned-store -fomit-frame-pointer -fgraphite-identity -floop-nest-optimize -fipa-pta -fdevirtualize-at-ltrans -fno-semantic-interposition -flto=6 -fuse-linker-plugin -Wl,-O1 -Wl,--as-needed -Wl,-O2 -Wl,--hash-style=gnu -Wl,--relax -Wl,--sort-common" | |
declare -x FCFLAGS="-O3 -pipe -march=skylake -mabm -msgx -mavx256-split-unaligned-load -mavx256-split-unaligned-store -fomit-frame-pointer -fgraphite-identity -floop-nest-optimize -fipa-pta -fdevirtualize-at-ltrans -fno-semantic-interposition -flto=6 -fuse-linker-plugin -Wl,-O1 -Wl,--as-needed -Wl,-O2 -Wl,--hash-style=gnu -Wl,--relax -Wl,--sort-common" | |
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="-O3 -pipe -march=skylake -mabm -msgx -mavx256-split-unaligned-load -mavx256-split-unaligned-store -fomit-frame-pointer -fgraphite-identity -floop-nest-optimize -fipa-pta -fdevirtualize-at-ltrans -fno-semantic-interposition -flto=6 -fuse-linker-plugin -Wl,-O1 -Wl,--as-needed -Wl,-O2 -Wl,--hash-style=gnu -Wl,--relax -Wl,--sort-common" | |
declare -x FFTOOLS="" | |
declare -a FLAG_FILTER_CFLAGS=() | |
declare -a FLAG_FILTER_CXXFLAGS=() | |
declare -a FLAG_FILTER_CXX_FORTRAN=([0]="-std=c1*" [1]="-std=c8*" [2]="-std=c9*" [3]="-std=gnu1*" [4]="-std=gnu8*" [5]="-std=gnu9*" [6]="-std=iso*" [7]="-Wimplicit-function-declaration") | |
declare -a FLAG_FILTER_C_CXX=([0]="-fall-intrinsics" [1]="-fbackslash" [2]="-fcray-pointer" [3]="-fd-lines-as-*" [4]="-fdec*" [5]="-fdefault-*" [6]="-fdollar-ok" [7]="-ffixed-*" [8]="-ffree-*" [9]="-fimplicit-none" [10]="-finteger-4-integer-8" [11]="-fmax-identifier-length*" [12]="-fmodule-private" [13]="-fno-range-check" [14]="-freal-*" [15]="-ftest-forall-temp" [16]="-std=f*" [17]="-std=gnu" [18]="-std=legacy") | |
declare -a FLAG_FILTER_C_FORTRAN=([0]="-fabi-*" [1]="-faligned-new" [2]="-fcheck-new" [3]="-fconcepts" [4]="-fconstexpr-*" [5]="-fdeduce-init-list" [6]="-fext*" [7]="-ffor-scope" [8]="-ffriend-injection" [9]="-fms-extensions" [10]="-fnew-inheriting-ctors" [11]="-fnew-ttp-matching" [12]="-fno-access-control" [13]="-fno-elide-constructors" [14]="-fno-enforce-eh-specs" [15]="-fno-extern-tls-init" [16]="-fno-for-scope" [17]="-fno-gnu-keywords" [18]="-fno-implement-inlines" [19]="-fno-implicit-*" [20]="-fno-nonansi-builtins" [21]="-fno-operator-names" [22]="-fno-optional-diags" [23]="-fno-pretty-templates" [24]="-fno-rtti" [25]="-fno-threadsafe-statics" [26]="-fno-use-cxa-get-exception-ptr" [27]="-fno-weak" [28]="-fnothrow-opt" [29]="-fpermissive" [30]="-frepo" [31]="-fsized-deallocation" [32]="-fstrict-enums" [33]="-fstrong-eval-order" [34]="-ftemplate-*" [35]="-fuse-cxa-atexit" [36]="-fvisibility-*" [37]="-nostdinc++" [38]="-std=c++*" [39]="-std=gnu++*" [40]="-Wabi*" [41]="-Wctor-dtor-privacy" [42]="-Wdelete-non-virtual-dtor" [43]="-Weffc++" [44]="-Wliteral-suffix" [45]="-Wlto-type-mismatch" [46]="-Wmultiple-inheritance" [47]="-Wnamespaces" [48]="-Wno-narrowing" [49]="-Wno-non-template-friend" [50]="-Wno-pmf-conversions" [51]="-Wno-terminate" [52]="-Wnoexcept" [53]="-Wnon-virtual-dtor" [54]="-Wold-style-cast" [55]="-Woverloaded-virtual" [56]="-Wregister" [57]="-Wreorder" [58]="-Wsign-promo" [59]="-Wstrict-null-sentinel" [60]="-Wtemplates" [61]="-Wvirtual-inheritance") | |
declare -a FLAG_FILTER_F77FLAGS=() | |
declare -a FLAG_FILTER_FCFLAGS=() | |
declare -a FLAG_FILTER_FFLAGS=() | |
declare -a FLAG_FILTER_FORTRAN=([0]="-ansi" [1]="-fallow-parameterless-variadic-functions" [2]="-fcilkplus" [3]="-fcond-mismatch" [4]="-fdirectives-only" [5]="-ffreestanding" [6]="-fgimple" [7]="-fgnu-tm" [8]="-fgnu89-inline" [9]="-fhosted" [10]="-flax-vector-conversions" [11]="-fms-extensions" [12]="-fno-asm" [13]="-fno-builtin*" [14]="-fno-signed-bitfields" [15]="-fno-unsigned-bitfields" [16]="-fpermitted-flt-eval-methods*" [17]="-fplan9-extensions" [18]="-fsigned-*" [19]="-fsso-struct*" [20]="-funsigned-*" [21]="-Wchkp" [22]="-Wclobbered" [23]="-Wformat*" [24]="-Wvolatile-register-var") | |
declare -a FLAG_FILTER_GNU=([0]="-emit-llvm" [1]="-flto=full" [2]="-flto=thin" [3]="-flto-jobs=*" [4]="-fopenmp=*" [5]="-frewrite-includes" [6]="-fsanitize=cfi" [7]="-fsanitize=safe-stack" [8]="-mllvm" [9]="-mretpoline*" [10]="-polly*" [11]="-Wl,-z,retpolineplt") | |
declare -a FLAG_FILTER_NONGNU=([0]="-fcf-protection*" [1]="-fdevirtualize-at-ltrans" [2]="-fdevirtualize-speculatively" [3]="-fdirectives-only" [4]="-ffat-lto-objects" [5]="-fgcse*" [6]="-fgraphite*" [7]="-finline-functions" [8]="-fipa-pta" [9]="-fira-loop-pressure" [10]="-fisolate-erroneous-paths-attribute" [11]="-fivopts" [12]="-flimit-function-alignment" [13]="-floop*" [14]="-flto=[0-9]*" [15]="-flto=auto" [16]="-flto=jobserver" [17]="-flto-partition=*" [18]="-flto-compression-level=*" [19]="-fmodulo*" [20]="-fno-enforce-eh-specs" [21]="-fno-ident" [22]="-fno-ipa-cp-clone" [23]="-fno-plt" [24]="-fno-semantic-interposition" [25]="-fnothrow-opt" [26]="-fpredictive-commoning" [27]="-frename-registers" [28]="-freorder-functions" [29]="-frerun-cse-after-loop" [30]="-fsched*" [31]="-fsection-anchors" [32]="-fstack-clash-protection" [33]="-ftree*" [34]="-funsafe-loop*" [35]="-fuse-linker-plugin" [36]="-fvect-cost-model" [37]="-fweb" [38]="-fwhole-program" [39]="-malign-data*" [40]="-mfunction-return*" [41]="-mindirect-branch*" [42]="-mvectorize*" [43]="-Wl,-z,retpolineplt") | |
declare -x FLTO="-flto=6" | |
declare -x GCC_SPECS="" | |
declare -x GPSD_PROTOCOLS="" | |
declare -x GRAPHITE="-fgraphite-identity -floop-nest-optimize" | |
declare -x GRUB_PLATFORMS="" | |
declare -x GSETTINGS_BACKEND="dconf" | |
declare -x GST_VAAPI_ALL_DRIVERS="1" | |
declare -x GTK_IM_MODULE="ibus" | |
declare HOMEPAGE="https://wiki.qt.io/PySide2" | |
declare -x ICECC_ENV_COMPRESSION="zstd" | |
declare -x ICECC_REMOTE_CPP="1" | |
declare -x ICECC_VERSION="/var/lib/icecream/75c8ef08387e6b9e494a4ce78dd6ac99.tar.zst" | |
declare -x INHERITED=" toolchain-funcs multilib multiprocessing ninja-utils edos2unix l10n wrapper eutils flag-o-matic xdg-utils cmake multibuild python-utils-r1 python-r1 virtualx" | |
declare -x INPUT_DEVICES="" | |
declare -x INSOPTIONS="-m0644" | |
declare -x IPAPTA="-fipa-pta" | |
declare IUSE=" | |
3d charts concurrent datavis designer gles2-only +gui help location | |
multimedia +network positioning printsupport qml quick script scripttools | |
scxml sensors speech sql svg test testlib webchannel webengine websockets | |
+widgets x11extras xml xmlpatterns | |
python_targets_python3_7 python_targets_python3_8 test" | |
declare -x IUSE_EFFECTIVE="3d abi_x86_64 alpha amd64 amd64-fbsd amd64-linux arm arm64 arm64-macos charts concurrent datavis designer 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 gles2-only gui help hppa ia64 kernel_AIX kernel_Darwin kernel_FreeBSD kernel_HPUX kernel_NetBSD kernel_OpenBSD kernel_SunOS kernel_Winnt kernel_freemint kernel_linux location m68k mips multimedia network positioning ppc ppc-macos ppc64 ppc64-linux prefix prefix-guest prefix-stack printsupport python_targets_python3_7 python_targets_python3_8 qml quick riscv s390 script scripttools scxml sensors sparc sparc-solaris sparc64-solaris speech sql svg test testlib userland_BSD userland_GNU webchannel webengine websockets widgets x11extras x64-cygwin x64-macos x64-solaris x64-winnt x86 x86-fbsd x86-linux x86-solaris x86-winnt xml xmlpatterns" | |
declare -x IUSE_IMPLICIT="abi_x86_64 prefix prefix-guest prefix-stack" | |
declare -- KEEPPGO=":" | |
declare -x KERNEL="linux" | |
declare -x KERNEL_ABI="amd64" | |
declare -x KEYWORDS="~amd64 ~arm64 x86" | |
declare -x L10N="" | |
declare -x LANG="en_IN.utf8" | |
declare -x LANGUAGE="en_GB.utf8" | |
declare -x LCD_DEVICES="" | |
declare -x LC_COLLATE="C" | |
declare -x LC_MESSAGES="en_GB.utf8" | |
declare -x LDFLAGS="-Wl,-O1 -Wl,--as-needed -Wl,--as-needed -Wl,-O2 -Wl,--hash-style=gnu -Wl,--relax -Wl,--sort-common -O3 -pipe -march=skylake -mabm -msgx -mavx256-split-unaligned-load -mavx256-split-unaligned-store -fomit-frame-pointer -fgraphite-identity -floop-nest-optimize -fipa-pta -fdevirtualize-at-ltrans -fno-semantic-interposition -flto=6 -fuse-linker-plugin" | |
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 LESSCOLOR="yes" | |
declare -x LESSCOLORIZER="highlight --force -O truecolor --style aiseered" | |
declare -x LIBDIR_amd64="lib64" | |
declare -x LIBDIR_default="lib" | |
declare -x LIBDIR_x32="libx32" | |
declare -x LIBDIR_x86="lib" | |
declare -x LIBOPTIONS="-m0644" | |
declare -x LIBREOFFICE_EXTENSIONS="" | |
declare -x LIBVA_DRIVER_NAME="iHD" | |
declare -x LICENSE="|| ( GPL-2 GPL-3+ LGPL-3 )" | |
declare -x LIRC_DEVICES="" | |
declare -x LLVM_TARGETS="" | |
declare -x LUA_SINGLE_TARGET="" | |
declare -x LUA_TARGETS="" | |
declare -x MAIL="/var/mail/root" | |
declare -x MAKEOPTS="-j36 --load-average=16" | |
declare -x MANPAGER="manpager" | |
declare -x MESA_LOADER_DRIVER_OVERRIDE="iris" | |
declare -x MICROCODE_SIGNATURES="-S" | |
declare -- MIMEINFO_DATABASE_DIR="/usr/share/mime" | |
declare -x MONKEYD_PLUGINS="" | |
declare -x MULTILIB_ABIS="amd64" | |
declare -x MULTILIB_STRICT_DENY="64-bit.*shared object" | |
declare -x MULTILIB_STRICT_DIRS="/lib32 /lib /usr/lib32 /usr/lib /usr/kde/*/lib32 /usr/kde/*/lib /usr/qt/*/lib32 /usr/qt/*/lib /usr/X11R6/lib32 /usr/X11R6/lib" | |
declare -x MULTILIB_STRICT_EXEMPT="(perl5|gcc|binutils|eclipse-3|debug|portage|udev|systemd|clang|python-exec|llvm)" | |
declare -- MY_P="pyside-setup-opensource-src-5.15.1" | |
declare -x NGINX_MODULES_HTTP="" | |
declare -x NGINX_MODULES_MAIL="" | |
declare -x NGINX_MODULES_STREAM="" | |
declare -x NINJAFLAGS="-j36 --load-average=16" | |
declare -x NOCOMMON="-fno-common" | |
declare -x NOPLT="-fno-plt" | |
declare -x NTHREADS="6" | |
declare -x OFED_DRIVERS="" | |
declare -x OFFICE_IMPLEMENTATION="" | |
declare -x OPENCL_PROFILE="ocl-icd" | |
declare -x OPENGL_PROFILE="xorg-x11" | |
declare -x OPENMPI_FABRICS="" | |
declare -x OPENMPI_OFED_FEATURES="" | |
declare -x OPENMPI_RM="" | |
declare -x PATH="/usr/lib/ccache/bin:/usr/lib/portage/python3.9/ebuild-helpers/xattr:/usr/lib/portage/python3.9/ebuild-helpers:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/lib/llvm/11/bin" | |
declare PDEPEND="" | |
declare -- PGO_DIR="/var/cache/pgo/dev-python:pyside2-5.15.1" | |
declare -- PGO_PARENT="/var/cache/pgo" | |
declare -x PGSSLROOTCERT="/etc/ssl/cert.pem" | |
declare -x PHP_TARGETS="" | |
declare -x PORTAGE_COMPRESSION_COMMAND="bzip2" | |
declare -a PORTAGE_DOCOMPRESS=([0]="/usr/share/doc" [1]="/usr/share/info" [2]="/usr/share/man") | |
declare -x PORTAGE_DOCOMPRESS_SIZE_LIMIT="128" | |
declare -a PORTAGE_DOCOMPRESS_SKIP=([0]="/usr/share/doc/pyside2-5.15.1/html") | |
declare -a PORTAGE_DOSTRIP=([0]="/") | |
declare -a PORTAGE_DOSTRIP_SKIP=() | |
declare -x PORTAGE_NICENESS="15" | |
declare -x POSTGRES_TARGETS="" | |
declare -x PRELINK_PATH_MASK="/usr/bin/evolution" | |
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 PYTHONDONTWRITEBYTECODE="1" | |
declare -a PYTHON_COMPAT=([0]="python3_7" [1]="python3_8") | |
declare -- PYTHON_DEPS="python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_7(-),-python_single_target_python3_8(-)]" | |
declare -- PYTHON_REQUIRED_USE="|| ( python_targets_python3_7 python_targets_python3_8 )" | |
declare -x PYTHON_SINGLE_TARGET="" | |
declare -x PYTHON_TARGETS="python3_8" | |
declare -- PYTHON_USEDEP="python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_7(-),-python_single_target_python3_8(-)" | |
declare -x QEMU_SOFTMMU_TARGETS="" | |
declare -x QEMU_USER_TARGETS="" | |
declare -x QT_AUTO_SCREEN_SCALE_FACTOR="0" | |
declare -x QT_IM_MODULE="ibus" | |
declare -- QT_PV="5.15:5" | |
declare -x QT_SCALE_FACTOR="1" | |
declare RDEPEND="python_targets_python3_7? ( dev-lang/python:3.7 ) python_targets_python3_8? ( dev-lang/python:3.8 ) >=dev-lang/python-exec-2:=[python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_7(-),-python_single_target_python3_8(-)] | |
>=dev-python/shiboken2-5.15.1[python_targets_python3_7(-)?,python_targets_python3_8(-)?,-python_single_target_python3_7(-),-python_single_target_python3_8(-)] | |
dev-qt/qtcore:5= | |
dev-qt/qtopengl:5= | |
dev-qt/qtserialport:5= | |
3d? ( >=dev-qt/qt3d-5.15:5[qml?] ) | |
charts? ( >=dev-qt/qtcharts-5.15:5[qml?] ) | |
concurrent? ( >=dev-qt/qtconcurrent-5.15:5 ) | |
datavis? ( >=dev-qt/qtdatavis3d-5.15:5[qml?] ) | |
designer? ( >=dev-qt/designer-5.15:5 ) | |
gui? ( >=dev-qt/qtgui-5.15:5[gles2-only?] ) | |
help? ( >=dev-qt/qthelp-5.15:5 ) | |
location? ( >=dev-qt/qtlocation-5.15:5 ) | |
multimedia? ( >=dev-qt/qtmultimedia-5.15:5[qml?,widgets?] ) | |
network? ( >=dev-qt/qtnetwork-5.15:5 ) | |
positioning? ( >=dev-qt/qtpositioning-5.15:5[qml?] ) | |
printsupport? ( >=dev-qt/qtprintsupport-5.15:5 ) | |
qml? ( >=dev-qt/qtdeclarative-5.15:5[widgets?] ) | |
script? ( >=dev-qt/qtscript-5.15:5 ) | |
scxml? ( >=dev-qt/qtscxml-5.15:5 ) | |
sensors? ( >=dev-qt/qtsensors-5.15:5[qml?] ) | |
speech? ( >=dev-qt/qtspeech-5.15:5 ) | |
sql? ( >=dev-qt/qtsql-5.15:5 ) | |
svg? ( >=dev-qt/qtsvg-5.15:5 ) | |
testlib? ( >=dev-qt/qttest-5.15:5 ) | |
webchannel? ( >=dev-qt/qtwebchannel-5.15:5[qml?] ) | |
webengine? ( >=dev-qt/qtwebengine-5.15:5[widgets?] ) | |
websockets? ( >=dev-qt/qtwebsockets-5.15:5[qml?] ) | |
widgets? ( >=dev-qt/qtwidgets-5.15:5 ) | |
x11extras? ( >=dev-qt/qtx11extras-5.15:5 ) | |
xml? ( >=dev-qt/qtxml-5.15:5 ) | |
xmlpatterns? ( >=dev-qt/qtxmlpatterns-5.15:5[qml?] ) | |
" | |
declare REPOSITORY | |
declare REQUIRED_USE="|| ( python_targets_python3_7 python_targets_python3_8 ) | |
3d? ( gui network ) | |
charts? ( widgets ) | |
datavis? ( gui ) | |
designer? ( widgets xml ) | |
gles2-only? ( gui ) | |
help? ( widgets ) | |
location? ( positioning ) | |
multimedia? ( gui network ) | |
printsupport? ( widgets ) | |
qml? ( gui network ) | |
quick? ( qml ) | |
scripttools? ( gui script widgets ) | |
speech? ( multimedia ) | |
sql? ( widgets ) | |
svg? ( widgets ) | |
testlib? ( widgets ) | |
webengine? ( | |
location quick | |
widgets? ( gui network printsupport webchannel ) | |
) | |
websockets? ( network ) | |
widgets? ( gui ) | |
x11extras? ( gui ) | |
" | |
declare -x RESTRICT="test" | |
declare -x RESUMECOMMAND_SSH="bash -c \"x=\\\${2#ssh://} ; host=\\\${x%%/*} ; port=\\\${host##*:} ; host=\\\${host%:*} ; [[ \\\${host} = \\\${port} ]] && port= ; exec rsync --rsh=\\\"ssh \\\${port:+-p\\\${port}} \\\${3}\\\" -avP \\\"\\\${host}:/\\\${x#*/}\\\" \\\"\\\$1\\\"\" rsync \"\${DISTDIR}/\${FILE}\" \"\${URI}\" \"\${PORTAGE_SSH_OPTS}\"" | |
declare -x ROS_MESSAGES="" | |
declare -x RUBY_TARGETS="" | |
declare -x S="/var/tmp/portage/dev-python/pyside2-5.15.1/work/pyside-setup-opensource-src-5.15.1/sources/pyside2" | |
declare -x SAFER_FAST_MATH="-fno-signed-zeros -fno-trapping-math -fassociative-math -freciprocal-math -fno-math-errno -ffinite-math-only -fno-rounding-math -fno-signaling-nans -fcx-limited-range -fexcess-precision=fast" | |
declare -x SAFER_UNSAFE_MATH_OPTS="-fno-signed-zeros -fno-trapping-math -fassociative-math -freciprocal-math" | |
declare -x SAFEST_FAST_MATH="-fno-math-errno -fno-trapping-math" | |
declare -x SANDBOX_DEBUG="0" | |
declare -x SANDBOX_DENY="" | |
declare -x SANDBOX_PREDICT="/var/tmp/portage/dev-python/pyside2-5.15.1/homedir:/dev/crypto:/var/cache/man:/proc/self/coredump_filter:/dev/random:/proc/self/coredump_filter:/dev/random:/proc/self/coredump_filter:/dev/random:/proc/self/coredump_filter:/var/cache/fontconfig:/dev/nvidiactl:/dev/nvidia-uvm:/dev/ati/card:/dev/dri/card:/dev/dri/card0:/dev/dri/renderD128" | |
declare -x SANDBOX_READ="/:/var/cache/ccache:/var/tmp/portage" | |
declare -x SANDBOX_VERBOSE="1" | |
declare -x SANDBOX_WRITE=":/dev/console:/dev/fd:/dev/full:/dev/null:/dev/ptmx:/dev/pts/:/dev/pty:/dev/shm:/dev/tts:/dev/tty:/dev/vc/:/dev/zero:/proc/self/fd:/tmp/:/usr/lib/cf:/usr/lib/conftest:/usr/lib32/cf:/usr/lib32/conftest:/usr/lib64/cf:/usr/lib64/conftest:/usr/tmp/:/usr/tmp/cf:/usr/tmp/conftest:/var/cache/ccache:/var/cache/sccache/:/var/tmp/:/var/tmp/portage:/var/tmp/portage/dev-python/pyside2-5.15.1/homedir/.bash_history" | |
declare -x SANE_BACKENDS="" | |
declare -x SEMINTERPOS="-fno-semantic-interposition" | |
declare -x SHELL="/bin/bash" | |
declare -x SLOT="0" | |
declare SRC_URI="https://download.qt.io/official_releases/QtForPython/pyside2/PySide2-5.15.1-src/pyside-setup-opensource-src-5.15.1.tar.xz" | |
declare -x SUDO_COMMAND="/usr/bin/emerge freecad -va" | |
declare -x SUDO_GID="100" | |
declare -x SUDO_UID="1000" | |
declare -x SUDO_USER="baybal" | |
declare -x SYMLINK_LIB="no" | |
declare -x TWISTED_DISABLE_WRITING_OF_PLUGIN_CACHE="1" | |
declare -x USE="abi_x86_64 amd64 elibc_glibc gles2-only gui kernel_linux network python_targets_python3_8 svg userland_GNU widgets" | |
declare -x USERLAND="GNU" | |
declare -x USE_EXPAND_IMPLICIT="ARCH ELIBC KERNEL USERLAND" | |
declare -x USE_EXPAND_UNPREFIXED="ARCH" | |
declare -x USE_EXPAND_VALUES_ARCH="alpha amd64 amd64-fbsd amd64-linux arm arm64 arm64-macos hppa ia64 m68k mips ppc ppc64 ppc64-linux ppc-macos riscv s390 sparc sparc64-solaris sparc-solaris x64-cygwin x64-macos x64-solaris x64-winnt x86 x86-fbsd x86-linux x86-solaris x86-winnt" | |
declare -x USE_EXPAND_VALUES_ELIBC="AIX bionic Cygwin Darwin DragonFly FreeBSD glibc HPUX Interix mingw mintlib musl NetBSD OpenBSD SunOS uclibc Winnt" | |
declare -x USE_EXPAND_VALUES_KERNEL="AIX Darwin FreeBSD freemint HPUX linux NetBSD OpenBSD SunOS Winnt" | |
declare -x USE_EXPAND_VALUES_USERLAND="BSD GNU" | |
declare -x UWSGI_PLUGINS="" | |
declare -x VIDEO_CARDS="" | |
declare -- VIRTUALX_COMMAND="emake" | |
declare -- VIRTUALX_DEPEND=" | |
x11-base/xorg-server[xvfb] | |
x11-apps/xhost | |
" | |
declare -- VIRTUALX_REQUIRED="test" | |
declare -x VISUAL="/bin/nano" | |
declare -x VOICEMAIL_STORAGE="" | |
declare -x VTKHOME="/usr" | |
declare -x VTK_DATA_ROOT="/usr/share/vtk/data" | |
declare -x VTK_DIR="/usr/lib64/vtk-8.2" | |
declare -x XDG_CACHE_HOME="/var/tmp/portage/dev-python/pyside2-5.15.1/homedir/.cache" | |
declare -x XDG_CONFIG_DIRS="/etc/xdg" | |
declare -x XDG_CONFIG_HOME="/var/tmp/portage/dev-python/pyside2-5.15.1/homedir/.config" | |
declare -x XDG_DATA_DIRS="/usr/local/share:/usr/share" | |
declare -x XDG_DATA_HOME="/var/tmp/portage/dev-python/pyside2-5.15.1/homedir/.local/share" | |
declare -x XDG_RUNTIME_DIR="/var/tmp/portage/dev-python/pyside2-5.15.1/temp/run" | |
declare -x XFCE_PLUGINS="" | |
declare -x XMODIFIERS="@im-ibus" | |
declare -x XSESSION="Xfce Session" | |
declare -x XTABLES_ADDONS="" | |
declare -- _CMAKE_ECLASS="1" | |
declare -- _CMAKE_SRC_PREPARE_HAS_RUN="1" | |
declare -- _EUTILS_ECLASS="1" | |
declare -x _E_DESTTREE_="/usr" | |
declare -x _E_DOCDESTTREE_="" | |
declare -x _E_EXEDESTTREE_="" | |
declare -x _E_INSDESTTREE_="" | |
declare -- _FLAG_O_MATIC_ECLASS="1" | |
declare -- _L10N_ECLASS="1" | |
declare -- _MULTIBUILD="1" | |
declare -- _MULTILIB_ECLASS="1" | |
declare -- _MULTIPROCESSING_ECLASS="1" | |
declare -- _NINJA_UTILS_ECLASS="1" | |
declare -a _PYTHON_ALL_IMPLS=([0]="pypy3" [1]="python3_7" [2]="python3_8" [3]="python3_9" [4]="python3_10") | |
declare -a _PYTHON_HISTORICAL_IMPLS=([0]="jython2_7" [1]="pypy" [2]="pypy1_8" [3]="pypy1_9" [4]="pypy2_0" [5]="python2_5" [6]="python2_6" [7]="python2_7" [8]="python3_1" [9]="python3_2" [10]="python3_3" [11]="python3_4" [12]="python3_5" [13]="python3_6") | |
declare -- _PYTHON_R1="1" | |
declare -a _PYTHON_SUPPORTED_IMPLS=([0]="python3_7" [1]="python3_8") | |
declare -a _PYTHON_UNSUPPORTED_IMPLS=([0]="pypy3" [1]="python3_9" [2]="python3_10") | |
declare -- _PYTHON_UTILS_R1="1" | |
declare -- _TOOLCHAIN_FUNCS_ECLASS="1" | |
declare -- _VIRTUAL_X="1" | |
declare -- _WRAPPER_ECLASS="1" | |
declare -- bashrcd_phases_0_all="CcacheRestore" | |
declare -- bashrcd_phases_0_compile="FlagCompile" | |
declare -- bashrcd_phases_0_configure="LTOPatch" | |
declare -- bashrcd_phases_0_preinst="FlagPreinst" | |
declare -- bashrcd_phases_0_setup="FlagSetup" | |
declare -- bashrcd_phases_1_configure="nocommon_configure" | |
declare -- bashrcd_phases_1_preinst="LocalePurge" | |
declare -- bashrcd_phases_1_setup="QlopSetup" | |
declare -- bashrcd_phases_2_preinst="Remove_la" | |
declare -- bashrcd_phases_2_setup="CcacheSetup" | |
declare -- bashrcd_phases_c_all="0" | |
declare -- bashrcd_phases_c_compile="0" | |
declare -- bashrcd_phases_c_configure="1" | |
declare -- bashrcd_phases_c_preinst="2" | |
declare -- bashrcd_phases_c_setup="2" | |
BashrcdEcho () | |
{ | |
local i m=einfo; | |
BashrcdTrue $BASHRCDLOG && m=elog; | |
for i in "$@"; | |
do | |
$m "$i"; | |
done | |
} | |
BashrcdLog () | |
{ | |
local i m=elog; | |
BashrcdTrue $BASHRCDNOLOG && m=einfo; | |
for i in "$@"; | |
do | |
$m "$i"; | |
done | |
} | |
BashrcdMain () | |
{ | |
local bashrcd_ebuild_phase bashrcd_phase bashrcd_num bashrcd_max; | |
bashrcd_ebuild_phase=$EBUILD_PHASE; | |
[ -n "${bashrcd_ebuild_phase:++}" ] || [ $# -eq 0 ] || bashrcd_ebuild_phase=$1; | |
: ${ED:=${D%/}${EPREFIX%/}/}; | |
BashrcdTrue $BASHRCD_DEBUG && BashrcdEcho "$0: $* ($# args)" "EBUILD_PHASE=$EBUILD_PHASE" "PORTDIR=$PORTDIR" "CATEGORY=$CATEGORY" "P=$P" "USER=$USER" "UID=$UID" "HOME=$HOME" "PATH=$PATH" "ROOT=$ROOT" "PORTAGE_CONFIGROOT=$PORTAGE_CONFIGROOT" "LD_PRELOAD=$LD_PRELOAD" "EPREFIX=$EPREFIX" "D=$D" "ED=$ED"; | |
for bashrcd_phase in all "$bashrcd_ebuild_phase"; | |
do | |
eval bashrcd_max=\${bashrcd_phases_c_$bashrcd_phase}; | |
[ -z "${bashrcd_max:++}" ] && continue; | |
bashrcd_num=0; | |
while { | |
eval eval \"\\\${bashrcd_phases_${bashrcd_num}_$bashrcd_phase}\"; | |
[ $bashrcd_num -ne $bashrcd_max ] | |
}; do | |
bashrcd_num=$(( $bashrcd_num + 1 )); | |
done; | |
done | |
} | |
BashrcdTrue () | |
{ | |
case ${1:-n} in | |
[nNfF]* | [oO][fF]* | 0 | -) | |
return 1 | |
;; | |
esac; | |
: | |
} | |
CcacheRestore () | |
{ | |
local i j; | |
unset ${!CCACHE_*}; | |
for i in ${!BASHRCD_CCACHE_*}; | |
do | |
j=${i##BASHRCD_}; | |
eval $j=\$$i; | |
export $j; | |
done | |
} | |
CcacheSetup () | |
{ | |
local i; | |
: ${CCACHE_BASEDIR=${PORTAGE_TMPDIR:-/var/tmp}/portage}; | |
: ${CCACHE_SLOPPINESS='file_macro,time_macros,include_file_mtime,include_file_ctime,file_stat_matches,pch_defines'}; | |
: ${CCACHE_COMPRESS=true}; | |
if BashrcdTrue $USE_NONGNU && BashrcdTrue $CCACHE_CPP2_OPTIONAL; then | |
: ${CCACHE_CPP2=true}; | |
fi; | |
BashrcdTrue "${CCACHE_HASHDIR-}" || CCACHE_NOHASHDIR=true; | |
for i in ${!CCACHE_*}; | |
do | |
if eval "BashrcdTrue \$$i"; then | |
eval BASHRCD_$i=\$$i; | |
export $i; | |
else | |
unset $i; | |
fi; | |
done; | |
function CcacheRestore () | |
{ | |
local i j; | |
unset ${!CCACHE_*}; | |
for i in ${!BASHRCD_CCACHE_*}; | |
do | |
j=${i##BASHRCD_}; | |
eval $j=\$$i; | |
export $j; | |
done | |
} | |
} | |
FlagAdd () | |
{ | |
FlagNodupAdd '' "$@" | |
} | |
FlagAddAllFlags () | |
{ | |
FlagAddCFlags "$@"; | |
FlagAddFFlags "$@" | |
} | |
FlagAddCFlags () | |
{ | |
FlagAdd CFLAGS "$@"; | |
FlagAdd CXXFLAGS "$@" | |
} | |
FlagAddFFlags () | |
{ | |
FlagAdd FFLAGS "$@"; | |
FlagAdd FCFLAGS "$@"; | |
FlagAdd F77FLAGS "$@" | |
} | |
FlagAthlon () | |
{ | |
FlagSubCFlags '-march=*'; | |
FlagAddCFlags '-march=athlon-4'; | |
command -v x86_64-pc-linux-gnu-gcc32 > /dev/null 2>&1 && export CC=x86_64-pc-linux-gnu-gcc32; | |
command -v x86_64-pc-linux-gnu-g++32 > /dev/null 2>&1 && export CXX=x86_64-pc-linux-gnu-g++32 | |
} | |
FlagCompile () | |
{ | |
: | |
} | |
FlagEval () | |
{ | |
case $- in | |
*f*) | |
eval "$*" | |
;; | |
*) | |
set -f; | |
eval "$*"; | |
set +f | |
;; | |
esac | |
} | |
FlagExecute () | |
{ | |
local ex exy excurr; | |
for excurr in "$@"; | |
do | |
case $excurr in | |
'#'*) | |
return | |
;; | |
'!'*) | |
[ "$HOSTTYPE" = 'i686' ] || continue; | |
ex=${excurr#?} | |
;; | |
'~'*) | |
[ "$HOSTTYPE" = 'x86_64' ] || continue; | |
ex=${excurr#?} | |
;; | |
*) | |
ex=$excurr | |
;; | |
esac; | |
case $ex in | |
/*/*) | |
ex=${ex%/}; | |
ex=${ex#/}; | |
FlagEval FlagReplaceAllFlags "${ex%%/*}" "${ex#*/}" | |
;; | |
'-'*) | |
FlagAddCFlags "$ex" | |
;; | |
'+flto*') | |
FlagSubAllFlags '-flto*' '-fuse-linker-plugin' '-emit-llvm' | |
;; | |
'+'*) | |
FlagSubAllFlags "-${ex#+}" | |
;; | |
'C*FLAGS-='*) | |
FlagEval FlagSubCFlags ${ex#*-=} | |
;; | |
'C*FLAGS+='*) | |
FlagEval FlagAddCFlags ${ex#*+=} | |
;; | |
'C*FLAGS='*) | |
FlagEval FlagSetCFlags "${ex#*=}" | |
;; | |
'C*FLAGS/=/'*/*) | |
ex=${ex%/}; | |
ex=${ex#*/=/}; | |
FlagEval FlagReplaceCFlags "${ex%%/*}" "${ex#*/}" | |
;; | |
'F*FLAGS-='*) | |
FlagEval FlagSubFFlags ${ex#*-=} | |
;; | |
'F*FLAGS+='*) | |
FlagEval FlagAddFFlags ${ex#*+=} | |
;; | |
'F*FLAGS='*) | |
FlagEval FlagSetFFlags "${ex#*=}" | |
;; | |
'F*FLAGS/=/'*/*) | |
ex=${ex%/}; | |
ex=${ex#*/=/}; | |
FlagEval FlagReplaceFFlags "${ex%%/*}" "${ex#*/}" | |
;; | |
'*FLAGS-='*) | |
FlagEval FlagSubAllFlags ${ex#*-=} | |
;; | |
'*FLAGS+='*) | |
FlagEval FlagAddAllFlags ${ex#*+=} | |
;; | |
'*FLAGS='*) | |
FlagEval FlagSetAllFlags "${ex#*=}" | |
;; | |
'*FLAGS/=/'*/*) | |
ex=${ex%/}; | |
ex=${ex#*/=/}; | |
FlagEval FlagReplaceAllFlags "${ex%%/*}" "${ex#*/}" | |
;; | |
'ATHLON32') | |
FlagAthlon | |
;; | |
'NOC*OPT='* | 'NOC*='*) | |
FlagEval FlagSet NOCOPT "${ex#*=}"; | |
NOCXXOPT=$NOCOPT; | |
NOCPPOPT=$NOCOPT | |
;; | |
'NO*OPT='*) | |
FlagEval FlagSet NOCOPT "${ex#*=}"; | |
NOCXXOPT=$NOCOPT; | |
NOCPPOPT=$NOCOPT; | |
NOLDOPT=$NOCOPT | |
;; | |
'NOLD*='*) | |
FlagEval FlagSet NOLDOPT "${ex#*=}"; | |
NOLDADD=$NOLDOPT | |
;; | |
'NO*'*) | |
FlagEval FlagSet NOCOPT "${ex#*=}"; | |
NOCXXOPT=$NOCOPT; | |
NOCPPOPT=$NOCOPT; | |
NOLDOPT=$NOCOPT; | |
NOLDADD=$NOCOPT; | |
NOFFLAGS=$NOCOPT; | |
NOFCFLAGS=$NOCOPT; | |
NOF77FLAGS=$NOCOPT | |
;; | |
'SAFE') | |
NOCOPT=1; | |
NOCXXOPT=1; | |
NOCPPOPT=1; | |
NOLDOPT=1; | |
MESONDEDUP=1; | |
LDFLAGS=; | |
CONFIG_SITE=; | |
NOLAFILEREMOVE=1; | |
unset CMAKE_MAKEFILE_GENERATOR | |
;; | |
*' '*'='*) | |
FlagEval "$ex" | |
;; | |
*'/=/'*'/'*) | |
ex=${ex%/}; | |
exy=${ex#*/=/}; | |
FlagEval FlagReplace "${ex%%/=/*}" "${exy%%/*}" "${exy#*/}" | |
;; | |
*'-='*) | |
FlagEval FlagSub "${ex%%-=*}" ${ex#*-=} | |
;; | |
*'+='*) | |
FlagEval FlagAdd "${ex%%+=*}" ${ex#*+=} | |
;; | |
*'='*) | |
FlagEval FlagSet "${ex%%=*}" "${ex#*=}" | |
;; | |
*) | |
FlagEval "$ex" | |
;; | |
esac; | |
done | |
} | |
FlagInfoExport () | |
{ | |
local out; | |
for out in FEATURES CFLAGS CXXFLAGS CPPFLAGS FFLAGS FCFLAGS F77FLAGS LDFLAGS MAKEOPTS EXTRA_ECONF EXTRA_EMAKE USE_NONGNU; | |
do | |
eval "if [ -n \"\${$out:++}\" ] | |
then export $out | |
BashrcdEcho \"$out='\$$out'\" | |
else unset $out | |
fi"; | |
done; | |
if BashrcdTrue $PGO; then | |
BashrcdEcho "Create PGO into $PGO_DIR"; | |
else | |
if $use_pgo; then | |
BashrcdEcho "Using PGO from $PGO_DIR"; | |
fi; | |
fi; | |
out=`${CC:-gcc} --version | head -n 1` || out=; | |
BashrcdEcho "${out:-cannot determine gcc version}"; | |
out=`${CXX:-g++} --version | head -n 1` || out=; | |
BashrcdEcho "${out:-cannot determine g++ version}"; | |
out=`${LD:-ld} --version | head -n 1` || out=; | |
BashrcdEcho "${out:-cannot determine ld version}"; | |
BashrcdEcho "`uname -a`" | |
} | |
FlagMask () | |
{ | |
masked-packages -qm "$1" -- "$CATEGORY/$PF:${SLOT:-0}${PORTAGE_REPO_NAME:+::}${PORTAGE_REPO_NAME-}" | |
} | |
FlagMesonDedup () | |
{ | |
local newld=; | |
FlagNodupAdd "$CFLAGS $CXXFLAGS $CPPFLAGS $FFLAGS $FCFLAGS $F77FLAGS" newld $LDFLAGS; | |
LDFLAGS=$newld | |
} | |
FlagNodupAdd () | |
{ | |
local addres addf addvar dups; | |
dups=$1; | |
shift; | |
addvar=$1; | |
shift; | |
eval addres=\$$addvar; | |
for addf in "$@"; | |
do | |
case " $addres $dups " in | |
*[[:space:]]"$addf"[[:space:]]*) | |
continue | |
;; | |
esac; | |
addres=$addres${addres:+\ }$addf; | |
done; | |
eval $addvar=\$addres | |
} | |
FlagParseLine () | |
{ | |
local scanp scanl scansaveifs; | |
scanl=$2; | |
while :; do | |
case $scanl in | |
[[:space:]]*) | |
scanl=${scanl#?}; | |
continue | |
;; | |
'#'*) | |
return | |
;; | |
*[[:space:]]*) | |
break | |
;; | |
esac; | |
return; | |
done; | |
scanp=${scanl%%[[:space:]]*}; | |
scanl=${scanl#*[[:space:]]}; | |
[ -n "${scanl:++}" ] || return 0; | |
FlagMask "$scanp" || return 0; | |
scansaveifs=$IFS; | |
IFS=$1; | |
BashrcdEcho "$scanfile -> $scanp: $scanl"; | |
FlagEval FlagExecute $scanl; | |
IFS=$scansaveifs | |
} | |
FlagPreinst () | |
{ | |
: | |
} | |
FlagReplace () | |
{ | |
local repres repf repcurr repvar reppat; | |
repvar=$1; | |
shift; | |
eval repf=\$$repvar; | |
reppat=$1; | |
shift; | |
repres=; | |
for repcurr in $repf; | |
do | |
case $repcurr in | |
$reppat) | |
$repfound && FlagAdd repres "$@"; | |
continue | |
;; | |
esac; | |
repres=$repres${repres:+\ }$repcurr; | |
done; | |
eval $repvar=\$repres | |
} | |
FlagReplaceAllFlags () | |
{ | |
FlagReplaceCFlags "$@"; | |
FlagReplaceFFlags "$@"; | |
FlagSub LDFLAGS "$1"; | |
FlagSub OPTLDFLAGS "$1" | |
} | |
FlagReplaceCFlags () | |
{ | |
FlagReplace CFLAGS "$@"; | |
FlagReplace CXXFLAGS "$@"; | |
FlagReplace CPPFLAGS "$@"; | |
FlagSub OPTCFLAGS "$1"; | |
FlagSub OPTCXXFLAGS "$1"; | |
FlagSub OPTCPPFLAGS "$1" | |
} | |
FlagReplaceFFlags () | |
{ | |
FlagReplace FFLAGS "$@"; | |
FlagReplace FCFLAGS "$@"; | |
FlagReplace F77FLAGS "$@" | |
} | |
FlagScanDir () | |
{ | |
local scantmp scanifs scanfile; | |
scanifs=$IFS; | |
if test -d "$1"; then | |
IFS=' | |
'; | |
for scantmp in `find -L "$1" '(' '(' -name '.*' -o -name '*~' ')' -prune ')' -o -type f -print`; | |
do | |
IFS=$scanifs; | |
FlagScanFiles "$scantmp"; | |
done; | |
else | |
FlagScanFiles "$1"; | |
fi; | |
scanfile='FLAG_ADDLINES'; | |
IFS=' | |
'; | |
for scantmp in $FLAG_ADDLINES; | |
do | |
FlagParseLine "$scanifs" "$scantmp"; | |
done; | |
IFS=$scanifs | |
} | |
FlagScanFiles () | |
{ | |
local scanfile scanl oldifs scanifs; | |
scanifs=$IFS; | |
IFS=; | |
for scanfile in "$@"; | |
do | |
[ -z "${scanfile:++}" ] && continue; | |
test -r "$scanfile" || continue; | |
while read -r scanl; do | |
FlagParseLine "$scanifs" "$scanl"; | |
done < "$scanfile"; | |
done; | |
IFS=$scanifs | |
} | |
FlagSet () | |
{ | |
local setvar; | |
setvar=$1; | |
shift; | |
eval $setvar=\$* | |
} | |
FlagSetAllFlags () | |
{ | |
FlagSetCFlags "$@"; | |
FlagSetFFlags "$@"; | |
LDFLAGS=; | |
OPTLDFLAGS= | |
} | |
FlagSetCFlags () | |
{ | |
FlagSet CFLAGS "$@"; | |
CXXFLAGS=$CFLAGS; | |
CPPFLAGS=; | |
OPTCFLAGS=; | |
OPTCXXFLAGS=; | |
OPTCPPFLAGS= | |
} | |
FlagSetFFlags () | |
{ | |
FlagSet FFLAGS "$@"; | |
FlagSet FCFLAGS "$@"; | |
FlagSet F77FLAGS "$@" | |
} | |
FlagSetFlags () | |
{ | |
local ld i; | |
ld=; | |
: ${PGO_PARENT:=/var/cache/pgo}; | |
: ${PGO_DIR:=$PGO_PARENT/$CATEGORY:$P}; | |
FlagScanDir "${PORTAGE_CONFIGROOT%/}/etc/portage/package.cflags"; | |
[ -z "${USE_NONGNU++}" ] && FlagSetUseNonGNU && USE_NONGNU=1; | |
if BashrcdTrue "${USE_NONGNU-}"; then | |
FlagSetNonGNU; | |
else | |
FlagSetGNU; | |
fi; | |
if [ -n "$FLAG_ADD" ]; then | |
BashrcdEcho "FLAG_ADD: $FLAG_ADD"; | |
FlagEval FlagExecute "$FLAG_ADD"; | |
fi; | |
PGO_DIR=${PGO_DIR%/}; | |
case ${PGO_DIR:-/} in | |
/) | |
error 'PGO_DIR must not be empty'; | |
false | |
;; | |
/*) | |
: | |
;; | |
*) | |
error 'PGO_DIR must be an absolute path'; | |
false | |
;; | |
esac || { | |
die 'Bad PGO_DIR'; | |
exit 2 | |
}; | |
use_pgo=false; | |
if test -r "$PGO_DIR"; then | |
unset PGO; | |
BashrcdTrue $NOPGO || use_pgo=:; | |
fi; | |
if BashrcdTrue $PGO; then | |
FlagAddCFlags "-fprofile-generate=$PGO_DIR" -fvpt -fprofile-arcs; | |
FlagAdd LDFLAGS -fprofile-arcs; | |
addpredict "$PGO_PARENT"; | |
else | |
if $use_pgo; then | |
FlagAddCFlags "-fprofile-use=$PGO_DIR" -fvpt -fbranch-probabilities -fprofile-correction; | |
else | |
: ${KEEPPGO:=:}; | |
fi; | |
fi; | |
BashrcdTrue $NOLDOPT || FlagAdd LDFLAGS $OPTLDFLAGS; | |
BashrcdTrue $NOCADD || BashrcdTrue $MESONDEDUP || case " $LDFLAGS $CFLAGS $CXXFLAGS" in | |
*[[:space:]]'-flto'*) | |
ld="$CFLAGS $CXXFLAGS" | |
;; | |
esac; | |
BashrcdTrue $NOLDADD || BashrcdTrue $MESONDEDUP || FlagAddCFlags $LDFLAGS; | |
FlagAdd LDFLAGS $ld; | |
BashrcdTrue $NOCOPT || FlagAdd CFLAGS $OPTCFLAGS; | |
BashrcdTrue $NOCXXOPT || FlagAdd CXXFLAGS $OPTCXXFLAGS; | |
BashrcdTrue $NOCPPOPT || FlagAdd CPPFLAGS $OPTCPPFLAGS; | |
BashrcdTrue $NOFFLAGS || FFLAGS=$CFLAGS; | |
BashrcdTrue $NOFCFLAGS || FCFLAGS=$FFLAGS; | |
BashrcdTrue $NOF77FLAGS || F77FLAGS=$FFLAGS; | |
BashrcdTrue $NOFILTER_CXXFLAGS || FlagSub CXXFLAGS "${FLAG_FILTER_C_CXX[@]}" "${FLAG_FILTER_CXX_FORTRAN[@]}" "${FLAG_FILTER_CXXFLAGS[@]}"; | |
BashrcdTrue $NOFILTER_CFLAGS || FlagSub CFLAGS "${FLAG_FILTER_C_CXX[@]}" "${FLAG_FILTER_C_FORTRAN[@]}" "${FLAG_FILTER_CFLAGS[@]}"; | |
BashrcdTrue $NOFILTER_FFLAGS || FlagSub FFLAGS "${FLAG_FILTER_C_FORTRAN[@]}" "${FLAG_FILTER_CXX_FORTRAN[@]}" "${FLAG_FILTER_FORTRAN[@]}" "${FLAG_FILTER_FFLAGS[@]}"; | |
BashrcdTrue $NOFILTER_FCFLAGS || FlagSub FCFLAGS "${FLAG_FILTER_C_FORTRAN[@]}" "${FLAG_FILTER_CXX_FORTRAN[@]}" "${FLAG_FILTER_FORTRAN[@]}" "${FLAG_FILTER_FCFLAGS[@]}"; | |
BashrcdTrue $NOFILTER_F77FLAGS || FlagSub FCFLAGS "${FLAG_FILTER_C_FORTRAN[@]}" "${FLAG_FILTER_CXX_FORTRAN[@]}" "${FLAG_FILTER_FORTRAN[@]}" "${FLAG_FILTER_F77LAGS[@]}"; | |
! BashrcdTrue $MESONDEDUP || FlagMesonDedup; | |
unset OPTCFLAGS OPTCXXFLAGS OPTCPPFLAGS OPTLDFLAGS; | |
unset NOLDOPT NOLDADD NOCOPT NOCXXOPT NOFFLAGS NOFCFLAGS NOF77FLAGS; | |
unset NOFILTER_CXXFLAGS NOFILTER_CFLAGS; | |
unset NOFILTER_FFLAGS NOFILTER_FCFLAGS NOFILTER_F77FLAGS | |
} | |
FlagSetGNU () | |
{ | |
FlagSubAllFlags "${FLAG_FILTER_GNU[@]}" | |
} | |
FlagSetNonGNU () | |
{ | |
: ${NOLDADD:=1}; | |
FlagSubAllFlags "${FLAG_FILTER_NONGNU[@]}"; | |
FlagReplaceAllFlags '-fstack-check*' '-fstack-check' | |
} | |
FlagSetUseNonGNU () | |
{ | |
case $CC$CXX in | |
*clang*) | |
return 0 | |
;; | |
esac; | |
return 1 | |
} | |
FlagSetup () | |
{ | |
function FlagCompile () | |
{ | |
: | |
}; | |
local use_pgo; | |
FlagSetFlags; | |
if BashrcdTrue $PGO; then | |
function FlagPreinst () | |
{ | |
test -d "$PGO_DIR" || mkdir -p -m +1777 -- "$PGO_DIR" || { | |
eerror "cannot create pgo directory $PGO_DIR"; | |
die 'cannot create PGO_DIR'; | |
exit 2 | |
}; | |
ewarn "$CATEGORY/$PN will write profile info to world-writable"; | |
ewarn "$PGO_DIR"; | |
ewarn 'Reemerge it soon for an optimized version and removal of that directory' | |
}; | |
else | |
if BashrcdTrue $KEEPPGO; then | |
function FlagPreinst () | |
{ | |
: | |
}; | |
else | |
function FlagPreinst () | |
{ | |
test -d "$PGO_DIR" || return 0; | |
BashrcdLog "removing pgo directory $PGO_DIR"; | |
rm -r -f -- "$PGO_DIR" || { | |
eerror "cannot remove pgo directory $PGO_DIR"; | |
die 'cannot remove PGO_DIR'; | |
exit 2 | |
}; | |
local g; | |
g=${PGO_DIR%/*}; | |
[ -z "$g" ] || rmdir -p -- "$g" > /dev/null 2>&1 | |
}; | |
fi; | |
fi; | |
FlagInfoExport | |
} | |
FlagSub () | |
{ | |
local subres subpat subf subvar sublist; | |
subvar=$1; | |
shift; | |
subres=; | |
eval sublist=\$$subvar; | |
for subf in $sublist; | |
do | |
for subpat in "$@"; | |
do | |
[ -n "${subpat:++}" ] || continue; | |
case $subf in | |
$subpat) | |
subf=; | |
break | |
;; | |
esac; | |
done; | |
[ -z "${subf:++}" ] || subres=$subres${subres:+\ }$subf; | |
done; | |
eval $subvar=\$subres | |
} | |
FlagSubAllFlags () | |
{ | |
FlagSubCFlags "$@"; | |
FlagSubFFlags "$@"; | |
FlagSub LDFLAGS "$@"; | |
FlagSub OPTLDFLAGS "$@" | |
} | |
FlagSubCFlags () | |
{ | |
FlagSub CFLAGS "$@"; | |
FlagSub CXXFLAGS "$@"; | |
FlagSub CPPFLAGS "$@"; | |
FlagSub OPTCFLAGS "$@"; | |
FlagSub OPTCXXFLAGS "$@"; | |
FlagSub OPTCPPFLAGS "$@" | |
} | |
FlagSubFFlags () | |
{ | |
FlagSub FFLAGS "$@"; | |
FlagSub FCFLAGS "$@"; | |
FlagSub F77FLAGS "$@" | |
} | |
LTOPatch () | |
{ | |
if [[ -d $S ]]; then | |
cd "${S}"; | |
else | |
if ___eapi_has_S_WORKDIR_fallback; then | |
cd "${WORKDIR}"; | |
else | |
if [[ -z ${A} ]] && ! __has_phase_defined_up_to prepare; then | |
cd "${WORKDIR}"; | |
else | |
die "The source directory '${S}' doesn't exist"; | |
fi; | |
fi; | |
fi; | |
local tagfile=${T}/.portage_lto_patches_applied; | |
[[ -f ${tagfile} ]] && return; | |
>> "${tagfile}"; | |
local lto_overlay_dir="$(portageq get_repo_path ${PORTAGE_CONFIGROOT} lto-overlay)"; | |
local basedir="${lto_overlay_dir%/}/sys-config/ltoize/files/patches"; | |
local applied d f; | |
local -A _eapply_lto_patches; | |
local prev_shopt=$(shopt -p nullglob); | |
shopt -s nullglob; | |
for d in "${basedir}"/${CATEGORY}/{${P}-${PR},${P},${PN}}{:${SLOT%/*},}; | |
do | |
for f in "${d}"/*; | |
do | |
if [[ ( ${f} == *.diff || ${f} == *.patch ) && -z ${_eapply_lto_patches[${f##*/}]} ]]; then | |
_eapply_lto_patches[${f##*/}]=${f}; | |
fi; | |
done; | |
done; | |
local lto_patch_cmd; | |
if [[ "${EAPI}" -ge 6 ]]; then | |
lto_patch_cmd=eapply; | |
else | |
lto_patch_cmd=epatch; | |
fi; | |
if [[ ${#_eapply_lto_patches[@]} -gt 0 ]]; then | |
while read -r -d '' f; do | |
f=${_eapply_lto_patches[${f}]}; | |
if [[ -s ${f} ]]; then | |
${lto_patch_cmd} "${f}"; | |
applied=1; | |
fi; | |
done < <(printf -- '%s\0' "${!_eapply_lto_patches[@]}" | | |
LC_ALL=C sort -z); | |
fi; | |
${prev_shopt}; | |
[[ -n ${applied} ]] && ewarn "lto-overlay: LTO patches applied." | |
} | |
LocalePurge () | |
{ | |
if BashrcdTrue $NOLOCALEPURGE || { | |
! BashrcdTrue $LOCALEPURGE && ! BashrcdTrue $MANPURGE | |
} || [ -z "${KEEP_LOCALES++}" ]; then | |
return 0; | |
fi; | |
case $- in | |
*f*) | |
LocalePurgeMain | |
;; | |
*) | |
set -f; | |
LocalePurgeMain; | |
set +f | |
;; | |
esac | |
} | |
LocalePurgeMain () | |
{ | |
local locale_list locale_item locale_cmd; | |
locale_list=; | |
for locale_item in $ALL_LOCALES ${ALL_LOCALES_ADD-}; | |
do | |
[ -n "$locale_item" ] && LocalePurgeNokeep "$locale_item" && locale_list=$locale_list' '$locale_item; | |
done; | |
locale_cmd='for d | |
do for l in $locale_list | |
do if test -d "$d/$l$k" | |
then rm -rvf -- "$d/$l" | |
fi | |
done | |
done'; | |
export locale_list; | |
shell=`command -v sh` || shell=; | |
: ${shell:=/bin/sh}; | |
if BashrcdTrue $LOCALEPURGE; then | |
einfo 'removing undesired locales'; | |
find "$ED" -name locale -type d -exec "$shell" -c "k='/LC_MESSAGES' | |
$locale_cmd" sh '{}' '+'; | |
fi; | |
if BashrcdTrue $MANPURGE; then | |
einfo 'removing undesired manpages'; | |
find "$ED" -name man -type d -exec "$shell" -c "k= | |
$locale_cmd" sh '{}' '+'; | |
fi; | |
unset locale_list | |
} | |
LocalePurgeNokeep () | |
{ | |
local locale_keep; | |
for locale_keep in $KEEP_LOCALES; | |
do | |
case $1 in | |
$locale_keep) | |
return 1 | |
;; | |
esac; | |
done | |
} | |
QlopSetup () | |
{ | |
local num sec hour min date; | |
! BashrcdTrue "${NOQLOP-}" && command -v qlop > /dev/null 2>&1 || return 0; | |
qlop -amH -- "$CATEGORY/$PN"; | |
qlop -tmH -- "$CATEGORY/$PN"; | |
command -v title > /dev/null 2>&1 || return 0; | |
num=$(tail -n1 /var/log/emerge.log | sed -e 's/^.*(\([0-9]*\) of \([0-9]*\)).*$/\1|\2/') && [ -n "$num" ] || { | |
date=$(date +%T); | |
title "emerge $date $PN"; | |
return | |
}; | |
case ${QLOPCOUNT:-1} in | |
*[!0123456789]*) | |
sec=$(qlop -ACMm -- "$CATEGORY/$PN" | awk '/[[:space:]][0123456789]+$/{a=$NF} | |
END{if(a!=""){print a}}') | |
;; | |
[123456789]*) | |
sec=$(qlop -tCMm -- "$CATEGORY/$PN" | awk -v 'i=0' -v 'm=0' -v "n=${QLOPCOUNT:-3}" '/[[:space:]][0123456789]+$/{a[i++]=$NF;if(i>m){m=i};if(i>=n){i=0}} | |
END{s=0;for(i=m;i>0;){s+=a[--i]};if(m>0){print int(s/m+1/2)}}') | |
;; | |
*) | |
false | |
;; | |
esac && [ -n "$sec" ] || { | |
date=$(date +%T); | |
title "emerge $date $num $PN"; | |
return | |
}; | |
hour=$(( $sec / 3600 )); | |
[ "$hour" -gt 0 ] || hour=; | |
hour=$hour${hour:+:}; | |
sec=$(( $sec % 3600 )); | |
min=$(( $sec / 60 )); | |
sec=$(( $sec % 60 )); | |
[ "$min" -gt 9 ] || min=0$min; | |
[ "$sec" -gt 9 ] || sec=0$sec; | |
date=$(date +%T); | |
title "emerge $date $num $PN $hour$min:$sec" | |
} | |
Remove_la () | |
{ | |
BashrcdTrue $NOLAFILEREMOVE && return; | |
case "$CATEGORY/$PN" in | |
'media-libs/gst-plugins-base' | 'media-libs/libsidplay') | |
return 0 | |
;; | |
esac; | |
einfo 'removing unneeded *.la files'; | |
local shell; | |
shell=`command -v sh` || shell=; | |
: ${shell:=/bin/sh}; | |
Dexport=$ED find "$ED" -name '*.la' '!' -name 'libltdl.la' -exec "$shell" -c "for i | |
do if grep -q -- '^shouldnotlink=no\$' \"\$i\" | |
then printf '\\t%s\\n' \"\${i#\$Dexport}\" | |
rm -- \"\$i\" || echo 'removing failed!' | |
fi | |
done" sh '{}' '+' | |
} | |
__eapi6_src_install () | |
{ | |
if [[ -f Makefile || -f GNUmakefile || -f makefile ]]; then | |
emake DESTDIR="${D}" install; | |
fi; | |
einstalldocs | |
} | |
__eapi6_src_prepare () | |
{ | |
if ___is_indexed_array_var PATCHES; then | |
[[ ${#PATCHES[@]} -gt 0 ]] && eapply "${PATCHES[@]}"; | |
else | |
if [[ -n ${PATCHES} ]]; then | |
eapply ${PATCHES}; | |
fi; | |
fi; | |
eapply_user | |
} | |
__eapi7_ver_compare () | |
{ | |
local va=${1} vb=${2} a an al as ar b bn bl bs br re LC_ALL=C; | |
re="^([0-9]+(\.[0-9]+)*)([a-z]?)((_(alpha|beta|pre|rc|p)[0-9]*)*)(-r[0-9]+)?$"; | |
[[ ${va} =~ ${re} ]] || die "${FUNCNAME}: invalid version: ${va}"; | |
an=${BASH_REMATCH[1]}; | |
al=${BASH_REMATCH[3]}; | |
as=${BASH_REMATCH[4]}; | |
ar=${BASH_REMATCH[7]}; | |
[[ ${vb} =~ ${re} ]] || die "${FUNCNAME}: invalid version: ${vb}"; | |
bn=${BASH_REMATCH[1]}; | |
bl=${BASH_REMATCH[3]}; | |
bs=${BASH_REMATCH[4]}; | |
br=${BASH_REMATCH[7]}; | |
__eapi7_ver_compare_int "${an%%.*}" "${bn%%.*}" || return; | |
while [[ ${an} == *.* && ${bn} == *.* ]]; do | |
an=${an#*.}; | |
bn=${bn#*.}; | |
a=${an%%.*}; | |
b=${bn%%.*}; | |
if [[ ${a} == 0* || ${b} == 0* ]]; then | |
[[ ${a} =~ 0+$ ]] && a=${a%"${BASH_REMATCH[0]}"}; | |
[[ ${b} =~ 0+$ ]] && b=${b%"${BASH_REMATCH[0]}"}; | |
[[ ${a} > ${b} ]] && return 3; | |
[[ ${a} < ${b} ]] && return 1; | |
else | |
__eapi7_ver_compare_int "${a}" "${b}" || return; | |
fi; | |
done; | |
[[ ${an} == *.* ]] && return 3; | |
[[ ${bn} == *.* ]] && return 1; | |
[[ ${al} > ${bl} ]] && return 3; | |
[[ ${al} < ${bl} ]] && return 1; | |
as=${as#_}${as:+_}; | |
bs=${bs#_}${bs:+_}; | |
while [[ -n ${as} && -n ${bs} ]]; do | |
a=${as%%_*}; | |
b=${bs%%_*}; | |
if [[ ${a%%[0-9]*} == "${b%%[0-9]*}" ]]; then | |
__eapi7_ver_compare_int "${a##*[a-z]}" "${b##*[a-z]}" || return; | |
else | |
[[ ${a%%[0-9]*} == p ]] && return 3; | |
[[ ${b%%[0-9]*} == p ]] && return 1; | |
[[ ${a} > ${b} ]] && return 3 || return 1; | |
fi; | |
as=${as#*_}; | |
bs=${bs#*_}; | |
done; | |
if [[ -n ${as} ]]; then | |
[[ ${as} == p[_0-9]* ]] && return 3 || return 1; | |
else | |
if [[ -n ${bs} ]]; then | |
[[ ${bs} == p[_0-9]* ]] && return 1 || return 3; | |
fi; | |
fi; | |
__eapi7_ver_compare_int "${ar#-r}" "${br#-r}" || return; | |
return 2 | |
} | |
__eapi7_ver_compare_int () | |
{ | |
local a=$1 b=$2 d=$(( ${#1}-${#2} )); | |
if [[ ${d} -gt 0 ]]; then | |
printf -v b "%0${d}d%s" 0 "${b}"; | |
else | |
if [[ ${d} -lt 0 ]]; then | |
printf -v a "%0$(( -d ))d%s" 0 "${a}"; | |
fi; | |
fi; | |
[[ ${a} > ${b} ]] && return 3; | |
[[ ${a} == "${b}" ]] | |
} | |
__eapi7_ver_parse_range () | |
{ | |
local range=${1}; | |
local max=${2}; | |
[[ ${range} == [0-9]* ]] || die "${FUNCNAME}: range must start with a number"; | |
start=${range%-*}; | |
[[ ${range} == *-* ]] && end=${range#*-} || end=${start}; | |
if [[ -n ${end} ]]; then | |
[[ ${start} -le ${end} ]] || die "${FUNCNAME}: end of range must be >= start"; | |
[[ ${end} -le ${max} ]] || end=${max}; | |
else | |
end=${max}; | |
fi | |
} | |
__eapi7_ver_split () | |
{ | |
local v=${1} LC_ALL=C; | |
comp=(); | |
local s c; | |
while [[ -n ${v} ]]; do | |
s=${v%%[a-zA-Z0-9]*}; | |
v=${v:${#s}}; | |
[[ ${v} == [0-9]* ]] && c=${v%%[^0-9]*} || c=${v%%[^a-zA-Z]*}; | |
v=${v:${#c}}; | |
comp+=("${s}" "${c}"); | |
done | |
} | |
_clang_fullversion () | |
{ | |
local ver="$1"; | |
shift; | |
set -- $($(tc-getCPP "$@") -E -P - <<<"__clang_major__ __clang_minor__ __clang_patchlevel__"); | |
eval echo "$ver" | |
} | |
_cmake_banned_func () | |
{ | |
die "${FUNCNAME[1]} is banned. use -D$1<related_CMake_variable>=\"\$(usex $2)\" instead" | |
} | |
_cmake_check_build_dir () | |
{ | |
: ${CMAKE_USE_DIR:=${S}}; | |
if [[ -n ${CMAKE_IN_SOURCE_BUILD} ]]; then | |
BUILD_DIR="${CMAKE_USE_DIR}"; | |
fi; | |
mkdir -p "${BUILD_DIR}" || die; | |
einfo "Working in BUILD_DIR: \"$BUILD_DIR\"" | |
} | |
_cmake_modify-cmakelists () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
grep -qs "<<< Gentoo configuration >>>" "${CMAKE_USE_DIR}"/CMakeLists.txt && return 0; | |
find "${CMAKE_USE_DIR}" -name CMakeLists.txt -exec sed -e '/^[[:space:]]*set[[:space:]]*([[:space:]]*CMAKE_BUILD_TYPE\([[:space:]].*)\|)\)/I{s/^/#_cmake_modify_IGNORE /g}' -e '/^[[:space:]]*set[[:space:]]*([[:space:]]*CMAKE_COLOR_MAKEFILE[[:space:]].*)/I{s/^/#_cmake_modify_IGNORE /g}' -e '/^[[:space:]]*set[[:space:]]*([[:space:]]*CMAKE_INSTALL_PREFIX[[:space:]].*)/I{s/^/#_cmake_modify_IGNORE /g}' -e '/^[[:space:]]*set[[:space:]]*([[:space:]]*CMAKE_VERBOSE_MAKEFILE[[:space:]].*)/I{s/^/#_cmake_modify_IGNORE /g}' -i {} + || die "${LINENO}: failed to disable hardcoded settings"; | |
local x; | |
for x in $(find "${CMAKE_USE_DIR}" -name CMakeLists.txt -exec grep -l "^#_cmake_modify_IGNORE" {} +;); | |
do | |
einfo "Hardcoded definition(s) removed in $(echo "${x}" | cut -c $((${#CMAKE_USE_DIR}+2))-):"; | |
einfo "$(grep -se '^#_cmake_modify_IGNORE' ${x} | cut -c 22-99)"; | |
done; | |
cat >> "${CMAKE_USE_DIR}"/CMakeLists.txt <<-_EOF_ || | |
message(STATUS "<<< Gentoo configuration >>> | |
Build type \${CMAKE_BUILD_TYPE} | |
Install path \${CMAKE_INSTALL_PREFIX} | |
Compiler flags: | |
C \${CMAKE_C_FLAGS} | |
C++ \${CMAKE_CXX_FLAGS} | |
Linker flags: | |
Executable \${CMAKE_EXE_LINKER_FLAGS} | |
Module \${CMAKE_MODULE_LINKER_FLAGS} | |
Shared \${CMAKE_SHARED_LINKER_FLAGS}\n") | |
_EOF_ | |
die | |
} | |
_filter-hardened () | |
{ | |
local f; | |
for f in "$@"; | |
do | |
case "${f}" in | |
-fPIC | -fpic | -fPIE | -fpie | -Wl,pie | -pie) | |
gcc-specs-pie || continue; | |
if ! is-flagq -nopie && ! is-flagq -no-pie; then | |
if test-flags -nopie > /dev/null; then | |
append-flags -nopie; | |
else | |
append-flags -no-pie; | |
fi; | |
fi | |
;; | |
-fstack-protector) | |
gcc-specs-ssp || continue; | |
is-flagq -fno-stack-protector || append-flags $(test-flags -fno-stack-protector) | |
;; | |
-fstack-protector-all) | |
gcc-specs-ssp-to-all || continue; | |
is-flagq -fno-stack-protector-all || append-flags $(test-flags -fno-stack-protector-all) | |
;; | |
-fno-strict-overflow) | |
gcc-specs-nostrict || continue; | |
is-flagq -fstrict-overflow || append-flags $(test-flags -fstrict-overflow) | |
;; | |
esac; | |
done | |
} | |
_filter-var () | |
{ | |
local f x var=$1 new=(); | |
shift; | |
for f in ${!var}; | |
do | |
for x in "$@"; | |
do | |
[[ ${f} == ${x} ]] && continue 2; | |
done; | |
new+=("${f}"); | |
done; | |
export ${var}="${new[*]}" | |
} | |
_gcc-install-dir () | |
{ | |
echo "$(LC_ALL=C $(tc-getCC) -print-search-dirs 2> /dev/null | awk '$1=="install:" {print $2}')" | |
} | |
_gcc-specs-directive_raw () | |
{ | |
local cc=$(tc-getCC); | |
local specfiles=$(LC_ALL=C ${cc} -v 2>&1 | awk '$1=="Reading" {print $NF}'); | |
${cc} -dumpspecs 2> /dev/null | cat - ${specfiles} | awk -v directive=$1 'BEGIN { pspec=""; spec=""; outside=1 } | |
$1=="*"directive":" { pspec=spec; spec=""; outside=0; next } | |
outside || NF==0 || ( substr($1,1,1)=="*" && substr($1,length($1),1)==":" ) { outside=1; next } | |
spec=="" && substr($0,1,1)=="+" { spec=pspec " " substr($0,2); next } | |
{ spec=spec $0 } | |
END { print spec }'; | |
return 0 | |
} | |
_gcc-specs-exists () | |
{ | |
[[ -f $(_gcc-install-dir)/$1 ]] | |
} | |
_gcc_fullversion () | |
{ | |
local ver="$1"; | |
shift; | |
set -- $($(tc-getCPP "$@") -E -P - <<<"__GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__"); | |
eval echo "$ver" | |
} | |
_is_flagq () | |
{ | |
local x var="$1[*]"; | |
for x in ${!var}; | |
do | |
[[ ${x} == $2 ]] && return 0; | |
done; | |
return 1 | |
} | |
_multibuild_run () | |
{ | |
local i=1; | |
while [[ ${!i} == _* ]]; do | |
(( i += 1 )); | |
done; | |
[[ ${i} -le ${#} ]] && einfo "${v}: running ${@:${i}}"; | |
"${@}" | |
} | |
_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_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 sysconfig; print(sysconfig.get_path("purelib"))') || 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 sysconfig; print(sysconfig.get_path("platinclude"))') || 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 | |
python2* | python3.6 | python3.7*) | |
val=$($(tc-getPKG_CONFIG) --libs ${impl/n/n-}) || die | |
;; | |
python*) | |
val=$($(tc-getPKG_CONFIG) --libs ${impl/n/n-}-embed) || die | |
;; | |
*) | |
die "${impl}: obtaining ${var} not supported" | |
;; | |
esac; | |
export PYTHON_LIBS=${val}; | |
debug-print "${FUNCNAME}: PYTHON_LIBS = ${PYTHON_LIBS}" | |
;; | |
PYTHON_CONFIG) | |
local flags val; | |
case "${impl}" in | |
python*) | |
[[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it"; | |
flags=$("${PYTHON}" -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' | |
;; | |
python*) | |
PYTHON_PKG_DEP="dev-lang/python:${impl#python}" | |
;; | |
pypy) | |
PYTHON_PKG_DEP='>=dev-python/pypy-7.3.0:0=' | |
;; | |
pypy3) | |
PYTHON_PKG_DEP='>=dev-python/pypy3-7.3.0:0=' | |
;; | |
*) | |
die "Invalid implementation: ${impl}" | |
;; | |
esac; | |
if [[ -n ${PYTHON_REQ_USE} ]]; then | |
PYTHON_PKG_DEP+=[${PYTHON_REQ_USE}]; | |
fi; | |
export PYTHON_PKG_DEP; | |
debug-print "${FUNCNAME}: PYTHON_PKG_DEP = ${PYTHON_PKG_DEP}" | |
;; | |
PYTHON_SCRIPTDIR) | |
local dir; | |
export PYTHON_SCRIPTDIR=${EPREFIX}/usr/lib/python-exec/${impl}; | |
debug-print "${FUNCNAME}: PYTHON_SCRIPTDIR = ${PYTHON_SCRIPTDIR}" | |
;; | |
*) | |
die "_python_export: unknown variable ${var}" | |
;; | |
esac; | |
done | |
} | |
_python_gen_usedep () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local impl matches=(); | |
_python_verify_patterns "${@}"; | |
for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; | |
do | |
if _python_impl_matches "${impl}" "${@}"; then | |
matches+=("python_targets_${impl}(-)?" "-python_single_target_${impl}(-)"); | |
fi; | |
done; | |
[[ -n ${matches[@]} ]] || die "No supported implementations match python_gen_usedep patterns: ${@}"; | |
local out=${matches[@]}; | |
echo "${out// /,}" | |
} | |
_python_impl_matches () | |
{ | |
[[ ${#} -ge 1 ]] || die "${FUNCNAME}: takes at least 1 parameter"; | |
[[ ${#} -eq 1 ]] && return 0; | |
local impl=${1} pattern; | |
shift; | |
for pattern in "$@"; | |
do | |
if [[ ${pattern} == -2 ]]; then | |
python_is_python3 "${impl}" || return 0; | |
else | |
if [[ ${pattern} == -3 ]]; then | |
python_is_python3 "${impl}" && return 0; | |
return; | |
else | |
if [[ ${impl/./_} == ${pattern/./_} ]]; then | |
return 0; | |
fi; | |
fi; | |
fi; | |
done; | |
return 1 | |
} | |
_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; | |
if [[ ! -n ${PYTHON_COMPAT_NO_STRICT} ]]; then | |
for i in "${PYTHON_COMPAT[@]}"; | |
do | |
case ${i} in | |
jython2_7 | pypy | pypy1_[89] | pypy2_0 | pypy3 | python2_[5-7] | python3_[1-9] | python3_10) | |
;; | |
*) | |
if has "${i}" "${_PYTHON_ALL_IMPLS[@]}" "${_PYTHON_HISTORICAL_IMPLS[@]}"; then | |
die "Mis-synced patterns in _python_set_impls: missing ${i}"; | |
else | |
die "Invalid implementation in PYTHON_COMPAT: ${i}"; | |
fi | |
;; | |
esac; | |
done; | |
fi; | |
local supp=() unsupp=(); | |
for i in "${_PYTHON_ALL_IMPLS[@]}"; | |
do | |
if has "${i}" "${PYTHON_COMPAT[@]}"; then | |
supp+=("${i}"); | |
else | |
unsupp+=("${i}"); | |
fi; | |
done; | |
if [[ ! -n ${supp[@]} ]]; then | |
if [[ -n ${_PYTHON_ALLOW_PY27} ]] && has python2_7 "${PYTHON_COMPAT[@]}"; then | |
supp+=(python2_7); | |
else | |
die "No supported implementation in PYTHON_COMPAT."; | |
fi; | |
fi; | |
if [[ -n ${_PYTHON_SUPPORTED_IMPLS[@]} ]]; then | |
if [[ ${_PYTHON_SUPPORTED_IMPLS[@]} != ${supp[@]} ]]; then | |
eerror "Supported impls (PYTHON_COMPAT) changed between inherits!"; | |
eerror "Before: ${_PYTHON_SUPPORTED_IMPLS[*]}"; | |
eerror "Now : ${supp[*]}"; | |
die "_PYTHON_SUPPORTED_IMPLS integrity check failed"; | |
fi; | |
if [[ ${_PYTHON_UNSUPPORTED_IMPLS[@]} != ${unsupp[@]} ]]; then | |
eerror "Unsupported impls changed between inherits!"; | |
eerror "Before: ${_PYTHON_UNSUPPORTED_IMPLS[*]}"; | |
eerror "Now : ${unsupp[*]}"; | |
die "_PYTHON_UNSUPPORTED_IMPLS integrity check failed"; | |
fi; | |
else | |
_PYTHON_SUPPORTED_IMPLS=("${supp[@]}"); | |
_PYTHON_UNSUPPORTED_IMPLS=("${unsupp[@]}"); | |
readonly _PYTHON_SUPPORTED_IMPLS _PYTHON_UNSUPPORTED_IMPLS; | |
fi | |
} | |
_python_validate_useflags () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
if [[ -n ${PYTHON_COMPAT_OVERRIDE} ]]; then | |
if [[ ! -n ${_PYTHON_COMPAT_OVERRIDE_WARNED} ]]; then | |
ewarn "WARNING: PYTHON_COMPAT_OVERRIDE in effect. The following Python"; | |
ewarn "implementations will be enabled:"; | |
ewarn; | |
ewarn " ${PYTHON_COMPAT_OVERRIDE}"; | |
ewarn; | |
ewarn "Dependencies won't be satisfied, and PYTHON_TARGETS will be ignored."; | |
_PYTHON_COMPAT_OVERRIDE_WARNED=1; | |
fi; | |
return; | |
fi; | |
local i; | |
for i in "${_PYTHON_SUPPORTED_IMPLS[@]}"; | |
do | |
use "python_targets_${i}" && return 0; | |
done; | |
eerror "No Python implementation selected for the build. Please add one"; | |
eerror "of the following values to your PYTHON_TARGETS (in make.conf):"; | |
eerror; | |
eerror "${PYTHON_COMPAT[@]}"; | |
echo; | |
die "No supported Python implementation in PYTHON_TARGETS." | |
} | |
_python_verify_patterns () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local impl pattern; | |
for pattern in "$@"; | |
do | |
[[ ${pattern} == -[23] ]] && continue; | |
for impl in "${_PYTHON_ALL_IMPLS[@]}" "${_PYTHON_HISTORICAL_IMPLS[@]}"; | |
do | |
[[ ${impl} == ${pattern/./_} ]] && continue 2; | |
done; | |
die "Invalid implementation pattern: ${pattern}"; | |
done | |
} | |
_python_wrapper_setup () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local workdir=${1:-${T}/${EPYTHON}}; | |
local impl=${2:-${EPYTHON}}; | |
[[ -n ${workdir} ]] || die "${FUNCNAME}: no workdir specified."; | |
[[ -n ${impl} ]] || die "${FUNCNAME}: no impl nor EPYTHON specified."; | |
if [[ ! -x ${workdir}/bin/python ]]; then | |
mkdir -p "${workdir}"/{bin,pkgconfig} || die; | |
rm -f "${workdir}"/bin/python{,2,3}{,-config} || die; | |
rm -f "${workdir}"/bin/2to3 || die; | |
rm -f "${workdir}"/pkgconfig/python{2,3}{,-embed}.pc || die; | |
local EPYTHON PYTHON; | |
_python_export "${impl}" EPYTHON PYTHON; | |
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${pyver}.pc || die; | |
if [[ ${EPYTHON} != python[23].[67] ]]; then | |
ln -s "${EPREFIX}"/usr/$(get_libdir)/pkgconfig/${EPYTHON/n/n-}-embed.pc "${workdir}"/pkgconfig/python${pyver}-embed.pc || die; | |
fi; | |
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 | |
} | |
_setup-allowed-flags () | |
{ | |
ALLOWED_FLAGS=(-pipe -O '-O[12sg]' -mcpu -march -mtune '-fstack-protector*' '-fsanitize*' '-fno-sanitize*' '-fstack-check*' -fno-stack-check -fbounds-check -fbounds-checking -fno-strict-overflow -fno-PIE -fno-pie -nopie -no-pie -fno-unit-at-a-time -g '-g[0-9]' -ggdb '-ggdb[0-9]' -gdwarf '-gdwarf-*' -gstabs -gstabs+ -gz -fno-ident -fpermissive -frecord-gcc-switches '-fdiagnostics*' '-fplugin*' '-W*' -w '-[DUILR]*' '-Wl,*' '-fuse-ld'); | |
ALLOWED_FLAGS+=('-fno-stack-protector*' '-fabi-version=*' -fno-strict-aliasing -fno-bounds-check -fno-bounds-checking -fstrict-overflow -fno-omit-frame-pointer '-fno-builtin*'); | |
ALLOWED_FLAGS+=(-mregparm -mno-app-regs -mapp-regs -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-ssse3 -mno-sse4 -mno-sse4.1 -mno-sse4.2 -mno-avx -mno-aes -mno-pclmul -mno-sse4a -mno-3dnow -mno-popcnt -mno-abm -mips1 -mips2 -mips3 -mips4 -mips32 -mips64 -mips16 -mplt -msoft-float -mno-soft-float -mhard-float -mno-hard-float -mfpu -mieee -mieee-with-inexact -mschedule -mfloat-gprs -mspe -mno-spe -mtls-direct-seg-refs -mno-tls-direct-seg-refs -mflat -mno-flat -mno-faster-structs -mfaster-structs -m32 -m64 -mx32 -mabi -mlittle-endian -mbig-endian -EL -EB -fPIC -mlive-g0 -mcmodel -mstack-bias -mno-stack-bias -msecure-plt '-m*-toc' -mfloat-abi -mfix-r4000 -mno-fix-r4000 -mfix-r4400 -mno-fix-r4400 -mfix-rm7000 -mno-fix-rm7000 -mfix-r10000 -mno-fix-r10000 -mr10k-cache-barrier -mthumb -marm -mno-fma4 -mno-movbe -mno-xop -mno-lwp -mno-fsgsbase -mno-rdrnd -mno-f16c -mno-bmi -mno-tbm -mno-avx2 -mno-bmi2 -mno-fma -mno-lzcnt -mno-fxsr -mno-hle -mno-rtm -mno-xsave -mno-xsaveopt -mno-avx512cd -mno-avx512er -mno-avx512f -mno-avx512pf -mno-sha); | |
ALLOWED_FLAGS+=(-mstackrealign) | |
} | |
_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}" | |
} | |
_test-flag-PROG () | |
{ | |
local comp=$1; | |
local lang=$2; | |
shift 2; | |
if [[ -z ${comp} ]]; then | |
return 1; | |
fi; | |
if [[ -z $1 ]]; then | |
return 1; | |
fi; | |
comp=($(tc-get${comp})); | |
if ! type -p ${comp[0]} > /dev/null; then | |
return 1; | |
fi; | |
local in_src in_ext cmdline_extra=(); | |
case "${lang}" in | |
c) | |
in_ext='c'; | |
in_src='int main(void) { return 0; }'; | |
cmdline_extra+=(-xc -c) | |
;; | |
c++) | |
in_ext='cc'; | |
in_src='int main(void) { return 0; }'; | |
cmdline_extra+=(-xc++ -c) | |
;; | |
f77) | |
in_ext='f'; | |
in_src=' end'; | |
cmdline_extra+=(-xf77 -c) | |
;; | |
f95) | |
in_ext='f90'; | |
in_src='end'; | |
cmdline_extra+=(-xf95 -c) | |
;; | |
c+ld) | |
in_ext='c'; | |
in_src='int main(void) { return 0; }'; | |
cmdline_extra+=(-xc) | |
;; | |
esac; | |
local test_in=${T}/test-flag.${in_ext}; | |
local test_out=${T}/test-flag.exe; | |
printf "%s\n" "${in_src}" > "${test_in}" || die "Failed to create '${test_in}'"; | |
local cmdline=("${comp[@]}" -Werror "$@" "${cmdline_extra[@]}" "${test_in}" -o "${test_out}"); | |
if ! "${cmdline[@]}" &> /dev/null; then | |
cmdline+=(-Qunused-arguments); | |
"${cmdline[@]}" &> /dev/null; | |
fi | |
} | |
_test-flags-PROG () | |
{ | |
local comp=$1; | |
local flags=(); | |
local x; | |
shift; | |
[[ -z ${comp} ]] && return 1; | |
while (( $# )); do | |
case "$1" in | |
--param | -B) | |
if test-flag-${comp} "$1" "$2"; then | |
flags+=("$1" "$2"); | |
fi; | |
shift 2 | |
;; | |
*) | |
if test-flag-${comp} "$1"; then | |
flags+=("$1"); | |
fi; | |
shift 1 | |
;; | |
esac; | |
done; | |
echo "${flags[*]}"; | |
[[ ${#flags[@]} -gt 0 ]] | |
} | |
all-flag-vars () | |
{ | |
echo {ADA,C,CPP,CXX,CCAS,F,FC,LD}FLAGS | |
} | |
append-cflags () | |
{ | |
[[ $# -eq 0 ]] && return 0; | |
export CFLAGS+=" $*"; | |
return 0 | |
} | |
append-cppflags () | |
{ | |
[[ $# -eq 0 ]] && return 0; | |
export CPPFLAGS+=" $*"; | |
return 0 | |
} | |
append-cxxflags () | |
{ | |
[[ $# -eq 0 ]] && return 0; | |
export CXXFLAGS+=" $*"; | |
return 0 | |
} | |
append-fflags () | |
{ | |
[[ $# -eq 0 ]] && return 0; | |
export FFLAGS+=" $*"; | |
export FCFLAGS+=" $*"; | |
return 0 | |
} | |
append-flags () | |
{ | |
[[ $# -eq 0 ]] && return 0; | |
case " $* " in | |
*' '-[DIU]*) | |
eqawarn 'please use append-cppflags for preprocessor flags' | |
;; | |
*' '-L* | *' '-Wl,*) | |
eqawarn 'please use append-ldflags for linker flags' | |
;; | |
esac; | |
append-cflags "$@"; | |
append-cxxflags "$@"; | |
append-fflags "$@"; | |
return 0 | |
} | |
append-ldflags () | |
{ | |
[[ $# -eq 0 ]] && return 0; | |
local flag; | |
for flag in "$@"; | |
do | |
[[ ${flag} == -l* ]] && eqawarn "Appending a library link instruction (${flag}); libraries to link to should not be passed through LDFLAGS"; | |
done; | |
export LDFLAGS="${LDFLAGS} $*"; | |
return 0 | |
} | |
append-lfs-flags () | |
{ | |
[[ $# -ne 0 ]] && die "append-lfs-flags takes no arguments"; | |
append-cppflags -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE | |
} | |
append-libs () | |
{ | |
[[ $# -eq 0 ]] && return 0; | |
local flag; | |
for flag in "$@"; | |
do | |
if [[ -z "${flag// }" ]]; then | |
eqawarn "Appending an empty argument to LIBS is invalid! Skipping."; | |
continue; | |
fi; | |
case $flag in | |
-[lL]*) | |
export LIBS="${LIBS} ${flag}" | |
;; | |
-*) | |
eqawarn "Appending non-library to LIBS (${flag}); Other linker flags should be passed via LDFLAGS"; | |
export LIBS="${LIBS} ${flag}" | |
;; | |
*) | |
export LIBS="${LIBS} -l${flag}" | |
;; | |
esac; | |
done; | |
return 0 | |
} | |
build_sphinx () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ ${#} -eq 1 ]] || die "${FUNCNAME} takes 1 arg: <directory>"; | |
local dir=${1}; | |
sed -i -e 's:^intersphinx_mapping:disabled_&:' "${dir}"/conf.py || die; | |
sphinx-build -b html -d "${dir}"/_build/doctrees "${dir}" "${dir}"/_build/html || die; | |
HTML_DOCS+=("${dir}/_build/html/.") | |
} | |
clang-fullversion () | |
{ | |
_clang_fullversion '$1.$2.$3' "$@" | |
} | |
clang-major-version () | |
{ | |
_clang_fullversion '$1' "$@" | |
} | |
clang-micro-version () | |
{ | |
_clang_fullversion '$3' "$@" | |
} | |
clang-minor-version () | |
{ | |
_clang_fullversion '$2' "$@" | |
} | |
clang-version () | |
{ | |
_clang_fullversion '$1.$2' "$@" | |
} | |
cmake-utils_src_make () | |
{ | |
die "cmake-utils_src_make is banned. Use cmake_build instead" | |
} | |
cmake-utils_use () | |
{ | |
_cmake_banned_func "" "$@" | |
} | |
cmake-utils_use_build () | |
{ | |
_cmake_banned_func BUILD_ "$@" | |
} | |
cmake-utils_use_disable () | |
{ | |
_cmake_banned_func DISABLE_ "$@" | |
} | |
cmake-utils_use_enable () | |
{ | |
_cmake_banned_func ENABLE_ "$@" | |
} | |
cmake-utils_use_has () | |
{ | |
_cmake_banned_func HAVE_ "$@" | |
} | |
cmake-utils_use_no () | |
{ | |
_cmake_banned_func NO_ "$@" | |
} | |
cmake-utils_use_use () | |
{ | |
_cmake_banned_func USE_ "$@" | |
} | |
cmake-utils_use_want () | |
{ | |
_cmake_banned_func WANT_ "$@" | |
} | |
cmake-utils_use_with () | |
{ | |
_cmake_banned_func WITH_ "$@" | |
} | |
cmake-utils_useno () | |
{ | |
_cmake_banned_func "" "$@" | |
} | |
cmake_build () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
_cmake_check_build_dir; | |
pushd "${BUILD_DIR}" > /dev/null || die; | |
case ${CMAKE_MAKEFILE_GENERATOR} in | |
emake) | |
[[ -e Makefile ]] || die "Makefile not found. Error during configure stage."; | |
case ${CMAKE_VERBOSE} in | |
OFF) | |
emake "$@" | |
;; | |
*) | |
emake VERBOSE=1 "$@" | |
;; | |
esac | |
;; | |
ninja) | |
[[ -e build.ninja ]] || die "build.ninja not found. Error during configure stage."; | |
eninja "$@" | |
;; | |
esac; | |
popd > /dev/null || die | |
} | |
cmake_comment_add_subdirectory () | |
{ | |
if [[ -z ${1} ]]; then | |
die "${FUNCNAME[0]} must be passed at least one directory name to comment"; | |
fi; | |
[[ -e "CMakeLists.txt" ]] || return; | |
local d; | |
for d in $@; | |
do | |
d=${d//\//\\/}; | |
sed -e "/add_subdirectory[[:space:]]*([[:space:]]*${d}[[:space:]]*)/I s/^/#DONOTCOMPILE /" -i CMakeLists.txt || die "failed to comment add_subdirectory(${d})"; | |
done | |
} | |
cmake_run_in () | |
{ | |
if [[ -z ${2} ]]; then | |
die "${FUNCNAME[0]} must be passed at least two arguments"; | |
fi; | |
[[ -e ${1} ]] || die "${FUNCNAME[0]}: Nonexistent path: ${1}"; | |
pushd ${1} > /dev/null || die; | |
"${@:2}"; | |
popd > /dev/null || die | |
} | |
cmake_src_compile () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
cmake_build "$@" | |
} | |
cmake_src_configure () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
[[ -n ${_CMAKE_SRC_PREPARE_HAS_RUN} ]] || die "FATAL: cmake_src_prepare has not been run"; | |
_cmake_check_build_dir; | |
xdg_environment_reset; | |
local build_rules=${BUILD_DIR}/gentoo_rules.cmake; | |
cat > "${build_rules}" <<-_EOF_ || | |
set(CMAKE_ASM_COMPILE_OBJECT "<CMAKE_ASM_COMPILER> <DEFINES> <INCLUDES> ${CPPFLAGS} <FLAGS> -o <OBJECT> -c <SOURCE>" CACHE STRING "ASM compile command" FORCE) | |
set(CMAKE_ASM-ATT_COMPILE_OBJECT "<CMAKE_ASM-ATT_COMPILER> <DEFINES> <INCLUDES> ${CPPFLAGS} <FLAGS> -o <OBJECT> -c -x assembler <SOURCE>" CACHE STRING "ASM-ATT compile command" FORCE) | |
set(CMAKE_ASM-ATT_LINK_FLAGS "-nostdlib" CACHE STRING "ASM-ATT link flags" FORCE) | |
set(CMAKE_C_COMPILE_OBJECT "<CMAKE_C_COMPILER> <DEFINES> <INCLUDES> ${CPPFLAGS} <FLAGS> -o <OBJECT> -c <SOURCE>" CACHE STRING "C compile command" FORCE) | |
set(CMAKE_CXX_COMPILE_OBJECT "<CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> ${CPPFLAGS} <FLAGS> -o <OBJECT> -c <SOURCE>" CACHE STRING "C++ compile command" FORCE) | |
set(CMAKE_Fortran_COMPILE_OBJECT "<CMAKE_Fortran_COMPILER> <DEFINES> <INCLUDES> ${FCFLAGS} <FLAGS> -o <OBJECT> -c <SOURCE>" CACHE STRING "Fortran compile command" FORCE) | |
_EOF_ | |
die | |
local myCC=$(tc-getCC) myCXX=$(tc-getCXX) myFC=$(tc-getFC); | |
local toolchain_file=${BUILD_DIR}/gentoo_toolchain.cmake; | |
cat > ${toolchain_file} <<-_EOF_ || | |
set(CMAKE_ASM_COMPILER "${myCC/ /;}") | |
set(CMAKE_ASM-ATT_COMPILER "${myCC/ /;}") | |
set(CMAKE_C_COMPILER "${myCC/ /;}") | |
set(CMAKE_CXX_COMPILER "${myCXX/ /;}") | |
set(CMAKE_Fortran_COMPILER "${myFC/ /;}") | |
set(CMAKE_AR $(type -P $(tc-getAR)) CACHE FILEPATH "Archive manager" FORCE) | |
set(CMAKE_RANLIB $(type -P $(tc-getRANLIB)) CACHE FILEPATH "Archive index generator" FORCE) | |
set(CMAKE_SYSTEM_PROCESSOR "${CHOST%%-*}") | |
_EOF_ | |
die | |
local -x ASMFLAGS=${CFLAGS}; | |
local -x PKG_CONFIG=$(tc-getPKG_CONFIG); | |
if tc-is-cross-compiler; then | |
local sysname; | |
case "${KERNEL:-linux}" in | |
Cygwin) | |
sysname="CYGWIN_NT-5.1" | |
;; | |
HPUX) | |
sysname="HP-UX" | |
;; | |
linux) | |
sysname="Linux" | |
;; | |
Winnt) | |
sysname="Windows"; | |
cat >> "${toolchain_file}" <<-_EOF_ || | |
set(CMAKE_RC_COMPILER $(tc-getRC)) | |
_EOF_ | |
die | |
;; | |
*) | |
sysname="${KERNEL}" | |
;; | |
esac | |
cat >> "${toolchain_file}" <<-_EOF_ || | |
set(CMAKE_SYSTEM_NAME "${sysname}") | |
_EOF_ | |
die | |
if [ "${SYSROOT:-/}" != "/" ]; then | |
cat >> "${toolchain_file}" <<-_EOF_ || | |
set(CMAKE_FIND_ROOT_PATH "${SYSROOT}") | |
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) | |
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) | |
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) | |
_EOF_ | |
die; | |
fi; | |
fi | |
if use prefix-guest; then | |
cat >> "${build_rules}" <<-_EOF_ || | |
# in Prefix we need rpath and must ensure cmake gets our default linker path | |
# right ... except for Darwin hosts | |
if(NOT APPLE) | |
set(CMAKE_SKIP_RPATH OFF CACHE BOOL "" FORCE) | |
set(CMAKE_PLATFORM_REQUIRED_RUNTIME_PATH "${EPREFIX}/usr/${CHOST}/lib/gcc;${EPREFIX}/usr/${CHOST}/lib;${EPREFIX}/usr/$(get_libdir);${EPREFIX}/$(get_libdir)" CACHE STRING "" FORCE) | |
else() | |
set(CMAKE_PREFIX_PATH "${EPREFIX}/usr" CACHE STRING "" FORCE) | |
set(CMAKE_MACOSX_RPATH ON CACHE BOOL "" FORCE) | |
set(CMAKE_SKIP_BUILD_RPATH OFF CACHE BOOL "" FORCE) | |
set(CMAKE_SKIP_RPATH OFF CACHE BOOL "" FORCE) | |
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE CACHE BOOL "" FORCE) | |
endif() | |
_EOF_ | |
die; | |
fi | |
local common_config=${BUILD_DIR}/gentoo_common_config.cmake; | |
local libdir=$(get_libdir); | |
cat > "${common_config}" <<-_EOF_ || | |
set(CMAKE_GENTOO_BUILD ON CACHE BOOL "Indicate Gentoo package build") | |
set(LIB_SUFFIX ${libdir/lib} CACHE STRING "library path suffix" FORCE) | |
set(CMAKE_INSTALL_LIBDIR ${libdir} CACHE PATH "Output directory for libraries") | |
set(CMAKE_INSTALL_INFODIR "${EPREFIX}/usr/share/info" CACHE PATH "") | |
set(CMAKE_INSTALL_MANDIR "${EPREFIX}/usr/share/man" CACHE PATH "") | |
set(CMAKE_USER_MAKE_RULES_OVERRIDE "${build_rules}" CACHE FILEPATH "Gentoo override rules") | |
set(CMAKE_INSTALL_DOCDIR "${EPREFIX}/usr/share/doc/${PF}" CACHE PATH "") | |
set(BUILD_SHARED_LIBS ON CACHE BOOL "") | |
_EOF_ | |
die | |
if [[ -n ${_ECM_ECLASS} ]]; then | |
echo 'set(ECM_DISABLE_QMLPLUGINDUMP ON CACHE BOOL "")' >> "${common_config}" || die; | |
fi; | |
if [[ "${ARCH}" == riscv ]]; then | |
echo 'set(CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX '"${libdir#lib}"' CACHE STRING "library search suffix" FORCE)' >> "${common_config}" || die; | |
fi; | |
if [[ "${NOCOLOR}" = true || "${NOCOLOR}" = yes ]]; then | |
echo 'set(CMAKE_COLOR_MAKEFILE OFF CACHE BOOL "pretty colors during make" FORCE)' >> "${common_config}" || die; | |
fi; | |
if [[ ${CMAKE_BUILD_TYPE} != Gentoo ]]; then | |
cat >> ${common_config} <<-_EOF_ || | |
set(CMAKE_ASM_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "") | |
set(CMAKE_ASM-ATT_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "") | |
set(CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "") | |
set(CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "") | |
set(CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "") | |
set(CMAKE_EXE_LINKER_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "") | |
set(CMAKE_MODULE_LINKER_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "") | |
set(CMAKE_SHARED_LINKER_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "") | |
set(CMAKE_STATIC_LINKER_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "") | |
_EOF_ | |
die; | |
fi | |
[[ -z ${mycmakeargs} ]] && declare -a mycmakeargs=(); | |
local mycmakeargstype=$(declare -p mycmakeargs 2>&-); | |
if [[ "${mycmakeargstype}" != "declare -a mycmakeargs="* ]]; then | |
die "mycmakeargs must be declared as array"; | |
fi; | |
local mycmakeargs_local=("${mycmakeargs[@]}"); | |
local warn_unused_cli=""; | |
if [[ ${CMAKE_WARN_UNUSED_CLI} == no ]]; then | |
warn_unused_cli="--no-warn-unused-cli"; | |
fi; | |
local generator_name; | |
case ${CMAKE_MAKEFILE_GENERATOR} in | |
ninja) | |
generator_name="Ninja" | |
;; | |
emake) | |
generator_name="Unix Makefiles" | |
;; | |
esac; | |
local cmakeargs=(${warn_unused_cli} -C "${common_config}" -G "${generator_name}" -DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr" "${mycmakeargs_local[@]}" -DCMAKE_BUILD_TYPE="${CMAKE_BUILD_TYPE}" -DCMAKE_TOOLCHAIN_FILE="${toolchain_file}" "${MYCMAKEARGS}"); | |
if [[ -n "${CMAKE_EXTRA_CACHE_FILE}" ]]; then | |
cmakeargs+=(-C "${CMAKE_EXTRA_CACHE_FILE}"); | |
fi; | |
pushd "${BUILD_DIR}" > /dev/null || die; | |
debug-print "${LINENO} ${ECLASS} ${FUNCNAME}: mycmakeargs is ${mycmakeargs_local[*]}"; | |
echo "${CMAKE_BINARY}" "${cmakeargs[@]}" "${CMAKE_USE_DIR}"; | |
"${CMAKE_BINARY}" "${cmakeargs[@]}" "${CMAKE_USE_DIR}" || die "cmake failed"; | |
popd > /dev/null || die | |
} | |
cmake_src_install () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
_cmake_check_build_dir; | |
pushd "${BUILD_DIR}" > /dev/null || die; | |
DESTDIR="${D}" ${CMAKE_MAKEFILE_GENERATOR} install "$@" || die "died running ${CMAKE_MAKEFILE_GENERATOR} install"; | |
popd > /dev/null || die; | |
pushd "${S}" > /dev/null || die; | |
einstalldocs; | |
popd > /dev/null || die | |
} | |
cmake_src_prepare () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
pushd "${S}" > /dev/null || die; | |
default_src_prepare; | |
_cmake_check_build_dir; | |
if [[ ! -e ${CMAKE_USE_DIR}/CMakeLists.txt ]]; then | |
eerror "Unable to locate CMakeLists.txt under:"; | |
eerror "\"${CMAKE_USE_DIR}/CMakeLists.txt\""; | |
eerror "Consider not inheriting the cmake eclass."; | |
die "FATAL: Unable to find CMakeLists.txt"; | |
fi; | |
if [[ ${CMAKE_MAKEFILE_GENERATOR} == ninja ]] && ! has_version -b dev-util/ninja; then | |
eerror "CMAKE_MAKEFILE_GENERATOR is set to ninja, but ninja is not installed."; | |
die "Please install dev-util/ninja or unset CMAKE_MAKEFILE_GENERATOR."; | |
fi; | |
local modules_list; | |
if [[ $(declare -p CMAKE_REMOVE_MODULES_LIST) == "declare -a"* ]]; then | |
modules_list=("${CMAKE_REMOVE_MODULES_LIST[@]}"); | |
else | |
modules_list=(${CMAKE_REMOVE_MODULES_LIST}); | |
fi; | |
local name; | |
for name in "${modules_list[@]}"; | |
do | |
find "${S}" -name ${name}.cmake -exec rm -v {} + || die; | |
done; | |
_cmake_modify-cmakelists; | |
popd > /dev/null || die; | |
if [[ -n ${CMAKE_QA_SRC_DIR_READONLY} && ! -n ${CMAKE_IN_SOURCE_BUILD} ]]; then | |
chmod -R a-w "${S}"; | |
fi; | |
_CMAKE_SRC_PREPARE_HAS_RUN=1 | |
} | |
cmake_src_test () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
_cmake_check_build_dir; | |
pushd "${BUILD_DIR}" > /dev/null || die; | |
[[ -e CTestTestfile.cmake ]] || { | |
echo "No tests found. Skipping."; | |
return 0 | |
}; | |
[[ -n ${TEST_VERBOSE} ]] && myctestargs+=(--extra-verbose --output-on-failure); | |
set -- ctest -j "$(makeopts_jobs)" --test-load "$(makeopts_loadavg)" "${myctestargs[@]}" "$@"; | |
echo "$@" 1>&2; | |
if "$@"; then | |
einfo "Tests succeeded."; | |
popd > /dev/null || die; | |
return 0; | |
else | |
if [[ -n "${CMAKE_YES_I_WANT_TO_SEE_THE_TEST_LOG}" ]]; then | |
eerror "Tests failed. Test log ${BUILD_DIR}/Testing/Temporary/LastTest.log follows:"; | |
eerror "--START TEST LOG--------------------------------------------------------------"; | |
cat "${BUILD_DIR}/Testing/Temporary/LastTest.log"; | |
eerror "--END TEST LOG----------------------------------------------------------------"; | |
die "Tests failed."; | |
else | |
die "Tests failed. When you file a bug, please attach the following file: \n\t${BUILD_DIR}/Testing/Temporary/LastTest.log"; | |
fi; | |
popd > /dev/null || die; | |
return 1; | |
fi | |
} | |
cmake_use_find_package () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
if [[ "$#" != 2 || -z $1 ]]; then | |
die "Usage: cmake_use_find_package <USE flag> <package name>"; | |
fi; | |
echo "-DCMAKE_DISABLE_FIND_PACKAGE_$2=$(use $1 && echo OFF || echo ON)" | |
} | |
comment_add_subdirectory () | |
{ | |
die "comment_add_subdirectory is banned. Use cmake_comment_add_subdirectory instead" | |
} | |
eapply () | |
{ | |
local failed patch_cmd=patch; | |
local -x LC_COLLATE=POSIX; | |
type -P gpatch > /dev/null && patch_cmd=gpatch; | |
function _eapply_patch () | |
{ | |
local f=${1}; | |
local prefix=${2}; | |
ebegin "${prefix:-Applying }${f##*/}"; | |
local all_opts=(-p1 -f -g0 --no-backup-if-mismatch "${patch_options[@]}"); | |
if ${patch_cmd} "${all_opts[@]}" --dry-run -s -F0 < "${f}" &> /dev/null; then | |
all_opts+=(-s -F0); | |
fi; | |
${patch_cmd} "${all_opts[@]}" < "${f}"; | |
failed=${?}; | |
if ! eend "${failed}"; then | |
__helpers_die "patch -p1 ${patch_options[*]} failed with ${f}"; | |
fi | |
}; | |
local patch_options=() files=(); | |
local i found_doublehyphen; | |
for ((i = 1; i <= ${#@}; ++i )) | |
do | |
if [[ ${@:i:1} == -- ]]; then | |
patch_options=("${@:1:i-1}"); | |
files=("${@:i+1}"); | |
found_doublehyphen=1; | |
break; | |
fi; | |
done; | |
if [[ -z ${found_doublehyphen} ]]; then | |
for ((i = 1; i <= ${#@}; ++i )) | |
do | |
if [[ ${@:i:1} != -* ]]; then | |
patch_options=("${@:1:i-1}"); | |
files=("${@:i}"); | |
break; | |
fi; | |
done; | |
for i in "${files[@]}"; | |
do | |
if [[ ${i} == -* ]]; then | |
die "eapply: all options must be passed before non-options"; | |
fi; | |
done; | |
fi; | |
if [[ ${#files[@]} -eq 0 ]]; then | |
die "eapply: no files specified"; | |
fi; | |
local f; | |
for f in "${files[@]}"; | |
do | |
if [[ -d ${f} ]]; then | |
function _eapply_get_files () | |
{ | |
local LC_ALL=POSIX; | |
local prev_shopt=$(shopt -p nullglob); | |
shopt -s nullglob; | |
local f; | |
for f in "${1}"/*; | |
do | |
if [[ ${f} == *.diff || ${f} == *.patch ]]; then | |
files+=("${f}"); | |
fi; | |
done; | |
${prev_shopt} | |
}; | |
local files=(); | |
_eapply_get_files "${f}"; | |
[[ ${#files[@]} -eq 0 ]] && die "No *.{patch,diff} files in directory ${f}"; | |
einfo "Applying patches from ${f} ..."; | |
local f2; | |
for f2 in "${files[@]}"; | |
do | |
_eapply_patch "${f2}" ' '; | |
[[ ${failed} -ne 0 ]] && return "${failed}"; | |
done; | |
else | |
_eapply_patch "${f}"; | |
[[ ${failed} -ne 0 ]] && return "${failed}"; | |
fi; | |
done; | |
return 0 | |
} | |
eapply_user () | |
{ | |
[[ ${EBUILD_PHASE} == prepare ]] || die "eapply_user() called during invalid phase: ${EBUILD_PHASE}"; | |
local tagfile=${T}/.portage_user_patches_applied; | |
[[ -f ${tagfile} ]] && return; | |
>> "${tagfile}"; | |
local basedir=${PORTAGE_CONFIGROOT%/}/etc/portage/patches; | |
local applied d f; | |
local -A _eapply_user_patches; | |
local prev_shopt=$(shopt -p nullglob); | |
shopt -s nullglob; | |
for d in "${basedir}"/${CATEGORY}/{${P}-${PR},${P},${PN}}{:${SLOT%/*},}; | |
do | |
for f in "${d}"/*; | |
do | |
if [[ ( ${f} == *.diff || ${f} == *.patch ) && -z ${_eapply_user_patches[${f##*/}]} ]]; then | |
_eapply_user_patches[${f##*/}]=${f}; | |
fi; | |
done; | |
done; | |
if [[ ${#_eapply_user_patches[@]} -gt 0 ]]; then | |
while read -r -d '' f; do | |
f=${_eapply_user_patches[${f}]}; | |
if [[ -s ${f} ]]; then | |
eapply "${f}"; | |
applied=1; | |
fi; | |
done < <(printf -- '%s\0' "${!_eapply_user_patches[@]}" | | |
LC_ALL=C sort -z); | |
fi; | |
${prev_shopt}; | |
[[ -n ${applied} ]] && ewarn "User patches applied." | |
} | |
econf_build () | |
{ | |
local CBUILD=${CBUILD:-${CHOST}}; | |
tc-env_build econf --build=${CBUILD} --host=${CBUILD} "$@" | |
} | |
edos2unix () | |
{ | |
[[ $# -eq 0 ]] && return 0; | |
sed -i 's/\r$//' -- "$@" || die | |
} | |
einstalldocs () | |
{ | |
( if [[ $(declare -p DOCS 2>/dev/null) != *=* ]]; then | |
local d; | |
for d in README* ChangeLog AUTHORS NEWS TODO CHANGES THANKS BUGS FAQ CREDITS CHANGELOG; | |
do | |
[[ -f ${d} && -s ${d} ]] && docinto / && dodoc "${d}"; | |
done; | |
else | |
if ___is_indexed_array_var DOCS; then | |
[[ ${#DOCS[@]} -gt 0 ]] && docinto / && dodoc -r "${DOCS[@]}"; | |
else | |
[[ -n ${DOCS} ]] && docinto / && dodoc -r ${DOCS}; | |
fi; | |
fi ); | |
( if ___is_indexed_array_var HTML_DOCS; then | |
[[ ${#HTML_DOCS[@]} -gt 0 ]] && docinto html && dodoc -r "${HTML_DOCS[@]}"; | |
else | |
[[ -n ${HTML_DOCS} ]] && docinto html && dodoc -r ${HTML_DOCS}; | |
fi ) | |
} | |
emktemp () | |
{ | |
eqawarn "emktemp is deprecated. Create a temporary file in \${T} instead."; | |
local exe="touch"; | |
[[ $1 == -d ]] && exe="mkdir" && shift; | |
local topdir=$1; | |
if [[ -z ${topdir} ]]; then | |
[[ -z ${T} ]] && topdir="/tmp" || topdir=${T}; | |
fi; | |
if ! type -P mktemp > /dev/null; then | |
local tmp=/; | |
while [[ -e ${tmp} ]]; do | |
tmp=${topdir}/tmp.${RANDOM}.${RANDOM}.${RANDOM}; | |
done; | |
${exe} "${tmp}" || ${exe} -p "${tmp}"; | |
echo "${tmp}"; | |
else | |
if [[ ${exe} == "touch" ]]; then | |
TMPDIR="${topdir}" mktemp -t tmp.XXXXXXXXXX; | |
else | |
TMPDIR="${topdir}" mktemp -dt tmp.XXXXXXXXXX; | |
fi; | |
fi | |
} | |
eninja () | |
{ | |
local nonfatal_args=(); | |
[[ ${EAPI:-0} != [245] ]] && nonfatal_args+=(-n); | |
if [[ -z ${NINJAOPTS+set} ]]; then | |
NINJAOPTS="-j$(makeopts_jobs) -l$(makeopts_loadavg "${MAKEOPTS}" 0)"; | |
fi; | |
set -- ninja -v ${NINJAOPTS} "$@"; | |
echo "$@" 1>&2; | |
"$@" || die "${nonfatal_args[@]}" "${*} failed" | |
} | |
epytest () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ -n ${EPYTHON} ]] || die "EPYTHON unset, invalid call context"; | |
local args=(-vv -ra -l); | |
set -- "${EPYTHON}" -m pytest "${args[@]}" "${@}"; | |
echo "${@}" 1>&2; | |
"${@}" || die -n "pytest failed with ${EPYTHON}"; | |
return ${?} | |
} | |
eunittest () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ -n ${EPYTHON} ]] || die "EPYTHON unset, invalid call context"; | |
set -- "${EPYTHON}" -m unittest_or_fail discover -v "${@}"; | |
echo "${@}" 1>&2; | |
"${@}" || die -n "Tests failed with ${EPYTHON}"; | |
return ${?} | |
} | |
filter-flags () | |
{ | |
_filter-hardened "$@"; | |
local v; | |
for v in $(all-flag-vars); | |
do | |
_filter-var ${v} "$@"; | |
done; | |
return 0 | |
} | |
filter-ldflags () | |
{ | |
_filter-var LDFLAGS "$@"; | |
return 0 | |
} | |
filter-lfs-flags () | |
{ | |
[[ $# -ne 0 ]] && die "filter-lfs-flags takes no arguments"; | |
filter-flags -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE | |
} | |
filter-mfpmath () | |
{ | |
local orig_mfpmath new_math prune_math; | |
orig_mfpmath=$(get-flag -mfpmath); | |
new_math=$(get-flag mfpmath); | |
new_math=${new_math/both/387,sse}; | |
new_math=" ${new_math//[,+]/ } "; | |
prune_math=""; | |
for prune_math in "$@"; | |
do | |
new_math=${new_math/ ${prune_math} / }; | |
done; | |
new_math=$(echo ${new_math}); | |
new_math=${new_math// /,}; | |
if [[ -z ${new_math} ]]; then | |
filter-flags ${orig_mfpmath}; | |
else | |
replace-flags ${orig_mfpmath} -mfpmath=${new_math}; | |
fi; | |
return 0 | |
} | |
gcc-fullversion () | |
{ | |
_gcc_fullversion '$1.$2.$3' "$@" | |
} | |
gcc-major-version () | |
{ | |
_gcc_fullversion '$1' "$@" | |
} | |
gcc-micro-version () | |
{ | |
_gcc_fullversion '$3' "$@" | |
} | |
gcc-minor-version () | |
{ | |
_gcc_fullversion '$2' "$@" | |
} | |
gcc-specs-directive () | |
{ | |
local directive subdname subdirective; | |
directive="$(_gcc-specs-directive_raw $1)"; | |
while [[ ${directive} == *%\(*\)* ]]; do | |
subdname=${directive/*%\(}; | |
subdname=${subdname/\)*}; | |
subdirective="$(_gcc-specs-directive_raw ${subdname})"; | |
directive="${directive//\%(${subdname})/${subdirective}}"; | |
done; | |
echo "${directive}"; | |
return 0 | |
} | |
gcc-specs-nostrict () | |
{ | |
local directive; | |
directive=$(gcc-specs-directive cc1); | |
[[ "${directive/\{!fstrict-overflow:}" != "${directive}" ]] | |
} | |
gcc-specs-now () | |
{ | |
local directive; | |
directive=$(gcc-specs-directive link_command); | |
[[ "${directive/\{!nonow:}" != "${directive}" ]] | |
} | |
gcc-specs-pie () | |
{ | |
local directive; | |
directive=$(gcc-specs-directive cc1); | |
[[ "${directive/\{!nopie:}" != "${directive}" ]] | |
} | |
gcc-specs-relro () | |
{ | |
local directive; | |
directive=$(gcc-specs-directive link_command); | |
[[ "${directive/\{!norelro:}" != "${directive}" ]] | |
} | |
gcc-specs-ssp () | |
{ | |
local directive; | |
directive=$(gcc-specs-directive cc1); | |
[[ "${directive/\{!fno-stack-protector:}" != "${directive}" ]] | |
} | |
gcc-specs-ssp-to-all () | |
{ | |
local directive; | |
directive=$(gcc-specs-directive cc1); | |
[[ "${directive/\{!fno-stack-protector-all:}" != "${directive}" ]] | |
} | |
gcc-specs-stack-check () | |
{ | |
local directive; | |
directive=$(gcc-specs-directive cc1); | |
[[ "${directive/\{!fno-stack-check:}" != "${directive}" ]] | |
} | |
gcc-version () | |
{ | |
_gcc_fullversion '$1.$2' "$@" | |
} | |
gen_usr_ldscript () | |
{ | |
ewarn "${FUNCNAME}: Please migrate to usr-ldscript.eclass"; | |
local lib libdir=$(get_libdir) output_format="" auto=false suffix=$(get_libname); | |
[[ -z ${ED+set} ]] && local ED=${D%/}${EPREFIX}/; | |
tc-is-static-only && return; | |
if [[ $(type -t multilib_is_native_abi) == "function" ]]; then | |
multilib_is_native_abi || return 0; | |
fi; | |
case ${CTARGET:-${CHOST}} in | |
*-darwin*) | |
;; | |
*-android*) | |
return 0 | |
;; | |
*linux* | *-freebsd* | *-openbsd* | *-netbsd*) | |
use prefix && return 0 | |
;; | |
*) | |
return 0 | |
;; | |
esac; | |
dodir /usr/${libdir}; | |
if [[ $1 == "-a" ]]; then | |
auto=true; | |
shift; | |
dodir /${libdir}; | |
fi; | |
local flags=(${CFLAGS} ${LDFLAGS} -Wl,--verbose); | |
if $(tc-getLD) --version | grep -q 'GNU gold'; then | |
local d="${T}/bfd-linker"; | |
mkdir -p "${d}"; | |
ln -sf $(which ${CHOST}-ld.bfd) "${d}"/ld; | |
flags+=(-B"${d}"); | |
fi; | |
output_format=$($(tc-getCC) "${flags[@]}" 2>&1 | sed -n 's/^OUTPUT_FORMAT("\([^"]*\)",.*/\1/p'); | |
[[ -n ${output_format} ]] && output_format="OUTPUT_FORMAT ( ${output_format} )"; | |
for lib in "$@"; | |
do | |
local tlib; | |
if ${auto}; then | |
lib="lib${lib}${suffix}"; | |
else | |
[[ -r ${ED}/${libdir}/${lib} ]] || continue; | |
fi; | |
case ${CTARGET:-${CHOST}} in | |
*-darwin*) | |
if ${auto}; then | |
tlib=$(scanmacho -qF'%S#F' "${ED}"/usr/${libdir}/${lib}); | |
else | |
tlib=$(scanmacho -qF'%S#F' "${ED}"/${libdir}/${lib}); | |
fi; | |
[[ -z ${tlib} ]] && die "unable to read install_name from ${lib}"; | |
tlib=${tlib##*/}; | |
if ${auto}; then | |
mv "${ED}"/usr/${libdir}/${lib%${suffix}}.*${suffix#.} "${ED}"/${libdir}/ || die; | |
if [[ ${tlib} != ${lib%${suffix}}.*${suffix#.} ]]; then | |
mv "${ED}"/usr/${libdir}/${tlib%${suffix}}.*${suffix#.} "${ED}"/${libdir}/ || die; | |
fi; | |
rm -f "${ED}"/${libdir}/${lib}; | |
fi; | |
if [[ ! -w "${ED}/${libdir}/${tlib}" ]]; then | |
chmod u+w "${ED}${libdir}/${tlib}"; | |
local nowrite=yes; | |
fi; | |
install_name_tool -id "${EPREFIX}"/${libdir}/${tlib} "${ED}"/${libdir}/${tlib} || die "install_name_tool failed"; | |
[[ -n ${nowrite} ]] && chmod u-w "${ED}${libdir}/${tlib}"; | |
pushd "${ED}/usr/${libdir}" > /dev/null; | |
ln -snf "../../${libdir}/${tlib}" "${lib}"; | |
popd > /dev/null | |
;; | |
*) | |
if ${auto}; then | |
tlib=$(scanelf -qF'%S#F' "${ED}"/usr/${libdir}/${lib}); | |
[[ -z ${tlib} ]] && die "unable to read SONAME from ${lib}"; | |
mv "${ED}"/usr/${libdir}/${lib}* "${ED}"/${libdir}/ || die; | |
if [[ ${tlib} != ${lib}* ]]; then | |
mv "${ED}"/usr/${libdir}/${tlib}* "${ED}"/${libdir}/ || die; | |
fi; | |
rm -f "${ED}"/${libdir}/${lib}; | |
else | |
tlib=${lib}; | |
fi; | |
cat > "${ED}/usr/${libdir}/${lib}" <<-END_LDSCRIPT | |
/* GNU ld script | |
Since Gentoo has critical dynamic libraries in /lib, and the static versions | |
in /usr/lib, we need to have a "fake" dynamic lib in /usr/lib, otherwise we | |
run into linking problems. This "fake" dynamic lib is a linker script that | |
redirects the linker to the real lib. And yes, this works in the cross- | |
compiling scenario as the sysroot-ed linker will prepend the real path. | |
See bug https://bugs.gentoo.org/4411 for more info. | |
*/ | |
${output_format} | |
GROUP ( ${EPREFIX}/${libdir}/${tlib} ) | |
END_LDSCRIPT | |
;; | |
esac | |
fperms a+x "/usr/${libdir}/${lib}" || die "could not change perms on ${lib}"; | |
done | |
} | |
get-flag () | |
{ | |
[[ $# -ne 1 ]] && die "usage: <flag>"; | |
local f var findflag="$1"; | |
for var in $(all-flag-vars); | |
do | |
for f in ${!var}; | |
do | |
if [ "${f/${findflag}}" != "${f}" ]; then | |
printf "%s\n" "${f/-${findflag}=}"; | |
return 0; | |
fi; | |
done; | |
done; | |
return 1 | |
} | |
get_abi_CFLAGS () | |
{ | |
get_abi_var CFLAGS "$@" | |
} | |
get_abi_CHOST () | |
{ | |
get_abi_var CHOST "$@" | |
} | |
get_abi_CTARGET () | |
{ | |
get_abi_var CTARGET "$@" | |
} | |
get_abi_FAKE_TARGETS () | |
{ | |
get_abi_var FAKE_TARGETS "$@" | |
} | |
get_abi_LDFLAGS () | |
{ | |
get_abi_var LDFLAGS "$@" | |
} | |
get_abi_LIBDIR () | |
{ | |
get_abi_var LIBDIR "$@" | |
} | |
get_abi_var () | |
{ | |
local flag=$1; | |
local abi=${2:-${ABI:-${DEFAULT_ABI:-default}}}; | |
local var="${flag}_${abi}"; | |
echo ${!var} | |
} | |
get_all_abis () | |
{ | |
local x order="" mvar dvar; | |
mvar="MULTILIB_ABIS"; | |
dvar="DEFAULT_ABI"; | |
if [[ -n $1 ]]; then | |
mvar="$1_${mvar}"; | |
dvar="$1_${dvar}"; | |
fi; | |
if [[ -z ${!mvar} ]]; then | |
echo "default"; | |
return 0; | |
fi; | |
for x in ${!mvar}; | |
do | |
if [[ ${x} != ${!dvar} ]]; then | |
order="${order:+${order} }${x}"; | |
fi; | |
done; | |
order="${order:+${order} }${!dvar}"; | |
echo ${order}; | |
return 0 | |
} | |
get_all_libdirs () | |
{ | |
local libdirs abi; | |
for abi in ${MULTILIB_ABIS}; | |
do | |
libdirs+=" $(get_abi_LIBDIR ${abi})"; | |
done; | |
[[ " ${libdirs} " != *" lib "* ]] && libdirs+=" lib"; | |
echo "${libdirs}" | |
} | |
get_exeext () | |
{ | |
case ${CHOST} in | |
*-cygwin* | mingw* | *-mingw*) | |
echo ".exe" | |
;; | |
esac | |
} | |
get_install_abis () | |
{ | |
local x order=""; | |
if [[ -z ${MULTILIB_ABIS} ]]; then | |
echo "default"; | |
return 0; | |
fi; | |
if [[ ${EMULTILIB_PKG} == "true" ]]; then | |
for x in ${MULTILIB_ABIS}; | |
do | |
if [[ ${x} != "${DEFAULT_ABI}" ]]; then | |
has ${x} ${ABI_DENY} || order="${order} ${x}"; | |
fi; | |
done; | |
has ${DEFAULT_ABI} ${ABI_DENY} || order="${order} ${DEFAULT_ABI}"; | |
if [[ -n ${ABI_ALLOW} ]]; then | |
local ordera=""; | |
for x in ${order}; | |
do | |
if has ${x} ${ABI_ALLOW}; then | |
ordera="${ordera} ${x}"; | |
fi; | |
done; | |
order=${ordera}; | |
fi; | |
else | |
order=${DEFAULT_ABI}; | |
fi; | |
if [[ -z ${order} ]]; then | |
die "The ABI list is empty. Are you using a proper multilib profile? Perhaps your USE flags or MULTILIB_ABIS are too restrictive for this package."; | |
fi; | |
echo ${order}; | |
return 0 | |
} | |
get_libdir () | |
{ | |
local libdir_var="LIBDIR_${ABI}"; | |
local libdir="lib"; | |
[[ -n ${ABI} && -n ${!libdir_var} ]] && libdir=${!libdir_var}; | |
echo "${libdir}" | |
} | |
get_libname () | |
{ | |
local libname; | |
local ver=$1; | |
case ${CHOST} in | |
*-cygwin*) | |
libname="dll.a" | |
;; | |
mingw* | *-mingw*) | |
libname="dll" | |
;; | |
*-darwin*) | |
libname="dylib" | |
;; | |
*-mint*) | |
libname="irrelevant" | |
;; | |
hppa*-hpux*) | |
libname="sl" | |
;; | |
*) | |
libname="so" | |
;; | |
esac; | |
if [[ -z $* ]]; then | |
echo ".${libname}"; | |
else | |
for ver in "$@"; | |
do | |
case ${CHOST} in | |
*-cygwin*) | |
echo ".${ver}.${libname}" | |
;; | |
*-darwin*) | |
echo ".${ver}.${libname}" | |
;; | |
*-mint*) | |
echo ".${libname}" | |
;; | |
*) | |
echo ".${libname}.${ver}" | |
;; | |
esac; | |
done; | |
fi | |
} | |
get_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-flag () | |
{ | |
is-flagq "$@" && echo true | |
} | |
is-flagq () | |
{ | |
[[ -n $2 ]] && die "Usage: is-flag <flag>"; | |
local var; | |
for var in $(all-flag-vars); | |
do | |
_is_flagq ${var} "$1" && return 0; | |
done; | |
return 1 | |
} | |
is-ldflag () | |
{ | |
is-ldflagq "$@" && echo true | |
} | |
is-ldflagq () | |
{ | |
[[ -n $2 ]] && die "Usage: is-ldflag <flag>"; | |
_is_flagq LDFLAGS $1 | |
} | |
is_final_abi () | |
{ | |
has_multilib_profile || return 0; | |
set -- $(get_install_abis); | |
local LAST_ABI=$#; | |
[[ ${!LAST_ABI} == ${ABI} ]] | |
} | |
l10n_find_plocales_changes () | |
{ | |
[[ $# -ne 3 ]] && die "Exactly 3 arguments are needed!"; | |
ebegin "Looking in ${1} for new locales"; | |
pushd "${1}" > /dev/null || die "Cannot access ${1}"; | |
local current= x=; | |
for x in ${2}*${3}; | |
do | |
x=${x#"${2}"}; | |
x=${x%"${3}"}; | |
current+="${x} "; | |
done; | |
popd > /dev/null; | |
if [[ "$(printf '%s\n' ${PLOCALES} | LC_ALL=C sort)" != "$(printf '%s\n' ${current} | LC_ALL=C sort)" ]]; then | |
eend 1 "There are changes in locales! This ebuild should be updated to:"; | |
eerror "PLOCALES=\"${current%[[:space:]]}\""; | |
return 1; | |
else | |
eend 0; | |
fi | |
} | |
l10n_for_each_disabled_locale_do () | |
{ | |
local locs x; | |
locs=$(l10n_get_locales disabled); | |
for x in ${locs}; | |
do | |
"${@}" ${x} || die "failed to process disabled ${x} locale"; | |
done | |
} | |
l10n_for_each_locale_do () | |
{ | |
local locs x; | |
locs=$(l10n_get_locales); | |
for x in ${locs}; | |
do | |
"${@}" ${x} || die "failed to process enabled ${x} locale"; | |
done | |
} | |
l10n_get_locales () | |
{ | |
local loc locs; | |
if [[ -z ${LINGUAS+set} ]]; then | |
locs=${PLOCALES}; | |
else | |
for loc in ${LINGUAS}; | |
do | |
has ${loc} ${PLOCALES} && locs+="${loc} "; | |
done; | |
fi; | |
[[ -z ${locs} ]] && locs=${PLOCALE_BACKUP}; | |
if [[ ${1} == disabled ]]; then | |
local disabled_locs; | |
for loc in ${PLOCALES}; | |
do | |
has ${loc} ${locs} || disabled_locs+="${loc} "; | |
done; | |
locs=${disabled_locs}; | |
fi; | |
printf "%s" "${locs}" | |
} | |
make_wrapper () | |
{ | |
local wrapper=$1 bin=$2 chdir=$3 libdir=$4 path=$5; | |
local tmpwrapper="${T}/tmp.wrapper.${wrapper##*/}"; | |
has "${EAPI:-0}" 0 1 2 && local EPREFIX=""; | |
( echo '#!/bin/sh'; | |
if [[ -n ${libdir} ]]; then | |
local var; | |
if [[ ${CHOST} == *-darwin* ]]; then | |
var=DYLD_LIBRARY_PATH; | |
else | |
var=LD_LIBRARY_PATH; | |
fi; | |
cat <<-EOF | |
if [ "\${${var}+set}" = "set" ] ; then | |
export ${var}="\${${var}}:${EPREFIX}${libdir}" | |
else | |
export ${var}="${EPREFIX}${libdir}" | |
fi | |
EOF | |
fi | |
[[ -n ${chdir} ]] && printf 'cd "%s" &&\n' "${EPREFIX}${chdir}"; | |
printf 'exec %s "$@"\n' "${bin/#\//${EPREFIX}/}" ) > "${tmpwrapper}"; | |
chmod go+rx "${tmpwrapper}"; | |
if [[ -n ${path} ]]; then | |
( exeopts -m 0755; | |
exeinto "${path}"; | |
newexe "${tmpwrapper}" "${wrapper}" ) || die; | |
else | |
newbin "${tmpwrapper}" "${wrapper}" || die; | |
fi | |
} | |
makeopts_jobs () | |
{ | |
[[ $# -eq 0 ]] && set -- "${MAKEOPTS}"; | |
local jobs=$(echo " $* " | sed -r -n -e 's:.*[[:space:]](-[a-z]*j|--jobs[=[:space:]])[[:space:]]*([0-9]+).*:\2:p' -e "s:.*[[:space:]](-[a-z]*j|--jobs)[[:space:]].*:${2:-999}:p"); | |
echo ${jobs:-1} | |
} | |
makeopts_loadavg () | |
{ | |
[[ $# -eq 0 ]] && set -- "${MAKEOPTS}"; | |
local lavg=$(echo " $* " | sed -r -n -e 's:.*[[:space:]](-[a-z]*l|--(load-average|max-load)[=[:space:]])[[:space:]]*([0-9]+(\.[0-9]+)?)[[:space:]].*:\3:p' -e "s:.*[[:space:]](-[a-z]*l|--(load-average|max-load))[[:space:]].*:${2:-999}:p"); | |
echo ${lavg:-${2:-999}} | |
} | |
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 "${@}" | |
} | |
multilib_env () | |
{ | |
local CTARGET=${1:-${CTARGET}}; | |
local cpu=${CTARGET%%*-}; | |
if [[ ${CTARGET} = *-musl* ]]; then | |
: ${MULTILIB_ABIS=default}; | |
: ${DEFAULT_ABI=default}; | |
export MULTILIB_ABIS DEFAULT_ABI; | |
return; | |
fi; | |
case ${cpu} in | |
aarch64*) | |
export CFLAGS_arm=${CFLAGS_arm-}; | |
case ${cpu} in | |
aarch64*be) | |
export CHOST_arm="armv8b-${CTARGET#*-}" | |
;; | |
*) | |
export CHOST_arm="armv8l-${CTARGET#*-}" | |
;; | |
esac; | |
CHOST_arm=${CHOST_arm/%-gnu/-gnueabi}; | |
export CTARGET_arm=${CHOST_arm}; | |
export LIBDIR_arm="lib"; | |
export CFLAGS_arm64=${CFLAGS_arm64-}; | |
export CHOST_arm64=${CTARGET}; | |
export CTARGET_arm64=${CHOST_arm64}; | |
export LIBDIR_arm64="lib64"; | |
: ${MULTILIB_ABIS=arm64}; | |
: ${DEFAULT_ABI=arm64} | |
;; | |
x86_64*) | |
export CFLAGS_x86=${CFLAGS_x86--m32}; | |
export CHOST_x86=${CTARGET/x86_64/i686}; | |
CHOST_x86=${CHOST_x86/%-gnux32/-gnu}; | |
export CTARGET_x86=${CHOST_x86}; | |
if [[ ${SYMLINK_LIB} == "yes" ]]; then | |
export LIBDIR_x86="lib32"; | |
else | |
export LIBDIR_x86="lib"; | |
fi; | |
export CFLAGS_amd64=${CFLAGS_amd64--m64}; | |
export CHOST_amd64=${CTARGET/%-gnux32/-gnu}; | |
export CTARGET_amd64=${CHOST_amd64}; | |
export LIBDIR_amd64="lib64"; | |
export CFLAGS_x32=${CFLAGS_x32--mx32}; | |
export CHOST_x32=${CTARGET/%-gnu/-gnux32}; | |
export CTARGET_x32=${CHOST_x32}; | |
export LIBDIR_x32="libx32"; | |
case ${CTARGET} in | |
*-gnux32) | |
: ${MULTILIB_ABIS=x32 amd64 x86}; | |
: ${DEFAULT_ABI=x32} | |
;; | |
*) | |
: ${MULTILIB_ABIS=amd64 x86}; | |
: ${DEFAULT_ABI=amd64} | |
;; | |
esac | |
;; | |
mips64* | mipsisa64*) | |
export CFLAGS_o32=${CFLAGS_o32--mabi=32}; | |
export CHOST_o32=${CTARGET/mips64/mips}; | |
export CHOST_o32=${CHOST_o32/mipsisa64/mipsisa32}; | |
export CTARGET_o32=${CHOST_o32}; | |
export LIBDIR_o32="lib"; | |
export CFLAGS_n32=${CFLAGS_n32--mabi=n32}; | |
export CHOST_n32=${CTARGET}; | |
export CTARGET_n32=${CHOST_n32}; | |
export LIBDIR_n32="lib32"; | |
export CFLAGS_n64=${CFLAGS_n64--mabi=64}; | |
export CHOST_n64=${CTARGET}; | |
export CTARGET_n64=${CHOST_n64}; | |
export LIBDIR_n64="lib64"; | |
: ${MULTILIB_ABIS=n64 n32 o32}; | |
: ${DEFAULT_ABI=n32} | |
;; | |
powerpc64*) | |
export CFLAGS_ppc=${CFLAGS_ppc--m32}; | |
export CHOST_ppc=${CTARGET/powerpc64/powerpc}; | |
export CTARGET_ppc=${CHOST_ppc}; | |
export LIBDIR_ppc="lib"; | |
export CFLAGS_ppc64=${CFLAGS_ppc64--m64}; | |
export CHOST_ppc64=${CTARGET}; | |
export CTARGET_ppc64=${CHOST_ppc64}; | |
export LIBDIR_ppc64="lib64"; | |
: ${MULTILIB_ABIS=ppc64 ppc}; | |
: ${DEFAULT_ABI=ppc64} | |
;; | |
riscv64*) | |
export CFLAGS_lp64d=${CFLAGS_lp64d--mabi=lp64d -march=rv64imafdc}; | |
export CHOST_lp64d=${CTARGET}; | |
export CTARGET_lp64d=${CTARGET}; | |
export LIBDIR_lp64d="lib64/lp64d"; | |
export CFLAGS_lp64=${CFLAGS_lp64--mabi=lp64 -march=rv64imac}; | |
export CHOST_lp64=${CTARGET}; | |
export CTARGET_lp64=${CTARGET}; | |
export LIBDIR_lp64="lib64/lp64"; | |
export CFLAGS_ilp32d=${CFLAGS_ilp32d--mabi=ilp32d -march=rv32imafdc}; | |
export CHOST_ilp32d=${CTARGET/riscv64/riscv32}; | |
export CTARGET_ilp32d=${CTARGET/riscv64/riscv32}; | |
export LIBDIR_ilp32d="lib32/ilp32d"; | |
export CFLAGS_ilp32=${CFLAGS_ilp32--mabi=ilp32 -march=rv32imac}; | |
export CHOST_ilp32=${CTARGET/riscv64/riscv32}; | |
export CTARGET_ilp32=${CTARGET/riscv64/riscv32}; | |
export LIBDIR_ilp32="lib32/ilp32"; | |
: ${MULTILIB_ABIS=lp64d lp64 ilp32d ilp32}; | |
: ${DEFAULT_ABI=lp64d} | |
;; | |
riscv32*) | |
export CFLAGS_ilp32d=${CFLAGS_ilp32d--mabi=ilp32d}; | |
export CHOST_ilp32d=${CTARGET}; | |
export CTARGET_ilp32d=${CTARGET}; | |
export LIBDIR_ilp32d="lib32/ilp32d"; | |
export CFLAGS_ilp32=${CFLAGS_ilp32--mabi=ilp32 -march=rv32imac}; | |
export CHOST_ilp32=${CTARGET}; | |
export CTARGET_ilp32=${CTARGET}; | |
export LIBDIR_ilp32="lib32/ilp32"; | |
: ${MULTILIB_ABIS=ilp32d ilp32}; | |
: ${DEFAULT_ABI=ilp32d} | |
;; | |
s390x*) | |
export CFLAGS_s390=${CFLAGS_s390--m31}; | |
export CHOST_s390=${CTARGET/s390x/s390}; | |
export CTARGET_s390=${CHOST_s390}; | |
export LIBDIR_s390="lib"; | |
export CFLAGS_s390x=${CFLAGS_s390x--m64}; | |
export CHOST_s390x=${CTARGET}; | |
export CTARGET_s390x=${CHOST_s390x}; | |
export LIBDIR_s390x="lib64"; | |
: ${MULTILIB_ABIS=s390x s390}; | |
: ${DEFAULT_ABI=s390x} | |
;; | |
sparc64*) | |
export CFLAGS_sparc32=${CFLAGS_sparc32--m32}; | |
export CHOST_sparc32=${CTARGET/sparc64/sparc}; | |
export CTARGET_sparc32=${CHOST_sparc32}; | |
export LIBDIR_sparc32="lib"; | |
export CFLAGS_sparc64=${CFLAGS_sparc64--m64}; | |
export CHOST_sparc64=${CTARGET}; | |
export CTARGET_sparc64=${CHOST_sparc64}; | |
export LIBDIR_sparc64="lib64"; | |
: ${MULTILIB_ABIS=sparc64 sparc32}; | |
: ${DEFAULT_ABI=sparc64} | |
;; | |
*) | |
: ${MULTILIB_ABIS=default}; | |
: ${DEFAULT_ABI=default} | |
;; | |
esac; | |
export MULTILIB_ABIS DEFAULT_ABI | |
} | |
multilib_toolchain_setup () | |
{ | |
local v vv; | |
export ABI=$1; | |
local save_restore_variables=(CBUILD CHOST AR CC CXX F77 FC LD NM OBJDUMP PKG_CONFIG RANLIB READELF STRINGS STRIP PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG_SYSTEM_INCLUDE_PATH PKG_CONFIG_SYSTEM_LIBRARY_PATH); | |
if [[ ${_DEFAULT_ABI_SAVED} == "true" ]]; then | |
for v in "${save_restore_variables[@]}"; | |
do | |
vv="_abi_saved_${v}"; | |
[[ ${!vv+set} == "set" ]] && export ${v}="${!vv}" || unset ${v}; | |
unset ${vv}; | |
done; | |
unset _DEFAULT_ABI_SAVED; | |
fi; | |
if [[ ${ABI} != ${DEFAULT_ABI} ]]; then | |
for v in "${save_restore_variables[@]}"; | |
do | |
vv="_abi_saved_${v}"; | |
[[ ${!v+set} == "set" ]] && export ${vv}="${!v}" || unset ${vv}; | |
done; | |
export _DEFAULT_ABI_SAVED="true"; | |
if [[ ${CBUILD} == "${CHOST}" ]]; then | |
export CBUILD=$(get_abi_CHOST $1); | |
fi; | |
export CHOST=$(get_abi_CHOST ${DEFAULT_ABI}); | |
export AR="$(tc-getAR)"; | |
export CC="$(tc-getCC) $(get_abi_CFLAGS)"; | |
export CXX="$(tc-getCXX) $(get_abi_CFLAGS)"; | |
export F77="$(tc-getF77) $(get_abi_CFLAGS)"; | |
export FC="$(tc-getFC) $(get_abi_CFLAGS)"; | |
export LD="$(tc-getLD) $(get_abi_LDFLAGS)"; | |
export NM="$(tc-getNM)"; | |
export OBJDUMP="$(tc-getOBJDUMP)"; | |
export PKG_CONFIG="$(tc-getPKG_CONFIG)"; | |
export RANLIB="$(tc-getRANLIB)"; | |
export READELF="$(tc-getREADELF)"; | |
export STRINGS="$(tc-getSTRINGS)"; | |
export STRIP="$(tc-getSTRIP)"; | |
export CHOST=$(get_abi_CHOST $1); | |
export PKG_CONFIG_LIBDIR=${EPREFIX}/usr/$(get_libdir)/pkgconfig; | |
export PKG_CONFIG_PATH=${EPREFIX}/usr/share/pkgconfig; | |
export PKG_CONFIG_SYSTEM_INCLUDE_PATH=${EPREFIX}/usr/include; | |
export PKG_CONFIG_SYSTEM_LIBRARY_PATH=${EPREFIX}/$(get_libdir):${EPREFIX}/usr/$(get_libdir); | |
fi | |
} | |
no-as-needed () | |
{ | |
[[ $# -ne 0 ]] && die "no-as-needed takes no arguments"; | |
case $($(tc-getLD) -v 2>&1 </dev/null) in | |
*GNU*) | |
echo "-Wl,--no-as-needed" | |
;; | |
esac | |
} | |
nocommon_configure () | |
{ | |
if [[ "${NOCOMMON_OVERRIDE_LIBTOOL}" == "yes" ]]; then | |
ewarn "lto-overlay: libtool global_symbol_pipe and global_symbol_to_cdecl OVERRIDDEN"; | |
lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2 \\2/p' | sed '/ __gnu_lto/d'"; | |
export lt_cv_sys_global_symbol_pipe; | |
lt_cv_sys_global_symbol_to_cdecl=""; | |
export lt_cv_sys_global_symbol_to_cdecl; | |
fi | |
} | |
number_abis () | |
{ | |
set -- `get_install_abis`; | |
echo $# | |
} | |
path_exists () | |
{ | |
eerror "path_exists has been removed. Please see the following post"; | |
eerror "for a replacement snippet:"; | |
eerror "https://blogs.gentoo.org/mgorny/2018/08/09/inlining-path_exists/"; | |
die "path_exists is banned" | |
} | |
pkg_nofetch () | |
{ | |
default | |
} | |
pyside2_configure () | |
{ | |
local mycmakeargs=("${mycmakeargs[@]}" -DPYTHON_CONFIG_SUFFIX="-${EPYTHON}" -DPYTHON_EXECUTABLE="${PYTHON}" -DPYTHON_SITE_PACKAGES="$(python_get_sitedir)" -DSHIBOKEN_PYTHON_SHARED_LIBRARY_SUFFIX="-${EPYTHON}"); | |
cmake_src_configure | |
} | |
python_copy_sources () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local MULTIBUILD_VARIANTS; | |
_python_obtain_impls; | |
multibuild_copy_sources | |
} | |
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).'; | |
local includedir=$(python_get_includedir); | |
local d=${includedir#${EPREFIX}}; | |
( insopts -m 0644; | |
insinto "${d}"; | |
doins -r "${@}" || return ${?} ) | |
} | |
python_domodule () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ -n ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).'; | |
local d; | |
if [[ ${python_moduleroot} == /* ]]; then | |
d=${python_moduleroot}; | |
else | |
local sitedir=$(python_get_sitedir); | |
d=${sitedir#${EPREFIX}}/${python_moduleroot//.//}; | |
fi; | |
( insopts -m 0644; | |
insinto "${d}"; | |
doins -r "${@}" || return ${?} ); | |
python_optimize "${ED%/}/${d}" | |
} | |
python_doscript () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local _PYTHON_REWRITE_SHEBANG=1; | |
python_doexe "${@}" | |
} | |
python_export () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
eqawarn "python_export() is part of private eclass API."; | |
eqawarn "Please call python_get*() instead."; | |
_python_export "${@}" | |
} | |
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 | |
eerror "QA error: ${FUNCNAME}, ${path#${D%/}} did not match any fixable files."; | |
if [[ -n ${any_correct} ]]; then | |
eerror "All files have ${EPYTHON} shebang already."; | |
else | |
eerror "There are no Python files in specified directory."; | |
fi; | |
die "${FUNCNAME} did not match any fixable files"; | |
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}; | |
shift; | |
local i PYTHON_PKG_DEP out=; | |
_python_verify_patterns "${@}"; | |
for i in "${_PYTHON_SUPPORTED_IMPLS[@]}"; | |
do | |
if _python_impl_matches "${i}" "${@}"; then | |
local PYTHON_USEDEP="python_targets_${i}(-),-python_single_target_${i}(-)"; | |
local PYTHON_SINGLE_USEDEP="python_single_target_${i}(-)"; | |
_python_export "${i}" PYTHON_PKG_DEP; | |
local i_depstr=${depstr//\$\{PYTHON_USEDEP\}/${PYTHON_USEDEP}}; | |
i_depstr=${i_depstr//\$\{PYTHON_SINGLE_USEDEP\}/${PYTHON_SINGLE_USEDEP}}; | |
out="( ${PYTHON_PKG_DEP/:0=/:0} ${i_depstr} ) ${out}"; | |
fi; | |
done; | |
echo "|| ( ${out})" | |
} | |
python_gen_cond_dep () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local impl matches=(); | |
local dep=${1}; | |
shift; | |
_python_verify_patterns "${@}"; | |
for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; | |
do | |
if _python_impl_matches "${impl}" "${@}"; then | |
if [[ ${dep} == *'${PYTHON_USEDEP}'* ]]; then | |
local usedep=$(_python_gen_usedep "${@}"); | |
dep=${dep//\$\{PYTHON_USEDEP\}/${usedep}}; | |
fi; | |
matches+=("python_targets_${impl}? ( ${dep} )"); | |
fi; | |
done; | |
echo "${matches[@]}" | |
} | |
python_gen_impl_dep () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local impl matches=(); | |
local PYTHON_REQ_USE=${1}; | |
shift; | |
_python_verify_patterns "${@}"; | |
for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; | |
do | |
if _python_impl_matches "${impl}" "${@}"; then | |
local PYTHON_PKG_DEP; | |
_python_export "${impl}" PYTHON_PKG_DEP; | |
matches+=("python_targets_${impl}? ( ${PYTHON_PKG_DEP} )"); | |
fi; | |
done; | |
echo "${matches[@]}" | |
} | |
python_gen_usedep () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
if [[ ${EBUILD_PHASE} == setup ]]; then | |
eqawarn "python_gen_usedep() is deprecated. Please use python_gen_cond_dep instead."; | |
fi; | |
_python_gen_usedep "${@}" | |
} | |
python_gen_useflags () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local impl matches=(); | |
_python_verify_patterns "${@}"; | |
for impl in "${_PYTHON_SUPPORTED_IMPLS[@]}"; | |
do | |
if _python_impl_matches "${impl}" "${@}"; then | |
matches+=("python_targets_${impl}"); | |
fi; | |
done; | |
echo "${matches[@]}" | |
} | |
python_get_CFLAGS () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
_python_export "${@}" PYTHON_CFLAGS; | |
echo "${PYTHON_CFLAGS}" | |
} | |
python_get_LIBS () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
_python_export "${@}" PYTHON_LIBS; | |
echo "${PYTHON_LIBS}" | |
} | |
python_get_PYTHON_CONFIG () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
_python_export "${@}" PYTHON_CONFIG; | |
echo "${PYTHON_CONFIG}" | |
} | |
python_get_includedir () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
_python_export "${@}" PYTHON_INCLUDEDIR; | |
echo "${PYTHON_INCLUDEDIR}" | |
} | |
python_get_library_path () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
_python_export "${@}" PYTHON_LIBPATH; | |
echo "${PYTHON_LIBPATH}" | |
} | |
python_get_scriptdir () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
_python_export "${@}" PYTHON_SCRIPTDIR; | |
echo "${PYTHON_SCRIPTDIR}" | |
} | |
python_get_sitedir () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
_python_export "${@}" PYTHON_SITEDIR; | |
echo "${PYTHON_SITEDIR}" | |
} | |
python_is_installed () | |
{ | |
local impl=${1:-${EPYTHON}}; | |
[[ -n ${impl} ]] || die "${FUNCNAME}: no impl nor EPYTHON"; | |
local hasv_args=(-b); | |
[[ ${EAPI} == 6 ]] && hasv_args=(--host-root); | |
local PYTHON_PKG_DEP; | |
_python_export "${impl}" PYTHON_PKG_DEP; | |
has_version "${hasv_args[@]}" "${PYTHON_PKG_DEP}" | |
} | |
python_is_python3 () | |
{ | |
local impl=${1:-${EPYTHON}}; | |
[[ -n ${impl} ]] || die "python_is_python3: no impl nor EPYTHON"; | |
[[ ${impl} == python3* || ${impl} == pypy3 ]] | |
} | |
python_moduleinto () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
python_moduleroot=${1} | |
} | |
python_newexe () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
[[ -n ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).'; | |
[[ ${#} -eq 2 ]] || die "Usage: ${FUNCNAME} <path> <new-name>"; | |
local wrapd=${python_scriptroot:-/usr/bin}; | |
local f=${1}; | |
local newfn=${2}; | |
local scriptdir=$(python_get_scriptdir); | |
local d=${scriptdir#${EPREFIX}}; | |
( dodir "${wrapd}"; | |
exeopts -m 0755; | |
exeinto "${d}"; | |
newexe "${f}" "${newfn}" || return ${?} ); | |
_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; | |
[[ -x ${PYTHON} ]] || die "PYTHON (${PYTHON}) is not executable"; | |
if [[ ${#} -eq 0 ]]; then | |
local f; | |
while IFS= read -r -d '' f; do | |
if [[ ${f} == /* && -d ${D%/}${f} ]]; then | |
set -- "${D%/}${f}" "${@}"; | |
fi; | |
done < <("${PYTHON}" -c 'import sys; print("".join(x + "\0" for x in 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_replicate_script () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
function _python_replicate_script () | |
{ | |
local _PYTHON_FIX_SHEBANG_QUIET=1; | |
local PYTHON_SCRIPTDIR; | |
_python_export PYTHON_SCRIPTDIR; | |
( exeopts -m 0755; | |
exeinto "${PYTHON_SCRIPTDIR#${EPREFIX}}"; | |
doexe "${files[@]}" ); | |
python_fix_shebang -q "${files[@]/*\//${D%/}/${PYTHON_SCRIPTDIR}/}" | |
}; | |
local files=("${@}"); | |
python_foreach_impl _python_replicate_script; | |
unset -f _python_replicate_script; | |
local f; | |
for f in "$@"; | |
do | |
_python_ln_rel "${ED%/}/usr/lib/python-exec/python-exec2" "${f}" || die; | |
done | |
} | |
python_scriptinto () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
python_scriptroot=${1} | |
} | |
python_setup () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
local has_check_deps; | |
declare -f python_check_deps > /dev/null && has_check_deps=1; | |
if [[ ! -n ${has_check_deps} ]]; then | |
_python_validate_useflags; | |
fi; | |
local pycompat=("${PYTHON_COMPAT[@]}"); | |
if [[ -n ${PYTHON_COMPAT_OVERRIDE} ]]; then | |
pycompat=(${PYTHON_COMPAT_OVERRIDE}); | |
fi; | |
local found; | |
_python_verify_patterns "${@}"; | |
for ((i = ${#_PYTHON_SUPPORTED_IMPLS[@]} - 1; i >= 0; i-- )) | |
do | |
local impl=${_PYTHON_SUPPORTED_IMPLS[i]}; | |
has "${impl}" "${pycompat[@]}" || continue; | |
if [[ ! -n ${PYTHON_COMPAT_OVERRIDE} && ! -n ${has_check_deps} ]]; then | |
use "python_targets_${impl}" || continue; | |
fi; | |
_python_impl_matches "${impl}" "${@}" || continue; | |
_python_export "${impl}" EPYTHON PYTHON; | |
if [[ -n ${has_check_deps} ]]; then | |
python_is_installed "${impl}" || continue; | |
local PYTHON_USEDEP="python_targets_${impl}(-),-python_single_target_${impl}(-)"; | |
local PYTHON_SINGLE_USEDEP="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; | |
einfo "Using ${EPYTHON} in global scope" | |
} | |
python_wrapper_setup () | |
{ | |
debug-print-function ${FUNCNAME} "${@}"; | |
eqawarn "python_wrapper_setup() is part of private eclass API."; | |
eqawarn "Please call python_setup() instead."; | |
_python_wrapper_setup "${@}" | |
} | |
raw-ldflags () | |
{ | |
local x input="$@"; | |
[[ -z ${input} ]] && input=${LDFLAGS}; | |
set --; | |
for x in ${input}; | |
do | |
case ${x} in | |
-Wl,*) | |
x=${x#-Wl,}; | |
set -- "$@" ${x//,/ } | |
;; | |
*) | |
;; | |
esac; | |
done; | |
echo "$@" | |
} | |
replace-cpu-flags () | |
{ | |
local newcpu="$#"; | |
newcpu="${!newcpu}"; | |
while [ $# -gt 1 ]; do | |
replace-flags "-march=${1}" "-march=${newcpu}"; | |
replace-flags "-mcpu=${1}" "-mcpu=${newcpu}"; | |
replace-flags "-mtune=${1}" "-mtune=${newcpu}"; | |
shift; | |
done; | |
return 0 | |
} | |
replace-flags () | |
{ | |
[[ $# != 2 ]] && die "Usage: replace-flags <old flag> <new flag>"; | |
local f var new; | |
for var in $(all-flag-vars); | |
do | |
new=(); | |
for f in ${!var}; | |
do | |
[[ ${f} == ${1} ]] && f=${2}; | |
new+=("${f}"); | |
done; | |
export ${var}="${new[*]}"; | |
done; | |
return 0 | |
} | |
replace-sparc64-flags () | |
{ | |
[[ $# -ne 0 ]] && die "replace-sparc64-flags takes no arguments"; | |
local SPARC64_CPUS="ultrasparc3 ultrasparc v9"; | |
if [ "${CFLAGS/mtune}" != "${CFLAGS}" ]; then | |
for x in ${SPARC64_CPUS}; | |
do | |
CFLAGS="${CFLAGS/-mcpu=${x}/-mcpu=v8}"; | |
done; | |
else | |
for x in ${SPARC64_CPUS}; | |
do | |
CFLAGS="${CFLAGS/-mcpu=${x}/-mcpu=v8 -mtune=${x}}"; | |
done; | |
fi; | |
if [ "${CXXFLAGS/mtune}" != "${CXXFLAGS}" ]; then | |
for x in ${SPARC64_CPUS}; | |
do | |
CXXFLAGS="${CXXFLAGS/-mcpu=${x}/-mcpu=v8}"; | |
done; | |
else | |
for x in ${SPARC64_CPUS}; | |
do | |
CXXFLAGS="${CXXFLAGS/-mcpu=${x}/-mcpu=v8 -mtune=${x}}"; | |
done; | |
fi; | |
export CFLAGS CXXFLAGS | |
} | |
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} | |
} | |
setup-allowed-flags () | |
{ | |
[[ ${EAPI} == [567] ]] || die "Internal function ${FUNCNAME} is not available in EAPI ${EAPI}."; | |
_setup-allowed-flags "$@" | |
} | |
src_compile () | |
{ | |
python_foreach_impl cmake_src_compile | |
} | |
src_configure () | |
{ | |
local mycmakeargs=(-DBUILD_TESTS=$(usex test) -DCMAKE_DISABLE_FIND_PACKAGE_Qt53DAnimation=$(usex !3d) -DCMAKE_DISABLE_FIND_PACKAGE_Qt53DCore=$(usex !3d) -DCMAKE_DISABLE_FIND_PACKAGE_Qt53DExtras=$(usex !3d) -DCMAKE_DISABLE_FIND_PACKAGE_Qt53DInput=$(usex !3d) -DCMAKE_DISABLE_FIND_PACKAGE_Qt53DLogic=$(usex !3d) -DCMAKE_DISABLE_FIND_PACKAGE_Qt53DRender=$(usex !3d) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Charts=$(usex !charts) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Concurrent=$(usex !concurrent) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5DataVisualization=$(usex !datavis) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Designer=$(usex !designer) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Gui=$(usex !gui) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Help=$(usex !help) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Location=$(usex !location) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Multimedia=$(usex !multimedia) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5MultimediaWidgets=$(usex !multimedia yes $(usex !widgets)) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Network=$(usex !network) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Positioning=$(usex !positioning) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5PrintSupport=$(usex !printsupport) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Qml=$(usex !qml) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Quick=$(usex !quick) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5QuickWidgets=$(usex !quick yes $(usex !widgets)) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Script=$(usex !script) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5ScriptTools=$(usex !scripttools) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Scxml=$(usex !scxml) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Sensors=$(usex !sensors) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5TextToSpeech=$(usex !speech) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Sql=$(usex !sql) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Svg=$(usex !svg) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Test=$(usex !testlib) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5UiTools=$(usex !designer) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5WebChannel=$(usex !webchannel) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5WebEngine=$(usex !webengine) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5WebEngineCore=$(usex !webengine) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5WebEngineWidgets=$(usex !webengine yes $(usex !widgets)) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5WebSockets=$(usex !websockets) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Widgets=$(usex !widgets) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5X11Extras=$(usex !x11extras) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Xml=$(usex !xml) -DCMAKE_DISABLE_FIND_PACKAGE_Qt5XmlPatterns=$(usex !xmlpatterns)); | |
function pyside2_configure () | |
{ | |
local mycmakeargs=("${mycmakeargs[@]}" -DPYTHON_CONFIG_SUFFIX="-${EPYTHON}" -DPYTHON_EXECUTABLE="${PYTHON}" -DPYTHON_SITE_PACKAGES="$(python_get_sitedir)" -DSHIBOKEN_PYTHON_SHARED_LIBRARY_SUFFIX="-${EPYTHON}"); | |
cmake_src_configure | |
}; | |
python_foreach_impl pyside2_configure | |
} | |
src_install () | |
{ | |
function pyside2_install () | |
{ | |
cmake_src_install; | |
python_optimize; | |
sed -i -e 's~^Requires: shiboken2$~&-'${EPYTHON}'~' "${ED}/usr/$(get_libdir)"/pkgconfig/${PN}.pc || die; | |
cp "${ED}/usr/$(get_libdir)"/pkgconfig/${PN}{,-${EPYTHON}}.pc || die | |
}; | |
python_foreach_impl pyside2_install; | |
sed -i -e 's~pyside2-python[[:digit:]]\+\.[[:digit:]]\+~pyside2${PYTHON_CONFIG_SUFFIX}~g' "${ED}/usr/$(get_libdir)/cmake/PySide2-${PV}/PySide2Targets-gentoo.cmake" || die | |
} | |
src_prepare () | |
{ | |
cmake_src_prepare "$@" | |
} | |
src_test () | |
{ | |
local -x PYTHONDONTWRITEBYTECODE; | |
python_foreach_impl virtx cmake_src_test | |
} | |
src_unpack () | |
{ | |
default | |
} | |
strip-flags () | |
{ | |
[[ $# -ne 0 ]] && die "strip-flags takes no arguments"; | |
local x y var; | |
local ALLOWED_FLAGS; | |
_setup-allowed-flags; | |
set -f; | |
for var in $(all-flag-vars); | |
do | |
local new=(); | |
for x in ${!var}; | |
do | |
local flag=${x%%=*}; | |
for y in "${ALLOWED_FLAGS[@]}"; | |
do | |
if [[ -z ${flag%%${y}} ]]; then | |
new+=("${x}"); | |
break; | |
fi; | |
done; | |
done; | |
if _is_flagq ${var} "-O*" && ! _is_flagq new "-O*"; then | |
new+=(-O2); | |
fi; | |
if [[ ${!var} != "${new[*]}" ]]; then | |
einfo "strip-flags: ${var}: changed '${!var}' to '${new[*]}'"; | |
fi; | |
export ${var}="${new[*]}"; | |
done; | |
set +f; | |
return 0 | |
} | |
strip-linguas () | |
{ | |
local ls newls nols; | |
if [[ $1 == "-i" ]] || [[ $1 == "-u" ]]; then | |
local op=$1; | |
shift; | |
ls=$(find "$1" -name '*.po' -exec basename {} .po ';'); | |
shift; | |
local d f; | |
for d in "$@"; | |
do | |
if [[ ${op} == "-u" ]]; then | |
newls=${ls}; | |
else | |
newls=""; | |
fi; | |
for f in $(find "$d" -name '*.po' -exec basename {} .po ';'); | |
do | |
if [[ ${op} == "-i" ]]; then | |
has ${f} ${ls} && newls="${newls} ${f}"; | |
else | |
has ${f} ${ls} || newls="${newls} ${f}"; | |
fi; | |
done; | |
ls=${newls}; | |
done; | |
else | |
ls="$@"; | |
fi; | |
nols=""; | |
newls=""; | |
for f in ${LINGUAS}; | |
do | |
if has ${f} ${ls}; then | |
newls="${newls} ${f}"; | |
else | |
nols="${nols} ${f}"; | |
fi; | |
done; | |
[[ -n ${nols} ]] && einfo "Sorry, but ${PN} does not support the LINGUAS:" ${nols}; | |
export LINGUAS=${newls:1} | |
} | |
strip-unsupported-flags () | |
{ | |
[[ $# -ne 0 ]] && die "strip-unsupported-flags takes no arguments"; | |
export CFLAGS=$(test-flags-CC ${CFLAGS}); | |
export CXXFLAGS=$(test-flags-CXX ${CXXFLAGS}); | |
export FFLAGS=$(test-flags-F77 ${FFLAGS}); | |
export FCFLAGS=$(test-flags-FC ${FCFLAGS}); | |
export LDFLAGS=$(test-flags-CCLD ${LDFLAGS}) | |
} | |
tc-arch () | |
{ | |
tc-ninja_magic_to_arch portage "$@" | |
} | |
tc-arch-kernel () | |
{ | |
tc-ninja_magic_to_arch kern "$@" | |
} | |
tc-check-openmp () | |
{ | |
if ! tc-has-openmp; then | |
eerror "Your current compiler does not support OpenMP!"; | |
if tc-is-gcc; then | |
eerror "Enable OpenMP support by building sys-devel/gcc with USE=\"openmp\"."; | |
else | |
if tc-is-clang; then | |
eerror "OpenMP support in sys-devel/clang is provided by sys-libs/libomp."; | |
fi; | |
fi; | |
die "Active compiler does not have required support for OpenMP"; | |
fi | |
} | |
tc-cpp-is-true () | |
{ | |
local CONDITION=${1}; | |
shift; | |
$(tc-getTARGET_CPP) "${@}" -P - <<-EOF > /dev/null 2>&1 | |
#if ${CONDITION} | |
true | |
#else | |
#error false | |
#endif | |
EOF | |
} | |
tc-detect-is-softfloat () | |
{ | |
[[ $(tc-getTARGET_CPP) == "gcc -E" ]] && return 1; | |
case ${CTARGET:-${CHOST}} in | |
*-newlib | *-elf | *-eabi) | |
return 1 | |
;; | |
arm*) | |
if tc-cpp-is-true "defined(__ARM_PCS_VFP)"; then | |
echo "no"; | |
else | |
if tc-cpp-is-true "defined(__SOFTFP__)"; then | |
echo "yes"; | |
else | |
echo "softfp"; | |
fi; | |
fi; | |
return 0 | |
;; | |
*) | |
return 1 | |
;; | |
esac | |
} | |
tc-enables-pie () | |
{ | |
tc-cpp-is-true "defined(__PIE__)" ${CPPFLAGS} ${CFLAGS} | |
} | |
tc-enables-ssp () | |
{ | |
tc-cpp-is-true "defined(__SSP__) || defined(__SSP_STRONG__) || defined(__SSP_ALL__)" ${CPPFLAGS} ${CFLAGS} | |
} | |
tc-enables-ssp-all () | |
{ | |
tc-cpp-is-true "defined(__SSP_ALL__)" ${CPPFLAGS} ${CFLAGS} | |
} | |
tc-enables-ssp-strong () | |
{ | |
tc-cpp-is-true "defined(__SSP_STRONG__) || defined(__SSP_ALL__)" ${CPPFLAGS} ${CFLAGS} | |
} | |
tc-endian () | |
{ | |
local host=$1; | |
[[ -z ${host} ]] && host=${CTARGET:-${CHOST}}; | |
host=${host%%-*}; | |
case ${host} in | |
aarch64*be) | |
echo big | |
;; | |
aarch64) | |
echo little | |
;; | |
alpha*) | |
echo little | |
;; | |
arm*b*) | |
echo big | |
;; | |
arm*) | |
echo little | |
;; | |
cris*) | |
echo little | |
;; | |
hppa*) | |
echo big | |
;; | |
i?86*) | |
echo little | |
;; | |
ia64*) | |
echo little | |
;; | |
m68*) | |
echo big | |
;; | |
mips*l*) | |
echo little | |
;; | |
mips*) | |
echo big | |
;; | |
powerpc*le) | |
echo little | |
;; | |
powerpc*) | |
echo big | |
;; | |
riscv*) | |
echo little | |
;; | |
s390*) | |
echo big | |
;; | |
sh*b*) | |
echo big | |
;; | |
sh*) | |
echo little | |
;; | |
sparc*) | |
echo big | |
;; | |
x86_64*) | |
echo little | |
;; | |
*) | |
echo wtf | |
;; | |
esac | |
} | |
tc-env_build () | |
{ | |
tc-export_build_env; | |
CFLAGS=${BUILD_CFLAGS} CXXFLAGS=${BUILD_CXXFLAGS} CPPFLAGS=${BUILD_CPPFLAGS} LDFLAGS=${BUILD_LDFLAGS} AR=$(tc-getBUILD_AR) AS=$(tc-getBUILD_AS) CC=$(tc-getBUILD_CC) CPP=$(tc-getBUILD_CPP) CXX=$(tc-getBUILD_CXX) LD=$(tc-getBUILD_LD) NM=$(tc-getBUILD_NM) PKG_CONFIG=$(tc-getBUILD_PKG_CONFIG) RANLIB=$(tc-getBUILD_RANLIB) READELF=$(tc-getBUILD_READELF) "$@" | |
} | |
tc-export () | |
{ | |
local var; | |
for var in "$@"; | |
do | |
[[ $(type -t "tc-get${var}") != "function" ]] && die "tc-export: invalid export variable '${var}'"; | |
"tc-get${var}" > /dev/null; | |
done | |
} | |
tc-export_build_env () | |
{ | |
tc-export "$@"; | |
if tc-is-cross-compiler; then | |
: ${BUILD_CFLAGS:=-O1 -pipe}; | |
: ${BUILD_CXXFLAGS:=-O1 -pipe}; | |
: ${BUILD_CPPFLAGS:= }; | |
: ${BUILD_LDFLAGS:= }; | |
else | |
: ${BUILD_CFLAGS:=${CFLAGS}}; | |
: ${BUILD_CXXFLAGS:=${CXXFLAGS}}; | |
: ${BUILD_CPPFLAGS:=${CPPFLAGS}}; | |
: ${BUILD_LDFLAGS:=${LDFLAGS}}; | |
fi; | |
export BUILD_{C,CXX,CPP,LD}FLAGS; | |
local v; | |
for v in BUILD_{C,CXX,CPP,LD}FLAGS; | |
do | |
export ${v#BUILD_}_FOR_BUILD="${!v}"; | |
done | |
} | |
tc-get-compiler-type () | |
{ | |
local code=' | |
#if defined(__PATHSCALE__) | |
HAVE_PATHCC | |
#elif defined(__clang__) | |
HAVE_CLANG | |
#elif defined(__GNUC__) | |
HAVE_GCC | |
#endif | |
'; | |
local res=$($(tc-getCPP "$@") -E -P - <<<"${code}"); | |
case ${res} in | |
*HAVE_PATHCC*) | |
echo pathcc | |
;; | |
*HAVE_CLANG*) | |
echo clang | |
;; | |
*HAVE_GCC*) | |
echo gcc | |
;; | |
*) | |
echo unknown | |
;; | |
esac | |
} | |
tc-getAR () | |
{ | |
tc-getPROG AR ar "$@" | |
} | |
tc-getAS () | |
{ | |
tc-getPROG AS as "$@" | |
} | |
tc-getBUILD_AR () | |
{ | |
tc-getBUILD_PROG AR ar "$@" | |
} | |
tc-getBUILD_AS () | |
{ | |
tc-getBUILD_PROG AS as "$@" | |
} | |
tc-getBUILD_CC () | |
{ | |
tc-getBUILD_PROG CC gcc "$@" | |
} | |
tc-getBUILD_CPP () | |
{ | |
tc-getBUILD_PROG CPP "$(tc-getBUILD_CC) -E" "$@" | |
} | |
tc-getBUILD_CXX () | |
{ | |
tc-getBUILD_PROG CXX g++ "$@" | |
} | |
tc-getBUILD_LD () | |
{ | |
tc-getBUILD_PROG LD ld "$@" | |
} | |
tc-getBUILD_NM () | |
{ | |
tc-getBUILD_PROG NM nm "$@" | |
} | |
tc-getBUILD_OBJCOPY () | |
{ | |
tc-getBUILD_PROG OBJCOPY objcopy "$@" | |
} | |
tc-getBUILD_PKG_CONFIG () | |
{ | |
tc-getBUILD_PROG PKG_CONFIG pkg-config "$@" | |
} | |
tc-getBUILD_PROG () | |
{ | |
local vars="BUILD_$1 $1_FOR_BUILD HOST$1"; | |
tc-is-cross-compiler || vars+=" $1"; | |
_tc-getPROG CBUILD "${vars}" "${@:2}" | |
} | |
tc-getBUILD_RANLIB () | |
{ | |
tc-getBUILD_PROG RANLIB ranlib "$@" | |
} | |
tc-getBUILD_READELF () | |
{ | |
tc-getBUILD_PROG READELF readelf "$@" | |
} | |
tc-getBUILD_STRINGS () | |
{ | |
tc-getBUILD_PROG STRINGS strings "$@" | |
} | |
tc-getBUILD_STRIP () | |
{ | |
tc-getBUILD_PROG STRIP strip "$@" | |
} | |
tc-getCC () | |
{ | |
tc-getPROG CC gcc "$@" | |
} | |
tc-getCPP () | |
{ | |
tc-getPROG CPP "${CC:-gcc} -E" "$@" | |
} | |
tc-getCXX () | |
{ | |
tc-getPROG CXX g++ "$@" | |
} | |
tc-getDLLWRAP () | |
{ | |
tc-getPROG DLLWRAP dllwrap "$@" | |
} | |
tc-getF77 () | |
{ | |
tc-getPROG F77 gfortran "$@" | |
} | |
tc-getFC () | |
{ | |
tc-getPROG FC gfortran "$@" | |
} | |
tc-getGCJ () | |
{ | |
tc-getPROG GCJ gcj "$@" | |
} | |
tc-getGO () | |
{ | |
tc-getPROG GO gccgo "$@" | |
} | |
tc-getLD () | |
{ | |
tc-getPROG LD ld "$@" | |
} | |
tc-getNM () | |
{ | |
tc-getPROG NM nm "$@" | |
} | |
tc-getOBJCOPY () | |
{ | |
tc-getPROG OBJCOPY objcopy "$@" | |
} | |
tc-getOBJDUMP () | |
{ | |
tc-getPROG OBJDUMP objdump "$@" | |
} | |
tc-getPKG_CONFIG () | |
{ | |
tc-getPROG PKG_CONFIG pkg-config "$@" | |
} | |
tc-getPROG () | |
{ | |
_tc-getPROG CHOST "$@" | |
} | |
tc-getRANLIB () | |
{ | |
tc-getPROG RANLIB ranlib "$@" | |
} | |
tc-getRC () | |
{ | |
tc-getPROG RC windres "$@" | |
} | |
tc-getREADELF () | |
{ | |
tc-getPROG READELF readelf "$@" | |
} | |
tc-getSTRINGS () | |
{ | |
tc-getPROG STRINGS strings "$@" | |
} | |
tc-getSTRIP () | |
{ | |
tc-getPROG STRIP strip "$@" | |
} | |
tc-getTARGET_CPP () | |
{ | |
if [[ -n ${CTARGET} ]]; then | |
_tc-getPROG CTARGET TARGET_CPP "gcc -E" "$@"; | |
else | |
tc-getCPP "$@"; | |
fi | |
} | |
tc-has-openmp () | |
{ | |
local base="${T}/test-tc-openmp"; | |
cat <<-EOF > "${base}.c" | |
#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 <<-EOF > "${base}.c" | |
int foo(int *i) { | |
static __thread int j = 0; | |
return *i ? j : *i; | |
} | |
EOF | |
local flags; | |
case $1 in | |
-s) | |
flags="-S" | |
;; | |
-c) | |
flags="-c" | |
;; | |
-l) | |
;; | |
-*) | |
die "Usage: tc-has-tls [-c|-l] [toolchain prefix]" | |
;; | |
esac; | |
: ${flags:=-fPIC -shared -Wl,-z,defs}; | |
[[ $1 == -* ]] && shift; | |
$(tc-getCC "$@") ${flags} "${base}.c" -o "${base}" &> /dev/null; | |
local ret=$?; | |
rm -f "${base}"*; | |
return ${ret} | |
} | |
tc-is-clang () | |
{ | |
[[ $(tc-get-compiler-type) == clang ]] | |
} | |
tc-is-cross-compiler () | |
{ | |
[[ ${CBUILD:-${CHOST}} != ${CHOST} ]] | |
} | |
tc-is-gcc () | |
{ | |
[[ $(tc-get-compiler-type) == gcc ]] | |
} | |
tc-is-softfloat () | |
{ | |
tc-detect-is-softfloat || tc-tuple-is-softfloat | |
} | |
tc-is-static-only () | |
{ | |
local host=${CTARGET:-${CHOST}}; | |
[[ ${host} == *-mint* ]] | |
} | |
tc-ld-disable-gold () | |
{ | |
tc-ld-is-gold "$@" && tc-ld-force-bfd "$@" | |
} | |
tc-ld-force-bfd () | |
{ | |
if ! tc-ld-is-gold "$@" && ! tc-ld-is-lld "$@"; then | |
return; | |
fi; | |
ewarn "Forcing usage of the BFD linker"; | |
local ld=$(tc-getLD "$@"); | |
local bfd_ld="${ld%% *}.bfd"; | |
local path_ld=$(which "${bfd_ld}" 2>/dev/null); | |
[[ -e ${path_ld} ]] && export LD=${bfd_ld}; | |
local fallback="true"; | |
if tc-is-gcc; then | |
local major=$(gcc-major-version "$@"); | |
local minor=$(gcc-minor-version "$@"); | |
if [[ ${major} -gt 4 ]] || [[ ${major} -eq 4 && ${minor} -ge 8 ]]; then | |
export LDFLAGS="${LDFLAGS} -fuse-ld=bfd"; | |
fallback="false"; | |
fi; | |
else | |
if tc-is-clang; then | |
local major=$(clang-major-version "$@"); | |
local minor=$(clang-minor-version "$@"); | |
if [[ ${major} -gt 3 ]] || [[ ${major} -eq 3 && ${minor} -ge 5 ]]; then | |
export LDFLAGS="${LDFLAGS} -fuse-ld=bfd"; | |
fallback="false"; | |
fi; | |
fi; | |
fi; | |
if [[ ${fallback} == "true" ]]; then | |
if [[ -e ${path_ld} ]]; then | |
local d="${T}/bfd-linker"; | |
mkdir -p "${d}"; | |
ln -sf "${path_ld}" "${d}"/ld; | |
export LDFLAGS="${LDFLAGS} -B${d}"; | |
else | |
die "unable to locate a BFD linker"; | |
fi; | |
fi | |
} | |
tc-ld-is-gold () | |
{ | |
local out; | |
out=$($(tc-getLD "$@") --version 2>&1); | |
if [[ ${out} == *"GNU gold"* ]]; then | |
return 0; | |
fi; | |
local base="${T}/test-tc-gold"; | |
cat <<-EOF > "${base}.c" | |
int main() { return 0; } | |
EOF | |
out=$($(tc-getCC "$@") ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} -Wl,--version "${base}.c" -o "${base}" 2>&1); | |
rm -f "${base}"*; | |
if [[ ${out} == *"GNU gold"* ]]; then | |
return 0; | |
fi; | |
return 1 | |
} | |
tc-ld-is-lld () | |
{ | |
local out; | |
out=$($(tc-getLD "$@") --version 2>&1); | |
if [[ ${out} == *"LLD"* ]]; then | |
return 0; | |
fi; | |
local base="${T}/test-tc-lld"; | |
cat <<-EOF > "${base}.c" | |
int main() { return 0; } | |
EOF | |
out=$($(tc-getCC "$@") ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} -Wl,--version "${base}.c" -o "${base}" 2>&1); | |
rm -f "${base}"*; | |
if [[ ${out} == *"LLD"* ]]; then | |
return 0; | |
fi; | |
return 1 | |
} | |
tc-ninja_magic_to_arch () | |
{ | |
function ninj () | |
{ | |
[[ ${type} == "kern" ]] && echo $1 || echo $2 | |
}; | |
local type=$1; | |
local host=$2; | |
[[ -z ${host} ]] && host=${CTARGET:-${CHOST}}; | |
case ${host} in | |
aarch64*) | |
echo arm64 | |
;; | |
alpha*) | |
echo alpha | |
;; | |
arm*) | |
echo arm | |
;; | |
avr*) | |
ninj avr32 avr | |
;; | |
bfin*) | |
ninj blackfin bfin | |
;; | |
c6x*) | |
echo c6x | |
;; | |
cris*) | |
echo cris | |
;; | |
frv*) | |
echo frv | |
;; | |
hexagon*) | |
echo hexagon | |
;; | |
hppa*) | |
ninj parisc hppa | |
;; | |
i?86*) | |
if [[ ${type} == "kern" && ${host} == *freebsd* ]]; then | |
echo i386; | |
else | |
echo x86; | |
fi | |
;; | |
ia64*) | |
echo ia64 | |
;; | |
m68*) | |
echo m68k | |
;; | |
metag*) | |
echo metag | |
;; | |
microblaze*) | |
echo microblaze | |
;; | |
mips*) | |
echo mips | |
;; | |
nios2*) | |
echo nios2 | |
;; | |
nios*) | |
echo nios | |
;; | |
or1k* | or32*) | |
echo openrisc | |
;; | |
powerpc*) | |
if [[ ${type} == "kern" ]]; then | |
echo powerpc; | |
else | |
if [[ ${host} == powerpc64* ]]; then | |
echo ppc64; | |
else | |
echo ppc; | |
fi; | |
fi | |
;; | |
riscv*) | |
echo riscv | |
;; | |
s390*) | |
echo s390 | |
;; | |
score*) | |
echo score | |
;; | |
sh64*) | |
ninj sh64 sh | |
;; | |
sh*) | |
echo sh | |
;; | |
sparc64*) | |
ninj sparc64 sparc | |
;; | |
sparc*) | |
[[ ${PROFILE_ARCH} == "sparc64" ]] && ninj sparc64 sparc || echo sparc | |
;; | |
tile*) | |
echo tile | |
;; | |
vax*) | |
echo vax | |
;; | |
x86_64*freebsd*) | |
echo amd64 | |
;; | |
x86_64*) | |
if [[ ${type} == "kern" ]]; then | |
echo x86; | |
else | |
echo amd64; | |
fi | |
;; | |
xtensa*) | |
echo xtensa | |
;; | |
*) | |
echo unknown | |
;; | |
esac | |
} | |
tc-stack-grows-down () | |
{ | |
case ${ARCH} in | |
hppa | metag) | |
return 1 | |
;; | |
esac; | |
return 0 | |
} | |
tc-tuple-is-softfloat () | |
{ | |
local CTARGET=${CTARGET:-${CHOST}}; | |
case ${CTARGET//_/-} in | |
bfin* | h8300*) | |
echo "only" | |
;; | |
*-softfloat-*) | |
echo "yes" | |
;; | |
*-softfp-*) | |
echo "softfp" | |
;; | |
arm*-hardfloat-* | arm*eabihf) | |
echo "no" | |
;; | |
*-newlib | *-elf | *-eabi) | |
echo "no" | |
;; | |
arm*) | |
echo "yes" | |
;; | |
*) | |
echo "no" | |
;; | |
esac | |
} | |
test-flag-CC () | |
{ | |
_test-flag-PROG CC c "$@" | |
} | |
test-flag-CCLD () | |
{ | |
_test-flag-PROG CC c+ld "$@" | |
} | |
test-flag-CXX () | |
{ | |
_test-flag-PROG CXX c++ "$@" | |
} | |
test-flag-F77 () | |
{ | |
_test-flag-PROG F77 f77 "$@" | |
} | |
test-flag-FC () | |
{ | |
_test-flag-PROG FC f95 "$@" | |
} | |
test-flag-PROG () | |
{ | |
[[ ${EAPI} == [567] ]] || die "Internal function ${FUNCNAME} is not available in EAPI ${EAPI}."; | |
_test-flag-PROG "$@" | |
} | |
test-flags () | |
{ | |
test-flags-CC "$@" | |
} | |
test-flags-CC () | |
{ | |
_test-flags-PROG CC "$@" | |
} | |
test-flags-CCLD () | |
{ | |
_test-flags-PROG CCLD "$@" | |
} | |
test-flags-CXX () | |
{ | |
_test-flags-PROG CXX "$@" | |
} | |
test-flags-F77 () | |
{ | |
_test-flags-PROG F77 "$@" | |
} | |
test-flags-FC () | |
{ | |
_test-flags-PROG FC "$@" | |
} | |
test-flags-PROG () | |
{ | |
[[ ${EAPI} == [567] ]] || die "Internal function ${FUNCNAME} is not available in EAPI ${EAPI}."; | |
_test-flags-PROG "$@" | |
} | |
test_version_info () | |
{ | |
if [[ $($(tc-getCC) --version 2>&1) == *$1* ]]; then | |
return 0; | |
else | |
return 1; | |
fi | |
} | |
use_if_iuse () | |
{ | |
eqawarn "use_if_iuse is deprecated."; | |
eqawarn "Define it as a local function, or inline it:"; | |
eqawarn " in_iuse foo && use foo"; | |
in_iuse $1 || return 1; | |
use $1 | |
} | |
ver_cut () | |
{ | |
local range=${1}; | |
local v=${2:-${PV}}; | |
local start end; | |
local -a comp; | |
__eapi7_ver_split "${v}"; | |
local max=$((${#comp[@]}/2)); | |
__eapi7_ver_parse_range "${range}" "${max}"; | |
local IFS=; | |
if [[ ${start} -gt 0 ]]; then | |
start=$(( start*2 - 1 )); | |
fi; | |
echo "${comp[*]:start:end*2-start}" | |
} | |
ver_rs () | |
{ | |
local v; | |
(( ${#} & 1 )) && v=${@: -1} || v=${PV}; | |
local start end i; | |
local -a comp; | |
__eapi7_ver_split "${v}"; | |
local max=$((${#comp[@]}/2 - 1)); | |
while [[ ${#} -ge 2 ]]; do | |
__eapi7_ver_parse_range "${1}" "${max}"; | |
for ((i = start*2; i <= end*2; i+=2 )) | |
do | |
[[ ${i} -eq 0 && -z ${comp[i]} ]] && continue; | |
comp[i]=${2}; | |
done; | |
shift 2; | |
done; | |
local IFS=; | |
echo "${comp[*]}" | |
} | |
ver_test () | |
{ | |
local va op vb; | |
if [[ $# -eq 3 ]]; then | |
va=${1}; | |
shift; | |
else | |
va=${PVR}; | |
fi; | |
[[ $# -eq 2 ]] || die "${FUNCNAME}: bad number of arguments"; | |
op=${1}; | |
vb=${2}; | |
case ${op} in | |
-eq | -ne | -lt | -le | -gt | -ge) | |
;; | |
*) | |
die "${FUNCNAME}: invalid operator: ${op}" | |
;; | |
esac; | |
__eapi7_ver_compare "${va}" "${vb}"; | |
test $? "${op}" 2 | |
} | |
virtx () | |
{ | |
debug-print-function ${FUNCNAME} "$@"; | |
[[ $# -lt 1 ]] && die "${FUNCNAME} needs at least one argument"; | |
local i=0; | |
local retval=0; | |
local OLD_SANDBOX_ON="${SANDBOX_ON}"; | |
local XVFB XHOST XDISPLAY; | |
local xvfbargs="-screen 0 1280x1024x24 +extension RANDR"; | |
XVFB=$(type -p Xvfb) || die; | |
XHOST=$(type -p xhost) || die; | |
debug-print "${FUNCNAME}: running Xvfb hack"; | |
export XAUTHORITY=; | |
einfo "Scanning for an open DISPLAY to start Xvfb ..."; | |
XDISPLAY=$(i=1; while [[ -f /tmp/.X${i}-lock ]] ; do ((i++));done; echo ${i}); | |
debug-print "${FUNCNAME}: XDISPLAY=${XDISPLAY}"; | |
export SANDBOX_ON="0"; | |
debug-print "${FUNCNAME}: ${XVFB} :${XDISPLAY} ${xvfbargs}"; | |
${XVFB} :${XDISPLAY} ${xvfbargs} &> /dev/null & sleep 2; | |
local start=${XDISPLAY}; | |
while [[ ! -f /tmp/.X${XDISPLAY}-lock ]]; do | |
if ((XDISPLAY - start > 15)); then | |
eerror "'${XVFB} :${XDISPLAY} ${xvfbargs}' returns:"; | |
echo; | |
${XVFB} :${XDISPLAY} ${xvfbargs}; | |
echo; | |
eerror "If possible, correct the above error and try your emerge again."; | |
die "Unable to start Xvfb"; | |
fi; | |
((XDISPLAY++)); | |
debug-print "${FUNCNAME}: ${XVFB} :${XDISPLAY} ${xvfbargs}"; | |
${XVFB} :${XDISPLAY} ${xvfbargs} &> /dev/null & sleep 2; | |
done; | |
export SANDBOX_ON="${OLD_SANDBOX_ON}"; | |
einfo "Starting Xvfb on \$DISPLAY=${XDISPLAY} ..."; | |
export DISPLAY=:${XDISPLAY}; | |
debug-print "${FUNCNAME}: $@"; | |
nonfatal "$@"; | |
retval=$?; | |
kill $(cat /tmp/.X${XDISPLAY}-lock); | |
[[ ${retval} -ne 0 ]] && die "Failed to run '$@'"; | |
return 0 | |
} | |
xdg_desktop_database_update () | |
{ | |
if [[ ${EBUILD_PHASE} != post* ]]; then | |
die "xdg_desktop_database_update must be used in pkg_post* phases."; | |
fi; | |
if ! type update-desktop-database &> /dev/null; then | |
debug-print "update-desktop-database is not found"; | |
return; | |
fi; | |
ebegin "Updating .desktop files database"; | |
update-desktop-database -q "${EROOT%/}${DESKTOP_DATABASE_DIR}"; | |
eend $? | |
} | |
xdg_environment_reset () | |
{ | |
export XDG_DATA_HOME="${HOME}/.local/share"; | |
export XDG_CONFIG_HOME="${HOME}/.config"; | |
export XDG_CACHE_HOME="${HOME}/.cache"; | |
export XDG_RUNTIME_DIR="${T}/run"; | |
mkdir -p "${XDG_DATA_HOME}" "${XDG_CONFIG_HOME}" "${XDG_CACHE_HOME}" "${XDG_RUNTIME_DIR}" || die; | |
chmod 0700 "${XDG_RUNTIME_DIR}" || die; | |
unset DBUS_SESSION_BUS_ADDRESS | |
} | |
xdg_icon_cache_update () | |
{ | |
if [[ ${EBUILD_PHASE} != post* ]]; then | |
die "xdg_icon_cache_update must be used in pkg_post* phases."; | |
fi; | |
if ! type gtk-update-icon-cache &> /dev/null; then | |
debug-print "gtk-update-icon-cache is not found"; | |
return; | |
fi; | |
ebegin "Updating icons cache"; | |
local dir f retval=0; | |
local fails=(); | |
for dir in "${EROOT%/}"/usr/share/icons/*; | |
do | |
if [[ -f "${dir}/index.theme" ]]; then | |
local rv=0; | |
gtk-update-icon-cache -qf "${dir}"; | |
rv=$?; | |
if [[ ! $rv -eq 0 ]]; then | |
debug-print "Updating cache failed on ${dir}"; | |
fails+=("${dir}"); | |
retval=2; | |
fi; | |
else | |
if [[ $(ls "${dir}") = "icon-theme.cache" ]]; then | |
rm "${dir}/icon-theme.cache"; | |
fi; | |
fi; | |
if [[ -z $(ls "${dir}") ]]; then | |
rmdir "${dir}"; | |
fi; | |
done; | |
eend ${retval}; | |
for f in "${fails[@]}"; | |
do | |
eerror "Failed to update cache with icon $f"; | |
done | |
} | |
xdg_mimeinfo_database_update () | |
{ | |
if [[ ${EBUILD_PHASE} != post* ]]; then | |
die "xdg_mimeinfo_database_update must be used in pkg_post* phases."; | |
fi; | |
if ! type update-mime-database &> /dev/null; then | |
debug-print "update-mime-database is not found"; | |
return; | |
fi; | |
ebegin "Updating shared mime info database"; | |
update-mime-database "${EROOT%/}${MIMEINFO_DATABASE_DIR}"; | |
eend $? | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment