Advertisement
denxxter

build log

Mar 7th, 2025
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 157.04 KB | None | 0 0
  1. declare -x ABI="amd64"
  2. declare -x ABI_MIPS=""
  3. declare -x ABI_S390=""
  4. declare -x ABI_X86="64 32"
  5. declare -x ADA_TARGET=""
  6. declare -x ALACRITTY_LOG="/tmp/Alacritty-3025.log"
  7. declare -x ALACRITTY_WINDOW_ID="94262799431360"
  8. declare -a ALL_LLVM_EXPERIMENTAL_TARGETS=([0]="ARC" [1]="CSKY" [2]="DirectX" [3]="M68k" [4]="Xtensa")
  9. declare -a ALL_LLVM_PRODUCTION_TARGETS=([0]="AArch64" [1]="AMDGPU" [2]="ARM" [3]="AVR" [4]="BPF" [5]="Hexagon" [6]="Lanai" [7]="LoongArch" [8]="Mips" [9]="MSP430" [10]="NVPTX" [11]="PowerPC" [12]="RISCV" [13]="Sparc" [14]="SPIRV" [15]="SystemZ" [16]="VE" [17]="WebAssembly" [18]="X86" [19]="XCore")
  10. declare -a ALL_LLVM_TARGET_FLAGS=([0]="llvm_targets_AArch64" [1]="llvm_targets_AMDGPU" [2]="llvm_targets_ARM" [3]="llvm_targets_AVR" [4]="llvm_targets_BPF" [5]="llvm_targets_Hexagon" [6]="llvm_targets_Lanai" [7]="llvm_targets_LoongArch" [8]="llvm_targets_Mips" [9]="llvm_targets_MSP430" [10]="llvm_targets_NVPTX" [11]="llvm_targets_PowerPC" [12]="llvm_targets_RISCV" [13]="llvm_targets_Sparc" [14]="llvm_targets_SPIRV" [15]="llvm_targets_SystemZ" [16]="llvm_targets_VE" [17]="llvm_targets_WebAssembly" [18]="llvm_targets_X86" [19]="llvm_targets_XCore" [20]="llvm_targets_ARC" [21]="llvm_targets_CSKY" [22]="llvm_targets_DirectX" [23]="llvm_targets_M68k" [24]="llvm_targets_Xtensa")
  11. declare -x ALSA_CARDS=""
  12. declare -x AMDGPU_TARGETS=""
  13. declare -x APACHE2_MODULES=""
  14. declare -x APACHE2_MPMS=""
  15. declare -x ARCH="amd64"
  16. declare BDEPEND=$'\n\tclang? (\n\t\tllvm-core/clang:20\n\t\tllvm-runtimes/compiler-rt:20\n\t)\n\telibc_glibc? ( net-libs/libtirpc )\n\ttest? (\n\t\t|| ( ( dev-lang/python:3.13 >=dev-python/lit-15[python_targets_python3_13(-)] ) ( dev-lang/python:3.12 >=dev-python/lit-15[python_targets_python3_12(-)] ) ( dev-lang/python:3.11 >=dev-python/lit-15[python_targets_python3_11(-)] ) ( dev-lang/python:3.10 >=dev-python/lit-15[python_targets_python3_10(-)] ) )\n\t\t=llvm-core/clang-20.1.0*:20\n\t)\n\t!test? (\n\t\t|| ( dev-lang/python:3.13 dev-lang/python:3.12 dev-lang/python:3.11 dev-lang/python:3.10 )\n\t)\n\n\t\t\t\tverify-sig? (\n\t\t\t\t\t>=sec-keys/openpgp-keys-llvm-18.1.6\n\t\t\t\t)\n\t\t\t app-alternatives/ninja >=dev-build/cmake-3.20.5 \n\t\t\tverify-sig? (\n\t\t\t\tapp-crypt/gnupg\n\t\t\t\t>=app-portage/gemato-20\n\t\t\t)\n\t\t'
  17. declare -x BINPKG_FORMAT="gpkg"
  18. declare -x BINPKG_GPG_SIGNING_BASE_COMMAND="/usr/bin/flock /run/lock/portage-binpkg-gpg.lock /usr/bin/gpg --sign --armor [PORTAGE_CONFIG]"
  19. declare -x BINPKG_GPG_SIGNING_DIGEST="SHA512"
  20. declare -x BINPKG_GPG_VERIFY_BASE_COMMAND="/usr/bin/gpg --verify --batch --no-tty --no-auto-check-trustdb --status-fd 2 [PORTAGE_CONFIG] [SIGNATURE]"
  21. declare -x BINPKG_GPG_VERIFY_GPG_HOME="/etc/portage/gnupg"
  22. declare -x BOOTSTRAP_USE="unicode pkg-config split-usr xml python_targets_python3_12 python_single_target_python3_12 multilib zstd cet"
  23. declare -- BUILD_DIR="/var/tmp/portage/llvm-runtimes/compiler-rt-sanitizers-20.1.0/work/compiler-rt_build"
  24. declare -x CALLIGRA_FEATURES=""
  25. declare -x CAMERAS=""
  26. declare -x CBUILD="x86_64-pc-linux-gnu"
  27. declare -x CFLAGS="-march=alderlake -O2 -pipe -flto -Werror=odr -Werror=strict-aliasing"
  28. declare -x CFLAGS_amd64="-m64"
  29. declare -x CFLAGS_default
  30. declare -x CFLAGS_x32="-mx32"
  31. declare -x CFLAGS_x86="-m32 -mfpmath=sse"
  32. declare -x CGO_CFLAGS="-march=alderlake -O2 -pipe -flto -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing"
  33. declare -x CGO_CXXFLAGS="-march=alderlake -O2 -pipe -flto -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing"
  34. declare -x CGO_FFLAGS="-march=alderlake -O2 -pipe -flto -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing"
  35. declare -x CGO_LDFLAGS="-Wl,-O1 -Wl,--as-needed -Wl,-z,pack-relative-relocs"
  36. declare -x CHOST="x86_64-pc-linux-gnu"
  37. declare -x CHOST_amd64="x86_64-pc-linux-gnu"
  38. declare -x CHOST_default="x86_64-pc-linux-gnu"
  39. declare -x CHOST_x32="x86_64-pc-linux-gnux32"
  40. declare -x CHOST_x86="i686-pc-linux-gnu"
  41. declare -- CMAKE_BINARY="cmake"
  42. declare -- CMAKE_BUILD_TYPE="RelWithDebInfo"
  43. declare -- CMAKE_MAKEFILE_GENERATOR="ninja"
  44. declare -a CMAKE_REMOVE_MODULES_LIST=([0]="FindBLAS" [1]="FindLAPACK")
  45. declare -- CMAKE_USE_DIR="/var/tmp/portage/llvm-runtimes/compiler-rt-sanitizers-20.1.0/work/compiler-rt"
  46. declare -- CMAKE_VERBOSE="ON"
  47. declare -- CMAKE_WARN_UNUSED_CLI="yes"
  48. declare -x COLLECTD_PLUGINS=""
  49. declare -x COMMON_FLAGS="-march=alderlake -O2 -pipe -flto -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing"
  50. declare -x CPPFLAGS="-march=alderlake -O2 -pipe -flto -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing"
  51. declare -x CPU_FLAGS_ARM=""
  52. declare -x CPU_FLAGS_PPC=""
  53. declare -x CPU_FLAGS_X86=""
  54. declare -x CTARGET_default="x86_64-pc-linux-gnu"
  55. declare -x CURL_QUIC=""
  56. declare -x CURL_SSL=""
  57. declare -x CXXFLAGS="-march=alderlake -O2 -pipe -flto -Werror=odr -Werror=strict-aliasing"
  58. declare -x DEFAULT_ABI="amd64"
  59. declare -x DEFINED_PHASES=" compile configure install prepare pretend setup test unpack"
  60. declare DEPEND=$'\n\tllvm-core/llvm:20\n\tvirtual/libcrypt[abi_x86_32(-)?,abi_x86_64(-)?]\n '
  61. declare DESCRIPTION="Compiler runtime libraries for clang (sanitizers & xray)"
  62. declare -- DESKTOP_DATABASE_DIR="/usr/share/applications"
  63. declare -x DESKTOP_SESSION="niri"
  64. declare -x DIROPTIONS="-m0755"
  65. declare -x EAPI="8"
  66. declare -x ELIBC="glibc"
  67. declare -x ENV_UNSET="CARGO_HOME DBUS_SESSION_BUS_ADDRESS DISPLAY GDK_PIXBUF_MODULE_FILE GOBIN GOPATH PERL5LIB PERL5OPT PERLPREFIX PERL_CORE PERL_MB_OPT PERL_MM_OPT XAUTHORITY XDG_CACHE_HOME XDG_CONFIG_HOME XDG_DATA_HOME XDG_RUNTIME_DIR XDG_STATE_HOME"
  68. declare -- EPOCHREALTIME="1741337521.855836"
  69. declare -- EPOCHSECONDS="1741337521"
  70. declare -x EPYTHON="python3.13"
  71. declare -x EXEOPTIONS="-m0755"
  72. declare -x FCFLAGS="-march=alderlake -O2 -pipe -flto -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing"
  73. 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}\""
  74. declare -x FFLAGS="-march=alderlake -O2 -pipe -flto -Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing"
  75. declare -x FFTOOLS=""
  76. declare -x GCC_SPECS=""
  77. declare -x GOAMD64="v3"
  78. declare -x GPG_VERIFY_GROUP_DROP="nogroup"
  79. declare -x GPG_VERIFY_USER_DROP="nobody"
  80. declare -x GPSD_PROTOCOLS=""
  81. declare -x GRUB_PLATFORMS=""
  82. declare -x GSETTINGS_BACKEND="dconf"
  83. declare -x GTK_THEME="Colloid-Dark-Tokyonight"
  84. declare -x GUILE_SINGLE_TARGET=""
  85. declare -x GUILE_TARGETS=""
  86. declare HOMEPAGE="https://llvm.org/"
  87. declare IDEPEND=""
  88. declare -x INHERITED=" check-reqs toolchain-funcs multilib flag-o-matic multiprocessing ninja-utils xdg-utils cmake eapi9-pipestatus verify-sig llvm.org llvm-utils python-utils-r1 python-any-r1"
  89. declare -x INPUT_DEVICES=""
  90. declare -x INSOPTIONS="-m0644"
  91. declare IUSE="+abi_x86_32 abi_x86_64 +clang debug test +ctx-profile +libfuzzer +memprof +orc +profile +xray +asan +dfsan +lsan +msan +hwasan +tsan +ubsan +safestack +cfi +scudo +shadowcallstack +gwp-asan +nsan +rtsan test verify-sig"
  92. declare -x IUSE_EFFECTIVE="abi_x86_32 abi_x86_64 alpha amd64 amd64-linux arm arm64 arm64-macos asan cfi clang ctx-profile debug dfsan elibc_Darwin elibc_SunOS elibc_bionic elibc_glibc elibc_mingw elibc_musl gwp-asan hppa hwasan kernel_Darwin kernel_SunOS kernel_linux libfuzzer loong lsan m68k memprof mips msan nsan orc ppc ppc-macos ppc64 ppc64-linux prefix prefix-guest prefix-stack profile riscv rtsan s390 safestack scudo shadowcallstack sparc test tsan ubsan verify-sig x64-macos x64-solaris x86 x86-linux xray"
  93. declare -x IUSE_IMPLICIT="abi_x86_64 prefix prefix-guest prefix-stack"
  94. declare -x KERNEL="linux"
  95. declare -x KERNEL_ABI="amd64"
  96. declare -x KEYWORDS="~amd64 ~arm ~arm64 ~loong ~mips ~ppc64 ~riscv ~x86 ~amd64-linux ~ppc-macos ~x64-macos"
  97. declare -x L10N=""
  98. declare -x LANG="en_US.utf8"
  99. declare -x LCD_DEVICES=""
  100. declare -x LC_COLLATE="C"
  101. declare -x LC_MESSAGES="C.utf8"
  102. declare -x LDFLAGS="-Wl,-O1 -Wl,--as-needed -Wl,-z,pack-relative-relocs"
  103. declare -x LDFLAGS_amd64="-m elf_x86_64"
  104. declare -x LDFLAGS_default
  105. declare -x LDFLAGS_x32="-m elf32_x86_64"
  106. declare -x LDFLAGS_x86="-m elf_i386"
  107. declare -x LEX="flex"
  108. declare -x LIBDIR_amd64="lib64"
  109. declare -x LIBDIR_default="lib"
  110. declare -x LIBDIR_x32="libx32"
  111. declare -x LIBDIR_x86="lib"
  112. declare -x LIBOPTIONS="-m0644"
  113. declare -x LIBREOFFICE_EXTENSIONS=""
  114. declare -x LICENSE="Apache-2.0-with-LLVM-exceptions || ( UoI-NCSA MIT )"
  115. declare -a LLVM_COMPONENTS=([0]="compiler-rt" [1]="cmake" [2]="llvm/cmake")
  116. declare -- LLVM_MAJOR="20"
  117. declare -x LLVM_SLOT=""
  118. declare -- LLVM_SOABI="20.1"
  119. declare -x LLVM_TARGETS=""
  120. declare -a LLVM_TEST_COMPONENTS=([0]="llvm/include/llvm/ProfileData" [1]="llvm/lib/Testing/Support" [2]="third-party")
  121. declare -- LLVM_VERSION="20.1.0"
  122. declare -x LUA_SINGLE_TARGET=""
  123. declare -x LUA_TARGETS=""
  124. declare -x MAIL="/var/mail/dex"
  125. declare -x MAKEOPTS="-j6 -l6"
  126. declare -x MANPAGER="manpager"
  127. declare -- MIMEINFO_DATABASE_DIR="/usr/share/mime"
  128. declare -x MOTD_SHOWN="pam"
  129. declare -x MULTILIB_ABIS="amd64 x86"
  130. declare -x MULTILIB_STRICT_DENY="64-bit.*shared object"
  131. 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"
  132. declare -x MULTILIB_STRICT_EXEMPT="(perl5|gcc|binutils|eclipse-3|debug|portage|udev|systemd|clang|python-exec|llvm)"
  133. declare -x NGINX_MODULES_HTTP=""
  134. declare -x NGINX_MODULES_MAIL=""
  135. declare -x NGINX_MODULES_STREAM=""
  136. declare -- NINJA="ninja"
  137. declare -- NINJA_DEPEND="app-alternatives/ninja"
  138. declare -- NINJA_VERBOSE="ON"
  139. declare -x NIRI_SOCKET="/run/user/1000/niri.wayland-1.2352.sock"
  140. declare -x NPM_CONFIG_GLOBALCONFIG="/etc/npm/npmrc"
  141. declare -x OFFICE_IMPLEMENTATION=""
  142. declare -x OPENMPI_FABRICS=""
  143. declare -x OPENMPI_OFED_FEATURES=""
  144. declare -x OPENMPI_RM=""
  145. declare -x PATH="/var/tmp/portage/llvm-runtimes/compiler-rt-sanitizers-20.1.0/temp/python3.13/bin:/usr/lib/portage/python3.13/ebuild-helpers/xattr:/usr/lib/portage/python3.13/ebuild-helpers:/usr/local/sbin:/usr/local/bin:/usr/bin:/opt/bin:/usr/lib/llvm/20/bin:/usr/lib/llvm/19/bin"
  146. declare PDEPEND=""
  147. declare -x PERL_FEATURES=""
  148. declare -x PHP_TARGETS=""
  149. declare -x PKG_CONFIG_PATH="/var/tmp/portage/llvm-runtimes/compiler-rt-sanitizers-20.1.0/temp/python3.13/pkgconfig"
  150. declare -x PORTAGE_BZIP2_COMMAND="bzip2"
  151. declare -x PORTAGE_COMPRESSION_COMMAND="zstd -T6"
  152. declare -a PORTAGE_DOCOMPRESS=([0]="/usr/share/doc" [1]="/usr/share/info" [2]="/usr/share/man")
  153. declare -x PORTAGE_DOCOMPRESS_SIZE_LIMIT="128"
  154. declare -a PORTAGE_DOCOMPRESS_SKIP=([0]="/usr/share/doc/compiler-rt-sanitizers-20.1.0/html")
  155. declare -a PORTAGE_DOSTRIP=([0]="/")
  156. declare -a PORTAGE_DOSTRIP_SKIP=()
  157. declare -x PORTAGE_REPO_REVISIONS="{\"gentoo\": \"dd52f90135b38472764ef6097cc4058fb840635e\"}"
  158. declare -x POSTGRES_TARGETS=""
  159. declare -x PROFILE_ONLY_VARIABLES="ARCH ELIBC IUSE_IMPLICIT KERNEL USE_EXPAND_IMPLICIT USE_EXPAND_UNPREFIXED USE_EXPAND_VALUES_ARCH USE_EXPAND_VALUES_ELIBC USE_EXPAND_VALUES_KERNEL"
  160. declare -- PROPERTIES=""
  161. declare -x PYTHON="/usr/bin/python3.13"
  162. declare -x PYTHONDONTWRITEBYTECODE="1"
  163. declare -a PYTHON_COMPAT=([0]="python3_10" [1]="python3_11" [2]="python3_12" [3]="python3_13")
  164. declare -- PYTHON_DEPS="|| ( dev-lang/python:3.13 dev-lang/python:3.12 dev-lang/python:3.11 dev-lang/python:3.10 )"
  165. declare -- PYTHON_REQUIRED_USE="I-DO-NOT-EXIST-IN-PYTHON-ANY-R1"
  166. declare -x PYTHON_SINGLE_TARGET=""
  167. declare -x PYTHON_TARGETS=""
  168. declare -x QEMU_SOFTMMU_TARGETS=""
  169. declare -x QEMU_USER_TARGETS=""
  170. declare -x QT_QPA_PLATFORM="wayland"
  171. declare -x QT_QPA_PLATFORMTHEME="qt5ct"
  172. declare RDEPEND=""
  173. declare REPOSITORY
  174. declare REQUIRED_USE=$'\n\t|| ( asan dfsan lsan msan hwasan tsan ubsan safestack cfi scudo shadowcallstack gwp-asan nsan rtsan libfuzzer orc profile xray )\n\ttest? (\n\t\tcfi? ( ubsan )\n\t\tgwp-asan? ( scudo )\n\t)\n '
  175. declare RESTRICT="test"
  176. 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}\""
  177. declare -x RUBY_TARGETS=""
  178. declare -x RUSTFLAGS=" -C target-cpu=alderlake -C strip=debuginfo"
  179. declare -x S="/var/tmp/portage/llvm-runtimes/compiler-rt-sanitizers-20.1.0/work/compiler-rt"
  180. declare -x SANDBOX_DEBUG="0"
  181. declare -x SANDBOX_DENY=""
  182. declare -x SANDBOX_METHOD="any"
  183. declare -x SANDBOX_PREDICT="/var/tmp/portage/llvm-runtimes/compiler-rt-sanitizers-20.1.0/homedir:/dev/crypto:/var/cache/man:/var/cache/fontconfig"
  184. declare -x SANDBOX_READ="/:/var/tmp/portage"
  185. declare -x SANDBOX_VERBOSE="1"
  186. declare -x SANDBOX_WRITE=":/dev/console:/dev/fd:/dev/full:/dev/null:/dev/ptmx:/dev/pts/:/dev/pty:/dev/shm:/dev/tts:/dev/tty:/dev/vc/:/dev/zero:/proc/self/fd:/tmp/:/usr/lib/cf:/usr/lib/conftest:/usr/lib32/cf:/usr/lib32/conftest:/usr/lib64/cf:/usr/lib64/conftest:/usr/tmp/:/usr/tmp/cf:/usr/tmp/conftest:/var/tmp/:/var/tmp/portage:/var/tmp/portage/llvm-runtimes/compiler-rt-sanitizers-20.1.0/homedir/.bash_history"
  187. declare -x SANE_BACKENDS=""
  188. declare -a SANITIZER_FLAGS=([0]="asan" [1]="dfsan" [2]="lsan" [3]="msan" [4]="hwasan" [5]="tsan" [6]="ubsan" [7]="safestack" [8]="cfi" [9]="scudo" [10]="shadowcallstack" [11]="gwp-asan" [12]="nsan" [13]="rtsan")
  189. declare -x SHELL="/bin/bash"
  190. declare -x SHELL_SETS_TITLE="0"
  191. declare -x SLOT="20"
  192. declare -i SRANDOM="1492023314"
  193. declare SRC_URI=$'\n\t\t\t\t\thttps://github.com/llvm/llvm-project/releases/download/llvmorg-20.1.0/llvm-project-20.1.0.src.tar.xz\n\t\t\t\t\tverify-sig? (\n\t\t\t\t\t\thttps://github.com/llvm/llvm-project/releases/download/llvmorg-20.1.0/llvm-project-20.1.0.src.tar.xz.sig\n\t\t\t\t\t)\n\t\t\t\t'
  194. declare -x STARSHIP_SESSION_KEY="3121123628891145"
  195. declare -x STARSHIP_SHELL="fish"
  196. declare -x SYMLINK_LIB="no"
  197. declare -x TWISTED_DISABLE_WRITING_OF_PLUGIN_CACHE="1"
  198. declare -x USE="abi_x86_32 abi_x86_64 amd64 asan cfi clang ctx-profile dfsan elibc_glibc gwp-asan hwasan kernel_linux libfuzzer lsan memprof msan nsan orc profile rtsan safestack scudo tsan ubsan xray"
  199. declare -x USERLAND="GNU"
  200. declare -x USE_EXPAND_IMPLICIT="ARCH ELIBC KERNEL"
  201. declare -x USE_EXPAND_UNPREFIXED="ARCH"
  202. declare -x USE_EXPAND_VALUES_ARCH="alpha amd64 amd64-linux arm arm64 arm64-macos hppa loong m68k mips ppc ppc64 ppc64-linux ppc-macos riscv s390 sparc x64-macos x64-solaris x86 x86-linux"
  203. declare -x USE_EXPAND_VALUES_ELIBC="bionic Darwin glibc mingw musl SunOS"
  204. declare -x USE_EXPAND_VALUES_KERNEL="Darwin linux SunOS"
  205. declare -x UWSGI_PLUGINS=""
  206. declare -- VERIFY_SIG_METHOD="openpgp"
  207. declare -- VERIFY_SIG_OPENPGP_KEY_PATH="/usr/share/openpgp-keys/llvm.asc"
  208. declare -- VERIFY_SIG_OPENPGP_KEY_REFRESH="no"
  209. declare -x VIDEO_CARDS=""
  210. declare -x VIRTUAL_ENV="/home/dex/.venv/main"
  211. declare -x VIRTUAL_ENV_PROMPT="main"
  212. declare -x VOICEMAIL_STORAGE=""
  213. declare -x WARNING_FLAGS="-Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing"
  214. declare -x WAYLAND_DISPLAY="wayland-1"
  215. declare -x WINDOWID="94262799431360"
  216. declare -x XCURSOR_SIZE="22"
  217. declare -x XCURSOR_THEME="Future-cursors"
  218. declare -x XDG_CACHE_HOME="/var/tmp/portage/llvm-runtimes/compiler-rt-sanitizers-20.1.0/homedir/.cache"
  219. declare -x XDG_CONFIG_DIRS="/etc/xdg"
  220. declare -x XDG_CONFIG_HOME="/var/tmp/portage/llvm-runtimes/compiler-rt-sanitizers-20.1.0/homedir/.config"
  221. declare -x XDG_CURRENT_DESKTOP="niri"
  222. declare -x XDG_DATA_DIRS="/usr/local/share:/usr/share"
  223. declare -x XDG_DATA_HOME="/var/tmp/portage/llvm-runtimes/compiler-rt-sanitizers-20.1.0/homedir/.local/share"
  224. declare -x XDG_RUNTIME_DIR="/var/tmp/portage/llvm-runtimes/compiler-rt-sanitizers-20.1.0/temp/run"
  225. declare -x XDG_SEAT="seat0"
  226. declare -x XDG_SESSION_DESKTOP="niri"
  227. declare -x XDG_SESSION_ID="2"
  228. declare -x XDG_SESSION_TYPE="wayland"
  229. declare -x XDG_STATE_HOME="/var/tmp/portage/llvm-runtimes/compiler-rt-sanitizers-20.1.0/homedir/.local/state"
  230. declare -x XDG_VTNR="7"
  231. declare -x XTABLES_ADDONS=""
  232. declare -- _CHECK_REQS_ECLASS="1"
  233. declare -- _CMAKE_ECLASS="1"
  234. declare -- _CMAKE_SRC_PREPARE_HAS_RUN="1"
  235. declare -- _FLAG_O_MATIC_ECLASS="1"
  236. declare -- _LLVM_MAIN_MAJOR="21"
  237. declare -- _LLVM_ORG_SET_GLOBALS_CALLED="1"
  238. declare -- _LLVM_SOURCE_TYPE="tar"
  239. declare -- _LLVM_UTILS_ECLASS="1"
  240. declare -- _MULTILIB_ECLASS="1"
  241. declare -- _MULTIPROCESSING_ECLASS="1"
  242. declare -- _NINJA_UTILS_ECLASS="1"
  243. declare -x _OLD_VIRTUAL_PATH="/home/dex/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/opt/bin:/usr/lib/llvm/20/bin:/usr/lib/llvm/19/bin:/home/dex/.local/share/scripts"
  244. declare -a _PYTHON_ALL_IMPLS=([0]="pypy3" [1]="pypy3_11" [2]="python3_13t" [3]="python3_10" [4]="python3_11" [5]="python3_12" [6]="python3_13")
  245. declare -- _PYTHON_ANY_R1_ECLASS="1"
  246. declare -a _PYTHON_HISTORICAL_IMPLS=([0]="jython2_7" [1]="pypy" [2]="pypy1_8" [3]="pypy1_9" [4]="pypy2_0" [5]="python2_5" [6]="python2_6" [7]="python2_7" [8]="python3_1" [9]="python3_2" [10]="python3_3" [11]="python3_4" [12]="python3_5" [13]="python3_6" [14]="python3_7" [15]="python3_8" [16]="python3_9")
  247. declare -- _PYTHON_SANITY_CHECKED="1"
  248. declare -a _PYTHON_SUPPORTED_IMPLS=([0]="python3_10" [1]="python3_11" [2]="python3_12" [3]="python3_13")
  249. declare -a _PYTHON_UNSUPPORTED_IMPLS=([0]="pypy3" [1]="pypy3_11" [2]="python3_13t")
  250. declare -- _PYTHON_UTILS_R1_ECLASS="1"
  251. declare -- _TOOLCHAIN_FUNCS_ECLASS="1"
  252. declare -- _VERIFY_SIG_ECLASS="1"
  253. declare -x __E_DESTTREE="/usr"
  254. declare -x __E_DOCDESTTREE=""
  255. declare -x __E_EXEDESTTREE=""
  256. declare -x __E_INSDESTTREE=""
  257. declare -x ac_cv_c_undeclared_builtin_options="none needed"
  258. declare -x enable_year2038="no"
  259. declare -x gl_cv_compiler_check_decl_option="-Werror=implicit-function-declaration"
  260. declare -x gl_cv_func_getcwd_path_max="yes"
  261. _check-reqs_disk ()
  262. {
  263. debug-print-function ${FUNCNAME} "$@";
  264. [[ -z ${2} ]] && die "Usage: ${FUNCNAME} [path] [size]";
  265. local path=${1};
  266. local size=${2};
  267. local space_kbi;
  268. _check-reqs_start_phase ${size} "disk space at \"${path}\"";
  269. space_kbi=$(df -Pk "${1}" 2> /dev/null | awk 'FNR == 2 {print $4}');
  270. if [[ $? == 0 && -n ${space_kbi} ]]; then
  271. if [[ ${space_kbi} -lt $(_check-reqs_get_kibibytes ${size}) ]]; then
  272. eend 1;
  273. _check-reqs_unsatisfied ${size} "disk space at \"${path}\"";
  274. else
  275. eend 0;
  276. fi;
  277. else
  278. eend 1;
  279. ewarn "Couldn't determine disk space, skipping...";
  280. fi
  281. }
  282. _check-reqs_get_kibibytes ()
  283. {
  284. debug-print-function ${FUNCNAME} "$@";
  285. [[ -z ${1} ]] && die "Usage: ${FUNCNAME} [size]";
  286. local unit=${1:(-1)};
  287. local size=${1%[GMT]};
  288. case ${unit} in
  289. M)
  290. echo $((1024 * size))
  291. ;;
  292. G)
  293. echo $((1024 * 1024 * size))
  294. ;;
  295. T)
  296. echo $((1024 * 1024 * 1024 * size))
  297. ;;
  298. *)
  299. die "${FUNCNAME}: Unknown unit: ${unit}"
  300. ;;
  301. esac
  302. }
  303. _check-reqs_get_number ()
  304. {
  305. debug-print-function ${FUNCNAME} "$@";
  306. [[ -z ${1} ]] && die "Usage: ${FUNCNAME} [size]";
  307. local size=${1%[GMT]};
  308. [[ ${size} == ${1} ]] && die "${FUNCNAME}: Missing unit: ${1}";
  309. echo ${size}
  310. }
  311. _check-reqs_get_unit ()
  312. {
  313. debug-print-function ${FUNCNAME} "$@";
  314. [[ -z ${1} ]] && die "Usage: ${FUNCNAME} [size]";
  315. local unit=${1:(-1)};
  316. case ${unit} in
  317. M)
  318. echo "MiB"
  319. ;;
  320. G)
  321. echo "GiB"
  322. ;;
  323. T)
  324. echo "TiB"
  325. ;;
  326. *)
  327. die "${FUNCNAME}: Unknown unit: ${unit}"
  328. ;;
  329. esac
  330. }
  331. _check-reqs_memory ()
  332. {
  333. debug-print-function ${FUNCNAME} "$@";
  334. [[ -z ${1} ]] && die "Usage: ${FUNCNAME} [size]";
  335. local size=${1};
  336. local actual_memory;
  337. local actual_swap;
  338. _check-reqs_start_phase ${size} "RAM";
  339. if [[ -r /proc/meminfo ]]; then
  340. actual_memory=$(awk '/MemTotal/ { print $2 }' /proc/meminfo);
  341. actual_swap=$(awk '/SwapTotal/ { print $2 }' /proc/meminfo);
  342. else
  343. actual_memory=$(sysctl hw.physmem 2> /dev/null);
  344. [[ $? -eq 0 ]] && actual_memory=$(echo "${actual_memory}" | sed -e 's/^[^:=]*[:=][[:space:]]*//');
  345. actual_swap=$(sysctl vm.swap_total 2> /dev/null);
  346. [[ $? -eq 0 ]] && actual_swap=$(echo "${actual_swap}" | sed -e 's/^[^:=]*[:=][[:space:]]*//');
  347. fi;
  348. if [[ -n ${actual_memory} ]]; then
  349. if [[ ${actual_memory} -ge $(_check-reqs_get_kibibytes ${size}) ]]; then
  350. eend 0;
  351. else
  352. if [[ -n ${actual_swap} && $((${actual_memory} + ${actual_swap})) -ge $(_check-reqs_get_kibibytes ${size}) ]]; then
  353. ewarn "Amount of main memory is insufficient, but amount";
  354. ewarn "of main memory combined with swap is sufficient.";
  355. ewarn "Build process may make computer very slow!";
  356. eend 0;
  357. else
  358. eend 1;
  359. _check-reqs_unsatisfied ${size} "RAM";
  360. fi;
  361. fi;
  362. else
  363. eend 1;
  364. ewarn "Couldn't determine amount of memory, skipping...";
  365. fi
  366. }
  367. _check-reqs_output ()
  368. {
  369. debug-print-function ${FUNCNAME} "$@";
  370. local msg="ewarn";
  371. [[ ${EBUILD_PHASE} == "pretend" && -z ${CHECKREQS_DONOTHING} ]] && msg="eerror";
  372. if [[ -n ${CHECKREQS_FAILED} ]]; then
  373. ${msg};
  374. ${msg} "Memory or space constraints set in the ebuild were not met!";
  375. ${msg} "The build will most probably fail, you should:";
  376. ${msg} "- enhance the memory (reduce MAKEOPTS, add swap), or";
  377. ${msg} "- add more space";
  378. ${msg} "as required depending on the failed tests.";
  379. ${msg};
  380. [[ ${EBUILD_PHASE} == "pretend" && -z ${CHECKREQS_DONOTHING} ]] && die "Build requirements not met!";
  381. fi
  382. }
  383. _check-reqs_prepare ()
  384. {
  385. debug-print-function ${FUNCNAME} "$@";
  386. if [[ -z ${CHECKREQS_MEMORY} && -z ${CHECKREQS_DISK_BUILD} && -z ${CHECKREQS_DISK_USR} && -z ${CHECKREQS_DISK_VAR} ]]; then
  387. eerror "Set some check-reqs eclass variables if you want to use it.";
  388. eerror "If you are user and see this message file a bug against the package.";
  389. die "${FUNCNAME}: check-reqs eclass called but not actually used!";
  390. fi
  391. }
  392. _check-reqs_run ()
  393. {
  394. debug-print-function ${FUNCNAME} "$@";
  395. unset CHECKREQS_FAILED;
  396. if [[ ${MERGE_TYPE} != binary ]]; then
  397. [[ -n ${CHECKREQS_MEMORY} ]] && _check-reqs_memory ${CHECKREQS_MEMORY};
  398. [[ -n ${CHECKREQS_DISK_BUILD} ]] && _check-reqs_disk "${T}" "${CHECKREQS_DISK_BUILD}";
  399. fi;
  400. if [[ ${MERGE_TYPE} != buildonly ]]; then
  401. [[ -n ${CHECKREQS_DISK_USR} ]] && _check-reqs_disk "${EROOT}/usr" "${CHECKREQS_DISK_USR}";
  402. [[ -n ${CHECKREQS_DISK_VAR} ]] && _check-reqs_disk "${EROOT}/var" "${CHECKREQS_DISK_VAR}";
  403. fi
  404. }
  405. _check-reqs_start_phase ()
  406. {
  407. debug-print-function ${FUNCNAME} "$@";
  408. [[ -z ${2} ]] && die "Usage: ${FUNCNAME} [size] [location]";
  409. local size=${1};
  410. local location=${2};
  411. local sizeunit="$(_check-reqs_get_number ${size}) $(_check-reqs_get_unit ${size})";
  412. ebegin "Checking for at least ${sizeunit} ${location}"
  413. }
  414. _check-reqs_unsatisfied ()
  415. {
  416. debug-print-function ${FUNCNAME} "$@";
  417. [[ -z ${2} ]] && die "Usage: ${FUNCNAME} [size] [location]";
  418. local msg="ewarn";
  419. local size=${1};
  420. local location=${2};
  421. local sizeunit="$(_check-reqs_get_number ${size}) $(_check-reqs_get_unit ${size})";
  422. [[ ${EBUILD_PHASE} == "pretend" && -z ${CHECKREQS_DONOTHING} ]] && msg="eerror";
  423. ${msg} "There is NOT at least ${sizeunit} ${location}";
  424. CHECKREQS_FAILED="true"
  425. }
  426. _clang_fullversion ()
  427. {
  428. local ver="$1";
  429. shift;
  430. set -- $($(tc-getCC "$@") -E -P - <<< "__clang_major__ __clang_minor__ __clang_patchlevel__");
  431. eval echo "${ver}"
  432. }
  433. _cmake_banned_func ()
  434. {
  435. die "${FUNCNAME[1]} is banned. use -D$1<related_CMake_variable>=\"\$(usex $2)\" instead"
  436. }
  437. _cmake_check_build_dir ()
  438. {
  439. if [[ ${EAPI} == 7 ]]; then
  440. : "${CMAKE_USE_DIR:=${S}}";
  441. else
  442. : "${CMAKE_USE_DIR:=${PWD}}";
  443. fi;
  444. if [[ -n ${CMAKE_IN_SOURCE_BUILD} ]]; then
  445. BUILD_DIR="${CMAKE_USE_DIR}";
  446. else
  447. : "${BUILD_DIR:=${CMAKE_USE_DIR}_build}";
  448. if [[ ${S} == "${WORKDIR}" && ${BUILD_DIR} == "${WORKDIR}_build" ]]; then
  449. eqawarn "QA notice: S=WORKDIR is deprecated for cmake.eclass.";
  450. eqawarn "Please relocate the sources in src_unpack.";
  451. BUILD_DIR="${WORKDIR}"/${P}_build;
  452. fi;
  453. fi;
  454. einfo "Source directory (CMAKE_USE_DIR): \"${CMAKE_USE_DIR}\"";
  455. einfo "Build directory (BUILD_DIR): \"${BUILD_DIR}\"";
  456. mkdir -p "${BUILD_DIR}" || die
  457. }
  458. _cmake_modify-cmakelists ()
  459. {
  460. debug-print-function ${FUNCNAME} "$@";
  461. grep -qs "<<< Gentoo configuration >>>" "${CMAKE_USE_DIR}"/CMakeLists.txt && return 0;
  462. 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";
  463. local x;
  464. for x in $(find "${CMAKE_USE_DIR}" -name CMakeLists.txt -exec grep -l "^#_cmake_modify_IGNORE" {} +);
  465. do
  466. einfo "Hardcoded definition(s) removed in $(echo "${x}" | cut -c $((${#CMAKE_USE_DIR}+2))-):";
  467. einfo "$(grep -se '^#_cmake_modify_IGNORE' ${x} | cut -c 22-99)";
  468. done;
  469. cat >> "${CMAKE_USE_DIR}"/CMakeLists.txt <<-_EOF_ ||
  470.  
  471. message(STATUS "<<< Gentoo configuration >>>
  472. Build type \${CMAKE_BUILD_TYPE}
  473. Install path \${CMAKE_INSTALL_PREFIX}
  474. Compiler flags:
  475. C \${CMAKE_C_FLAGS}
  476. C++ \${CMAKE_CXX_FLAGS}
  477. Linker flags:
  478. Executable \${CMAKE_EXE_LINKER_FLAGS}
  479. Module \${CMAKE_MODULE_LINKER_FLAGS}
  480. Shared \${CMAKE_SHARED_LINKER_FLAGS}\n")
  481. _EOF_
  482. die
  483. }
  484. _filter-hardened ()
  485. {
  486. local f;
  487. for f in "$@";
  488. do
  489. case "${f}" in
  490. -fPIC | -fpic | -fPIE | -fpie | -Wl,pie | -pie)
  491. if ! gcc-specs-pie && ! tc-enables-pie; then
  492. continue;
  493. fi;
  494. if ! is-flagq -nopie && ! is-flagq -no-pie; then
  495. if test-flags -nopie > /dev/null; then
  496. append-flags -nopie;
  497. else
  498. append-flags -no-pie;
  499. fi;
  500. fi
  501. ;;
  502. -fstack-protector | -fstack-protector-strong)
  503. if ! gcc-specs-ssp && ! tc-enables-ssp && ! tc-enables-ssp-strong; then
  504. continue;
  505. fi;
  506. is-flagq -fno-stack-protector || append-flags $(test-flags -fno-stack-protector)
  507. ;;
  508. -fstack-protector-all)
  509. if ! gcc-specs-ssp-to-all && ! tc-enables-ssp-all; then
  510. continue;
  511. fi;
  512. is-flagq -fno-stack-protector || append-flags $(test-flags -fno-stack-protector)
  513. ;;
  514. -fno-strict-overflow)
  515. gcc-specs-nostrict || continue;
  516. is-flagq -fstrict-overflow || append-flags $(test-flags -fstrict-overflow)
  517. ;;
  518. -D_GLIBCXX_ASSERTIONS | -D_LIBCPP_ENABLE_ASSERTIONS | -D_LIBCPP_ENABLE_HARDENED_MODE)
  519. tc-enables-cxx-assertions || continue;
  520. append-cppflags -U_GLIBCXX_ASSERTIONS -U_LIBCPP_ENABLE_ASSERTIONS -U_LIBCPP_ENABLE_HARDENED_MODE
  521. ;;
  522. -D_FORTIFY_SOURCE=*)
  523. tc-enables-fortify-source || continue;
  524. append-cppflags -U_FORTIFY_SOURCE
  525. ;;
  526. esac;
  527. done
  528. }
  529. _filter-var ()
  530. {
  531. local f x var=$1 new=();
  532. shift;
  533. for f in ${!var};
  534. do
  535. for x in "$@";
  536. do
  537. [[ ${f} == ${x} ]] && continue 2;
  538. done;
  539. new+=("${f}");
  540. done;
  541. export ${var}="${new[*]}"
  542. }
  543. _gcc-install-dir ()
  544. {
  545. echo "$(LC_ALL=C $(tc-getCC) -print-search-dirs 2> /dev/null | awk '$1=="install:" {print $2}')"
  546. }
  547. _gcc-specs-directive_raw ()
  548. {
  549. local cc=$(tc-getCC);
  550. local specfiles=$(LC_ALL=C ${cc} -v 2>&1 | awk '$1=="Reading" {print $NF}');
  551. ${cc} -dumpspecs 2> /dev/null | cat - ${specfiles} | awk -v directive=$1 'BEGIN { pspec=""; spec=""; outside=1 }
  552. $1=="*"directive":" { pspec=spec; spec=""; outside=0; next }
  553. outside || NF==0 || ( substr($1,1,1)=="*" && substr($1,length($1),1)==":" ) { outside=1; next }
  554. spec=="" && substr($0,1,1)=="+" { spec=pspec " " substr($0,2); next }
  555. { spec=spec $0 }
  556. END { print spec }';
  557. return 0
  558. }
  559. _gcc-specs-exists ()
  560. {
  561. [[ -f $(_gcc-install-dir)/$1 ]]
  562. }
  563. _gcc_fullversion ()
  564. {
  565. local ver="$1";
  566. shift;
  567. set -- $($(tc-getCC "$@") -E -P - <<< "__GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__");
  568. eval echo "${ver}"
  569. }
  570. _get_all_makeopts ()
  571. {
  572. echo "${MAKEOPTS} ${GNUMAKEFLAGS} ${MAKEFLAGS}"
  573. }
  574. _gpg_verify_signed_checksums ()
  575. {
  576. local checksum_file=${1};
  577. local algo=${2};
  578. local files=${3};
  579. local key=${4};
  580. verify-sig_verify_unsigned_checksums - "${algo}" "${files}" < <(verify-sig_verify_message "${checksum_file}" - "${key}")
  581. }
  582. _is_flagq ()
  583. {
  584. local x var="$1[*]";
  585. for x in ${!var};
  586. do
  587. [[ ${x} == $2 ]] && return 0;
  588. done;
  589. return 1
  590. }
  591. _python_check_EPYTHON ()
  592. {
  593. if [[ -z ${EPYTHON} ]]; then
  594. die "EPYTHON unset, invalid call context";
  595. fi
  596. }
  597. _python_check_locale_sanity ()
  598. {
  599. local -x LC_ALL=${1};
  600. local IFS=;
  601. local lc=({a..z});
  602. local uc=({A..Z});
  603. local input="${lc[*]}${uc[*]}";
  604. local output=$(tr '[:lower:][:upper:]' '[:upper:][:lower:]' <<< "${input}");
  605. [[ ${output} == "${uc[*]}${lc[*]}" ]]
  606. }
  607. _python_check_occluded_packages ()
  608. {
  609. debug-print-function ${FUNCNAME} "$@";
  610. [[ -z ${BUILD_DIR} || ! -d ${BUILD_DIR}/install ]] && return;
  611. local sitedir="${BUILD_DIR}/install$(python_get_sitedir)";
  612. [[ ${sitedir} -ef . ]] && return;
  613. local f fn diff l;
  614. for f in "${sitedir}"/*/;
  615. do
  616. f=${f%/};
  617. fn=${f##*/};
  618. [[ ${fn} == *.dist-info || ${fn} == *.egg-info ]] && continue;
  619. if [[ -d ${fn} ]]; then
  620. diff=$(comm -1 -3 <(find "${fn}" -type f -not -path '*/__pycache__/*' | sort
  621. assert) <(cd "${sitedir}" && find "${fn}" -type f -not -path '*/__pycache__/*' | sort
  622. assert));
  623. if [[ -n ${diff} ]]; then
  624. eqawarn "The directory ${fn} occludes package installed for ${EPYTHON}.";
  625. eqawarn "The installed package includes additional files:";
  626. eqawarn;
  627. while IFS= read -r l; do
  628. eqawarn " ${l}";
  629. done <<< "${diff}";
  630. eqawarn;
  631. if [[ ! -n ${_PYTHON_WARNED_OCCLUDED_PACKAGES} ]]; then
  632. eqawarn "For more information on occluded packages, please see:";
  633. eqawarn "https://projects.gentoo.org/python/guide/test.html#importerrors-for-c-extensions";
  634. _PYTHON_WARNED_OCCLUDED_PACKAGES=1;
  635. fi;
  636. fi;
  637. fi;
  638. done
  639. }
  640. _python_export ()
  641. {
  642. debug-print-function ${FUNCNAME} "$@";
  643. local impl var;
  644. case "${1}" in
  645. python* | jython* | pypy | pypy3*)
  646. impl=${1/_/.};
  647. shift
  648. ;;
  649. *)
  650. impl=${EPYTHON};
  651. if [[ -z ${impl} ]]; then
  652. die "_python_export called without a python implementation and EPYTHON is unset";
  653. fi
  654. ;;
  655. esac;
  656. debug-print "${FUNCNAME}: implementation: ${impl}";
  657. for var in "$@";
  658. do
  659. case "${var}" in
  660. EPYTHON)
  661. export EPYTHON=${impl};
  662. debug-print "${FUNCNAME}: EPYTHON = ${EPYTHON}"
  663. ;;
  664. PYTHON)
  665. export PYTHON=${BROOT-${EPREFIX}}/usr/bin/${impl};
  666. debug-print "${FUNCNAME}: PYTHON = ${PYTHON}"
  667. ;;
  668. PYTHON_STDLIB)
  669. [[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it";
  670. PYTHON_STDLIB=$("${PYTHON}" - "${EPREFIX}/usr" <<-EOF ||
  671. import sys, sysconfig
  672. print(sysconfig.get_path("stdlib", vars={"installed_base": sys.argv[1]}))
  673. EOF
  674. die);
  675. export PYTHON_STDLIB;
  676. debug-print "${FUNCNAME}: PYTHON_STDLIB = ${PYTHON_STDLIB}"
  677. ;;
  678. PYTHON_SITEDIR)
  679. [[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it";
  680. PYTHON_SITEDIR=$("${PYTHON}" - "${EPREFIX}/usr" <<-EOF ||
  681. import sys, sysconfig
  682. print(sysconfig.get_path("purelib", vars={"base": sys.argv[1]}))
  683. EOF
  684. die);
  685. export PYTHON_SITEDIR;
  686. debug-print "${FUNCNAME}: PYTHON_SITEDIR = ${PYTHON_SITEDIR}"
  687. ;;
  688. PYTHON_INCLUDEDIR)
  689. [[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it";
  690. PYTHON_INCLUDEDIR=$("${PYTHON}" - "${ESYSROOT}/usr" <<-EOF ||
  691. import sys, sysconfig
  692. print(sysconfig.get_path("platinclude", vars={"installed_platbase": sys.argv[1]}))
  693. EOF
  694. die);
  695. export PYTHON_INCLUDEDIR;
  696. debug-print "${FUNCNAME}: PYTHON_INCLUDEDIR = ${PYTHON_INCLUDEDIR}";
  697. if [[ ! -d ${PYTHON_INCLUDEDIR} ]]; then
  698. die "${impl} does not install any header files!";
  699. fi
  700. ;;
  701. PYTHON_LIBPATH)
  702. [[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it";
  703. PYTHON_LIBPATH=$("${PYTHON}" - <<-EOF ||
  704. import os.path, sysconfig
  705. print(
  706. os.path.join(
  707. sysconfig.get_config_var("LIBDIR"),
  708. sysconfig.get_config_var("LDLIBRARY"))
  709. if sysconfig.get_config_var("LDLIBRARY")
  710. else "")
  711. EOF
  712. die);
  713. export PYTHON_LIBPATH;
  714. debug-print "${FUNCNAME}: PYTHON_LIBPATH = ${PYTHON_LIBPATH}";
  715. if [[ ! -n ${PYTHON_LIBPATH} ]]; then
  716. die "${impl} lacks a (usable) dynamic library";
  717. fi
  718. ;;
  719. PYTHON_CFLAGS)
  720. local val;
  721. case "${impl}" in
  722. python*)
  723. val=$($(tc-getPKG_CONFIG) --cflags ${impl/n/n-}) || die
  724. ;;
  725. *)
  726. die "${impl}: obtaining ${var} not supported"
  727. ;;
  728. esac;
  729. export PYTHON_CFLAGS=${val};
  730. debug-print "${FUNCNAME}: PYTHON_CFLAGS = ${PYTHON_CFLAGS}"
  731. ;;
  732. PYTHON_LIBS)
  733. local val;
  734. case "${impl}" in
  735. python*)
  736. val=$($(tc-getPKG_CONFIG) --libs ${impl/n/n-}-embed) || die
  737. ;;
  738. *)
  739. die "${impl}: obtaining ${var} not supported"
  740. ;;
  741. esac;
  742. export PYTHON_LIBS=${val};
  743. debug-print "${FUNCNAME}: PYTHON_LIBS = ${PYTHON_LIBS}"
  744. ;;
  745. PYTHON_CONFIG)
  746. local flags val;
  747. case "${impl}" in
  748. python*)
  749. [[ -n ${PYTHON} ]] || die "PYTHON needs to be set for ${var} to be exported, or requested before it";
  750. flags=$("${PYTHON}" - <<-EOF ||
  751. import sysconfig
  752. print(sysconfig.get_config_var("ABIFLAGS")
  753. or "")
  754. EOF
  755. die);
  756. val=${PYTHON%t}${flags}-config
  757. ;;
  758. *)
  759. die "${impl}: obtaining ${var} not supported"
  760. ;;
  761. esac;
  762. export PYTHON_CONFIG=${val};
  763. debug-print "${FUNCNAME}: PYTHON_CONFIG = ${PYTHON_CONFIG}"
  764. ;;
  765. PYTHON_PKG_DEP)
  766. local d;
  767. case ${impl} in
  768. python*)
  769. PYTHON_PKG_DEP="dev-lang/python:${impl#python}${PYTHON_REQ_USE:+[${PYTHON_REQ_USE}]}"
  770. ;;
  771. pypy3)
  772. PYTHON_PKG_DEP="dev-lang/pypy:3.10=[symlink${PYTHON_REQ_USE:+,${PYTHON_REQ_USE}}]"
  773. ;;
  774. pypy3.*)
  775. PYTHON_PKG_DEP="dev-lang/pypy:${impl#pypy}=${PYTHON_REQ_USE:+[${PYTHON_REQ_USE}]}"
  776. ;;
  777. *)
  778. die "Invalid implementation: ${impl}"
  779. ;;
  780. esac;
  781. export PYTHON_PKG_DEP;
  782. debug-print "${FUNCNAME}: PYTHON_PKG_DEP = ${PYTHON_PKG_DEP}"
  783. ;;
  784. PYTHON_SCRIPTDIR)
  785. local dir;
  786. export PYTHON_SCRIPTDIR=${EPREFIX}/usr/lib/python-exec/${impl};
  787. debug-print "${FUNCNAME}: PYTHON_SCRIPTDIR = ${PYTHON_SCRIPTDIR}"
  788. ;;
  789. *)
  790. die "_python_export: unknown variable ${var}"
  791. ;;
  792. esac;
  793. done
  794. }
  795. _python_impl_matches ()
  796. {
  797. [[ ${#} -ge 1 ]] || die "${FUNCNAME}: takes at least 1 parameter";
  798. [[ ${#} -eq 1 ]] && return 0;
  799. local impl=${1/./_} pattern;
  800. shift;
  801. for pattern in "$@";
  802. do
  803. case ${pattern} in
  804. -2 | python2* | pypy)
  805. if [[ ${EAPI} != 7 ]]; then
  806. eerror;
  807. eerror "Python 2 is no longer supported in Gentoo, please remove Python 2";
  808. eerror "${FUNCNAME[1]} calls.";
  809. die "Passing ${pattern} to ${FUNCNAME[1]} is banned in EAPI ${EAPI}";
  810. fi
  811. ;;
  812. -3)
  813. if [[ ${EAPI} != 7 ]]; then
  814. eerror;
  815. eerror "Python 2 is no longer supported in Gentoo, please remove Python 2";
  816. eerror "${FUNCNAME[1]} calls.";
  817. die "Passing ${pattern} to ${FUNCNAME[1]} is banned in EAPI ${EAPI}";
  818. fi;
  819. return 0
  820. ;;
  821. 3.10)
  822. [[ ${impl} == python${pattern/./_} || ${impl} == pypy3 ]] && return 0
  823. ;;
  824. 3.8 | 3.9 | 3.1[1-3])
  825. [[ ${impl%t} == python${pattern/./_} || ${impl} == pypy${pattern/./_} ]] && return 0
  826. ;;
  827. *)
  828. [[ ${impl} == ${pattern/./_} ]] && return 0
  829. ;;
  830. esac;
  831. done;
  832. return 1
  833. }
  834. _python_run_check_deps ()
  835. {
  836. debug-print-function ${FUNCNAME} "$@";
  837. local impl=${1};
  838. einfo "Checking whether ${impl} is suitable ...";
  839. local PYTHON_PKG_DEP;
  840. _python_export "${impl}" PYTHON_PKG_DEP;
  841. ebegin " ${PYTHON_PKG_DEP}";
  842. has_version -b "${PYTHON_PKG_DEP}";
  843. eend ${?} || return 1;
  844. declare -f python_check_deps > /dev/null || return 0;
  845. local PYTHON_USEDEP="python_targets_${impl}(-)";
  846. local PYTHON_SINGLE_USEDEP="python_single_target_${impl}(-)";
  847. ebegin " python_check_deps";
  848. python_check_deps;
  849. eend ${?}
  850. }
  851. _python_sanity_checks ()
  852. {
  853. debug-print-function ${FUNCNAME} "$@";
  854. [[ -n ${_PYTHON_SANITY_CHECKED} ]] && return;
  855. if [[ -v PYTHONPATH ]]; then
  856. local x paths=();
  857. mapfile -d ':' -t paths <<< ${PYTHONPATH};
  858. for x in "${paths[@]}";
  859. do
  860. if [[ ${x} != /* ]]; then
  861. eerror "Relative path found in PYTHONPATH:";
  862. eerror;
  863. eerror " PYTHONPATH=${PYTHONPATH@Q}";
  864. eerror;
  865. eerror "This is guaranteed to cause random breakage. Please make sure that";
  866. eerror "your PYTHONPATH contains absolute paths only (and only if necessary).";
  867. eerror "Note that empty values (including ':' at either end and an empty";
  868. eerror "PYTHONPATH) count as the current directory. If no PYTHONPATH";
  869. eerror "is intended, it needs to be unset instead.";
  870. die "Relative paths in PYTHONPATH are forbidden: ${x@Q}";
  871. fi;
  872. done;
  873. elog "PYTHONPATH=${PYTHONPATH@Q}";
  874. fi;
  875. _PYTHON_SANITY_CHECKED=1
  876. }
  877. _python_set_impls ()
  878. {
  879. local i;
  880. if [[ ${BASH_VERSINFO[0]} -ge 5 ]]; then
  881. [[ ${PYTHON_COMPAT@a} == *a* ]];
  882. else
  883. [[ $(declare -p PYTHON_COMPAT) == "declare -a"* ]];
  884. fi;
  885. if [[ ${?} -ne 0 ]]; then
  886. if ! declare -p PYTHON_COMPAT &> /dev/null; then
  887. die 'PYTHON_COMPAT not declared.';
  888. else
  889. die 'PYTHON_COMPAT must be an array.';
  890. fi;
  891. fi;
  892. local obsolete=();
  893. if [[ ! -n ${PYTHON_COMPAT_NO_STRICT} ]]; then
  894. for i in "${PYTHON_COMPAT[@]}";
  895. do
  896. case ${i} in
  897. pypy3 | pypy3_11 | python3_9 | python3_1[0-3] | python3_13t)
  898.  
  899. ;;
  900. jython2_7 | pypy | pypy1_[89] | pypy2_0 | python2_[5-7] | python3_[1-9])
  901. obsolete+=("${i}")
  902. ;;
  903. *)
  904. if has "${i}" "${_PYTHON_ALL_IMPLS[@]}" "${_PYTHON_HISTORICAL_IMPLS[@]}"; then
  905. die "Mis-synced patterns in _python_set_impls: missing ${i}";
  906. else
  907. die "Invalid implementation in PYTHON_COMPAT: ${i}";
  908. fi
  909. ;;
  910. esac;
  911. done;
  912. fi;
  913. local supp=() unsupp=();
  914. for i in "${_PYTHON_ALL_IMPLS[@]}";
  915. do
  916. if has "${i}" "${PYTHON_COMPAT[@]}"; then
  917. supp+=("${i}");
  918. else
  919. unsupp+=("${i}");
  920. fi;
  921. done;
  922. if [[ ! -n ${supp[@]} ]]; then
  923. die "No supported implementation in PYTHON_COMPAT.";
  924. fi;
  925. if [[ -n ${_PYTHON_SUPPORTED_IMPLS[@]} ]]; then
  926. if [[ ${_PYTHON_SUPPORTED_IMPLS[@]} != ${supp[@]} ]]; then
  927. eerror "Supported impls (PYTHON_COMPAT) changed between inherits!";
  928. eerror "Before: ${_PYTHON_SUPPORTED_IMPLS[*]}";
  929. eerror "Now : ${supp[*]}";
  930. die "_PYTHON_SUPPORTED_IMPLS integrity check failed";
  931. fi;
  932. if [[ ${_PYTHON_UNSUPPORTED_IMPLS[@]} != ${unsupp[@]} ]]; then
  933. eerror "Unsupported impls changed between inherits!";
  934. eerror "Before: ${_PYTHON_UNSUPPORTED_IMPLS[*]}";
  935. eerror "Now : ${unsupp[*]}";
  936. die "_PYTHON_UNSUPPORTED_IMPLS integrity check failed";
  937. fi;
  938. else
  939. _PYTHON_SUPPORTED_IMPLS=("${supp[@]}");
  940. _PYTHON_UNSUPPORTED_IMPLS=("${unsupp[@]}");
  941. readonly _PYTHON_SUPPORTED_IMPLS _PYTHON_UNSUPPORTED_IMPLS;
  942. fi
  943. }
  944. _python_verify_patterns ()
  945. {
  946. debug-print-function ${FUNCNAME} "$@";
  947. local impl pattern;
  948. for pattern in "$@";
  949. do
  950. case ${pattern} in
  951. -[23] | 3.[89] | 3.1[0-3])
  952. continue
  953. ;;
  954. esac;
  955. for impl in "${_PYTHON_ALL_IMPLS[@]}" "${_PYTHON_HISTORICAL_IMPLS[@]}";
  956. do
  957. [[ ${impl} == ${pattern/./_} ]] && continue 2;
  958. done;
  959. die "Invalid implementation pattern: ${pattern}";
  960. done
  961. }
  962. _python_wrapper_setup ()
  963. {
  964. debug-print-function ${FUNCNAME} "$@";
  965. local workdir=${1:-${T}/${EPYTHON}};
  966. local impl=${2:-${EPYTHON}};
  967. [[ -n ${workdir} ]] || die "${FUNCNAME}: no workdir specified.";
  968. [[ -n ${impl} ]] || die "${FUNCNAME}: no impl nor EPYTHON specified.";
  969. if [[ ! -x ${workdir}/bin/python ]]; then
  970. mkdir -p "${workdir}"/{bin,pkgconfig} || die;
  971. rm -f "${workdir}"/bin/python{,2,3}{,-config} || die;
  972. rm -f "${workdir}"/bin/2to3 || die;
  973. rm -f "${workdir}"/pkgconfig/python{2,3}{,-embed}.pc || die;
  974. local EPYTHON PYTHON;
  975. _python_export "${impl}" EPYTHON PYTHON;
  976. cat > "${workdir}/bin/python" <<-_EOF_ ||
  977. #!/bin/sh
  978. exec "${PYTHON}" "\${@}"
  979. _EOF_
  980. die
  981. cp "${workdir}/bin/python" "${workdir}/bin/python3" || die;
  982. chmod +x "${workdir}/bin/python" "${workdir}/bin/python3" || die;
  983. local nonsupp=(python2 python2-config);
  984. if [[ ${EPYTHON} == python* ]]; then
  985. cat > "${workdir}/bin/python-config" <<-_EOF_ ||
  986. #!/bin/sh
  987. exec "${PYTHON}-config" "\${@}"
  988. _EOF_
  989. die
  990. cp "${workdir}/bin/python-config" "${workdir}/bin/python3-config" || die;
  991. chmod +x "${workdir}/bin/python-config" "${workdir}/bin/python3-config" || die;
  992. ln -s "${PYTHON/python/2to3-}" "${workdir}"/bin/2to3 || die;
  993. ln -s "${EPREFIX}"/usr/$(get_libdir)/pkgconfig/${EPYTHON/n/n-}.pc "${workdir}"/pkgconfig/python3.pc || die;
  994. ln -s "${EPREFIX}"/usr/$(get_libdir)/pkgconfig/${EPYTHON/n/n-}-embed.pc "${workdir}"/pkgconfig/python3-embed.pc || die;
  995. else
  996. nonsupp+=(2to3 python-config python3-config);
  997. fi;
  998. local x;
  999. for x in "${nonsupp[@]}";
  1000. do
  1001. cat > "${workdir}"/bin/${x} <<-_EOF_ ||
  1002. #!/bin/sh
  1003. echo "${ECLASS}: ${FUNCNAME}: ${x} is not supported by ${EPYTHON} (PYTHON_COMPAT)" >&2
  1004. exit 127
  1005. _EOF_
  1006. die
  1007. chmod +x "${workdir}"/bin/${x} || die;
  1008. done;
  1009. fi;
  1010. if [[ ${PATH##:*} != ${workdir}/bin ]]; then
  1011. PATH=${workdir}/bin${PATH:+:${PATH}};
  1012. fi;
  1013. if [[ ${PKG_CONFIG_PATH##:*} != ${workdir}/pkgconfig ]]; then
  1014. PKG_CONFIG_PATH=${workdir}/pkgconfig${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}};
  1015. fi;
  1016. export PATH PKG_CONFIG_PATH
  1017. }
  1018. _setup-allowed-flags ()
  1019. {
  1020. ALLOWED_FLAGS=(-pipe -O '-O[123szg]' '-mcpu=*' '-march=*' '-mtune=*' '-mfpmath=*' -flto '-flto=*' -fno-lto '-fstack-protector*' -fstack-clash-protection '-fcf-protection=*' -fbounds-check -fbounds-checking -fno-PIE -fno-pie -nopie -no-pie -fharden-compares -fharden-conditional-branches -fharden-control-flow-redundancy -fno-harden-control-flow-redundancy -fhardcfr-skip-leaf -fhardcfr-check-exceptions -fhardcfr-check-returning-calls '-fhardcfr-check-noreturn-calls=*' '-mindirect-branch=*' -mindirect-branch-register '-mfunction-return=*' -mretpoline '-mharden-sls=*' '-mbranch-protection=*' -fno-unit-at-a-time -fno-strict-overflow '-fsanitize*' '-fno-sanitize*' -g '-g[0-9]' -ggdb '-ggdb[0-9]' -gdwarf '-gdwarf-*' -gstabs -gstabs+ -gz -glldb '-fdebug-default-version=*' -fno-diagnostics-color '-fmessage-length=*' -fno-ident -fpermissive -frecord-gcc-switches -frecord-command-line '-fdiagnostics*' '-fplugin*' '-W*' -w '-[DUILR]*' '-Wl,*' '-fuse-ld=*');
  1021. ALLOWED_FLAGS+=('-fno-stack-protector*' '-fabi-version=*' -fno-strict-aliasing -fno-bounds-check -fno-bounds-checking -fstrict-overflow -fno-omit-frame-pointer '-fno-builtin*' -mno-omit-leaf-frame-pointer);
  1022. 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=*' '-mtls-dialect=*' -mfix-r4000 -mno-fix-r4000 -mfix-r4400 -mno-fix-r4400 -mfix-r10000 -mno-fix-r10000 '-mr10k-cache-barrier=*' -mthumb -marm -ffixed-x18 -mstrict-align -mvector-strict-align -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 -mevex512 -mno-evex512);
  1023. ALLOWED_FLAGS+=(-mstackrealign '-mpreferred-stack-boundary=*' '-mincoming-stack-boundary=*');
  1024. ALLOWED_FLAGS+=('--unwindlib=*' '--rtlib=*' '--stdlib=*')
  1025. }
  1026. _tc-getPROG ()
  1027. {
  1028. local tuple=$1;
  1029. local v var vars=$2;
  1030. local prog=($3);
  1031. var=${vars%% *};
  1032. for v in ${vars};
  1033. do
  1034. if [[ -n ${!v} ]]; then
  1035. export ${var}="${!v}";
  1036. echo "${!v}";
  1037. return 0;
  1038. fi;
  1039. done;
  1040. local search=;
  1041. [[ -n $4 ]] && search=$(type -p $4-${prog[0]});
  1042. [[ -z ${search} && -n ${!tuple} ]] && search=$(type -p ${!tuple}-${prog[0]});
  1043. [[ -n ${search} ]] && prog[0]=${search##*/};
  1044. export ${var}="${prog[*]}";
  1045. echo "${!var}"
  1046. }
  1047. _tc-has-openmp ()
  1048. {
  1049. local base="${T}/test-tc-openmp";
  1050. cat <<-EOF > "${base}.c"
  1051. #include <omp.h>
  1052. int main(void) {
  1053. int nthreads, tid, ret = 0;
  1054. #pragma omp parallel private(nthreads, tid)
  1055. {
  1056. tid = omp_get_thread_num();
  1057. nthreads = omp_get_num_threads();
  1058. ret += tid + nthreads;
  1059. }
  1060. return ret;
  1061. }
  1062. EOF
  1063.  
  1064. $(tc-getCC "$@") -fopenmp "${base}.c" -o "${base}" >&/dev/null;
  1065. local ret=$?;
  1066. rm -f "${base}"*;
  1067. return ${ret}
  1068. }
  1069. _test-flag-PROG ()
  1070. {
  1071. local comp=$1;
  1072. local lang=$2;
  1073. shift 2;
  1074. if [[ -z ${comp} ]]; then
  1075. return 1;
  1076. fi;
  1077. if [[ -z $1 ]]; then
  1078. return 1;
  1079. fi;
  1080. comp=($(tc-get${comp}));
  1081. if ! type -p ${comp[0]} > /dev/null; then
  1082. return 1;
  1083. fi;
  1084. local in_src in_ext cmdline_extra=();
  1085. case "${lang}" in
  1086. c)
  1087. in_ext='c';
  1088. in_src='int main(void) { return 0; }';
  1089. cmdline_extra+=(-xc -c)
  1090. ;;
  1091. c++)
  1092. in_ext='cc';
  1093. in_src='int main(void) { return 0; }';
  1094. cmdline_extra+=(-xc++ -c)
  1095. ;;
  1096. f77)
  1097. in_ext='f';
  1098. in_src=' end';
  1099. cmdline_extra+=(-xf77 -c)
  1100. ;;
  1101. f95)
  1102. in_ext='f90';
  1103. in_src='end';
  1104. cmdline_extra+=(-xf95 -c)
  1105. ;;
  1106. c+ld)
  1107. in_ext='c';
  1108. in_src='int main(void) { return 0; }';
  1109. if is-ldflagq -fuse-ld=*; then
  1110. fuse_ld_value=$(get-flag -fuse-ld=*);
  1111. cmdline_extra+=(${fuse_ld_value});
  1112. fi;
  1113. cmdline_extra+=(-xc)
  1114. ;;
  1115. esac;
  1116. local test_in=${T}/test-flag.${in_ext};
  1117. local test_out=${T}/test-flag.exe;
  1118. printf "%s\n" "${in_src}" > "${test_in}" || die "Failed to create '${test_in}'";
  1119. local cmdline=("${comp[@]}" -Werror "$@" "${cmdline_extra[@]}" "${test_in}" -o "${test_out}");
  1120. "${cmdline[@]}" &> /dev/null
  1121. }
  1122. _test-flags-PROG ()
  1123. {
  1124. local comp=$1;
  1125. local flags=();
  1126. local x;
  1127. shift;
  1128. [[ -z ${comp} ]] && return 1;
  1129. while (( $# )); do
  1130. case "$1" in
  1131. --param | -B)
  1132. if test-flag-${comp} "$1" "$2"; then
  1133. flags+=("$1" "$2");
  1134. fi;
  1135. shift 2
  1136. ;;
  1137. *)
  1138. if test-flag-${comp} "$1"; then
  1139. flags+=("$1");
  1140. fi;
  1141. shift 1
  1142. ;;
  1143. esac;
  1144. done;
  1145. echo "${flags[*]}";
  1146. [[ ${#flags[@]} -gt 0 ]]
  1147. }
  1148. all-flag-vars ()
  1149. {
  1150. echo {ADA,C,CPP,CXX,CCAS,F,FC,LD}FLAGS
  1151. }
  1152. append-atomic-flags ()
  1153. {
  1154. test-flags-CCLD "-latomic" &> /dev/null || return;
  1155. append-libs "-Wl,--push-state,--as-needed,-latomic,--pop-state"
  1156. }
  1157. append-cflags ()
  1158. {
  1159. [[ $# -eq 0 ]] && return 0;
  1160. export CFLAGS+=" $*";
  1161. return 0
  1162. }
  1163. append-cppflags ()
  1164. {
  1165. [[ $# -eq 0 ]] && return 0;
  1166. export CPPFLAGS+=" $*";
  1167. return 0
  1168. }
  1169. append-cxxflags ()
  1170. {
  1171. [[ $# -eq 0 ]] && return 0;
  1172. export CXXFLAGS+=" $*";
  1173. return 0
  1174. }
  1175. append-fflags ()
  1176. {
  1177. [[ $# -eq 0 ]] && return 0;
  1178. export FFLAGS+=" $*";
  1179. export FCFLAGS+=" $*";
  1180. return 0
  1181. }
  1182. append-flags ()
  1183. {
  1184. [[ $# -eq 0 ]] && return 0;
  1185. case " $* " in
  1186. *' '-[DIU]*)
  1187. eqawarn 'Please use append-cppflags for preprocessor flags'
  1188. ;;
  1189. *' '-L* | *' '-Wl,*)
  1190. eqawarn 'Please use append-ldflags for linker flags'
  1191. ;;
  1192. esac;
  1193. append-cflags "$@";
  1194. append-cxxflags "$@";
  1195. append-fflags "$@";
  1196. return 0
  1197. }
  1198. append-ldflags ()
  1199. {
  1200. [[ $# -eq 0 ]] && return 0;
  1201. local flag;
  1202. for flag in "$@";
  1203. do
  1204. [[ ${flag} == -l* ]] && eqawarn "Appending a library link instruction (${flag}); libraries to link to should not be passed through LDFLAGS";
  1205. done;
  1206. export LDFLAGS="${LDFLAGS} $*";
  1207. return 0
  1208. }
  1209. append-lfs-flags ()
  1210. {
  1211. [[ $# -ne 0 ]] && die "append-lfs-flags takes no arguments";
  1212. append-cppflags -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
  1213. }
  1214. append-libs ()
  1215. {
  1216. [[ $# -eq 0 ]] && return 0;
  1217. local flag;
  1218. for flag in "$@";
  1219. do
  1220. if [[ -z "${flag// }" ]]; then
  1221. eqawarn "Appending an empty argument to LIBS is invalid! Skipping.";
  1222. continue;
  1223. fi;
  1224. case $flag in
  1225. -[lL]*)
  1226. export LIBS="${LIBS} ${flag}"
  1227. ;;
  1228. -*)
  1229. eqawarn "Appending non-library to LIBS (${flag}); Other linker flags should be passed via LDFLAGS";
  1230. export LIBS="${LIBS} ${flag}"
  1231. ;;
  1232. *)
  1233. export LIBS="${LIBS} -l${flag}"
  1234. ;;
  1235. esac;
  1236. done;
  1237. return 0
  1238. }
  1239. build_sphinx ()
  1240. {
  1241. debug-print-function ${FUNCNAME} "$@";
  1242. [[ ${#} -eq 1 ]] || die "${FUNCNAME} takes 1 arg: <directory>";
  1243. local dir=${1};
  1244. sed -i -e 's:^intersphinx_mapping:disabled_&:' "${dir}"/conf.py || die;
  1245. local command=("${EPYTHON}" -m sphinx.cmd.build);
  1246. if ! "${EPYTHON}" -c "import sphinx.cmd.build" 2> /dev/null; then
  1247. command=(sphinx-build);
  1248. fi;
  1249. command+=(-b html -d "${dir}"/_build/doctrees "${dir}" "${dir}"/_build/html);
  1250. echo "${command[@]}" 1>&2;
  1251. "${command[@]}" || die;
  1252. HTML_DOCS+=("${dir}/_build/html/.")
  1253. }
  1254. check-reqs_disk ()
  1255. {
  1256. [[ ${EAPI} == 7 ]] || die "Internal function ${FUNCNAME} is not available in EAPI ${EAPI}.";
  1257. _check-reqs_disk "$@"
  1258. }
  1259. check-reqs_get_kibibytes ()
  1260. {
  1261. [[ ${EAPI} == 7 ]] || die "Internal function ${FUNCNAME} is not available in EAPI ${EAPI}.";
  1262. _check-reqs_get_kibibytes "$@"
  1263. }
  1264. check-reqs_get_number ()
  1265. {
  1266. [[ ${EAPI} == 7 ]] || die "Internal function ${FUNCNAME} is not available in EAPI ${EAPI}.";
  1267. _check-reqs_get_number "$@"
  1268. }
  1269. check-reqs_get_unit ()
  1270. {
  1271. [[ ${EAPI} == 7 ]] || die "Internal function ${FUNCNAME} is not available in EAPI ${EAPI}.";
  1272. _check-reqs_get_unit "$@"
  1273. }
  1274. check-reqs_memory ()
  1275. {
  1276. [[ ${EAPI} == 7 ]] || die "Internal function ${FUNCNAME} is not available in EAPI ${EAPI}.";
  1277. _check-reqs_memory "$@"
  1278. }
  1279. check-reqs_output ()
  1280. {
  1281. [[ ${EAPI} == 7 ]] || die "Internal function ${FUNCNAME} is not available in EAPI ${EAPI}.";
  1282. _check-reqs_get_unit "$@"
  1283. }
  1284. check-reqs_pkg_pretend ()
  1285. {
  1286. debug-print-function ${FUNCNAME} "$@";
  1287. check-reqs_pkg_setup "$@"
  1288. }
  1289. check-reqs_pkg_setup ()
  1290. {
  1291. debug-print-function ${FUNCNAME} "$@";
  1292. _check-reqs_prepare;
  1293. _check-reqs_run;
  1294. _check-reqs_output
  1295. }
  1296. check-reqs_prepare ()
  1297. {
  1298. [[ ${EAPI} == 7 ]] || die "Internal function ${FUNCNAME} is not available in EAPI ${EAPI}.";
  1299. _check-reqs_prepare "$@"
  1300. }
  1301. check-reqs_run ()
  1302. {
  1303. [[ ${EAPI} == 7 ]] || die "Internal function ${FUNCNAME} is not available in EAPI ${EAPI}.";
  1304. _check-reqs_run "$@"
  1305. }
  1306. check-reqs_start_phase ()
  1307. {
  1308. [[ ${EAPI} == 7 ]] || die "Internal function ${FUNCNAME} is not available in EAPI ${EAPI}.";
  1309. _check-reqs_start_phase "$@"
  1310. }
  1311. check-reqs_unsatisfied ()
  1312. {
  1313. [[ ${EAPI} == 7 ]] || die "Internal function ${FUNCNAME} is not available in EAPI ${EAPI}.";
  1314. _check-reqs_unsatisfied "$@"
  1315. }
  1316. check_space ()
  1317. {
  1318. if use test; then
  1319. local CHECKREQS_DISK_BUILD=11G;
  1320. check-reqs_pkg_pretend;
  1321. fi
  1322. }
  1323. clang-fullversion ()
  1324. {
  1325. _clang_fullversion '$1.$2.$3' "$@"
  1326. }
  1327. clang-major-version ()
  1328. {
  1329. _clang_fullversion '$1' "$@"
  1330. }
  1331. clang-micro-version ()
  1332. {
  1333. _clang_fullversion '$3' "$@"
  1334. }
  1335. clang-minor-version ()
  1336. {
  1337. _clang_fullversion '$2' "$@"
  1338. }
  1339. clang-version ()
  1340. {
  1341. _clang_fullversion '$1.$2' "$@"
  1342. }
  1343. cmake-utils_src_make ()
  1344. {
  1345. die "cmake-utils_src_make is banned. Use cmake_build instead"
  1346. }
  1347. cmake-utils_use ()
  1348. {
  1349. _cmake_banned_func "" "$@"
  1350. }
  1351. cmake-utils_use_build ()
  1352. {
  1353. _cmake_banned_func BUILD_ "$@"
  1354. }
  1355. cmake-utils_use_disable ()
  1356. {
  1357. _cmake_banned_func DISABLE_ "$@"
  1358. }
  1359. cmake-utils_use_enable ()
  1360. {
  1361. _cmake_banned_func ENABLE_ "$@"
  1362. }
  1363. cmake-utils_use_has ()
  1364. {
  1365. _cmake_banned_func HAVE_ "$@"
  1366. }
  1367. cmake-utils_use_no ()
  1368. {
  1369. _cmake_banned_func NO_ "$@"
  1370. }
  1371. cmake-utils_use_use ()
  1372. {
  1373. _cmake_banned_func USE_ "$@"
  1374. }
  1375. cmake-utils_use_want ()
  1376. {
  1377. _cmake_banned_func WANT_ "$@"
  1378. }
  1379. cmake-utils_use_with ()
  1380. {
  1381. _cmake_banned_func WITH_ "$@"
  1382. }
  1383. cmake-utils_useno ()
  1384. {
  1385. _cmake_banned_func "" "$@"
  1386. }
  1387. cmake_build ()
  1388. {
  1389. debug-print-function ${FUNCNAME} "$@";
  1390. _cmake_check_build_dir;
  1391. pushd "${BUILD_DIR}" > /dev/null || die;
  1392. case ${CMAKE_MAKEFILE_GENERATOR} in
  1393. emake)
  1394. [[ -e Makefile ]] || die "Makefile not found. Error during configure stage.";
  1395. case ${CMAKE_VERBOSE} in
  1396. OFF)
  1397. emake "$@"
  1398. ;;
  1399. *)
  1400. emake VERBOSE=1 "$@"
  1401. ;;
  1402. esac
  1403. ;;
  1404. ninja)
  1405. [[ -e build.ninja ]] || die "build.ninja not found. Error during configure stage.";
  1406. case ${CMAKE_VERBOSE} in
  1407. OFF)
  1408. NINJA_VERBOSE=OFF eninja "$@"
  1409. ;;
  1410. *)
  1411. eninja "$@"
  1412. ;;
  1413. esac
  1414. ;;
  1415. esac;
  1416. popd > /dev/null || die
  1417. }
  1418. cmake_comment_add_subdirectory ()
  1419. {
  1420. if [[ -z ${1} ]]; then
  1421. die "${FUNCNAME[0]} must be passed at least one directory name to comment";
  1422. fi;
  1423. [[ -e "CMakeLists.txt" ]] || return;
  1424. local d;
  1425. for d in $@;
  1426. do
  1427. d=${d//\//\\/};
  1428. sed -e "/add_subdirectory[[:space:]]*([[:space:]]*${d}[[:space:]]*)/I s/^/#DONOTCOMPILE /" -i CMakeLists.txt || die "failed to comment add_subdirectory(${d})";
  1429. done
  1430. }
  1431. cmake_run_in ()
  1432. {
  1433. if [[ -z ${2} ]]; then
  1434. die "${FUNCNAME[0]} must be passed at least two arguments";
  1435. fi;
  1436. [[ -e ${1} ]] || die "${FUNCNAME[0]}: Nonexistent path: ${1}";
  1437. pushd ${1} > /dev/null || die;
  1438. "${@:2}";
  1439. popd > /dev/null || die
  1440. }
  1441. cmake_src_compile ()
  1442. {
  1443. debug-print-function ${FUNCNAME} "$@";
  1444. cmake_build "$@"
  1445. }
  1446. cmake_src_configure ()
  1447. {
  1448. debug-print-function ${FUNCNAME} "$@";
  1449. [[ -n ${_CMAKE_SRC_PREPARE_HAS_RUN} ]] || die "FATAL: cmake_src_prepare has not been run";
  1450. _cmake_check_build_dir;
  1451. xdg_environment_reset;
  1452. local build_rules=${BUILD_DIR}/gentoo_rules.cmake;
  1453. cat > "${build_rules}" <<-_EOF_ ||
  1454. set(CMAKE_ASM_COMPILE_OBJECT "<CMAKE_ASM_COMPILER> <DEFINES> <INCLUDES> ${CPPFLAGS} <FLAGS> -o <OBJECT> -c <SOURCE>" CACHE STRING "ASM compile command" FORCE)
  1455. 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)
  1456. set(CMAKE_ASM-ATT_LINK_FLAGS "-nostdlib" CACHE STRING "ASM-ATT link flags" FORCE)
  1457. set(CMAKE_C_COMPILE_OBJECT "<CMAKE_C_COMPILER> <DEFINES> <INCLUDES> ${CPPFLAGS} <FLAGS> -o <OBJECT> -c <SOURCE>" CACHE STRING "C compile command" FORCE)
  1458. set(CMAKE_CXX_COMPILE_OBJECT "<CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> ${CPPFLAGS} <FLAGS> -o <OBJECT> -c <SOURCE>" CACHE STRING "C++ compile command" FORCE)
  1459. set(CMAKE_Fortran_COMPILE_OBJECT "<CMAKE_Fortran_COMPILER> <DEFINES> <INCLUDES> ${FCFLAGS} <FLAGS> -o <OBJECT> -c <SOURCE>" CACHE STRING "Fortran compile command" FORCE)
  1460. _EOF_
  1461. die
  1462. local myCC=$(tc-getCC) myCXX=$(tc-getCXX) myFC=$(tc-getFC);
  1463. local toolchain_file=${BUILD_DIR}/gentoo_toolchain.cmake;
  1464. cat > ${toolchain_file} <<-_EOF_ ||
  1465. set(CMAKE_ASM_COMPILER "${myCC/ /;}")
  1466. set(CMAKE_ASM-ATT_COMPILER "${myCC/ /;}")
  1467. set(CMAKE_C_COMPILER "${myCC/ /;}")
  1468. set(CMAKE_CXX_COMPILER "${myCXX/ /;}")
  1469. set(CMAKE_Fortran_COMPILER "${myFC/ /;}")
  1470. set(CMAKE_AR $(type -P $(tc-getAR)) CACHE FILEPATH "Archive manager" FORCE)
  1471. set(CMAKE_RANLIB $(type -P $(tc-getRANLIB)) CACHE FILEPATH "Archive index generator" FORCE)
  1472. set(CMAKE_SYSTEM_PROCESSOR "${CHOST%%-*}")
  1473. _EOF_
  1474. die
  1475. local -x ASMFLAGS=${CFLAGS};
  1476. local -x PKG_CONFIG=$(tc-getPKG_CONFIG);
  1477. if tc-is-cross-compiler; then
  1478. local sysname;
  1479. case "${KERNEL:-linux}" in
  1480. Cygwin)
  1481. sysname="CYGWIN_NT-5.1"
  1482. ;;
  1483. HPUX)
  1484. sysname="HP-UX"
  1485. ;;
  1486. linux)
  1487. sysname="Linux"
  1488. ;;
  1489. Winnt)
  1490. sysname="Windows";
  1491. cat >> "${toolchain_file}" <<-_EOF_ ||
  1492. set(CMAKE_RC_COMPILER $(tc-getRC))
  1493. _EOF_
  1494. die
  1495. ;;
  1496. *)
  1497. sysname="${KERNEL}"
  1498. ;;
  1499. esac
  1500. cat >> "${toolchain_file}" <<-_EOF_ ||
  1501. set(CMAKE_SYSTEM_NAME "${sysname}")
  1502. _EOF_
  1503. die;
  1504. fi
  1505. if [[ ${SYSROOT:-/} != / ]]; then
  1506. cat >> "${toolchain_file}" <<-_EOF_ ||
  1507. set(CMAKE_SYSROOT "${ESYSROOT}")
  1508. set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
  1509. set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
  1510. set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  1511. _EOF_
  1512. die;
  1513. fi
  1514. if use prefix-guest; then
  1515. cat >> "${build_rules}" <<-_EOF_ ||
  1516. # in Prefix we need rpath and must ensure cmake gets our default linker path
  1517. # right ... except for Darwin hosts
  1518. if(NOT APPLE)
  1519. set(CMAKE_SKIP_RPATH OFF CACHE BOOL "" FORCE)
  1520. 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)
  1521. else()
  1522. set(CMAKE_PREFIX_PATH "${EPREFIX}/usr" CACHE STRING "" FORCE)
  1523. set(CMAKE_MACOSX_RPATH ON CACHE BOOL "" FORCE)
  1524. set(CMAKE_SKIP_BUILD_RPATH OFF CACHE BOOL "" FORCE)
  1525. set(CMAKE_SKIP_RPATH OFF CACHE BOOL "" FORCE)
  1526. set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE CACHE BOOL "" FORCE)
  1527. endif()
  1528. _EOF_
  1529. die;
  1530. fi
  1531. local common_config=${BUILD_DIR}/gentoo_common_config.cmake;
  1532. local libdir=$(get_libdir);
  1533. cat > "${common_config}" <<-_EOF_ ||
  1534. set(CMAKE_GENTOO_BUILD ON CACHE BOOL "Indicate Gentoo package build")
  1535. set(LIB_SUFFIX ${libdir/lib} CACHE STRING "library path suffix" FORCE)
  1536. set(CMAKE_INSTALL_LIBDIR ${libdir} CACHE PATH "Output directory for libraries")
  1537. set(CMAKE_INSTALL_INFODIR "${EPREFIX}/usr/share/info" CACHE PATH "")
  1538. set(CMAKE_INSTALL_MANDIR "${EPREFIX}/usr/share/man" CACHE PATH "")
  1539. set(CMAKE_USER_MAKE_RULES_OVERRIDE "${build_rules}" CACHE FILEPATH "Gentoo override rules")
  1540. set(CMAKE_INSTALL_DOCDIR "${EPREFIX}/usr/share/doc/${PF}" CACHE PATH "")
  1541. set(BUILD_SHARED_LIBS ON CACHE BOOL "")
  1542. set(Python3_FIND_UNVERSIONED_NAMES FIRST CACHE STRING "")
  1543. set(CMAKE_DISABLE_PRECOMPILE_HEADERS ON CACHE BOOL "")
  1544. set(CMAKE_TLS_VERIFY ON CACHE BOOL "")
  1545. set(CMAKE_COMPILE_WARNING_AS_ERROR OFF CACHE BOOL "")
  1546. _EOF_
  1547. die
  1548. if [[ -n ${_ECM_ECLASS} ]]; then
  1549. cat >> ${common_config} <<-_EOF_ ||
  1550. set(ECM_DISABLE_QMLPLUGINDUMP ON CACHE BOOL "")
  1551. set(ECM_DISABLE_APPSTREAMTEST ON CACHE BOOL "")
  1552. set(ECM_DISABLE_GIT ON CACHE BOOL "")
  1553. _EOF_
  1554. die;
  1555. fi
  1556. if [[ "${ARCH}" == riscv ]]; then
  1557. echo 'set(CMAKE_FIND_LIBRARY_CUSTOM_LIB_SUFFIX '"${libdir#lib}"' CACHE STRING "library search suffix" FORCE)' >> "${common_config}" || die;
  1558. fi;
  1559. if [[ "${NOCOLOR}" = true || "${NOCOLOR}" = yes ]]; then
  1560. echo 'set(CMAKE_COLOR_MAKEFILE OFF CACHE BOOL "pretty colors during make" FORCE)' >> "${common_config}" || die;
  1561. fi;
  1562. if [[ ${EAPI} != 7 ]]; then
  1563. echo 'set(CMAKE_INSTALL_ALWAYS 1)' >> "${common_config}" || die;
  1564. fi;
  1565. if [[ ${CMAKE_BUILD_TYPE} != Gentoo ]]; then
  1566. cat >> ${common_config} <<-_EOF_ ||
  1567. set(CMAKE_ASM_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "")
  1568. set(CMAKE_ASM-ATT_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "")
  1569. set(CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "")
  1570. set(CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "")
  1571. set(CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "")
  1572. set(CMAKE_EXE_LINKER_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "")
  1573. set(CMAKE_MODULE_LINKER_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "")
  1574. set(CMAKE_SHARED_LINKER_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "")
  1575. set(CMAKE_STATIC_LINKER_FLAGS_${CMAKE_BUILD_TYPE^^} "" CACHE STRING "")
  1576. _EOF_
  1577. die;
  1578. fi
  1579. [[ -z ${mycmakeargs} ]] && declare -a mycmakeargs=();
  1580. local mycmakeargstype=$(declare -p mycmakeargs 2>&-);
  1581. if [[ "${mycmakeargstype}" != "declare -a mycmakeargs="* ]]; then
  1582. die "mycmakeargs must be declared as array";
  1583. fi;
  1584. local mycmakeargs_local=("${mycmakeargs[@]}");
  1585. local warn_unused_cli="";
  1586. if [[ ${CMAKE_WARN_UNUSED_CLI} == no ]]; then
  1587. warn_unused_cli="--no-warn-unused-cli";
  1588. fi;
  1589. local generator_name;
  1590. case ${CMAKE_MAKEFILE_GENERATOR} in
  1591. ninja)
  1592. generator_name="Ninja"
  1593. ;;
  1594. emake)
  1595. generator_name="Unix Makefiles"
  1596. ;;
  1597. esac;
  1598. 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}");
  1599. eval "local -a MYCMAKEARGS=( ${MYCMAKEARGS} )";
  1600. cmakeargs+=("${MYCMAKEARGS[@]}");
  1601. if [[ -n "${CMAKE_EXTRA_CACHE_FILE}" ]]; then
  1602. cmakeargs+=(-C "${CMAKE_EXTRA_CACHE_FILE}");
  1603. fi;
  1604. pushd "${BUILD_DIR}" > /dev/null || die;
  1605. debug-print "${LINENO} ${ECLASS} ${FUNCNAME}: mycmakeargs is ${mycmakeargs_local[*]}";
  1606. echo "${CMAKE_BINARY}" "${cmakeargs[@]}" "${CMAKE_USE_DIR}";
  1607. "${CMAKE_BINARY}" "${cmakeargs[@]}" "${CMAKE_USE_DIR}" || die "cmake failed";
  1608. popd > /dev/null || die
  1609. }
  1610. cmake_src_install ()
  1611. {
  1612. debug-print-function ${FUNCNAME} "$@";
  1613. DESTDIR="${D}" cmake_build install "$@";
  1614. if [[ ${EAPI} == 7 ]]; then
  1615. pushd "${S}" > /dev/null || die;
  1616. einstalldocs;
  1617. popd > /dev/null || die;
  1618. else
  1619. pushd "${CMAKE_USE_DIR}" > /dev/null || die;
  1620. einstalldocs;
  1621. popd > /dev/null || die;
  1622. fi
  1623. }
  1624. cmake_src_prepare ()
  1625. {
  1626. debug-print-function ${FUNCNAME} "$@";
  1627. if [[ ${EAPI} == 7 ]]; then
  1628. pushd "${S}" > /dev/null || die;
  1629. fi;
  1630. _cmake_check_build_dir;
  1631. default_src_prepare;
  1632. if [[ ! -e ${CMAKE_USE_DIR}/CMakeLists.txt ]]; then
  1633. eerror "Unable to locate CMakeLists.txt under:";
  1634. eerror "\"${CMAKE_USE_DIR}/CMakeLists.txt\"";
  1635. eerror "Consider not inheriting the cmake eclass.";
  1636. die "FATAL: Unable to find CMakeLists.txt";
  1637. fi;
  1638. local modules_list;
  1639. if [[ ${EAPI} == 7 && $(declare -p CMAKE_REMOVE_MODULES_LIST) != "declare -a"* ]]; then
  1640. modules_list=(${CMAKE_REMOVE_MODULES_LIST});
  1641. else
  1642. modules_list=("${CMAKE_REMOVE_MODULES_LIST[@]}");
  1643. fi;
  1644. local name;
  1645. for name in "${modules_list[@]}";
  1646. do
  1647. if [[ ${EAPI} == 7 ]]; then
  1648. find "${S}" -name "${name}.cmake" -exec rm -v {} + || die;
  1649. else
  1650. find -name "${name}.cmake" -exec rm -v {} + || die;
  1651. fi;
  1652. done;
  1653. _cmake_modify-cmakelists;
  1654. if [[ ${EAPI} == 7 ]]; then
  1655. popd > /dev/null || die;
  1656. fi;
  1657. if [[ -n ${CMAKE_QA_SRC_DIR_READONLY} && ! -n ${CMAKE_IN_SOURCE_BUILD} ]]; then
  1658. if [[ ${EAPI} == 7 ]]; then
  1659. chmod -R a-w "${S}";
  1660. else
  1661. chmod -R a-w "${CMAKE_USE_DIR}";
  1662. fi;
  1663. fi;
  1664. _CMAKE_SRC_PREPARE_HAS_RUN=1
  1665. }
  1666. cmake_src_test ()
  1667. {
  1668. debug-print-function ${FUNCNAME} "$@";
  1669. _cmake_check_build_dir;
  1670. pushd "${BUILD_DIR}" > /dev/null || die;
  1671. [[ -e CTestTestfile.cmake ]] || {
  1672. echo "No tests found. Skipping.";
  1673. return 0
  1674. };
  1675. [[ -n ${TEST_VERBOSE} ]] && myctestargs+=(--extra-verbose --output-on-failure);
  1676. [[ -n ${CMAKE_SKIP_TESTS} ]] && myctestargs+=(-E '('$(IFS='|'; echo "${CMAKE_SKIP_TESTS[*]}")')');
  1677. set -- ctest -j "$(makeopts_jobs "${MAKEOPTS}" 999)" --test-load "$(makeopts_loadavg)" "${myctestargs[@]}" "$@";
  1678. echo "$@" 1>&2;
  1679. if "$@"; then
  1680. einfo "Tests succeeded.";
  1681. popd > /dev/null || die;
  1682. return 0;
  1683. else
  1684. if [[ -n "${CMAKE_YES_I_WANT_TO_SEE_THE_TEST_LOG}" ]]; then
  1685. eerror "Tests failed. Test log ${BUILD_DIR}/Testing/Temporary/LastTest.log follows:";
  1686. eerror "--START TEST LOG--------------------------------------------------------------";
  1687. cat "${BUILD_DIR}/Testing/Temporary/LastTest.log";
  1688. eerror "--END TEST LOG----------------------------------------------------------------";
  1689. die "Tests failed.";
  1690. else
  1691. die "Tests failed. When you file a bug, please attach the following file: \n\t${BUILD_DIR}/Testing/Temporary/LastTest.log";
  1692. fi;
  1693. popd > /dev/null || die;
  1694. return 1;
  1695. fi
  1696. }
  1697. cmake_use_find_package ()
  1698. {
  1699. debug-print-function ${FUNCNAME} "$@";
  1700. if [[ "$#" != 2 || -z $1 ]]; then
  1701. die "Usage: cmake_use_find_package <USE flag> <package name>";
  1702. fi;
  1703. echo "-DCMAKE_DISABLE_FIND_PACKAGE_$2=$(use $1 && echo OFF || echo ON)"
  1704. }
  1705. comment_add_subdirectory ()
  1706. {
  1707. die "comment_add_subdirectory is banned. Use cmake_comment_add_subdirectory instead"
  1708. }
  1709. econf_build ()
  1710. {
  1711. local CBUILD=${CBUILD:-${CHOST}};
  1712. function econf_env ()
  1713. {
  1714. CHOST=${CBUILD} econf "$@"
  1715. };
  1716. tc-env_build econf_env "$@"
  1717. }
  1718. eninja ()
  1719. {
  1720. case "${NINJA}" in
  1721. ninja | samu)
  1722.  
  1723. ;;
  1724. *)
  1725. ewarn "Unknown value '${NINJA}' for \${NINJA}"
  1726. ;;
  1727. esac;
  1728. local v;
  1729. case "${NINJA_VERBOSE}" in
  1730. OFF)
  1731.  
  1732. ;;
  1733. *)
  1734. v="-v"
  1735. ;;
  1736. esac;
  1737. set -- "${NINJA}" ${v} $(get_NINJAOPTS) "$@";
  1738. echo "$@" 1>&2;
  1739. "$@" || die -n "${*} failed"
  1740. }
  1741. epytest ()
  1742. {
  1743. debug-print-function ${FUNCNAME} "$@";
  1744. _python_check_EPYTHON;
  1745. _python_check_occluded_packages;
  1746. local color=yes;
  1747. [[ -n ${NO_COLOR} ]] && color=no;
  1748. local args=(-vv -ra -l -Wdefault -Werror::pytest.PytestUnhandledCoroutineWarning "--color=${color}" -o console_output_style=count -o tmp_path_retention_count=0 -o tmp_path_retention_policy=failed);
  1749. if [[ ! -n ${PYTEST_DISABLE_PLUGIN_AUTOLOAD} ]]; then
  1750. args+=(-p no:cov -p no:flake8 -p no:flakes -p no:pylint -p no:markdown -p no:sugar -p no:xvfb -p no:pytest-describe -p no:plus -p no:tavern -p no:salt-factories);
  1751. fi;
  1752. if [[ -n ${EPYTEST_TIMEOUT} ]]; then
  1753. if [[ ${PYTEST_PLUGINS} != *pytest_timeout* ]]; then
  1754. args+=(-p timeout);
  1755. fi;
  1756. args+=("--timeout=${EPYTEST_TIMEOUT}");
  1757. fi;
  1758. if [[ -n ${EPYTEST_XDIST} ]]; then
  1759. local jobs=${EPYTEST_JOBS:-$(makeopts_jobs)};
  1760. if [[ ${jobs} -gt 1 ]]; then
  1761. if [[ ${PYTEST_PLUGINS} != *xdist.plugin* ]]; then
  1762. args+=(-p xdist);
  1763. fi;
  1764. args+=(-n "${jobs}" --dist=worksteal);
  1765. fi;
  1766. fi;
  1767. local x;
  1768. for x in "${EPYTEST_DESELECT[@]}";
  1769. do
  1770. args+=(--deselect "${x}");
  1771. done;
  1772. for x in "${EPYTEST_IGNORE[@]}";
  1773. do
  1774. args+=(--ignore "${x}");
  1775. done;
  1776. set -- "${EPYTHON}" -m pytest "${args[@]}" "${@}" ${EPYTEST_FLAGS};
  1777. echo "${@}" 1>&2;
  1778. "${@}";
  1779. local ret=${?};
  1780. rm -rf .hypothesis .pytest_cache || die;
  1781. if [[ -n ${BUILD_DIR} && -d ${BUILD_DIR} ]]; then
  1782. find "${BUILD_DIR}" -name '*-pytest-*.pyc' -delete || die;
  1783. fi;
  1784. [[ ${ret} -ne 0 ]] && die -n "pytest failed with ${EPYTHON}";
  1785. return ${ret}
  1786. }
  1787. eunittest ()
  1788. {
  1789. debug-print-function ${FUNCNAME} "$@";
  1790. _python_check_EPYTHON;
  1791. _python_check_occluded_packages;
  1792. local runner=unittest;
  1793. if _python_impl_matches "${EPYTHON}" 3.{9..11}; then
  1794. runner=unittest_or_fail;
  1795. fi;
  1796. set -- "${EPYTHON}" -m "${runner}" discover -v "${@}";
  1797. echo "${@}" 1>&2;
  1798. "${@}" || die -n "Tests failed with ${EPYTHON}";
  1799. return ${?}
  1800. }
  1801. filter-flags ()
  1802. {
  1803. _filter-hardened "$@";
  1804. local v;
  1805. for v in $(all-flag-vars);
  1806. do
  1807. _filter-var ${v} "$@";
  1808. done;
  1809. return 0
  1810. }
  1811. filter-ldflags ()
  1812. {
  1813. _filter-var LDFLAGS "$@";
  1814. return 0
  1815. }
  1816. filter-lfs-flags ()
  1817. {
  1818. [[ $# -ne 0 ]] && die "filter-lfs-flags takes no arguments";
  1819. filter-flags -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_TIME_BITS=64
  1820. }
  1821. filter-lto ()
  1822. {
  1823. [[ $# -ne 0 ]] && die "filter-lto takes no arguments";
  1824. filter-flags '-flto*' -fwhole-program-vtables '-fsanitize=cfi*'
  1825. }
  1826. filter-mfpmath ()
  1827. {
  1828. local orig_mfpmath new_math prune_math;
  1829. orig_mfpmath=$(get-flag -mfpmath);
  1830. new_math=$(get-flag mfpmath);
  1831. new_math=${new_math/both/387,sse};
  1832. new_math=" ${new_math//[,+]/ } ";
  1833. prune_math="";
  1834. for prune_math in "$@";
  1835. do
  1836. new_math=${new_math/ ${prune_math} / };
  1837. done;
  1838. new_math=$(echo ${new_math});
  1839. new_math=${new_math// /,};
  1840. if [[ -z ${new_math} ]]; then
  1841. filter-flags ${orig_mfpmath};
  1842. else
  1843. replace-flags ${orig_mfpmath} -mfpmath=${new_math};
  1844. fi;
  1845. return 0
  1846. }
  1847. gcc-fullversion ()
  1848. {
  1849. _gcc_fullversion '$1.$2.$3' "$@"
  1850. }
  1851. gcc-major-version ()
  1852. {
  1853. _gcc_fullversion '$1' "$@"
  1854. }
  1855. gcc-micro-version ()
  1856. {
  1857. _gcc_fullversion '$3' "$@"
  1858. }
  1859. gcc-minor-version ()
  1860. {
  1861. _gcc_fullversion '$2' "$@"
  1862. }
  1863. gcc-specs-directive ()
  1864. {
  1865. local directive subdname subdirective;
  1866. directive="$(_gcc-specs-directive_raw $1)";
  1867. while [[ ${directive} == *%\(*\)* ]]; do
  1868. subdname=${directive/*%\(};
  1869. subdname=${subdname/\)*};
  1870. subdirective="$(_gcc-specs-directive_raw ${subdname})";
  1871. directive="${directive//\%(${subdname})/${subdirective}}";
  1872. done;
  1873. echo "${directive}";
  1874. return 0
  1875. }
  1876. gcc-specs-nostrict ()
  1877. {
  1878. local directive;
  1879. directive=$(gcc-specs-directive cc1);
  1880. [[ "${directive/\{!fstrict-overflow:}" != "${directive}" ]]
  1881. }
  1882. gcc-specs-now ()
  1883. {
  1884. local directive;
  1885. directive=$(gcc-specs-directive link_command);
  1886. [[ "${directive/\{!nonow:}" != "${directive}" ]]
  1887. }
  1888. gcc-specs-pie ()
  1889. {
  1890. local directive;
  1891. directive=$(gcc-specs-directive cc1);
  1892. [[ "${directive/\{!nopie:}" != "${directive}" ]]
  1893. }
  1894. gcc-specs-relro ()
  1895. {
  1896. local directive;
  1897. directive=$(gcc-specs-directive link_command);
  1898. [[ "${directive/\{!norelro:}" != "${directive}" ]]
  1899. }
  1900. gcc-specs-ssp ()
  1901. {
  1902. local directive;
  1903. directive=$(gcc-specs-directive cc1);
  1904. [[ "${directive/\{!fno-stack-protector:}" != "${directive}" ]]
  1905. }
  1906. gcc-specs-ssp-to-all ()
  1907. {
  1908. local directive;
  1909. directive=$(gcc-specs-directive cc1);
  1910. [[ "${directive/\{!fno-stack-protector-all:}" != "${directive}" ]]
  1911. }
  1912. gcc-specs-stack-check ()
  1913. {
  1914. local directive;
  1915. directive=$(gcc-specs-directive cc1);
  1916. [[ "${directive/\{!fno-stack-check:}" != "${directive}" ]]
  1917. }
  1918. gcc-version ()
  1919. {
  1920. _gcc_fullversion '$1.$2' "$@"
  1921. }
  1922. gen_usr_ldscript ()
  1923. {
  1924. ewarn "${FUNCNAME}: Please migrate to usr-ldscript.eclass";
  1925. local lib libdir=$(get_libdir) output_format="" auto=false suffix=$(get_libname);
  1926. tc-is-static-only && return;
  1927. use prefix && return;
  1928. if [[ $(type -t multilib_is_native_abi) == "function" ]]; then
  1929. multilib_is_native_abi || return 0;
  1930. fi;
  1931. case ${CTARGET:-${CHOST}} in
  1932. *-darwin*)
  1933.  
  1934. ;;
  1935. *-android*)
  1936. return 0
  1937. ;;
  1938. *linux*)
  1939. use prefix && return 0
  1940. ;;
  1941. *)
  1942. return 0
  1943. ;;
  1944. esac;
  1945. dodir /usr/${libdir};
  1946. if [[ $1 == "-a" ]]; then
  1947. auto=true;
  1948. shift;
  1949. dodir /${libdir};
  1950. fi;
  1951. local flags=(${CFLAGS} ${LDFLAGS} -Wl,--verbose);
  1952. if $(tc-getLD) --version | grep -q 'GNU gold'; then
  1953. local d="${T}/bfd-linker";
  1954. mkdir -p "${d}";
  1955. ln -sf $(type -P ${CHOST}-ld.bfd) "${d}"/ld;
  1956. flags+=(-B"${d}");
  1957. fi;
  1958. output_format=$($(tc-getCC) "${flags[@]}" 2>&1 | sed -n 's/^OUTPUT_FORMAT("\([^"]*\)",.*/\1/p');
  1959. [[ -n ${output_format} ]] && output_format="OUTPUT_FORMAT ( ${output_format} )";
  1960. for lib in "$@";
  1961. do
  1962. local tlib;
  1963. if ${auto}; then
  1964. lib="lib${lib}${suffix}";
  1965. else
  1966. [[ -r ${ED}/${libdir}/${lib} ]] || continue;
  1967. fi;
  1968. case ${CTARGET:-${CHOST}} in
  1969. *-darwin*)
  1970. if ${auto}; then
  1971. tlib=$(scanmacho -qF'%S#F' "${ED}"/usr/${libdir}/${lib});
  1972. else
  1973. tlib=$(scanmacho -qF'%S#F' "${ED}"/${libdir}/${lib});
  1974. fi;
  1975. [[ -z ${tlib} ]] && die "unable to read install_name from ${lib}";
  1976. tlib=${tlib##*/};
  1977. if ${auto}; then
  1978. mv "${ED}"/usr/${libdir}/${lib%${suffix}}.*${suffix#.} "${ED}"/${libdir}/ || die;
  1979. if [[ ${tlib} != ${lib%${suffix}}.*${suffix#.} ]]; then
  1980. mv "${ED}"/usr/${libdir}/${tlib%${suffix}}.*${suffix#.} "${ED}"/${libdir}/ || die;
  1981. fi;
  1982. rm -f "${ED}"/${libdir}/${lib};
  1983. fi;
  1984. if [[ ! -w "${ED}/${libdir}/${tlib}" ]]; then
  1985. chmod u+w "${ED}${libdir}/${tlib}";
  1986. local nowrite=yes;
  1987. fi;
  1988. install_name_tool -id "${EPREFIX}"/${libdir}/${tlib} "${ED}"/${libdir}/${tlib} || die "install_name_tool failed";
  1989. [[ -n ${nowrite} ]] && chmod u-w "${ED}${libdir}/${tlib}";
  1990. pushd "${ED}/usr/${libdir}" > /dev/null;
  1991. ln -snf "../../${libdir}/${tlib}" "${lib}";
  1992. popd > /dev/null
  1993. ;;
  1994. *)
  1995. if ${auto}; then
  1996. tlib=$(scanelf -qF'%S#F' "${ED}"/usr/${libdir}/${lib});
  1997. [[ -z ${tlib} ]] && die "unable to read SONAME from ${lib}";
  1998. mv "${ED}"/usr/${libdir}/${lib}* "${ED}"/${libdir}/ || die;
  1999. if [[ ${tlib} != ${lib}* ]]; then
  2000. mv "${ED}"/usr/${libdir}/${tlib}* "${ED}"/${libdir}/ || die;
  2001. fi;
  2002. rm -f "${ED}"/${libdir}/${lib};
  2003. else
  2004. tlib=${lib};
  2005. fi;
  2006. cat > "${ED}/usr/${libdir}/${lib}" <<-END_LDSCRIPT
  2007. /* GNU ld script
  2008. Since Gentoo has critical dynamic libraries in /lib, and the static versions
  2009. in /usr/lib, we need to have a "fake" dynamic lib in /usr/lib, otherwise we
  2010. run into linking problems. This "fake" dynamic lib is a linker script that
  2011. redirects the linker to the real lib. And yes, this works in the cross-
  2012. compiling scenario as the sysroot-ed linker will prepend the real path.
  2013.  
  2014. See bug https://bugs.gentoo.org/4411 for more info.
  2015. */
  2016. ${output_format}
  2017. GROUP ( ${EPREFIX}/${libdir}/${tlib} )
  2018. END_LDSCRIPT
  2019.  
  2020. ;;
  2021. esac
  2022. fperms a+x "/usr/${libdir}/${lib}" || die "could not change perms on ${lib}";
  2023. done
  2024. }
  2025. get-flag ()
  2026. {
  2027. [[ $# -ne 1 ]] && die "usage: <flag>";
  2028. local f var findflag="$1";
  2029. for var in $(all-flag-vars);
  2030. do
  2031. for f in ${!var};
  2032. do
  2033. if [ "${f/${findflag}}" != "${f}" ]; then
  2034. printf "%s\n" "${f/-${findflag}=}";
  2035. return 0;
  2036. fi;
  2037. done;
  2038. done;
  2039. return 1
  2040. }
  2041. get_NINJAOPTS ()
  2042. {
  2043. if [[ -z ${NINJAOPTS+set} ]]; then
  2044. NINJAOPTS="-j$(get_makeopts_jobs 999) -l$(get_makeopts_loadavg 0)";
  2045. fi;
  2046. echo "${NINJAOPTS}"
  2047. }
  2048. get_abi_CFLAGS ()
  2049. {
  2050. get_abi_var CFLAGS "$@"
  2051. }
  2052. get_abi_CHOST ()
  2053. {
  2054. get_abi_var CHOST "$@"
  2055. }
  2056. get_abi_CTARGET ()
  2057. {
  2058. get_abi_var CTARGET "$@"
  2059. }
  2060. get_abi_FAKE_TARGETS ()
  2061. {
  2062. get_abi_var FAKE_TARGETS "$@"
  2063. }
  2064. get_abi_LDFLAGS ()
  2065. {
  2066. get_abi_var LDFLAGS "$@"
  2067. }
  2068. get_abi_LIBDIR ()
  2069. {
  2070. get_abi_var LIBDIR "$@"
  2071. }
  2072. get_abi_var ()
  2073. {
  2074. local flag=$1;
  2075. local abi=${2:-${ABI:-${DEFAULT_ABI:-default}}};
  2076. local var="${flag}_${abi}";
  2077. echo ${!var}
  2078. }
  2079. get_all_abis ()
  2080. {
  2081. local x order="" mvar dvar;
  2082. mvar="MULTILIB_ABIS";
  2083. dvar="DEFAULT_ABI";
  2084. if [[ -n $1 ]]; then
  2085. mvar="$1_${mvar}";
  2086. dvar="$1_${dvar}";
  2087. fi;
  2088. if [[ -z ${!mvar} ]]; then
  2089. echo "default";
  2090. return 0;
  2091. fi;
  2092. for x in ${!mvar};
  2093. do
  2094. if [[ ${x} != ${!dvar} ]]; then
  2095. order="${order:+${order} }${x}";
  2096. fi;
  2097. done;
  2098. order="${order:+${order} }${!dvar}";
  2099. echo ${order};
  2100. return 0
  2101. }
  2102. get_all_libdirs ()
  2103. {
  2104. local libdirs abi;
  2105. for abi in ${MULTILIB_ABIS};
  2106. do
  2107. libdirs+=" $(get_abi_LIBDIR ${abi})";
  2108. done;
  2109. [[ " ${libdirs} " != *" lib "* ]] && libdirs+=" lib";
  2110. echo "${libdirs}"
  2111. }
  2112. get_exeext ()
  2113. {
  2114. case ${CHOST} in
  2115. mingw* | *-mingw*)
  2116. echo ".exe"
  2117. ;;
  2118. esac
  2119. }
  2120. get_install_abis ()
  2121. {
  2122. local x order="";
  2123. if [[ -z ${MULTILIB_ABIS} ]]; then
  2124. echo "default";
  2125. return 0;
  2126. fi;
  2127. if [[ ${EMULTILIB_PKG} == "true" ]]; then
  2128. for x in ${MULTILIB_ABIS};
  2129. do
  2130. if [[ ${x} != "${DEFAULT_ABI}" ]]; then
  2131. has ${x} ${ABI_DENY} || order="${order} ${x}";
  2132. fi;
  2133. done;
  2134. has ${DEFAULT_ABI} ${ABI_DENY} || order="${order} ${DEFAULT_ABI}";
  2135. if [[ -n ${ABI_ALLOW} ]]; then
  2136. local ordera="";
  2137. for x in ${order};
  2138. do
  2139. if has ${x} ${ABI_ALLOW}; then
  2140. ordera="${ordera} ${x}";
  2141. fi;
  2142. done;
  2143. order=${ordera};
  2144. fi;
  2145. else
  2146. order=${DEFAULT_ABI};
  2147. fi;
  2148. if [[ -z ${order} ]]; then
  2149. 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.";
  2150. fi;
  2151. echo ${order};
  2152. return 0
  2153. }
  2154. get_libname ()
  2155. {
  2156. local libname;
  2157. local ver=$1;
  2158. case ${CHOST} in
  2159. mingw* | *-mingw*)
  2160. libname="dll"
  2161. ;;
  2162. *-darwin*)
  2163. libname="dylib"
  2164. ;;
  2165. *)
  2166. libname="so"
  2167. ;;
  2168. esac;
  2169. if [[ -z $* ]]; then
  2170. echo ".${libname}";
  2171. else
  2172. for ver in "$@";
  2173. do
  2174. case ${CHOST} in
  2175. *-darwin*)
  2176. echo ".${ver}.${libname}"
  2177. ;;
  2178. *)
  2179. echo ".${libname}.${ver}"
  2180. ;;
  2181. esac;
  2182. done;
  2183. fi
  2184. }
  2185. get_lit_flags ()
  2186. {
  2187. echo "-vv;-j;${LIT_JOBS:-$(makeopts_jobs)}"
  2188. }
  2189. get_makeopts_jobs ()
  2190. {
  2191. makeopts_jobs "$(_get_all_makeopts)" "${1:-1}"
  2192. }
  2193. get_makeopts_loadavg ()
  2194. {
  2195. makeopts_loadavg "$(_get_all_makeopts)" "${1:-999}"
  2196. }
  2197. get_modname ()
  2198. {
  2199. local modname;
  2200. local ver=$1;
  2201. case ${CHOST} in
  2202. *-darwin*)
  2203. modname="bundle"
  2204. ;;
  2205. *)
  2206. modname="so"
  2207. ;;
  2208. esac;
  2209. echo ".${modname}"
  2210. }
  2211. get_nproc ()
  2212. {
  2213. local nproc;
  2214. if type -P nproc &> /dev/null; then
  2215. nproc=$(nproc);
  2216. fi;
  2217. if [[ -z ${nproc} ]] && type -P sysctl &> /dev/null; then
  2218. nproc=$(sysctl -n hw.ncpu 2> /dev/null);
  2219. fi;
  2220. if [[ -z ${nproc} ]] && type -P python &> /dev/null; then
  2221. nproc=$(python -c 'import multiprocessing; print(multiprocessing.cpu_count());' 2> /dev/null);
  2222. fi;
  2223. if [[ -n ${nproc} ]]; then
  2224. echo "${nproc}";
  2225. else
  2226. echo "${1:-1}";
  2227. fi
  2228. }
  2229. has_multilib_profile ()
  2230. {
  2231. [ -n "${MULTILIB_ABIS}" -a "${MULTILIB_ABIS}" != "${MULTILIB_ABIS/ /}" ]
  2232. }
  2233. is-flag ()
  2234. {
  2235. is-flagq "$@" && echo true
  2236. }
  2237. is-flagq ()
  2238. {
  2239. [[ -n $2 ]] && die "Usage: is-flag <flag>";
  2240. local var;
  2241. for var in $(all-flag-vars);
  2242. do
  2243. _is_flagq ${var} "$1" && return 0;
  2244. done;
  2245. return 1
  2246. }
  2247. is-ldflag ()
  2248. {
  2249. is-ldflagq "$@" && echo true
  2250. }
  2251. is-ldflagq ()
  2252. {
  2253. [[ -n $2 ]] && die "Usage: is-ldflag <flag>";
  2254. _is_flagq LDFLAGS $1
  2255. }
  2256. is_final_abi ()
  2257. {
  2258. has_multilib_profile || return 0;
  2259. set -- $(get_install_abis);
  2260. local LAST_ABI=$#;
  2261. [[ ${!LAST_ABI} == ${ABI} ]]
  2262. }
  2263. llvm.org_set_globals ()
  2264. {
  2265. if [[ $(declare -p LLVM_COMPONENTS) != "declare -a"* ]]; then
  2266. die 'LLVM_COMPONENTS must be an array.';
  2267. fi;
  2268. if declare -p LLVM_TEST_COMPONENTS &> /dev/null; then
  2269. if [[ $(declare -p LLVM_TEST_COMPONENTS) != "declare -a"* ]]; then
  2270. die 'LLVM_TEST_COMPONENTS must be an array.';
  2271. fi;
  2272. fi;
  2273. case ${_LLVM_SOURCE_TYPE} in
  2274. git)
  2275. EGIT_REPO_URI="https://github.com/llvm/llvm-project.git";
  2276. [[ ${LLVM_MAJOR} != ${_LLVM_MAIN_MAJOR} ]] && EGIT_BRANCH="release/${LLVM_MAJOR}.x"
  2277. ;;
  2278. tar)
  2279. if [[ ${LLVM_MAJOR} -ge 19 ]]; then
  2280. SRC_URI+="
  2281. https://github.com/llvm/llvm-project/releases/download/llvmorg-${PV/_/-}/llvm-project-${PV/_/-}.src.tar.xz
  2282. verify-sig? (
  2283. https://github.com/llvm/llvm-project/releases/download/llvmorg-${PV/_/-}/llvm-project-${PV/_/-}.src.tar.xz.sig
  2284. )
  2285. ";
  2286. else
  2287. SRC_URI+="
  2288. https://github.com/llvm/llvm-project/releases/download/llvmorg-${PV/_/-}/llvm-project-${PV/_/}.src.tar.xz
  2289. verify-sig? (
  2290. https://github.com/llvm/llvm-project/releases/download/llvmorg-${PV/_/-}/llvm-project-${PV/_/}.src.tar.xz.sig
  2291. )
  2292. ";
  2293. fi;
  2294. BDEPEND+="
  2295. verify-sig? (
  2296. >=sec-keys/openpgp-keys-llvm-18.1.6
  2297. )
  2298. ";
  2299. VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/llvm.asc
  2300. ;;
  2301. snapshot)
  2302. SRC_URI+="
  2303. https://github.com/llvm/llvm-project/archive/${EGIT_COMMIT}.tar.gz
  2304. -> llvm-project-${EGIT_COMMIT}.tar.gz
  2305. "
  2306. ;;
  2307. *)
  2308. die "Invalid _LLVM_SOURCE_TYPE: ${LLVM_SOURCE_TYPE}"
  2309. ;;
  2310. esac;
  2311. S=${WORKDIR}/${LLVM_COMPONENTS[0]};
  2312. if [[ -n ${LLVM_TEST_COMPONENTS+1} ]]; then
  2313. IUSE+=" test";
  2314. RESTRICT+=" !test? ( test )";
  2315. fi;
  2316. if [[ -n ${LLVM_MANPAGES} ]]; then
  2317. LLVM_MANPAGE_DIST=;
  2318. if [[ ${_LLVM_SOURCE_TYPE} == tar && ${PV} != *_rc* ]]; then
  2319. case ${PV} in
  2320. 14* | 15* | 16.0.[0-3])
  2321. LLVM_MANPAGE_DIST="llvm-${PV}-manpages.tar.bz2"
  2322. ;;
  2323. 16*)
  2324. LLVM_MANPAGE_DIST="llvm-16.0.4-manpages.tar.bz2"
  2325. ;;
  2326. 17*)
  2327. LLVM_MANPAGE_DIST="llvm-17.0.1-manpages.tar.bz2"
  2328. ;;
  2329. 18*)
  2330. LLVM_MANPAGE_DIST="llvm-18.1.0-manpages.tar.bz2"
  2331. ;;
  2332. 19*)
  2333. LLVM_MANPAGE_DIST="llvm-19.1.0-manpages.tar.bz2"
  2334. ;;
  2335. 20*)
  2336. LLVM_MANPAGE_DIST="llvm-20.1.0-manpages.tar.xz"
  2337. ;;
  2338. esac;
  2339. fi;
  2340. IUSE+=" doc";
  2341. if [[ -n ${LLVM_MANPAGE_DIST} ]]; then
  2342. SRC_URI+="
  2343. !doc? (
  2344. https://dev.gentoo.org/~mgorny/dist/llvm/${LLVM_MANPAGE_DIST}
  2345. )
  2346. ";
  2347. fi;
  2348. fi;
  2349. if [[ -n ${LLVM_PATCHSET} ]]; then
  2350. SRC_URI+="
  2351. https://dev.gentoo.org/~mgorny/dist/llvm/llvm-gentoo-patchset-${LLVM_PATCHSET}.tar.xz";
  2352. fi;
  2353. local x;
  2354. case ${LLVM_USE_TARGETS:-__unset__} in
  2355. __unset__)
  2356.  
  2357. ;;
  2358. provide | llvm)
  2359. IUSE+=" ${ALL_LLVM_TARGET_FLAGS[*]}";
  2360. REQUIRED_USE+=" || ( ${ALL_LLVM_TARGET_FLAGS[*]} )"
  2361. ;;&
  2362. llvm)
  2363. local dep=;
  2364. for x in "${ALL_LLVM_TARGET_FLAGS[@]}";
  2365. do
  2366. dep+="
  2367. ${x}? ( ~llvm-core/llvm-${PV}[${x}] )";
  2368. done;
  2369. RDEPEND+=" ${dep}";
  2370. DEPEND+=" ${dep}"
  2371. ;;
  2372. esac;
  2373. CMAKE_BUILD_TYPE=RelWithDebInfo;
  2374. _LLVM_ORG_SET_GLOBALS_CALLED=1
  2375. }
  2376. llvm.org_src_prepare ()
  2377. {
  2378. if [[ -n ${LLVM_PATCHSET} ]]; then
  2379. local PATCHES=("${PATCHES[@]}" "${WORKDIR}/llvm-gentoo-patchset-${LLVM_PATCHSET}");
  2380. fi;
  2381. pushd "${WORKDIR}" > /dev/null || die;
  2382. if declare -f cmake_src_prepare > /dev/null; then
  2383. CMAKE_USE_DIR=${S};
  2384. if [[ ${EAPI} == 7 ]]; then
  2385. local S=${WORKDIR};
  2386. fi;
  2387. cmake_src_prepare;
  2388. else
  2389. default_src_prepare;
  2390. fi;
  2391. popd > /dev/null || die
  2392. }
  2393. llvm.org_src_unpack ()
  2394. {
  2395. if [[ ! -n ${_LLVM_ORG_SET_GLOBALS_CALLED} ]]; then
  2396. die "llvm.org_set_globals must be called in global scope";
  2397. fi;
  2398. local components=("${LLVM_COMPONENTS[@]}");
  2399. if [[ -n ${LLVM_TEST_COMPONENTS+1} ]] && use test; then
  2400. components+=("${LLVM_TEST_COMPONENTS[@]}");
  2401. fi;
  2402. local archive=;
  2403. case ${_LLVM_SOURCE_TYPE} in
  2404. git)
  2405. git-r3_fetch;
  2406. git-r3_checkout '' . '' "${components[@]}"
  2407. ;;
  2408. tar)
  2409. if [[ ${LLVM_MAJOR} -ge 19 ]]; then
  2410. archive=llvm-project-${PV/_/-}.src.tar.xz;
  2411. else
  2412. archive=llvm-project-${PV/_/}.src.tar.xz;
  2413. fi;
  2414. if use verify-sig; then
  2415. verify-sig_verify_detached "${DISTDIR}/${archive}" "${DISTDIR}/${archive}.sig";
  2416. fi;
  2417. ebegin "Unpacking from ${archive}";
  2418. tar -x -J -o --strip-components 1 -f "${DISTDIR}/${archive}" "${components[@]/#/${archive%.tar*}/}" || die;
  2419. eend ${?}
  2420. ;;
  2421. snapshot)
  2422. archive=llvm-project-${EGIT_COMMIT}.tar.gz;
  2423. ebegin "Unpacking from ${archive}";
  2424. tar -x -z -o --strip-components 1 -f "${DISTDIR}/${archive}" "${components[@]/#/${archive%.tar*}/}" || die;
  2425. eend ${?}
  2426. ;;
  2427. *)
  2428. die "Invalid _LLVM_SOURCE_TYPE: ${LLVM_SOURCE_TYPE}"
  2429. ;;
  2430. esac;
  2431. local x;
  2432. for x in ${A};
  2433. do
  2434. [[ ${x} != ${archive} ]] && unpack "${x}";
  2435. done;
  2436. if [[ -n ${LLVM_PATCHSET} ]]; then
  2437. local nocomp=$(grep -r -L "^Gentoo-Component:" "${WORKDIR}/llvm-gentoo-patchset-${LLVM_PATCHSET}");
  2438. if [[ -n ${nocomp} ]]; then
  2439. die "Patches lacking Gentoo-Component found: ${nocomp}";
  2440. fi;
  2441. local IFS='|';
  2442. grep -E -r -L "^Gentoo-Component:.*(${components[*]})" "${WORKDIR}/llvm-gentoo-patchset-${LLVM_PATCHSET}" | xargs -r rm;
  2443. local status=("${PIPESTATUS[@]}");
  2444. [[ ${status[1]} -ne 0 ]] && die "rm failed";
  2445. [[ ${status[0]} -ne 0 ]] && die "No patches in the patchset apply to the package";
  2446. fi
  2447. }
  2448. llvm_are_manpages_built ()
  2449. {
  2450. use doc || [[ -z ${LLVM_MANPAGE_DIST} ]]
  2451. }
  2452. llvm_fix_clang_version ()
  2453. {
  2454. debug-print-function ${FUNCNAME} "$@";
  2455. local shopt_save=$(shopt -p -o noglob);
  2456. set -f;
  2457. local var;
  2458. for var in "$@";
  2459. do
  2460. local split=(${!var});
  2461. case ${split[0]} in
  2462. *clang | *clang++ | *clang-cpp)
  2463. local version=();
  2464. read -r -a version < <("${split[0]}" --version);
  2465. local major=${version[-1]%%.*};
  2466. if [[ -n ${major//[0-9]} ]]; then
  2467. die "${var}=${!var} produced invalid --version: ${version[*]}";
  2468. fi;
  2469. split[0]+=-${major};
  2470. if ! type -P "${split[0]}" &> /dev/null; then
  2471. die "${split[0]} does not seem to exist";
  2472. fi;
  2473. declare -g "${var}=${split[*]}"
  2474. ;;
  2475. esac;
  2476. done;
  2477. ${shopt_save}
  2478. }
  2479. llvm_fix_tool_path ()
  2480. {
  2481. debug-print-function ${FUNCNAME} "$@";
  2482. local shopt_save=$(shopt -p -o noglob);
  2483. set -f;
  2484. local var;
  2485. for var in "$@";
  2486. do
  2487. local split=(${!var});
  2488. local path=$(type -P ${split[0]} 2> /dev/null);
  2489. if [[ ${path} == "${BROOT}/usr/lib/llvm"* ]]; then
  2490. split[0]=${path};
  2491. declare -g "${var}=${split[*]}";
  2492. fi;
  2493. done;
  2494. ${shopt_save}
  2495. }
  2496. llvm_install_manpages ()
  2497. {
  2498. if ! llvm_are_manpages_built; then
  2499. insinto "/usr/lib/llvm/${LLVM_MAJOR}/share/man/man1";
  2500. doins "${WORKDIR}"/llvm-*-manpages/"${LLVM_COMPONENTS[0]}"/*.1;
  2501. fi
  2502. }
  2503. llvm_prepend_path ()
  2504. {
  2505. debug-print-function ${FUNCNAME} "$@";
  2506. local prefix;
  2507. case ${1--d} in
  2508. -d)
  2509. prefix=${ESYSROOT};
  2510. shift
  2511. ;;
  2512. -b)
  2513. prefix=${BROOT};
  2514. shift
  2515. ;;
  2516. -*)
  2517. die "${FUNCNAME}: invalid option: ${1}"
  2518. ;;
  2519. esac;
  2520. [[ ${#} -ne 1 ]] && die "Usage: ${FUNCNAME} [-b|-d] <slot>";
  2521. local slot=${1};
  2522. local llvm_path=${prefix}/usr/lib/llvm/${slot}/bin;
  2523. local IFS=:;
  2524. local split_path=(${PATH});
  2525. local new_path=();
  2526. local x added=;
  2527. for x in "${split_path[@]}";
  2528. do
  2529. if [[ ${x} == */usr/lib/llvm/*/bin ]]; then
  2530. if [[ ! -n ${added} ]]; then
  2531. new_path+=("${llvm_path}");
  2532. added=1;
  2533. fi;
  2534. if [[ ${x} == ${llvm_path} ]]; then
  2535. continue;
  2536. fi;
  2537. fi;
  2538. new_path+=("${x}");
  2539. done;
  2540. [[ -n ${added} ]] || new_path+=("${llvm_path}");
  2541. export PATH=${new_path[*]}
  2542. }
  2543. llvm_tuple_to_target ()
  2544. {
  2545. debug-print-function ${FUNCNAME} "$@";
  2546. [[ ${#} -gt 1 ]] && die "Usage: ${FUNCNAME} [<tuple>]";
  2547. case ${1:-${CHOST}} in
  2548. aarch64*)
  2549. echo "AArch64"
  2550. ;;
  2551. amdgcn*)
  2552. echo "AMDGPU"
  2553. ;;
  2554. arc*)
  2555. echo "ARC"
  2556. ;;
  2557. arm*)
  2558. echo "ARM"
  2559. ;;
  2560. avr*)
  2561. echo "AVR"
  2562. ;;
  2563. bpf*)
  2564. echo "BPF"
  2565. ;;
  2566. csky*)
  2567. echo "CSKY"
  2568. ;;
  2569. loong*)
  2570. echo "LoongArch"
  2571. ;;
  2572. m68k*)
  2573. echo "M68k"
  2574. ;;
  2575. mips*)
  2576. echo "Mips"
  2577. ;;
  2578. msp430*)
  2579. echo "MSP430"
  2580. ;;
  2581. nvptx*)
  2582. echo "NVPTX"
  2583. ;;
  2584. powerpc*)
  2585. echo "PowerPC"
  2586. ;;
  2587. riscv*)
  2588. echo "RISCV"
  2589. ;;
  2590. sparc*)
  2591. echo "Sparc"
  2592. ;;
  2593. s390*)
  2594. echo "SystemZ"
  2595. ;;
  2596. x86_64* | i?86*)
  2597. echo "X86"
  2598. ;;
  2599. xtensa*)
  2600. echo "Xtensa"
  2601. ;;
  2602. *)
  2603. die "Unknown LLVM target for tuple ${1:-${CHOST}}"
  2604. ;;
  2605. esac
  2606. }
  2607. makeopts_jobs ()
  2608. {
  2609. [[ $# -eq 0 ]] && set -- "$(_get_all_makeopts)";
  2610. local jobs=$(echo " $* " | sed -r -n -e 's:.*[[:space:]](-[a-z]*j|--jobs[=[:space:]])[[:space:]]*([0-9]+).*:\2:p' -e "s:.*[[:space:]](-[a-z]*j|--jobs)[[:space:]].*:${2:-$(( $(get_nproc) + 1 ))}:p");
  2611. echo ${jobs:-1}
  2612. }
  2613. makeopts_loadavg ()
  2614. {
  2615. [[ $# -eq 0 ]] && set -- "$(_get_all_makeopts)";
  2616. 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");
  2617. echo ${lavg:-${2:-999}}
  2618. }
  2619. multilib_env ()
  2620. {
  2621. local CTARGET=${1:-${CTARGET}};
  2622. local cpu=${CTARGET%%*-};
  2623. if [[ ${CTARGET} = *-musl* ]]; then
  2624. : "${MULTILIB_ABIS=default}";
  2625. : "${DEFAULT_ABI=default}";
  2626. export MULTILIB_ABIS DEFAULT_ABI;
  2627. return;
  2628. fi;
  2629. case ${cpu} in
  2630. aarch64*)
  2631. export CFLAGS_arm=${CFLAGS_arm-};
  2632. case ${cpu} in
  2633. aarch64*be)
  2634. export CHOST_arm="armv8b-${CTARGET#*-}"
  2635. ;;
  2636. *)
  2637. export CHOST_arm="armv8l-${CTARGET#*-}"
  2638. ;;
  2639. esac;
  2640. CHOST_arm=${CHOST_arm/%-gnu/-gnueabi};
  2641. export CTARGET_arm=${CHOST_arm};
  2642. export LIBDIR_arm="lib";
  2643. export CFLAGS_arm64=${CFLAGS_arm64-};
  2644. export CHOST_arm64=${CTARGET};
  2645. export CTARGET_arm64=${CHOST_arm64};
  2646. export LIBDIR_arm64="lib64";
  2647. : "${MULTILIB_ABIS=arm64}";
  2648. : "${DEFAULT_ABI=arm64}"
  2649. ;;
  2650. x86_64*)
  2651. export CFLAGS_x86=${CFLAGS_x86--m32};
  2652. export CHOST_x86=${CTARGET/x86_64/i686};
  2653. CHOST_x86=${CHOST_x86/%-gnux32/-gnu};
  2654. export CTARGET_x86=${CHOST_x86};
  2655. if [[ ${SYMLINK_LIB} == "yes" ]]; then
  2656. export LIBDIR_x86="lib32";
  2657. else
  2658. export LIBDIR_x86="lib";
  2659. fi;
  2660. export CFLAGS_amd64=${CFLAGS_amd64--m64};
  2661. export CHOST_amd64=${CTARGET/%-gnux32/-gnu};
  2662. export CTARGET_amd64=${CHOST_amd64};
  2663. export LIBDIR_amd64="lib64";
  2664. export CFLAGS_x32=${CFLAGS_x32--mx32};
  2665. export CHOST_x32=${CTARGET/%-gnu/-gnux32};
  2666. export CTARGET_x32=${CHOST_x32};
  2667. export LIBDIR_x32="libx32";
  2668. case ${CTARGET} in
  2669. *-gnux32)
  2670. : "${MULTILIB_ABIS=x32 amd64 x86}";
  2671. : "${DEFAULT_ABI=x32}"
  2672. ;;
  2673. *)
  2674. : "${MULTILIB_ABIS=amd64 x86}";
  2675. : "${DEFAULT_ABI=amd64}"
  2676. ;;
  2677. esac
  2678. ;;
  2679. loongarch64*)
  2680. export CFLAGS_lp64d=${CFLAGS_lp64d--mabi=lp64d};
  2681. export CHOST_lp64d=${CTARGET};
  2682. export CTARGET_lp64d=${CTARGET};
  2683. export LIBDIR_lp64d=${LIBDIR_lp64d-lib64};
  2684. : "${MULTILIB_ABIS=lp64d}";
  2685. : "${DEFAULT_ABI=lp64d}"
  2686. ;;
  2687. mips64* | mipsisa64*)
  2688. export CFLAGS_o32=${CFLAGS_o32--mabi=32};
  2689. export CHOST_o32=${CTARGET/mips64/mips};
  2690. export CHOST_o32=${CHOST_o32/mipsisa64/mipsisa32};
  2691. export CTARGET_o32=${CHOST_o32};
  2692. export LIBDIR_o32="lib";
  2693. export CFLAGS_n32=${CFLAGS_n32--mabi=n32};
  2694. export CHOST_n32=${CTARGET};
  2695. export CTARGET_n32=${CHOST_n32};
  2696. export LIBDIR_n32="lib32";
  2697. export CFLAGS_n64=${CFLAGS_n64--mabi=64};
  2698. export CHOST_n64=${CTARGET};
  2699. export CTARGET_n64=${CHOST_n64};
  2700. export LIBDIR_n64="lib64";
  2701. : "${MULTILIB_ABIS=n64 n32 o32}";
  2702. : "${DEFAULT_ABI=n32}"
  2703. ;;
  2704. powerpc64*)
  2705. export CFLAGS_ppc=${CFLAGS_ppc--m32};
  2706. export CHOST_ppc=${CTARGET/powerpc64/powerpc};
  2707. export CTARGET_ppc=${CHOST_ppc};
  2708. export LIBDIR_ppc="lib";
  2709. export CFLAGS_ppc64=${CFLAGS_ppc64--m64};
  2710. export CHOST_ppc64=${CTARGET};
  2711. export CTARGET_ppc64=${CHOST_ppc64};
  2712. export LIBDIR_ppc64="lib64";
  2713. : "${MULTILIB_ABIS=ppc64 ppc}";
  2714. : "${DEFAULT_ABI=ppc64}"
  2715. ;;
  2716. riscv64*)
  2717. : "${MULTILIB_ABIS=lp64d lp64 ilp32d ilp32}";
  2718. : "${DEFAULT_ABI=lp64d}";
  2719. local _libdir_riscvdefaultabi_variable="LIBDIR_${DEFAULT_ABI}";
  2720. local _libdir_riscvdefaultabi=${!_libdir_riscvdefaultabi_variable};
  2721. export ${_libdir_riscvdefaultabi_variable}=${_libdir_riscvdefaultabi:-lib64};
  2722. export CFLAGS_lp64d=${CFLAGS_lp64d--mabi=lp64d -march=rv64gc};
  2723. export CHOST_lp64d=${CTARGET};
  2724. export CTARGET_lp64d=${CTARGET};
  2725. export LIBDIR_lp64d=${LIBDIR_lp64d-lib64/lp64d};
  2726. export CFLAGS_lp64=${CFLAGS_lp64--mabi=lp64 -march=rv64imac};
  2727. export CHOST_lp64=${CTARGET};
  2728. export CTARGET_lp64=${CTARGET};
  2729. export LIBDIR_lp64=${LIBDIR_lp64-lib64/lp64};
  2730. export CFLAGS_ilp32d=${CFLAGS_ilp32d--mabi=ilp32d -march=rv32imafdc};
  2731. export CHOST_ilp32d=${CTARGET/riscv64/riscv32};
  2732. export CTARGET_ilp32d=${CTARGET/riscv64/riscv32};
  2733. export LIBDIR_ilp32d=${LIBDIR_ilp32d-lib32/ilp32d};
  2734. export CFLAGS_ilp32=${CFLAGS_ilp32--mabi=ilp32 -march=rv32imac};
  2735. export CHOST_ilp32=${CTARGET/riscv64/riscv32};
  2736. export CTARGET_ilp32=${CTARGET/riscv64/riscv32};
  2737. export LIBDIR_ilp32=${LIBDIR_ilp32-lib32/ilp32}
  2738. ;;
  2739. riscv32*)
  2740. : "${MULTILIB_ABIS=ilp32d ilp32}";
  2741. : "${DEFAULT_ABI=ilp32d}";
  2742. local _libdir_riscvdefaultabi_variable="LIBDIR_${DEFAULT_ABI}";
  2743. local _libdir_riscvdefaultabi=${!_libdir_riscvdefaultabi_variable};
  2744. export ${_libdir_riscvdefaultabi_variable}=${_libdir_riscvdefaultabi:-lib};
  2745. export CFLAGS_ilp32d=${CFLAGS_ilp32d--mabi=ilp32d -march=rv32imafdc};
  2746. export CHOST_ilp32d=${CTARGET};
  2747. export CTARGET_ilp32d=${CTARGET};
  2748. export LIBDIR_ilp32d=${LIBDIR_ilp32d-lib32/ilp32d};
  2749. export CFLAGS_ilp32=${CFLAGS_ilp32--mabi=ilp32 -march=rv32imac};
  2750. export CHOST_ilp32=${CTARGET};
  2751. export CTARGET_ilp32=${CTARGET};
  2752. export LIBDIR_ilp32=${LIBDIR_ilp32-lib32/ilp32}
  2753. ;;
  2754. s390x*)
  2755. export CFLAGS_s390=${CFLAGS_s390--m31};
  2756. export CHOST_s390=${CTARGET/s390x/s390};
  2757. export CTARGET_s390=${CHOST_s390};
  2758. export LIBDIR_s390="lib";
  2759. export CFLAGS_s390x=${CFLAGS_s390x--m64};
  2760. export CHOST_s390x=${CTARGET};
  2761. export CTARGET_s390x=${CHOST_s390x};
  2762. export LIBDIR_s390x="lib64";
  2763. : "${MULTILIB_ABIS=s390x s390}";
  2764. : "${DEFAULT_ABI=s390x}"
  2765. ;;
  2766. sparc64*)
  2767. export CFLAGS_sparc32=${CFLAGS_sparc32--m32};
  2768. export CHOST_sparc32=${CTARGET/sparc64/sparc};
  2769. export CTARGET_sparc32=${CHOST_sparc32};
  2770. export LIBDIR_sparc32="lib";
  2771. export CFLAGS_sparc64=${CFLAGS_sparc64--m64};
  2772. export CHOST_sparc64=${CTARGET};
  2773. export CTARGET_sparc64=${CHOST_sparc64};
  2774. export LIBDIR_sparc64="lib64";
  2775. : "${MULTILIB_ABIS=sparc64 sparc32}";
  2776. : "${DEFAULT_ABI=sparc64}"
  2777. ;;
  2778. *)
  2779. : "${MULTILIB_ABIS=default}";
  2780. : "${DEFAULT_ABI=default}"
  2781. ;;
  2782. esac;
  2783. export MULTILIB_ABIS DEFAULT_ABI
  2784. }
  2785. multilib_toolchain_setup ()
  2786. {
  2787. local v vv;
  2788. export ABI=$1;
  2789. local save_restore_variables=(CBUILD CHOST AR CC CXX F77 FC LD NM OBJCOPY OBJDUMP PKG_CONFIG RANLIB READELF STRINGS STRIP PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG_SYSTEM_INCLUDE_PATH PKG_CONFIG_SYSTEM_LIBRARY_PATH);
  2790. if [[ ${_DEFAULT_ABI_SAVED} == "true" ]]; then
  2791. for v in "${save_restore_variables[@]}";
  2792. do
  2793. vv="_abi_saved_${v}";
  2794. [[ ${!vv+set} == "set" ]] && export ${v}="${!vv}" || unset ${v};
  2795. unset ${vv};
  2796. done;
  2797. unset _DEFAULT_ABI_SAVED;
  2798. fi;
  2799. if [[ ${ABI} != ${DEFAULT_ABI} ]]; then
  2800. for v in "${save_restore_variables[@]}";
  2801. do
  2802. vv="_abi_saved_${v}";
  2803. [[ ${!v+set} == "set" ]] && export ${vv}="${!v}" || unset ${vv};
  2804. done;
  2805. export _DEFAULT_ABI_SAVED="true";
  2806. if [[ ${CBUILD} == "${CHOST}" ]]; then
  2807. export CBUILD=$(get_abi_CHOST $1);
  2808. fi;
  2809. export CHOST=$(get_abi_CHOST ${DEFAULT_ABI});
  2810. export AR="$(tc-getAR)";
  2811. export CC="$(tc-getCC) $(get_abi_CFLAGS)";
  2812. export CXX="$(tc-getCXX) $(get_abi_CFLAGS)";
  2813. export F77="$(tc-getF77) $(get_abi_CFLAGS)";
  2814. export FC="$(tc-getFC) $(get_abi_CFLAGS)";
  2815. export LD="$(tc-getLD) $(get_abi_LDFLAGS)";
  2816. export NM="$(tc-getNM)";
  2817. export OBJCOPY="$(tc-getOBJCOPY)";
  2818. export OBJDUMP="$(tc-getOBJDUMP)";
  2819. export PKG_CONFIG="$(tc-getPKG_CONFIG)";
  2820. export RANLIB="$(tc-getRANLIB)";
  2821. export READELF="$(tc-getREADELF)";
  2822. export STRINGS="$(tc-getSTRINGS)";
  2823. export STRIP="$(tc-getSTRIP)";
  2824. export CHOST=$(get_abi_CHOST $1);
  2825. export PKG_CONFIG_LIBDIR=${EPREFIX}/usr/$(get_libdir)/pkgconfig;
  2826. export PKG_CONFIG_PATH=${EPREFIX}/usr/share/pkgconfig;
  2827. export PKG_CONFIG_SYSTEM_INCLUDE_PATH=${EPREFIX}/usr/include;
  2828. export PKG_CONFIG_SYSTEM_LIBRARY_PATH=${EPREFIX}/$(get_libdir):${EPREFIX}/usr/$(get_libdir);
  2829. fi
  2830. }
  2831. no-as-needed ()
  2832. {
  2833. [[ $# -ne 0 ]] && die "no-as-needed takes no arguments";
  2834. case $($(tc-getLD) -v 2>&1 < /dev/null) in
  2835. *GNU*)
  2836. echo "-Wl,--no-as-needed"
  2837. ;;
  2838. esac
  2839. }
  2840. number_abis ()
  2841. {
  2842. set -- `get_install_abis`;
  2843. echo $#
  2844. }
  2845. pipestatus ()
  2846. {
  2847. local status=("${PIPESTATUS[@]}");
  2848. local s ret=0 verbose="";
  2849. [[ ${1} == -v ]] && {
  2850. verbose=1;
  2851. shift
  2852. };
  2853. [[ $# -ne 0 ]] && die "usage: ${FUNCNAME} [-v]";
  2854. for s in "${status[@]}";
  2855. do
  2856. [[ ${s} -ne 0 ]] && ret=${s};
  2857. done;
  2858. [[ -n ${verbose} ]] && echo "${status[@]}";
  2859. return "${ret}"
  2860. }
  2861. pkg_nofetch ()
  2862. {
  2863. default
  2864. }
  2865. pkg_pretend ()
  2866. {
  2867. check_space
  2868. }
  2869. pkg_setup ()
  2870. {
  2871. check_space;
  2872. python-any-r1_pkg_setup
  2873. }
  2874. python-any-r1_pkg_setup ()
  2875. {
  2876. debug-print-function ${FUNCNAME} "$@";
  2877. [[ ${MERGE_TYPE} != binary ]] && python_setup
  2878. }
  2879. python_check_deps ()
  2880. {
  2881. use test || return 0;
  2882. python_has_version ">=dev-python/lit-15[${PYTHON_USEDEP}]"
  2883. }
  2884. python_doexe ()
  2885. {
  2886. debug-print-function ${FUNCNAME} "$@";
  2887. [[ ${EBUILD_PHASE} != install ]] && die "${FUNCNAME} can only be used in src_install";
  2888. local f;
  2889. for f in "$@";
  2890. do
  2891. python_newexe "${f}" "${f##*/}";
  2892. done
  2893. }
  2894. python_doheader ()
  2895. {
  2896. debug-print-function ${FUNCNAME} "$@";
  2897. [[ ${EBUILD_PHASE} != install ]] && die "${FUNCNAME} can only be used in src_install";
  2898. [[ -n ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).';
  2899. local includedir=$(python_get_includedir);
  2900. local d=${includedir#${ESYSROOT}};
  2901. ( insopts -m 0644;
  2902. insinto "${d}";
  2903. doins -r "${@}" || return ${?} )
  2904. }
  2905. python_domodule ()
  2906. {
  2907. debug-print-function ${FUNCNAME} "$@";
  2908. [[ -n ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).';
  2909. local d;
  2910. if [[ ${_PYTHON_MODULEROOT} == /* ]]; then
  2911. d=${_PYTHON_MODULEROOT};
  2912. else
  2913. local sitedir=$(python_get_sitedir);
  2914. d=${sitedir#${EPREFIX}}/${_PYTHON_MODULEROOT//.//};
  2915. fi;
  2916. if [[ ${EBUILD_PHASE} == install ]]; then
  2917. ( insopts -m 0644;
  2918. insinto "${d}";
  2919. doins -r "${@}" || return ${?} );
  2920. python_optimize "${ED}${d}";
  2921. else
  2922. if [[ -n ${BUILD_DIR} ]]; then
  2923. local dest=${BUILD_DIR}/install${EPREFIX}/${d};
  2924. mkdir -p "${dest}" || die;
  2925. cp -pR "${@}" "${dest}/" || die;
  2926. ( cd "${dest}" || die;
  2927. chmod -R a+rX "${@##*/}" || die );
  2928. else
  2929. die "${FUNCNAME} can only be used in src_install or with BUILD_DIR set";
  2930. fi;
  2931. fi
  2932. }
  2933. python_doscript ()
  2934. {
  2935. debug-print-function ${FUNCNAME} "$@";
  2936. [[ ${EBUILD_PHASE} != install ]] && die "${FUNCNAME} can only be used in src_install";
  2937. local _PYTHON_REWRITE_SHEBANG=1;
  2938. python_doexe "${@}"
  2939. }
  2940. python_export_utf8_locale ()
  2941. {
  2942. debug-print-function ${FUNCNAME} "$@";
  2943. type locale &> /dev/null || return 0;
  2944. if [[ $(locale charmap) != UTF-8 ]]; then
  2945. local lang locales="C.UTF-8 en_US.UTF-8 en_GB.UTF-8 $(locale -a)";
  2946. for lang in ${locales};
  2947. do
  2948. if [[ $(LC_ALL=${lang} locale charmap 2> /dev/null) == UTF-8 ]]; then
  2949. if _python_check_locale_sanity "${lang}"; then
  2950. export LC_CTYPE=${lang};
  2951. if [[ -n ${LC_ALL} ]]; then
  2952. export LC_NUMERIC=${LC_ALL};
  2953. export LC_TIME=${LC_ALL};
  2954. export LC_COLLATE=${LC_ALL};
  2955. export LC_MONETARY=${LC_ALL};
  2956. export LC_MESSAGES=${LC_ALL};
  2957. export LC_PAPER=${LC_ALL};
  2958. export LC_NAME=${LC_ALL};
  2959. export LC_ADDRESS=${LC_ALL};
  2960. export LC_TELEPHONE=${LC_ALL};
  2961. export LC_MEASUREMENT=${LC_ALL};
  2962. export LC_IDENTIFICATION=${LC_ALL};
  2963. export LC_ALL=;
  2964. fi;
  2965. return 0;
  2966. fi;
  2967. fi;
  2968. done;
  2969. ewarn "Could not find a UTF-8 locale. This may trigger build failures in";
  2970. ewarn "some python packages. Please ensure that a UTF-8 locale is listed in";
  2971. ewarn "/etc/locale.gen and run locale-gen.";
  2972. return 1;
  2973. fi;
  2974. return 0
  2975. }
  2976. python_fix_shebang ()
  2977. {
  2978. debug-print-function ${FUNCNAME} "$@";
  2979. [[ -n ${EPYTHON} ]] || die "${FUNCNAME}: EPYTHON unset (pkg_setup not called?)";
  2980. local force quiet;
  2981. while [[ -n ${@} ]]; do
  2982. case "${1}" in
  2983. -f | --force)
  2984. force=1;
  2985. shift
  2986. ;;
  2987. -q | --quiet)
  2988. quiet=1;
  2989. shift
  2990. ;;
  2991. --)
  2992. shift;
  2993. break
  2994. ;;
  2995. *)
  2996. break
  2997. ;;
  2998. esac;
  2999. done;
  3000. [[ -n ${1} ]] || die "${FUNCNAME}: no paths given";
  3001. local path f;
  3002. for path in "$@";
  3003. do
  3004. local any_fixed is_recursive;
  3005. [[ -d ${path} ]] && is_recursive=1;
  3006. while IFS= read -r -d '' f; do
  3007. local shebang i;
  3008. local error= match=;
  3009. IFS= read -r shebang < "${f}";
  3010. if [[ ${shebang} == '#!'* ]]; then
  3011. local split_shebang=();
  3012. read -r -a split_shebang <<< ${shebang#"#!"} || die;
  3013. local in_path=${split_shebang[0]};
  3014. local from='^#! *[^ ]*';
  3015. if [[ ${in_path} == */env ]]; then
  3016. in_path=${split_shebang[1]};
  3017. from+=' *[^ ]*';
  3018. fi;
  3019. case ${in_path##*/} in
  3020. "${EPYTHON}")
  3021. match=1
  3022. ;;
  3023. python | python3)
  3024. match=1
  3025. ;;
  3026. python2 | python[23].[0-9] | python3.[1-9][0-9] | pypy | pypy3 | pypy3.[1-9][0-9] | jython[23].[0-9])
  3027. match=1;
  3028. error=1
  3029. ;;
  3030. esac;
  3031. fi;
  3032. [[ -n ${force} ]] && error=;
  3033. if [[ ! -n ${match} ]]; then
  3034. [[ -n ${is_recursive} ]] && continue;
  3035. error=1;
  3036. fi;
  3037. if [[ ! -n ${quiet} ]]; then
  3038. einfo "Fixing shebang in ${f#${D}}.";
  3039. fi;
  3040. if [[ ! -n ${error} ]]; then
  3041. debug-print "${FUNCNAME}: in file ${f#${D}}";
  3042. debug-print "${FUNCNAME}: rewriting shebang: ${shebang}";
  3043. sed -i -e "1s@${from}@#!${EPREFIX}/usr/bin/${EPYTHON}@" "${f}" || die;
  3044. any_fixed=1;
  3045. else
  3046. eerror "The file has incompatible shebang:";
  3047. eerror " file: ${f#${D}}";
  3048. eerror " current shebang: ${shebang}";
  3049. eerror " requested impl: ${EPYTHON}";
  3050. die "${FUNCNAME}: conversion of incompatible shebang requested";
  3051. fi;
  3052. done < <(find -H "${path}" -type f -print0 || die);
  3053. if [[ ! -n ${any_fixed} ]]; then
  3054. eerror "QA error: ${FUNCNAME}, ${path#${D}} did not match any fixable files.";
  3055. eerror "There are no Python files in specified directory.";
  3056. die "${FUNCNAME} did not match any fixable files";
  3057. fi;
  3058. done
  3059. }
  3060. python_gen_any_dep ()
  3061. {
  3062. debug-print-function ${FUNCNAME} "$@";
  3063. local depstr=${1};
  3064. [[ -n ${depstr} ]] || die "No dependency string provided";
  3065. local i PYTHON_PKG_DEP out=;
  3066. for i in "${_PYTHON_SUPPORTED_IMPLS[@]}";
  3067. do
  3068. local PYTHON_USEDEP="python_targets_${i}(-)";
  3069. local PYTHON_SINGLE_USEDEP="python_single_target_${i}(-)";
  3070. _python_export "${i}" PYTHON_PKG_DEP;
  3071. local i_depstr=${depstr//\$\{PYTHON_USEDEP\}/${PYTHON_USEDEP}};
  3072. i_depstr=${i_depstr//\$\{PYTHON_SINGLE_USEDEP\}/${PYTHON_SINGLE_USEDEP}};
  3073. out="( ${PYTHON_PKG_DEP/=} ${i_depstr} ) ${out}";
  3074. done;
  3075. echo "|| ( ${out})"
  3076. }
  3077. python_get_CFLAGS ()
  3078. {
  3079. debug-print-function ${FUNCNAME} "$@";
  3080. _python_export "${@}" PYTHON_CFLAGS;
  3081. echo "${PYTHON_CFLAGS}"
  3082. }
  3083. python_get_LIBS ()
  3084. {
  3085. debug-print-function ${FUNCNAME} "$@";
  3086. _python_export "${@}" PYTHON_LIBS;
  3087. echo "${PYTHON_LIBS}"
  3088. }
  3089. python_get_PYTHON_CONFIG ()
  3090. {
  3091. debug-print-function ${FUNCNAME} "$@";
  3092. _python_export "${@}" PYTHON_CONFIG;
  3093. echo "${PYTHON_CONFIG}"
  3094. }
  3095. python_get_includedir ()
  3096. {
  3097. debug-print-function ${FUNCNAME} "$@";
  3098. _python_export "${@}" PYTHON_INCLUDEDIR;
  3099. echo "${PYTHON_INCLUDEDIR}"
  3100. }
  3101. python_get_library_path ()
  3102. {
  3103. debug-print-function ${FUNCNAME} "$@";
  3104. _python_export "${@}" PYTHON_LIBPATH;
  3105. echo "${PYTHON_LIBPATH}"
  3106. }
  3107. python_get_scriptdir ()
  3108. {
  3109. debug-print-function ${FUNCNAME} "$@";
  3110. _python_export "${@}" PYTHON_SCRIPTDIR;
  3111. echo "${PYTHON_SCRIPTDIR}"
  3112. }
  3113. python_get_sitedir ()
  3114. {
  3115. debug-print-function ${FUNCNAME} "$@";
  3116. _python_export "${@}" PYTHON_SITEDIR;
  3117. echo "${PYTHON_SITEDIR}"
  3118. }
  3119. python_get_stdlib ()
  3120. {
  3121. debug-print-function ${FUNCNAME} "$@";
  3122. _python_export "${@}" PYTHON_STDLIB;
  3123. echo "${PYTHON_STDLIB}"
  3124. }
  3125. python_has_version ()
  3126. {
  3127. debug-print-function ${FUNCNAME} "$@";
  3128. local root_arg=(-b);
  3129. case ${1} in
  3130. -b | -d | -r)
  3131. root_arg=("${1}");
  3132. shift
  3133. ;;
  3134. esac;
  3135. local pkg;
  3136. for pkg in "$@";
  3137. do
  3138. ebegin " ${pkg}";
  3139. has_version "${root_arg[@]}" "${pkg}";
  3140. eend ${?} || return;
  3141. done;
  3142. return 0
  3143. }
  3144. python_moduleinto ()
  3145. {
  3146. debug-print-function ${FUNCNAME} "$@";
  3147. _PYTHON_MODULEROOT=${1}
  3148. }
  3149. python_newexe ()
  3150. {
  3151. debug-print-function ${FUNCNAME} "$@";
  3152. [[ ${EBUILD_PHASE} != install ]] && die "${FUNCNAME} can only be used in src_install";
  3153. [[ -n ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).';
  3154. [[ ${#} -eq 2 ]] || die "Usage: ${FUNCNAME} <path> <new-name>";
  3155. local wrapd=${_PYTHON_SCRIPTROOT:-/usr/bin};
  3156. local f=${1};
  3157. local newfn=${2};
  3158. local scriptdir=$(python_get_scriptdir);
  3159. local d=${scriptdir#${EPREFIX}};
  3160. ( dodir "${wrapd}";
  3161. exeopts -m 0755;
  3162. exeinto "${d}";
  3163. newexe "${f}" "${newfn}" || return ${?} );
  3164. local dosym=dosym;
  3165. [[ ${EAPI} == 7 ]] && dosym=dosym8;
  3166. "${dosym}" -r /usr/lib/python-exec/python-exec2 "${wrapd}/${newfn}";
  3167. if [[ -n ${_PYTHON_REWRITE_SHEBANG} ]]; then
  3168. python_fix_shebang -q "${ED}${d}/${newfn}";
  3169. fi
  3170. }
  3171. python_newscript ()
  3172. {
  3173. debug-print-function ${FUNCNAME} "$@";
  3174. [[ ${EBUILD_PHASE} != install ]] && die "${FUNCNAME} can only be used in src_install";
  3175. local _PYTHON_REWRITE_SHEBANG=1;
  3176. python_newexe "${@}"
  3177. }
  3178. python_optimize ()
  3179. {
  3180. debug-print-function ${FUNCNAME} "$@";
  3181. [[ -n ${EPYTHON} ]] || die 'No Python implementation set (EPYTHON is null).';
  3182. local PYTHON=${PYTHON};
  3183. [[ -n ${PYTHON} ]] || _python_export PYTHON;
  3184. [[ -x ${PYTHON} ]] || die "PYTHON (${PYTHON}) is not executable";
  3185. if [[ ${#} -eq 0 ]]; then
  3186. local f;
  3187. while IFS= read -r -d '' f; do
  3188. if [[ ${f} == /* && -d ${D}${f} ]]; then
  3189. set -- "${D}${f}" "${@}";
  3190. fi;
  3191. done < <("${PYTHON}" - <<-EOF ||
  3192. import sys
  3193. print("".join(x + "\0" for x in sys.path))
  3194. EOF
  3195. die);
  3196. debug-print "${FUNCNAME}: using sys.path: ${*/%/;}";
  3197. fi;
  3198. local jobs=$(makeopts_jobs);
  3199. local d;
  3200. for d in "$@";
  3201. do
  3202. local instpath=${d#${D}};
  3203. instpath=/${instpath##/};
  3204. einfo "Optimize Python modules for ${instpath}";
  3205. case "${EPYTHON}" in
  3206. python3.8)
  3207. "${PYTHON}" -m compileall -j "${jobs}" -q -f -d "${instpath}" "${d}";
  3208. "${PYTHON}" -O -m compileall -j "${jobs}" -q -f -d "${instpath}" "${d}";
  3209. "${PYTHON}" -OO -m compileall -j "${jobs}" -q -f -d "${instpath}" "${d}"
  3210. ;;
  3211. python* | pypy3*)
  3212. "${PYTHON}" -m compileall -j "${jobs}" -o 0 -o 1 -o 2 --hardlink-dupes -q -f -d "${instpath}" "${d}"
  3213. ;;
  3214. pypy | jython2.7)
  3215. "${PYTHON}" -m compileall -q -f -d "${instpath}" "${d}"
  3216. ;;
  3217. *)
  3218. die "${FUNCNAME}: unexpected EPYTHON=${EPYTHON}"
  3219. ;;
  3220. esac;
  3221. done
  3222. }
  3223. python_scriptinto ()
  3224. {
  3225. debug-print-function ${FUNCNAME} "$@";
  3226. _PYTHON_SCRIPTROOT=${1}
  3227. }
  3228. python_setup ()
  3229. {
  3230. debug-print-function ${FUNCNAME} "$@";
  3231. _python_sanity_checks;
  3232. if [[ -n ${PYTHON_COMPAT_OVERRIDE} ]]; then
  3233. local impls=(${PYTHON_COMPAT_OVERRIDE});
  3234. [[ ${#impls[@]} -eq 1 ]] || die "PYTHON_COMPAT_OVERRIDE must name exactly one implementation for python-any-r1";
  3235. ewarn "WARNING: PYTHON_COMPAT_OVERRIDE in effect. The following Python";
  3236. ewarn "implementation will be used:";
  3237. ewarn;
  3238. ewarn " ${PYTHON_COMPAT_OVERRIDE}";
  3239. ewarn;
  3240. ewarn "Dependencies won't be satisfied, and EPYTHON/eselect-python will be ignored.";
  3241. _python_export "${impls[0]}" EPYTHON PYTHON;
  3242. _python_wrapper_setup;
  3243. einfo "Using ${EPYTHON} to build (via PYTHON_COMPAT_OVERRIDE)";
  3244. return;
  3245. fi;
  3246. local epython_impl=${EPYTHON/./_};
  3247. if [[ -n ${epython_impl} ]]; then
  3248. if ! has "${epython_impl}" "${_PYTHON_SUPPORTED_IMPLS[@]}"; then
  3249. if ! has "${epython_impl}" "${_PYTHON_ALL_IMPLS[@]}"; then
  3250. ewarn "Invalid EPYTHON: ${EPYTHON}";
  3251. else
  3252. einfo "EPYTHON (${EPYTHON}) not supported by the package";
  3253. fi;
  3254. else
  3255. if _python_run_check_deps "${epython_impl}"; then
  3256. _python_export EPYTHON PYTHON;
  3257. _python_wrapper_setup;
  3258. einfo "Using ${EPYTHON} to build (via EPYTHON)";
  3259. return;
  3260. fi;
  3261. fi;
  3262. fi;
  3263. local i;
  3264. for ((i = ${#_PYTHON_SUPPORTED_IMPLS[@]} - 1; i >= 0; i-- ))
  3265. do
  3266. local impl=${_PYTHON_SUPPORTED_IMPLS[i]};
  3267. [[ ${impl} == ${epython_impl} ]] && continue;
  3268. _python_export "${impl}" EPYTHON PYTHON;
  3269. if _python_run_check_deps "${impl}"; then
  3270. _python_wrapper_setup;
  3271. einfo "Using ${EPYTHON} to build (via PYTHON_COMPAT iteration)";
  3272. return;
  3273. fi;
  3274. done;
  3275. eerror "No Python implementation found for the build. This is usually";
  3276. eerror "a bug in the ebuild. Please report it to bugs.gentoo.org";
  3277. eerror "along with the build log.";
  3278. echo;
  3279. die "No supported Python implementation installed."
  3280. }
  3281. raw-ldflags ()
  3282. {
  3283. local x input="$@";
  3284. [[ -z ${input} ]] && input=${LDFLAGS};
  3285. set --;
  3286. for x in ${input};
  3287. do
  3288. case ${x} in
  3289. -Wl,*)
  3290. x=${x#-Wl,};
  3291. set -- "$@" ${x//,/ }
  3292. ;;
  3293. *)
  3294.  
  3295. ;;
  3296. esac;
  3297. done;
  3298. echo "$@"
  3299. }
  3300. replace-cpu-flags ()
  3301. {
  3302. local newcpu="$#";
  3303. newcpu="${!newcpu}";
  3304. while [ $# -gt 1 ]; do
  3305. replace-flags "-march=${1}" "-march=${newcpu}";
  3306. replace-flags "-mcpu=${1}" "-mcpu=${newcpu}";
  3307. replace-flags "-mtune=${1}" "-mtune=${newcpu}";
  3308. shift;
  3309. done;
  3310. return 0
  3311. }
  3312. replace-flags ()
  3313. {
  3314. [[ $# != 2 ]] && die "Usage: replace-flags <old flag> <new flag>";
  3315. local f var new;
  3316. for var in $(all-flag-vars);
  3317. do
  3318. new=();
  3319. for f in ${!var};
  3320. do
  3321. [[ ${f} == ${1} ]] && f=${2};
  3322. new+=("${f}");
  3323. done;
  3324. export ${var}="${new[*]}";
  3325. done;
  3326. return 0
  3327. }
  3328. replace-sparc64-flags ()
  3329. {
  3330. [[ $# -ne 0 ]] && die "replace-sparc64-flags takes no arguments";
  3331. local SPARC64_CPUS="ultrasparc3 ultrasparc v9";
  3332. if [ "${CFLAGS/mtune}" != "${CFLAGS}" ]; then
  3333. for x in ${SPARC64_CPUS};
  3334. do
  3335. CFLAGS="${CFLAGS/-mcpu=${x}/-mcpu=v8}";
  3336. done;
  3337. else
  3338. for x in ${SPARC64_CPUS};
  3339. do
  3340. CFLAGS="${CFLAGS/-mcpu=${x}/-mcpu=v8 -mtune=${x}}";
  3341. done;
  3342. fi;
  3343. if [ "${CXXFLAGS/mtune}" != "${CXXFLAGS}" ]; then
  3344. for x in ${SPARC64_CPUS};
  3345. do
  3346. CXXFLAGS="${CXXFLAGS/-mcpu=${x}/-mcpu=v8}";
  3347. done;
  3348. else
  3349. for x in ${SPARC64_CPUS};
  3350. do
  3351. CXXFLAGS="${CXXFLAGS/-mcpu=${x}/-mcpu=v8 -mtune=${x}}";
  3352. done;
  3353. fi;
  3354. export CFLAGS CXXFLAGS
  3355. }
  3356. setup-allowed-flags ()
  3357. {
  3358. [[ ${EAPI} == 7 ]] || die "Internal function ${FUNCNAME} is not available in EAPI ${EAPI}.";
  3359. _setup-allowed-flags "$@"
  3360. }
  3361. src_compile ()
  3362. {
  3363. cmake_src_compile "$@"
  3364. }
  3365. src_configure ()
  3366. {
  3367. llvm_prepend_path "${LLVM_MAJOR}";
  3368. use debug || local -x CPPFLAGS="${CPPFLAGS} -DNDEBUG";
  3369. BUILD_DIR=${WORKDIR}/compiler-rt_build;
  3370. if use clang; then
  3371. local -x CC=${CHOST}-clang;
  3372. local -x CXX=${CHOST}-clang++;
  3373. strip-unsupported-flags;
  3374. fi;
  3375. local flag want_sanitizer=OFF;
  3376. for flag in "${SANITIZER_FLAGS[@]}";
  3377. do
  3378. if use "${flag}"; then
  3379. want_sanitizer=ON;
  3380. break;
  3381. fi;
  3382. done;
  3383. local mycmakeargs=(-DCOMPILER_RT_INSTALL_PATH="${EPREFIX}/usr/lib/clang/${LLVM_MAJOR}" -DCOMPILER_RT_OUTPUT_DIR="${BUILD_DIR}/lib/clang/${LLVM_MAJOR}" -DCOMPILER_RT_INCLUDE_TESTS=$(usex test) -DCOMPILER_RT_BUILD_BUILTINS=OFF -DCOMPILER_RT_BUILD_CRT=OFF -DCOMPILER_RT_BUILD_CTX_PROFILE=$(usex ctx-profile) -DCOMPILER_RT_BUILD_LIBFUZZER=$(usex libfuzzer) -DCOMPILER_RT_BUILD_MEMPROF=$(usex memprof) -DCOMPILER_RT_BUILD_ORC=$(usex orc) -DCOMPILER_RT_BUILD_PROFILE=$(usex profile) -DCOMPILER_RT_BUILD_SANITIZERS="${want_sanitizer}" -DCOMPILER_RT_BUILD_XRAY=$(usex xray) -DPython3_EXECUTABLE="${PYTHON}");
  3384. if use amd64; then
  3385. mycmakeargs+=(-DCAN_TARGET_i386=$(usex abi_x86_32) -DCAN_TARGET_x86_64=$(usex abi_x86_64));
  3386. fi;
  3387. if use test; then
  3388. mycmakeargs+=(-DLLVM_EXTERNAL_LIT="${EPREFIX}/usr/bin/lit" -DLLVM_LIT_ARGS="$(get_lit_flags)" -DCOMPILER_RT_TEST_COMPILER="${BUILD_DIR}/lib/llvm/${LLVM_MAJOR}/bin/clang" -DCOMPILER_RT_TEST_CXX_COMPILER="${BUILD_DIR}/lib/llvm/${LLVM_MAJOR}/bin/clang++");
  3389. CC=${EPREFIX}/usr/lib/llvm/${LLVM_MAJOR}/bin/clang CXX=${EPREFIX}/usr/lib/llvm/${LLVM_MAJOR}/bin/clang++ strip-unsupported-flags;
  3390. fi;
  3391. if use prefix && [[ "${CHOST}" == *-darwin* ]]; then
  3392. mycmakeargs+=(-DDARWIN_macosx_CACHED_SYSROOT="${EPREFIX}/MacOSX.sdk" -DDARWIN_macosx_OVERRIDE_SDK_VERSION="$(realpath ${EPREFIX}/MacOSX.sdk | sed -e 's/.*MacOSX\(.*\)\.sdk/\1/')" -DCMAKE_LIBTOOL="${EPREFIX}/usr/bin/${CHOST}-libtool");
  3393. fi;
  3394. cmake_src_configure;
  3395. if use test; then
  3396. local sys_dir=("${EPREFIX}"/usr/lib/clang/${LLVM_MAJOR}/lib/*);
  3397. [[ -e ${sys_dir} ]] || die "Unable to find ${sys_dir}";
  3398. [[ ${#sys_dir[@]} -eq 1 ]] || die "Non-deterministic compiler-rt install: ${sys_dir[*]}";
  3399. mkdir -p "${BUILD_DIR}"/lib/{llvm/${LLVM_MAJOR}/{bin,$(get_libdir)},clang/${LLVM_MAJOR}/include} || die;
  3400. cp "${EPREFIX}"/usr/lib/llvm/${LLVM_MAJOR}/bin/clang{,++} "${BUILD_DIR}"/lib/llvm/${LLVM_MAJOR}/bin/ || die;
  3401. cp "${EPREFIX}"/usr/lib/clang/${LLVM_MAJOR}/include/*.h "${BUILD_DIR}"/lib/clang/${LLVM_MAJOR}/include/ || die;
  3402. cp "${sys_dir}"/*builtins*.a "${BUILD_DIR}/lib/clang/${LLVM_MAJOR}/lib/${sys_dir##*/}/" || die;
  3403. if [[ -f ${EPREFIX}/usr/lib/llvm/${LLVM_MAJOR}/$(get_libdir)/LLVMgold.so ]]; then
  3404. ln -s "${EPREFIX}"/usr/lib/llvm/${LLVM_MAJOR}/$(get_libdir)/LLVMgold.so "${BUILD_DIR}"/lib/llvm/${LLVM_MAJOR}/$(get_libdir)/ || die;
  3405. fi;
  3406. fi
  3407. }
  3408. src_install ()
  3409. {
  3410. cmake_src_install "$@"
  3411. }
  3412. src_prepare ()
  3413. {
  3414. sed -i -e 's:-Werror::' lib/tsan/go/buildgo.sh || die;
  3415. local flag;
  3416. for flag in "${SANITIZER_FLAGS[@]}";
  3417. do
  3418. if ! use "${flag}"; then
  3419. local cmake_flag=${flag/-/_};
  3420. sed -i -e "/COMPILER_RT_HAS_${cmake_flag^^}/s:TRUE:FALSE:" cmake/config-ix.cmake || die;
  3421. fi;
  3422. done;
  3423. if use asan && ! use profile; then
  3424. rm test/asan/TestCases/asan_and_llvm_coverage_test.cpp || die;
  3425. fi;
  3426. if use ubsan && ! use cfi; then
  3427. > test/cfi/CMakeLists.txt || die;
  3428. fi;
  3429. rm test/tsan/getline_nohang.cpp || die;
  3430. llvm.org_src_prepare
  3431. }
  3432. src_test ()
  3433. {
  3434. local -x LIT_PRESERVES_TMP=1;
  3435. local -x SANDBOX_ON=0;
  3436. local -x LD_PRELOAD=;
  3437. cmake_build check-all
  3438. }
  3439. src_unpack ()
  3440. {
  3441. llvm.org_src_unpack "$@"
  3442. }
  3443. strip-flags ()
  3444. {
  3445. [[ $# -ne 0 ]] && die "strip-flags takes no arguments";
  3446. local x y var;
  3447. local ALLOWED_FLAGS;
  3448. _setup-allowed-flags;
  3449. set -f;
  3450. for var in $(all-flag-vars);
  3451. do
  3452. local new=();
  3453. for x in ${!var};
  3454. do
  3455. for y in "${ALLOWED_FLAGS[@]}";
  3456. do
  3457. if [[ ${x} == ${y} ]]; then
  3458. new+=("${x}");
  3459. break;
  3460. fi;
  3461. done;
  3462. done;
  3463. if _is_flagq ${var} "-O*" && ! _is_flagq new "-O*"; then
  3464. new+=(-O2);
  3465. fi;
  3466. if [[ ${!var} != "${new[*]}" ]]; then
  3467. einfo "strip-flags: ${var}: changed '${!var}' to '${new[*]}'";
  3468. fi;
  3469. export ${var}="${new[*]}";
  3470. done;
  3471. set +f;
  3472. return 0
  3473. }
  3474. strip-unsupported-flags ()
  3475. {
  3476. [[ $# -ne 0 ]] && die "strip-unsupported-flags takes no arguments";
  3477. export CFLAGS=$(test-flags-CC ${CFLAGS});
  3478. export CXXFLAGS=$(test-flags-CXX ${CXXFLAGS});
  3479. export FFLAGS=$(test-flags-F77 ${FFLAGS});
  3480. export FCFLAGS=$(test-flags-FC ${FCFLAGS});
  3481. export LDFLAGS=$(test-flags-CCLD ${LDFLAGS})
  3482. }
  3483. tc-arch ()
  3484. {
  3485. tc-ninja_magic_to_arch portage "$@"
  3486. }
  3487. tc-arch-kernel ()
  3488. {
  3489. tc-ninja_magic_to_arch kern "$@"
  3490. }
  3491. tc-check-min_ver ()
  3492. {
  3493. function do_check ()
  3494. {
  3495. debug-print "Compiler version check for ${1}";
  3496. debug-print "Detected: ${2}";
  3497. debug-print "Required: ${3}";
  3498. if ver_test ${2} -lt ${3}; then
  3499. eerror "Your current compiler is too old for this package!";
  3500. die "Active compiler is too old for this package (found ${1} ${2}).";
  3501. fi
  3502. };
  3503. case ${1} in
  3504. gcc)
  3505. tc-is-gcc || return;
  3506. do_check GCC $(gcc-version) ${2}
  3507. ;;
  3508. clang)
  3509. tc-is-clang || return;
  3510. do_check Clang $(clang-version) ${2}
  3511. ;;
  3512. *)
  3513. eerror "Unknown first parameter for ${FUNCNAME} - must be gcc or clang";
  3514. die "${FUNCNAME}: Parameter ${1} unknown"
  3515. ;;
  3516. esac
  3517. }
  3518. tc-check-openmp ()
  3519. {
  3520. if ! _tc-has-openmp; then
  3521. eerror "Your current compiler does not support OpenMP!";
  3522. if tc-is-gcc; then
  3523. eerror "Enable OpenMP support by building sys-devel/gcc with USE=\"openmp\".";
  3524. else
  3525. if tc-is-clang; then
  3526. eerror "OpenMP support in llvm-core/clang is provided by llvm-runtimes/openmp.";
  3527. fi;
  3528. fi;
  3529. die "Active compiler does not have required support for OpenMP";
  3530. fi
  3531. }
  3532. tc-cpp-is-true ()
  3533. {
  3534. local CONDITION=${1};
  3535. shift;
  3536. $(tc-getTARGET_CPP) "${@}" -P - <<-EOF > /dev/null 2>&1
  3537. #if ${CONDITION}
  3538. true
  3539. #else
  3540. #error false
  3541. #endif
  3542. EOF
  3543.  
  3544. }
  3545. tc-detect-is-softfloat ()
  3546. {
  3547. [[ $(tc-getTARGET_CPP) == "gcc -E" ]] && return 1;
  3548. case ${CTARGET:-${CHOST}} in
  3549. *-newlib | *-elf | *-eabi | arm64-apple-darwin*)
  3550. return 1
  3551. ;;
  3552. arm*)
  3553. if tc-cpp-is-true "defined(__ARM_PCS_VFP)"; then
  3554. echo "no";
  3555. else
  3556. if tc-cpp-is-true "defined(__SOFTFP__)"; then
  3557. echo "yes";
  3558. else
  3559. echo "softfp";
  3560. fi;
  3561. fi;
  3562. return 0
  3563. ;;
  3564. *)
  3565. return 1
  3566. ;;
  3567. esac
  3568. }
  3569. tc-enables-cxx-assertions ()
  3570. {
  3571. tc-cpp-is-true "defined(_GLIBCXX_ASSERTIONS) || defined(_LIBCPP_ENABLE_ASSERTIONS) || defined(_LIBCPP_ENABLE_HARDENED_MODE)" ${CPPFLAGS} ${CXXFLAGS}
  3572. }
  3573. tc-enables-fortify-source ()
  3574. {
  3575. tc-cpp-is-true "defined(_FORTIFY_SOURCE)" ${CPPFLAGS} ${CFLAGS} ${CXXFLAGS}
  3576. }
  3577. tc-enables-pie ()
  3578. {
  3579. tc-cpp-is-true "defined(__PIE__)" ${CPPFLAGS} ${CFLAGS} ${CXXFLAGS}
  3580. }
  3581. tc-enables-ssp ()
  3582. {
  3583. tc-cpp-is-true "defined(__SSP__) || defined(__SSP_STRONG__) || defined(__SSP_ALL__)" ${CPPFLAGS} ${CFLAGS} ${CXXFLAGS}
  3584. }
  3585. tc-enables-ssp-all ()
  3586. {
  3587. tc-cpp-is-true "defined(__SSP_ALL__)" ${CPPFLAGS} ${CFLAGS} ${CXXFLAGS}
  3588. }
  3589. tc-enables-ssp-strong ()
  3590. {
  3591. tc-cpp-is-true "defined(__SSP_STRONG__) || defined(__SSP_ALL__)" ${CPPFLAGS} ${CFLAGS} ${CXXFLAGS}
  3592. }
  3593. tc-endian ()
  3594. {
  3595. local host=$1;
  3596. [[ -z ${host} ]] && host=${CTARGET:-${CHOST}};
  3597. host=${host%%-*};
  3598. case ${host} in
  3599. aarch64*be)
  3600. echo big
  3601. ;;
  3602. aarch64)
  3603. echo little
  3604. ;;
  3605. alpha*)
  3606. echo little
  3607. ;;
  3608. arc*b*)
  3609. echo big
  3610. ;;
  3611. arc*)
  3612. echo little
  3613. ;;
  3614. arm*b*)
  3615. echo big
  3616. ;;
  3617. arm*)
  3618. echo little
  3619. ;;
  3620. cris*)
  3621. echo little
  3622. ;;
  3623. hppa*)
  3624. echo big
  3625. ;;
  3626. i?86*)
  3627. echo little
  3628. ;;
  3629. ia64*)
  3630. echo little
  3631. ;;
  3632. loongarch*)
  3633. echo little
  3634. ;;
  3635. m68*)
  3636. echo big
  3637. ;;
  3638. mips*l*)
  3639. echo little
  3640. ;;
  3641. mips*)
  3642. echo big
  3643. ;;
  3644. powerpc*le)
  3645. echo little
  3646. ;;
  3647. powerpc*)
  3648. echo big
  3649. ;;
  3650. riscv*)
  3651. echo little
  3652. ;;
  3653. s390*)
  3654. echo big
  3655. ;;
  3656. sh*b*)
  3657. echo big
  3658. ;;
  3659. sh*)
  3660. echo little
  3661. ;;
  3662. sparc*)
  3663. echo big
  3664. ;;
  3665. x86_64*)
  3666. echo little
  3667. ;;
  3668. *)
  3669. echo wtf
  3670. ;;
  3671. esac
  3672. }
  3673. tc-env_build ()
  3674. {
  3675. tc-export_build_env;
  3676. 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) "$@"
  3677. }
  3678. tc-export ()
  3679. {
  3680. local var;
  3681. for var in "$@";
  3682. do
  3683. [[ $(type -t "tc-get${var}") != "function" ]] && die "tc-export: invalid export variable '${var}'";
  3684. "tc-get${var}" > /dev/null;
  3685. done
  3686. }
  3687. tc-export_build_env ()
  3688. {
  3689. tc-export "$@";
  3690. if tc-is-cross-compiler; then
  3691. : "${BUILD_CFLAGS:=-O1 -pipe}";
  3692. : "${BUILD_CXXFLAGS:=-O1 -pipe}";
  3693. : "${BUILD_CPPFLAGS:= }";
  3694. : "${BUILD_LDFLAGS:= }";
  3695. else
  3696. : "${BUILD_CFLAGS:=${CFLAGS}}";
  3697. : "${BUILD_CXXFLAGS:=${CXXFLAGS}}";
  3698. : "${BUILD_CPPFLAGS:=${CPPFLAGS}}";
  3699. : "${BUILD_LDFLAGS:=${LDFLAGS}}";
  3700. fi;
  3701. export BUILD_{C,CXX,CPP,LD}FLAGS;
  3702. local v;
  3703. for v in BUILD_{C,CXX,CPP,LD}FLAGS;
  3704. do
  3705. export ${v#BUILD_}_FOR_BUILD="${!v}";
  3706. done
  3707. }
  3708. tc-get-build-ptr-size ()
  3709. {
  3710. $(tc-getBUILD_CC) -E -P - <<< __SIZEOF_POINTER__ || die "Could not determine CBUILD pointer size"
  3711. }
  3712. tc-get-c-rtlib ()
  3713. {
  3714. local res=$($(tc-getCC) ${CPPFLAGS} ${CFLAGS} ${LDFLAGS} -print-libgcc-file-name 2> /dev/null);
  3715. case ${res} in
  3716. *libclang_rt*)
  3717. echo compiler-rt
  3718. ;;
  3719. *libgcc*)
  3720. echo libgcc
  3721. ;;
  3722. *)
  3723. return 1
  3724. ;;
  3725. esac;
  3726. return 0
  3727. }
  3728. tc-get-compiler-type ()
  3729. {
  3730. local code='
  3731. #if defined(__PATHSCALE__)
  3732. HAVE_PATHCC
  3733. #elif defined(__clang__)
  3734. HAVE_CLANG
  3735. #elif defined(__GNUC__)
  3736. HAVE_GCC
  3737. #endif
  3738. ';
  3739. local res=$($(tc-getCC "$@") -E -P - <<< "${code}");
  3740. case ${res} in
  3741. *HAVE_PATHCC*)
  3742. echo pathcc
  3743. ;;
  3744. *HAVE_CLANG*)
  3745. echo clang
  3746. ;;
  3747. *HAVE_GCC*)
  3748. echo gcc
  3749. ;;
  3750. *)
  3751. echo unknown
  3752. ;;
  3753. esac
  3754. }
  3755. tc-get-cxx-stdlib ()
  3756. {
  3757. local code='#include <ciso646>
  3758.  
  3759. #if defined(_LIBCPP_VERSION)
  3760. HAVE_LIBCXX
  3761. #elif defined(__GLIBCXX__)
  3762. HAVE_LIBSTDCPP
  3763. #endif
  3764. ';
  3765. local res=$($(tc-getCXX) ${CPPFLAGS} ${CXXFLAGS} -x c++ -E -P - <<< "${code}" 2> /dev/null);
  3766. case ${res} in
  3767. *HAVE_LIBCXX*)
  3768. echo libc++
  3769. ;;
  3770. *HAVE_LIBSTDCPP*)
  3771. echo libstdc++
  3772. ;;
  3773. *)
  3774. return 1
  3775. ;;
  3776. esac;
  3777. return 0
  3778. }
  3779. tc-get-ptr-size ()
  3780. {
  3781. $(tc-getCC) -E -P - <<< __SIZEOF_POINTER__ || die "Could not determine CHOST pointer size"
  3782. }
  3783. tc-getAR ()
  3784. {
  3785. tc-getPROG AR ar "$@"
  3786. }
  3787. tc-getAS ()
  3788. {
  3789. tc-getPROG AS as "$@"
  3790. }
  3791. tc-getBUILD_AR ()
  3792. {
  3793. tc-getBUILD_PROG AR ar "$@"
  3794. }
  3795. tc-getBUILD_AS ()
  3796. {
  3797. tc-getBUILD_PROG AS as "$@"
  3798. }
  3799. tc-getBUILD_CC ()
  3800. {
  3801. tc-getBUILD_PROG CC gcc "$@"
  3802. }
  3803. tc-getBUILD_CPP ()
  3804. {
  3805. tc-getBUILD_PROG CPP "$(tc-getBUILD_CC) -E" "$@"
  3806. }
  3807. tc-getBUILD_CXX ()
  3808. {
  3809. tc-getBUILD_PROG CXX g++ "$@"
  3810. }
  3811. tc-getBUILD_LD ()
  3812. {
  3813. tc-getBUILD_PROG LD ld "$@"
  3814. }
  3815. tc-getBUILD_NM ()
  3816. {
  3817. tc-getBUILD_PROG NM nm "$@"
  3818. }
  3819. tc-getBUILD_OBJCOPY ()
  3820. {
  3821. tc-getBUILD_PROG OBJCOPY objcopy "$@"
  3822. }
  3823. tc-getBUILD_PKG_CONFIG ()
  3824. {
  3825. tc-getBUILD_PROG PKG_CONFIG pkg-config "$@"
  3826. }
  3827. tc-getBUILD_PROG ()
  3828. {
  3829. local vars="BUILD_$1 $1_FOR_BUILD HOST$1";
  3830. tc-is-cross-compiler || vars+=" $1";
  3831. _tc-getPROG CBUILD "${vars}" "${@:2}"
  3832. }
  3833. tc-getBUILD_RANLIB ()
  3834. {
  3835. tc-getBUILD_PROG RANLIB ranlib "$@"
  3836. }
  3837. tc-getBUILD_READELF ()
  3838. {
  3839. tc-getBUILD_PROG READELF readelf "$@"
  3840. }
  3841. tc-getBUILD_STRINGS ()
  3842. {
  3843. tc-getBUILD_PROG STRINGS strings "$@"
  3844. }
  3845. tc-getBUILD_STRIP ()
  3846. {
  3847. tc-getBUILD_PROG STRIP strip "$@"
  3848. }
  3849. tc-getCC ()
  3850. {
  3851. tc-getPROG CC gcc "$@"
  3852. }
  3853. tc-getCPP ()
  3854. {
  3855. tc-getPROG CPP "${CC:-gcc} -E" "$@"
  3856. }
  3857. tc-getCXX ()
  3858. {
  3859. tc-getPROG CXX g++ "$@"
  3860. }
  3861. tc-getDLLWRAP ()
  3862. {
  3863. tc-getPROG DLLWRAP dllwrap "$@"
  3864. }
  3865. tc-getF77 ()
  3866. {
  3867. tc-getPROG F77 gfortran "$@"
  3868. }
  3869. tc-getFC ()
  3870. {
  3871. tc-getPROG FC gfortran "$@"
  3872. }
  3873. tc-getGCJ ()
  3874. {
  3875. tc-getPROG GCJ gcj "$@"
  3876. }
  3877. tc-getGO ()
  3878. {
  3879. tc-getPROG GO gccgo "$@"
  3880. }
  3881. tc-getLD ()
  3882. {
  3883. tc-getPROG LD ld "$@"
  3884. }
  3885. tc-getNM ()
  3886. {
  3887. tc-getPROG NM nm "$@"
  3888. }
  3889. tc-getOBJCOPY ()
  3890. {
  3891. tc-getPROG OBJCOPY objcopy "$@"
  3892. }
  3893. tc-getOBJDUMP ()
  3894. {
  3895. tc-getPROG OBJDUMP objdump "$@"
  3896. }
  3897. tc-getPKG_CONFIG ()
  3898. {
  3899. tc-getPROG PKG_CONFIG pkg-config "$@"
  3900. }
  3901. tc-getPROG ()
  3902. {
  3903. _tc-getPROG CHOST "$@"
  3904. }
  3905. tc-getRANLIB ()
  3906. {
  3907. tc-getPROG RANLIB ranlib "$@"
  3908. }
  3909. tc-getRC ()
  3910. {
  3911. tc-getPROG RC windres "$@"
  3912. }
  3913. tc-getREADELF ()
  3914. {
  3915. tc-getPROG READELF readelf "$@"
  3916. }
  3917. tc-getSTRINGS ()
  3918. {
  3919. tc-getPROG STRINGS strings "$@"
  3920. }
  3921. tc-getSTRIP ()
  3922. {
  3923. tc-getPROG STRIP strip "$@"
  3924. }
  3925. tc-getTARGET_CPP ()
  3926. {
  3927. if [[ -n ${CTARGET} ]]; then
  3928. _tc-getPROG CTARGET TARGET_CPP "gcc -E" "$@";
  3929. else
  3930. tc-getCPP "$@";
  3931. fi
  3932. }
  3933. tc-has-64bit-time_t ()
  3934. {
  3935. $(tc-getCC) ${CFLAGS} ${CPPFLAGS} -c -x c - -o /dev/null <<-EOF &> /dev/null
  3936. #include <sys/types.h>
  3937. int test[sizeof(time_t) >= 8 ? 1 : -1];
  3938. EOF
  3939.  
  3940. return $?
  3941. }
  3942. tc-has-tls ()
  3943. {
  3944. local base="${T}/test-tc-tls";
  3945. cat <<-EOF > "${base}.c"
  3946. int foo(int *i) {
  3947. static __thread int j = 0;
  3948. return *i ? j : *i;
  3949. }
  3950. EOF
  3951.  
  3952. local flags;
  3953. case $1 in
  3954. -s)
  3955. flags="-S"
  3956. ;;
  3957. -c)
  3958. flags="-c"
  3959. ;;
  3960. -l)
  3961.  
  3962. ;;
  3963. -*)
  3964. die "Usage: tc-has-tls [-c|-l] [toolchain prefix]"
  3965. ;;
  3966. esac;
  3967. case "${CHOST}" in
  3968. *-darwin*)
  3969. : ${flags:=-dynamiclib}
  3970. ;;
  3971. *)
  3972. : ${flags:=-fPIC -shared -Wl,-z,defs}
  3973. ;;
  3974. esac;
  3975. [[ $1 == -* ]] && shift;
  3976. $(tc-getCC "$@") ${flags} "${base}.c" -o "${base}" >&/dev/null;
  3977. local ret=$?;
  3978. rm -f "${base}"*;
  3979. return ${ret}
  3980. }
  3981. tc-is-clang ()
  3982. {
  3983. [[ $(tc-get-compiler-type) == clang ]]
  3984. }
  3985. tc-is-cross-compiler ()
  3986. {
  3987. [[ ${CBUILD:-${CHOST}} != ${CHOST} ]]
  3988. }
  3989. tc-is-gcc ()
  3990. {
  3991. [[ $(tc-get-compiler-type) == gcc ]]
  3992. }
  3993. tc-is-lto ()
  3994. {
  3995. local f="${T}/test-lto.o";
  3996. local ret=1;
  3997. case $(tc-get-compiler-type) in
  3998. clang)
  3999. $(tc-getCC) ${CFLAGS} -c -o "${f}" -x c - <<< "" || die;
  4000. llvm-bcanalyzer "${f}" &> /dev/null && ret=0
  4001. ;;
  4002. gcc)
  4003. $(tc-getCC) ${CFLAGS} -c -o "${f}" -x c - <<< "" || die;
  4004. [[ $($(tc-getREADELF) -S "${f}") == *.gnu.lto* ]] && ret=0
  4005. ;;
  4006. esac;
  4007. rm -f "${f}" || die;
  4008. return "${ret}"
  4009. }
  4010. tc-is-softfloat ()
  4011. {
  4012. tc-detect-is-softfloat || tc-tuple-is-softfloat
  4013. }
  4014. tc-is-static-only ()
  4015. {
  4016. local host=${CTARGET:-${CHOST}};
  4017. [[ ${host} == *-mint* ]]
  4018. }
  4019. tc-ld-disable-gold ()
  4020. {
  4021. tc-ld-is-gold "$@" && tc-ld-force-bfd "$@"
  4022. }
  4023. tc-ld-force-bfd ()
  4024. {
  4025. if tc-ld-is-bfd "$@"; then
  4026. return;
  4027. fi;
  4028. ewarn "Forcing usage of the BFD linker";
  4029. local ld=$(unset LD; tc-getLD "$@");
  4030. local bfd_ld="${ld}.bfd";
  4031. local path_ld=$(type -P "${bfd_ld}" 2> /dev/null);
  4032. [[ -e ${path_ld} ]] && export LD=${bfd_ld};
  4033. if tc-is-gcc || tc-is-clang; then
  4034. export CFLAGS="${CFLAGS} -fuse-ld=bfd";
  4035. export CXXFLAGS="${CXXFLAGS} -fuse-ld=bfd";
  4036. export LDFLAGS="${LDFLAGS} -fuse-ld=bfd";
  4037. fi
  4038. }
  4039. tc-ld-is-bfd ()
  4040. {
  4041. local out;
  4042. local -x LC_ALL=C;
  4043. out=$($(tc-getLD "$@") --version 2>&1);
  4044. if [[ ${out} != "GNU ld"* ]]; then
  4045. return 1;
  4046. fi;
  4047. local base="${T}/test-tc-linker";
  4048. cat <<-EOF > "${base}.c"
  4049. int main(void) { return 0; }
  4050. EOF
  4051.  
  4052. out=$($(tc-getCC "$@") ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} -Wl,--version "${base}.c" -o "${base}" 2>&1);
  4053. rm -f "${base}"*;
  4054. if [[ ! ${out} =~ .*^"GNU ld".* ]]; then
  4055. return 1;
  4056. fi;
  4057. return 0
  4058. }
  4059. tc-ld-is-gold ()
  4060. {
  4061. local out;
  4062. local -x LC_ALL=C;
  4063. out=$($(tc-getLD "$@") --version 2>&1);
  4064. if [[ ${out} == *"GNU gold"* ]]; then
  4065. return 0;
  4066. fi;
  4067. local base="${T}/test-tc-linker";
  4068. cat <<-EOF > "${base}.c"
  4069. int main(void) { return 0; }
  4070. EOF
  4071.  
  4072. out=$($(tc-getCC "$@") ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} -Wl,--version "${base}.c" -o "${base}" 2>&1);
  4073. rm -f "${base}"*;
  4074. if [[ ${out} == *"GNU gold"* ]]; then
  4075. return 0;
  4076. fi;
  4077. return 1
  4078. }
  4079. tc-ld-is-lld ()
  4080. {
  4081. local out;
  4082. local -x LC_ALL=C;
  4083. out=$($(tc-getLD "$@") --version 2>&1);
  4084. if [[ ${out} == *"LLD"* ]]; then
  4085. return 0;
  4086. fi;
  4087. local base="${T}/test-tc-linker";
  4088. cat <<-EOF > "${base}.c"
  4089. int main(void) { return 0; }
  4090. EOF
  4091.  
  4092. out=$($(tc-getCC "$@") ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} -Wl,--version "${base}.c" -o "${base}" 2>&1);
  4093. rm -f "${base}"*;
  4094. if [[ ${out} == *"LLD"* ]]; then
  4095. return 0;
  4096. fi;
  4097. return 1
  4098. }
  4099. tc-ld-is-mold ()
  4100. {
  4101. local out;
  4102. local -x LC_ALL=C;
  4103. out=$($(tc-getLD "$@") --version 2>&1);
  4104. if [[ ${out} == *"mold"* ]]; then
  4105. return 0;
  4106. fi;
  4107. local base="${T}/test-tc-linker";
  4108. cat <<-EOF > "${base}.c"
  4109. int main(void) { return 0; }
  4110. EOF
  4111.  
  4112. out=$($(tc-getCC "$@") ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} -Wl,--version "${base}.c" -o "${base}" 2>&1);
  4113. rm -f "${base}"*;
  4114. if [[ ${out} == *"mold"* ]]; then
  4115. return 0;
  4116. fi;
  4117. return 1
  4118. }
  4119. tc-ninja_magic_to_arch ()
  4120. {
  4121. function _tc_echo_kernel_alias ()
  4122. {
  4123. [[ ${type} == "kern" ]] && echo $1 || echo $2
  4124. };
  4125. local type=$1;
  4126. local host=$2;
  4127. [[ -z ${host} ]] && host=${CTARGET:-${CHOST}};
  4128. case ${host} in
  4129. arm64*)
  4130. echo arm64
  4131. ;;
  4132. aarch64*)
  4133. echo arm64
  4134. ;;
  4135. alpha*)
  4136. echo alpha
  4137. ;;
  4138. arc*)
  4139. echo arc
  4140. ;;
  4141. arm*)
  4142. echo arm
  4143. ;;
  4144. avr*)
  4145. _tc_echo_kernel_alias avr32 avr
  4146. ;;
  4147. bfin*)
  4148. _tc_echo_kernel_alias blackfin bfin
  4149. ;;
  4150. c6x*)
  4151. echo c6x
  4152. ;;
  4153. cris*)
  4154. echo cris
  4155. ;;
  4156. frv*)
  4157. echo frv
  4158. ;;
  4159. hexagon*)
  4160. echo hexagon
  4161. ;;
  4162. hppa*)
  4163. _tc_echo_kernel_alias parisc hppa
  4164. ;;
  4165. i?86*)
  4166. echo x86
  4167. ;;
  4168. ia64*)
  4169. echo ia64
  4170. ;;
  4171. loongarch*)
  4172. _tc_echo_kernel_alias loongarch loong
  4173. ;;
  4174. m68*)
  4175. echo m68k
  4176. ;;
  4177. metag*)
  4178. echo metag
  4179. ;;
  4180. microblaze*)
  4181. echo microblaze
  4182. ;;
  4183. mips*)
  4184. echo mips
  4185. ;;
  4186. nios2*)
  4187. echo nios2
  4188. ;;
  4189. nios*)
  4190. echo nios
  4191. ;;
  4192. or1k* | or32*)
  4193. echo openrisc
  4194. ;;
  4195. powerpc*)
  4196. if [[ ${type} == "kern" ]]; then
  4197. echo powerpc;
  4198. else
  4199. if [[ ${host} == powerpc64* ]]; then
  4200. echo ppc64;
  4201. else
  4202. echo ppc;
  4203. fi;
  4204. fi
  4205. ;;
  4206. riscv*)
  4207. echo riscv
  4208. ;;
  4209. s390*)
  4210. echo s390
  4211. ;;
  4212. score*)
  4213. echo score
  4214. ;;
  4215. sh64*)
  4216. _tc_echo_kernel_alias sh64 sh
  4217. ;;
  4218. sh*)
  4219. echo sh
  4220. ;;
  4221. sparc64*)
  4222. _tc_echo_kernel_alias sparc64 sparc
  4223. ;;
  4224. sparc*)
  4225. [[ ${PROFILE_ARCH} == "sparc64" ]] && _tc_echo_kernel_alias sparc64 sparc || echo sparc
  4226. ;;
  4227. tile*)
  4228. echo tile
  4229. ;;
  4230. vax*)
  4231. echo vax
  4232. ;;
  4233. x86_64*)
  4234. if [[ ${type} == "kern" ]]; then
  4235. echo x86;
  4236. else
  4237. echo amd64;
  4238. fi
  4239. ;;
  4240. xtensa*)
  4241. echo xtensa
  4242. ;;
  4243. *)
  4244. echo unknown
  4245. ;;
  4246. esac
  4247. }
  4248. tc-stack-grows-down ()
  4249. {
  4250. case ${ARCH} in
  4251. hppa | metag)
  4252. return 1
  4253. ;;
  4254. esac;
  4255. return 0
  4256. }
  4257. tc-tuple-is-softfloat ()
  4258. {
  4259. local CTARGET=${CTARGET:-${CHOST}};
  4260. case ${CTARGET//_/-} in
  4261. bfin* | h8300*)
  4262. echo "only"
  4263. ;;
  4264. *-softfloat-*)
  4265. echo "yes"
  4266. ;;
  4267. *-softfp-*)
  4268. echo "softfp"
  4269. ;;
  4270. arm*-hardfloat-* | arm*eabihf)
  4271. echo "no"
  4272. ;;
  4273. *-newlib | *-elf | *-eabi)
  4274. echo "no"
  4275. ;;
  4276. arm64-apple-darwin*)
  4277. echo "no"
  4278. ;;
  4279. arm*)
  4280. echo "yes"
  4281. ;;
  4282. *)
  4283. echo "no"
  4284. ;;
  4285. esac
  4286. }
  4287. test-compile ()
  4288. {
  4289. local lang=$1;
  4290. local code=$2;
  4291. shift 2;
  4292. [[ -z "${lang}" ]] && return 1;
  4293. [[ -z "${code}" ]] && return 1;
  4294. local compiler filename_in filename_out args=() libs=();
  4295. case "${lang}" in
  4296. c)
  4297. compiler="$(tc-getCC)";
  4298. filename_in="${T}/test.c";
  4299. filename_out="${T}/test.o";
  4300. args+=(${CFLAGS[@]} -xc -c)
  4301. ;;
  4302. c++)
  4303. compiler="$(tc-getCXX)";
  4304. filename_in="${T}/test.cc";
  4305. filename_out="${T}/test.o";
  4306. args+=(${CXXFLAGS[@]} -xc++ -c)
  4307. ;;
  4308. f77)
  4309. compiler="$(tc-getF77)";
  4310. filename_in="${T}/test.f";
  4311. filename_out="${T}/test.o";
  4312. args+=(${FFFLAGS[@]} -xf77 -c)
  4313. ;;
  4314. f95)
  4315. compiler="$(tc-getFC)";
  4316. filename_in="${T}/test.f90";
  4317. filename_out="${T}/test.o";
  4318. args+=(${FCFLAGS[@]} -xf95 -c)
  4319. ;;
  4320. c+ld)
  4321. compiler="$(tc-getCC)";
  4322. filename_in="${T}/test.c";
  4323. filename_out="${T}/test.exe";
  4324. args+=(${CFLAGS[@]} ${LDFLAGS[@]} -xc);
  4325. libs+=(${LIBS[@]})
  4326. ;;
  4327. c+++ld)
  4328. compiler="$(tc-getCXX)";
  4329. filename_in="${T}/test.cc";
  4330. filename_out="${T}/test.exe";
  4331. args+=(${CXXFLAGS[@]} ${LDFLAGS[@]} -xc++);
  4332. libs+=(${LIBS[@]})
  4333. ;;
  4334. f77+ld)
  4335. compiler="$(tc-getF77)";
  4336. filename_in="${T}/test.f";
  4337. filename_out="${T}/test.exe";
  4338. args+=(${FFLAGS[@]} ${LDFLAGS[@]} -xf77);
  4339. libs+=(${LIBS[@]})
  4340. ;;
  4341. f95+ld)
  4342. compiler="$(tc-getFC)";
  4343. filename_in="${T}/test.f90";
  4344. filename_out="${T}/test.exe";
  4345. args+=(${FCFLAGS[@]} ${LDFLAGS[@]} -xf95);
  4346. libs+=(${LIBS[@]})
  4347. ;;
  4348. *)
  4349. die "Unknown compiled language ${lang}"
  4350. ;;
  4351. esac;
  4352. printf "%s\n" "${code}" > "${filename_in}" || die "Failed to create '${test_in}'";
  4353. "${compiler}" ${args[@]} "${filename_in}" -o "${filename_out}" ${libs[@]} &> /dev/null
  4354. }
  4355. test-flag-CC ()
  4356. {
  4357. _test-flag-PROG CC c "$@"
  4358. }
  4359. test-flag-CCLD ()
  4360. {
  4361. _test-flag-PROG CC c+ld "$@"
  4362. }
  4363. test-flag-CXX ()
  4364. {
  4365. _test-flag-PROG CXX c++ "$@"
  4366. }
  4367. test-flag-F77 ()
  4368. {
  4369. _test-flag-PROG F77 f77 "$@"
  4370. }
  4371. test-flag-FC ()
  4372. {
  4373. _test-flag-PROG FC f95 "$@"
  4374. }
  4375. test-flag-PROG ()
  4376. {
  4377. [[ ${EAPI} == 7 ]] || die "Internal function ${FUNCNAME} is not available in EAPI ${EAPI}.";
  4378. _test-flag-PROG "$@"
  4379. }
  4380. test-flags ()
  4381. {
  4382. test-flags-CC "$@"
  4383. }
  4384. test-flags-CC ()
  4385. {
  4386. _test-flags-PROG CC "$@"
  4387. }
  4388. test-flags-CCLD ()
  4389. {
  4390. _test-flags-PROG CCLD "$@"
  4391. }
  4392. test-flags-CXX ()
  4393. {
  4394. _test-flags-PROG CXX "$@"
  4395. }
  4396. test-flags-F77 ()
  4397. {
  4398. _test-flags-PROG F77 "$@"
  4399. }
  4400. test-flags-FC ()
  4401. {
  4402. _test-flags-PROG FC "$@"
  4403. }
  4404. test-flags-PROG ()
  4405. {
  4406. [[ ${EAPI} == 7 ]] || die "Internal function ${FUNCNAME} is not available in EAPI ${EAPI}.";
  4407. _test-flags-PROG "$@"
  4408. }
  4409. test_version_info ()
  4410. {
  4411. if [[ $($(tc-getCC) --version 2>&1) == *$1* ]]; then
  4412. return 0;
  4413. else
  4414. return 1;
  4415. fi
  4416. }
  4417. verify-sig_src_unpack ()
  4418. {
  4419. if use verify-sig; then
  4420. local f suffix found;
  4421. local distfiles=() signatures=() nosigfound=() straysigs=();
  4422. for f in ${A};
  4423. do
  4424. found=;
  4425. for suffix in .asc .sig .minisig .sigstore;
  4426. do
  4427. if [[ ${f} == *${suffix} ]]; then
  4428. signatures+=("${f}");
  4429. found=sig;
  4430. break;
  4431. else
  4432. if has "${f}${suffix}" ${A}; then
  4433. distfiles+=("${f}");
  4434. found=dist+sig;
  4435. break;
  4436. fi;
  4437. fi;
  4438. done;
  4439. if [[ ! -n ${found} ]]; then
  4440. nosigfound+=("${f}");
  4441. fi;
  4442. done;
  4443. if [[ ${#nosigfound[@]} -gt 0 ]]; then
  4444. eerror "The following distfiles lack detached signatures:";
  4445. for f in "${nosigfound[@]}";
  4446. do
  4447. eerror " ${f}";
  4448. done;
  4449. die "Unsigned distfiles found";
  4450. fi;
  4451. for f in "${signatures[@]}";
  4452. do
  4453. if ! has "${f%.*}" "${distfiles[@]}"; then
  4454. straysigs+=("${f}");
  4455. fi;
  4456. done;
  4457. if [[ ${#straysigs[@]} -gt 0 ]]; then
  4458. eerror "The following signatures do not match any distfiles:";
  4459. for f in "${straysigs[@]}";
  4460. do
  4461. eerror " ${f}";
  4462. done;
  4463. die "Unused signatures found";
  4464. fi;
  4465. for f in "${signatures[@]}";
  4466. do
  4467. verify-sig_verify_detached "${DISTDIR}/${f%.*}" "${DISTDIR}/${f}";
  4468. done;
  4469. fi;
  4470. default_src_unpack
  4471. }
  4472. verify-sig_uncompress_verify_unpack ()
  4473. {
  4474. local file=${1};
  4475. local unpacker;
  4476. case ${file} in
  4477. *.tar.xz)
  4478. unpacker=(xz -cd)
  4479. ;;
  4480. *)
  4481. die "${FUNCNAME}: only .tar.xz archives are supported at the moment"
  4482. ;;
  4483. esac;
  4484. einfo "Unpacking ${file} ...";
  4485. verify-sig_verify_detached - "${@:2}" < <("${unpacker[@]}" "${file}" | tee >(tar -xf - || die)
  4486. pipestatus || die)
  4487. }
  4488. verify-sig_verify_detached ()
  4489. {
  4490. local file=${1};
  4491. local sig=${2};
  4492. local key=${3};
  4493. if [[ ${VERIFY_SIG_METHOD} == sigstore ]]; then
  4494. if [[ -n ${key:-${VERIFY_SIG_OPENPGP_KEY_PATH}} ]]; then
  4495. die "${FUNCNAME}: key unexpectedly specified for sigstore";
  4496. fi;
  4497. if [[ -z ${VERIFY_SIG_CERT_IDENTITY} ]]; then
  4498. die "${FUNCNAME}: VERIFY_SIG_CERT_IDENTITY must be specified for sigstore";
  4499. fi;
  4500. if [[ -z ${VERIFY_SIG_CERT_OIDC_ISSUER} ]]; then
  4501. die "${FUNCNAME}: VERIFY_SIG_CERT_OIDC_ISSUER must be specified for sigstore";
  4502. fi;
  4503. else
  4504. if [[ -z ${key} ]]; then
  4505. if [[ -z ${VERIFY_SIG_OPENPGP_KEY_PATH} ]]; then
  4506. die "${FUNCNAME}: no key passed and VERIFY_SIG_OPENPGP_KEY_PATH unset";
  4507. else
  4508. key="${BROOT}${VERIFY_SIG_OPENPGP_KEY_PATH}";
  4509. fi;
  4510. fi;
  4511. fi;
  4512. local extra_args=();
  4513. if [[ -n ${VERIFY_SIG_OPENPGP_KEYSERVER+1} ]]; then
  4514. [[ ${VERIFY_SIG_METHOD} == openpgp ]] || die "${FUNCNAME}: VERIFY_SIG_OPENPGP_KEYSERVER is not supported";
  4515. extra_args+=(--keyserver "${VERIFY_SIG_OPENPGP_KEYSERVER}");
  4516. fi;
  4517. addpredict /run/user;
  4518. local filename=${file##*/};
  4519. [[ ${file} == - ]] && filename='(stdin)';
  4520. einfo "Verifying ${filename} ...";
  4521. case ${VERIFY_SIG_METHOD} in
  4522. minisig)
  4523. minisign "${extra_args[@]}" -V -P "$(< "${key}")" -x "${sig}" -m "${file}" || die "minisig signature verification failed"
  4524. ;;
  4525. openpgp)
  4526. if [[ ${VERIFY_SIG_OPENPGP_KEY_REFRESH} != yes ]]; then
  4527. extra_args+=(-R);
  4528. fi;
  4529. local -x TMPDIR=/tmp;
  4530. gemato openpgp-verify-detached -K "${key}" "${extra_args[@]}" --no-require-all-good "${sig}" "${file}" || die "PGP signature verification failed"
  4531. ;;
  4532. signify)
  4533. signify "${extra_args[@]}" -V -p "${key}" -m "${file}" -x "${sig}" || die "Signify signature verification failed"
  4534. ;;
  4535. sigstore)
  4536. if [[ ${VERIFY_SIG_OPENPGP_KEY_REFRESH} != yes ]]; then
  4537. extra_args+=(--offline);
  4538. fi;
  4539. cp -r "${BROOT}"/usr/share/sigstore-gentoo/{.cache,.local} "${HOME}"/ || die;
  4540. sigstore verify identity "${extra_args[@]}" --bundle "${sig}" --cert-identity "${VERIFY_SIG_CERT_IDENTITY}" --cert-oidc-issuer "${VERIFY_SIG_CERT_OIDC_ISSUER}" "${file}" || die "Sigstore signature verification failed"
  4541. ;;
  4542. *)
  4543. die "${FUNCNAME} not supported with ${VERIFY_SIG_METHOD}"
  4544. ;;
  4545. esac
  4546. }
  4547. verify-sig_verify_message ()
  4548. {
  4549. local file=${1};
  4550. local output_file=${2};
  4551. local key=${3};
  4552. if [[ -z ${key} ]]; then
  4553. if [[ -z ${VERIFY_SIG_OPENPGP_KEY_PATH} ]]; then
  4554. die "${FUNCNAME}: no key passed and VERIFY_SIG_OPENPGP_KEY_PATH unset";
  4555. else
  4556. key="${BROOT}${VERIFY_SIG_OPENPGP_KEY_PATH}";
  4557. fi;
  4558. fi;
  4559. local extra_args=();
  4560. [[ ${VERIFY_SIG_OPENPGP_KEY_REFRESH} == yes ]] || extra_args+=(-R);
  4561. if [[ -n ${VERIFY_SIG_OPENPGP_KEYSERVER+1} ]]; then
  4562. [[ ${VERIFY_SIG_METHOD} == openpgp ]] || die "${FUNCNAME}: VERIFY_SIG_OPENPGP_KEYSERVER is not supported";
  4563. extra_args+=(--keyserver "${VERIFY_SIG_OPENPGP_KEYSERVER}");
  4564. fi;
  4565. addpredict /run/user;
  4566. local filename=${file##*/};
  4567. [[ ${file} == - ]] && filename='(stdin)';
  4568. einfo "Verifying ${filename} ...";
  4569. case ${VERIFY_SIG_METHOD} in
  4570. minisig)
  4571. minisign -V -P "$(< "${key}")" -x "${sig}" -o "${output_file}" -m "${file}" || die "minisig signature verification failed"
  4572. ;;
  4573. openpgp)
  4574. local -x TMPDIR=/tmp;
  4575. gemato gpg-wrap -K "${key}" "${extra_args[@]}" -- gpg --verify --output="${output_file}" "${file}" || die "PGP signature verification failed"
  4576. ;;
  4577. signify)
  4578. signify -V -e -p "${key}" -m "${output_file}" -x "${file}" || die "Signify signature verification failed"
  4579. ;;
  4580. *)
  4581. die "${FUNCNAME} not supported with ${VERIFY_SIG_METHOD}"
  4582. ;;
  4583. esac
  4584. }
  4585. verify-sig_verify_signed_checksums ()
  4586. {
  4587. local checksum_file=${1};
  4588. local algo=${2};
  4589. local files=();
  4590. read -r -d '' -a files <<< "${3}";
  4591. local key=${4};
  4592. if [[ -z ${key} ]]; then
  4593. if [[ -z ${VERIFY_SIG_OPENPGP_KEY_PATH} ]]; then
  4594. die "${FUNCNAME}: no key passed and VERIFY_SIG_OPENPGP_KEY_PATH unset";
  4595. else
  4596. key="${BROOT}${VERIFY_SIG_OPENPGP_KEY_PATH}";
  4597. fi;
  4598. fi;
  4599. case ${VERIFY_SIG_METHOD} in
  4600. openpgp)
  4601. _gpg_verify_signed_checksums "${checksum_file}" "${algo}" "${files[@]}" "${key}"
  4602. ;;
  4603. signify)
  4604. signify -C -p "${key}" -x "${checksum_file}" "${files[@]}" || die "Signify signature verification failed"
  4605. ;;
  4606. *)
  4607. die "${FUNCNAME} not supported with ${VERIFY_SIG_METHOD}"
  4608. ;;
  4609. esac
  4610. }
  4611. verify-sig_verify_unsigned_checksums ()
  4612. {
  4613. local checksum_file=${1};
  4614. local format=${2};
  4615. local files=();
  4616. read -r -d '' -a files <<< "${3}";
  4617. local chksum_prog chksum_len algo=${format};
  4618. case ${format} in
  4619. sha256)
  4620. chksum_len=64
  4621. ;;
  4622. openssl-dgst)
  4623.  
  4624. ;;
  4625. *)
  4626. die "${FUNCNAME}: unknown checksum format ${format}"
  4627. ;;
  4628. esac;
  4629. [[ ${checksum_file} == - ]] && checksum_file=/dev/stdin;
  4630. local line checksum filename junk ret=0 count=0;
  4631. local -A verified;
  4632. while read -r line; do
  4633. if [[ ${line} == "-----BEGIN"* ]]; then
  4634. die "${FUNCNAME}: PGP armor found, use verify-sig_verify_signed_checksums instead";
  4635. fi;
  4636. case ${format} in
  4637. sha256)
  4638. read -r checksum filename junk <<< "${line}";
  4639. [[ ${#checksum} -ne ${chksum_len} ]] && continue;
  4640. [[ -n ${checksum//[0-9a-f]} ]] && continue;
  4641. [[ -n ${junk} ]] && continue
  4642. ;;
  4643. openssl-dgst)
  4644. [[ ${line} != *"("*")="* ]] && continue;
  4645. checksum=${line##*)=};
  4646. algo=${line%%(*};
  4647. filename=${line#*(};
  4648. filename=${filename%)=*}
  4649. ;;
  4650. esac;
  4651. if ! has "${filename}" "${files[@]}"; then
  4652. continue;
  4653. fi;
  4654. if "${algo,,}sum" -c --strict - <<< "${checksum} ${filename}"; then
  4655. verified["${filename}"]=1;
  4656. else
  4657. ret=1;
  4658. fi;
  4659. done < "${checksum_file}";
  4660. [[ ${ret} -eq 0 ]] || die "${FUNCNAME}: at least one file did not verify successfully";
  4661. [[ ${#verified[@]} -eq ${#files[@]} ]] || die "${FUNCNAME}: checksums for some of the specified files were missing"
  4662. }
  4663. xdg_desktop_database_update ()
  4664. {
  4665. if [[ ${EBUILD_PHASE} != post* ]]; then
  4666. die "xdg_desktop_database_update must be used in pkg_post* phases.";
  4667. fi;
  4668. if ! type update-desktop-database &> /dev/null; then
  4669. debug-print "update-desktop-database is not found";
  4670. return;
  4671. fi;
  4672. ebegin "Updating .desktop files database";
  4673. update-desktop-database -q "${EROOT}${DESKTOP_DATABASE_DIR}";
  4674. eend $?
  4675. }
  4676. xdg_environment_reset ()
  4677. {
  4678. export XDG_DATA_HOME="${HOME}/.local/share";
  4679. export XDG_CONFIG_HOME="${HOME}/.config";
  4680. export XDG_CACHE_HOME="${HOME}/.cache";
  4681. export XDG_STATE_HOME="${HOME}/.local/state";
  4682. export XDG_RUNTIME_DIR="${T}/run";
  4683. mkdir -p "${XDG_DATA_HOME}" "${XDG_CONFIG_HOME}" "${XDG_CACHE_HOME}" "${XDG_STATE_HOME}" "${XDG_RUNTIME_DIR}" || die;
  4684. chmod 0700 "${XDG_RUNTIME_DIR}" || die;
  4685. unset DBUS_SESSION_BUS_ADDRESS
  4686. }
  4687. xdg_icon_cache_update ()
  4688. {
  4689. if [[ ${EBUILD_PHASE} != post* ]]; then
  4690. die "xdg_icon_cache_update must be used in pkg_post* phases.";
  4691. fi;
  4692. if ! type gtk-update-icon-cache &> /dev/null; then
  4693. debug-print "gtk-update-icon-cache is not found";
  4694. return;
  4695. fi;
  4696. ebegin "Updating icons cache";
  4697. local dir retval=0;
  4698. local fails=();
  4699. for dir in "${EROOT}"/usr/share/icons/*;
  4700. do
  4701. if [[ -f ${dir}/index.theme ]]; then
  4702. if ! gtk-update-icon-cache -qf "${dir}"; then
  4703. debug-print "Updating cache failed on ${dir}";
  4704. fails+=("${dir}");
  4705. retval=2;
  4706. fi;
  4707. else
  4708. if [[ $(ls "${dir}") = icon-theme.cache ]]; then
  4709. rm "${dir}/icon-theme.cache";
  4710. fi;
  4711. fi;
  4712. if [[ -z $(ls "${dir}") ]]; then
  4713. rmdir "${dir}";
  4714. fi;
  4715. done;
  4716. eend ${retval};
  4717. for dir in "${fails[@]}";
  4718. do
  4719. eerror "Failed to update cache with icon ${dir}";
  4720. done
  4721. }
  4722. xdg_mimeinfo_database_update ()
  4723. {
  4724. if [[ ${EBUILD_PHASE} != post* ]]; then
  4725. die "xdg_mimeinfo_database_update must be used in pkg_post* phases.";
  4726. fi;
  4727. if ! type update-mime-database &> /dev/null; then
  4728. debug-print "update-mime-database is not found";
  4729. return;
  4730. fi;
  4731. local -x PKGSYSTEM_ENABLE_FSYNC=0;
  4732. ebegin "Updating shared mime info database";
  4733. update-mime-database "${EROOT}${MIMEINFO_DATABASE_DIR}";
  4734. eend $?
  4735. }
Tags: build log
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement