gui-apps/crystal-dock: new package, add 2.7
[gentoo-zh.git] / app-emulation / liblol-glibc / liblol-glibc-0.1.5_pre6.ebuild
blobacdaa146dab9ec03cbc85989e7838e0ea0484219
1 # Copyright 1999-2024 Gentoo Authors
2 # Distributed under the terms of the GNU General Public License v2
4 EAPI=8
6 # Bumping notes: https://wiki.gentoo.org/wiki/Project:Toolchain/sys-libs/glibc
7 # Please read & adapt the page as necessary if obsolete.
9 PYTHON_COMPAT=( python3_{10..12} )
10 TMPFILES_OPTIONAL=1
12 inherit python-any-r1 toolchain-funcs flag-o-matic gnuconfig multilib tmpfiles
14 DESCRIPTION="GNU libc C library, for liblol"
15 HOMEPAGE="https://www.gnu.org/software/libc/ https://liblol.aosc.io"
16 LICENSE="LGPL-2.1+ BSD HPND ISC inner-net rc PCRE"
17 SLOT="2.2"
19 EMULTILIB_PKG="true"
21 # Gentoo patchset (ignored for live ebuilds)
22 PATCH_VER=2
23 PATCH_DEV=dilfridge
25 # liblol additions
26 GLIBC_PV=2.39
27 GLIBC_PVR=2.39-r2
28 LOLPREFIX=/opt/lol
30 LOL_LIBS=(
31         math/libm.so.6
32         resolv/libresolv.so.2
33         malloc/libc_malloc_debug.so.0
34         nptl_db/libthread_db.so.1
35         locale/libBrokenLocale.so.1
37 LOL_MERGED_LIBS=(
38         resolv/libanl.so.1
39         dlfcn/libdl.so.2
40         rt/librt.so.1
41         login/libutil.so.1
42         nis/libnsl.so.1
45 # gcc mulitilib bootstrap files version
46 GCC_BOOTSTRAP_VER=20201208
48 # systemd integration version
49 GLIBC_SYSTEMD_VER=20210729
51 # Minimum kernel version that glibc requires
52 MIN_KERN_VER="3.2.0"
54 # Minimum pax-utils version needed (which contains any new syscall changes for
55 # its seccomp filter!). Please double check this!
56 MIN_PAX_UTILS_VER="1.3.3"
58 # Minimum systemd version needed (which contains any new syscall changes for
59 # its seccomp filter!). Please double check this!
60 MIN_SYSTEMD_VER="254.9-r1"
62 if [[ ${PV} == 9999* ]]; then
63         inherit git-r3
64 else
65         #KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa -ia64 ~loong ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86"
66         KEYWORDS="-* ~loong"
67         SRC_URI="mirror://gnu/glibc/glibc-${GLIBC_PV}.tar.xz"
68         SRC_URI+=" https://dev.gentoo.org/~${PATCH_DEV}/distfiles/glibc-${GLIBC_PV}-patches-${PATCH_VER}.tar.xz"
69         SRC_URI+=" https://github.com/AOSC-Dev/liblol/archive/refs/tags/v${PV}.tar.gz -> liblol-${PV}.tar.gz"
72 SRC_URI+=" multilib-bootstrap? ( https://dev.gentoo.org/~dilfridge/distfiles/gcc-multilib-bootstrap-${GCC_BOOTSTRAP_VER}.tar.xz )"
73 SRC_URI+=" systemd? ( https://gitweb.gentoo.org/proj/toolchain/glibc-systemd.git/snapshot/glibc-systemd-${GLIBC_SYSTEMD_VER}.tar.gz )"
75 S="${WORKDIR}/glibc-${GLIBC_PV}"
77 IUSE="audit caps cet compile-locales custom-cflags doc gd hash-sysv-compat headers-only +multiarch multilib multilib-bootstrap nscd perl profile selinux split-usr +ssp stack-realign +static-libs suid systemd systemtap test vanilla"
79 # Here's how the cross-compile logic breaks down ...
80 #  CTARGET - machine that will target the binaries
81 #  CHOST   - machine that will host the binaries
82 #  CBUILD  - machine that will build the binaries
83 # If CTARGET != CHOST, it means you want a libc for cross-compiling.
84 # If CHOST != CBUILD, it means you want to cross-compile the libc.
85 #  CBUILD = CHOST = CTARGET    - native build/install
86 #  CBUILD != (CHOST = CTARGET) - cross-compile a native build
87 #  (CBUILD = CHOST) != CTARGET - libc for cross-compiler
88 #  CBUILD != CHOST != CTARGET  - cross-compile a libc for a cross-compiler
89 # For install paths:
90 #  CHOST = CTARGET  - install into /
91 #  CHOST != CTARGET - install into /usr/CTARGET/
93 export CBUILD=${CBUILD:-${CHOST}}
94 export CTARGET=${CTARGET:-${CHOST}}
95 if [[ ${CTARGET} == ${CHOST} ]] ; then
96         if [[ ${CATEGORY} == cross-* ]] ; then
97                 export CTARGET=${CATEGORY#cross-}
98         fi
101 # Note [Disable automatic stripping]
102 # Disabling automatic stripping for a few reasons:
103 # - portage's attempt to strip breaks non-native binaries at least on
104 #   arm: bug #697428
105 # - portage's attempt to strip libpthread.so.0 breaks gdb thread
106 #   enumeration: bug #697910. This is quite subtle:
107 #   * gdb uses glibc's libthread_db-1.0.so to enumerate threads.
108 #   * libthread_db-1.0.so needs access to libpthread.so.0 local symbols
109 #     via 'ps_pglobal_lookup' symbol defined in gdb.
110 #   * 'ps_pglobal_lookup' uses '.symtab' section table to resolve all
111 #     known symbols in 'libpthread.so.0'. Specifically 'nptl_version'
112 #     (unexported) is used to sanity check compatibility before enabling
113 #     debugging.
114 #     Also see https://sourceware.org/gdb/wiki/FAQ#GDB_does_not_see_any_threads_besides_the_one_in_which_crash_occurred.3B_or_SIGTRAP_kills_my_program_when_I_set_a_breakpoint
115 #   * normal 'strip' command trims '.symtab'
116 #   Thus our main goal here is to prevent 'libpthread.so.0' from
117 #   losing it's '.symtab' entries.
118 # - similarly, valgrind requires knowledge about symbols in ld.so:
119 #       bug #920753
120 # As Gentoo's strip does not allow us to pass less aggressive stripping
121 # options and does not check the machine target we strip selectively.
123 # We need a new-enough binutils/gcc to match upstream baseline.
124 # Also we need to make sure our binutils/gcc supports TLS,
125 # and that gcc already contains the hardened patches.
126 # Lastly, let's avoid some openssh nastiness, bug 708224, as
127 # convenience to our users.
129 IDEPEND="
130         !compile-locales? ( sys-apps/locale-gen )
132 BDEPEND="
133         ${PYTHON_DEPS}
134         >=app-misc/pax-utils-${MIN_PAX_UTILS_VER}
135         >=dev-util/patchelf-liblol-0.1.4
136         sys-devel/bison
137         compile-locales? ( sys-apps/locale-gen )
138         doc? (
139                 dev-lang/perl
140                 sys-apps/texinfo
141         )
142         test? (
143                 dev-lang/perl
144                 >=net-dns/libidn2-2.3.0
145         )
147 COMMON_DEPEND="
148         gd? ( media-libs/gd:2= )
149         nscd? ( selinux? (
150                 audit? ( sys-process/audit )
151                 caps? ( sys-libs/libcap )
152         ) )
153         suid? ( caps? ( sys-libs/libcap ) )
154         selinux? ( sys-libs/libselinux )
155         systemtap? ( dev-debug/systemtap )
157 DEPEND="${COMMON_DEPEND}
159 RDEPEND="${COMMON_DEPEND}
160         !<app-emulation/liblol-0.1.0
161         !<app-misc/pax-utils-${MIN_PAX_UTILS_VER}
162         !<sys-apps/systemd-${MIN_SYSTEMD_VER}
163         perl? ( dev-lang/perl )
166 RESTRICT="!test? ( test )"
168 if [[ ${CATEGORY} == cross-* ]] ; then
169         BDEPEND+=" !headers-only? (
170                 >=${CATEGORY}/binutils-2.27
171                 >=${CATEGORY}/gcc-6.2
172         )"
173         [[ ${CATEGORY} == *-linux* ]] && DEPEND+=" ${CATEGORY}/linux-headers"
174 else
175         BDEPEND+="
176                 >=sys-devel/binutils-2.27
177                 >=sys-devel/gcc-6.2
178         "
179         DEPEND+=" virtual/os-headers "
180         RDEPEND+="
181                 >=net-dns/libidn2-2.3.0
182                 vanilla? ( !sys-libs/timezone-data )
183         "
184         PDEPEND+=" !vanilla? ( sys-libs/timezone-data )"
187 # Ignore tests whitelisted below
188 GENTOO_GLIBC_XFAIL_TESTS="${GENTOO_GLIBC_XFAIL_TESTS:-yes}"
190 # The following tests fail due to the Gentoo build system and are thus
191 # executed but ignored:
192 XFAIL_TEST_LIST=(
193         # buggy test, assumes /dev/ and /dev/null on a single filesystem
194         # 'mount --bind /dev/null /chroot/dev/null' breaks it.
195         # https://sourceware.org/PR25909
196         tst-support_descriptors
198         # The following tests fail only inside portage
199         # https://bugs.gentoo.org/831267
200         tst-system
201         tst-strerror
202         tst-strsignal
204         # Fails with certain PORTAGE_NICENESS/PORTAGE_SCHEDULING_POLICY
205         tst-sched1
207         # Fails regularly, unreliable
208         tst-valgrind-smoke
211 XFAIL_NSPAWN_TEST_LIST=(
212         # These tests need to be adapted to handle EPERM/ENOSYS(?) properly
213         # upstream, as systemd-nspawn's default seccomp whitelist is too strict.
214         # https://sourceware.org/PR30603
215         test-errno-linux
216         tst-bz21269
217         tst-mlock2
218         tst-ntp_gettime
219         tst-ntp_gettime-time64
220         tst-ntp_gettimex
221         tst-ntp_gettimex-time64
222         tst-pkey
223         tst-process_mrelease
224         tst-adjtime
225         tst-adjtime-time64
226         tst-clock2
227         tst-clock2-time64
229         # These fail if --suppress-sync and/or low priority is set
230         tst-sync_file_range
231         test-errno
235 # Small helper functions
238 dump_build_environment() {
239         einfo ==== glibc build environment ========================================================
240         local v
241         for v in ABI CBUILD CHOST CTARGET CBUILD_OPT CTARGET_OPT CC CXX CPP LD {AS,C,CPP,CXX,LD}FLAGS MAKEINFO NM AR AS STRIP RANLIB OBJCOPY STRINGS OBJDUMP READELF; do
242                 einfo " $(printf '%15s' ${v}:)   ${!v}"
243         done
244         einfo =====================================================================================
247 is_crosscompile() {
248         [[ ${CHOST} != ${CTARGET} ]]
251 just_headers() {
252         is_crosscompile && use headers-only
255 alt_prefix() {
256         is_crosscompile && echo /usr/${CTARGET}
259 # This prefix is applicable to CHOST when building against this
260 # glibc. It is baked into the library at configure time.
261 host_eprefix() {
262         is_crosscompile || echo "${EPREFIX}"
265 eprefix_lol() {
266         echo "${EPREFIX}${LOLPREFIX}"
269 # This prefix is applicable to CBUILD when building against this
270 # glibc. It determines the destination path at install time.
271 build_eprefix() {
272         is_crosscompile && echo "${EPREFIX}"
275 # We need to be able to set alternative headers for compiling for non-native
276 # platform. Will also become useful for testing kernel-headers without screwing
277 # up the whole system.
278 alt_headers() {
279         echo ${ALT_HEADERS:=$(alt_prefix)/usr/include}
282 alt_build_headers() {
283         if [[ -z ${ALT_BUILD_HEADERS} ]] ; then
284                 ALT_BUILD_HEADERS="$(host_eprefix)$(alt_headers)"
285                 if tc-is-cross-compiler ; then
286                         ALT_BUILD_HEADERS=${SYSROOT}$(alt_headers)
287                         if [[ ! -e ${ALT_BUILD_HEADERS}/linux/version.h ]] ; then
288                                 local header_path=$(echo '#include <linux/version.h>' | $(tc-getCPP ${CTARGET}) ${CFLAGS} 2>&1 | grep -o '[^"]*linux/version.h')
289                                 ALT_BUILD_HEADERS=${header_path%/linux/version.h}
290                         fi
291                 fi
292         fi
293         echo "${ALT_BUILD_HEADERS}"
296 alt_libdir() {
297         echo $(alt_prefix)${LOLPREFIX}/$(get_libdir)
299 alt_usrlibdir() {
300         echo $(alt_prefix)${LOLPREFIX}/usr/$(get_libdir)
303 builddir() {
304         echo "${WORKDIR}/build-${ABI}-${CTARGET}-$1"
307 do_compile_test() {
308         local ret save_cflags=${CFLAGS}
309         CFLAGS+=" $1"
310         shift
312         pushd "${T}" >/dev/null
314         rm -f glibc-test*
315         printf '%b' "$*" > glibc-test.c
317         # We assume CC is already set up.
318         nonfatal emake glibc-test
319         ret=$?
321         popd >/dev/null
323         CFLAGS=${save_cflags}
324         return ${ret}
327 do_run_test() {
328         local ret
330         if [[ ${MERGE_TYPE} == "binary" ]] ; then
331                 # ignore build failures when installing a binary package #324685
332                 do_compile_test "" "$@" 2>/dev/null || return 0
333         else
334                 if ! do_compile_test "" "$@" ; then
335                         ewarn "Simple build failed ... assuming this is desired #324685"
336                         return 0
337                 fi
338         fi
340         pushd "${T}" >/dev/null
342         ./glibc-test
343         ret=$?
344         rm -f glibc-test*
346         popd >/dev/null
348         return ${ret}
351 setup_target_flags() {
352         # This largely mucks with compiler flags.  None of which should matter
353         # when building up just the headers.
354         just_headers && return 0
356         case $(tc-arch) in
357                 x86)
358                         # -march needed for #185404 #199334
359                         # TODO: When creating the first glibc cross-compile, this test will
360                         # always fail as it does a full link which in turn requires glibc.
361                         # Probably also applies when changing multilib profile settings (e.g.
362                         # enabling x86 when the profile was amd64-only previously).
363                         # We could change main to _start and pass -nostdlib here so that we
364                         # only test the gcc code compilation.  Or we could do a compile and
365                         # then look for the symbol via scanelf.
366                         if ! do_compile_test "" 'void f(int i, void *p) {if (__sync_fetch_and_add(&i, 1)) f(i, p);}\nint main(){return 0;}\n'; then
367                                 local t=${CTARGET_OPT:-${CTARGET}}
368                                 t=${t%%-*}
369                                 filter-flags '-march=*'
370                                 export CFLAGS="-march=${t} ${CFLAGS}"
371                                 einfo "Auto adding -march=${t} to CFLAGS #185404"
372                         fi
373                         # For compatibility with older binaries at slight performance cost.
374                         use stack-realign && export CFLAGS+=" -mstackrealign"
375                 ;;
376                 amd64)
377                         # -march needed for #185404 #199334
378                         # TODO: See cross-compile issues listed above for x86.
379                         if [[ ${ABI} == x86 ]]; then
380                                 if ! do_compile_test "${CFLAGS_x86}" 'void f(int i, void *p) {if (__sync_fetch_and_add(&i, 1)) f(i, p);}\nint main(){return 0;}\n'; then
381                                         local t=${CTARGET_OPT:-${CTARGET}}
382                                         t=${t%%-*}
383                                         # Normally the target is x86_64-xxx, so turn that into the -march that
384                                         # gcc actually accepts. #528708
385                                         [[ ${t} == "x86_64" ]] && t="x86-64"
386                                         filter-flags '-march=*'
387                                         # ugly, ugly, ugly.  ugly.
388                                         CFLAGS_x86=$(CFLAGS=${CFLAGS_x86} filter-flags '-march=*'; echo "${CFLAGS}")
389                                         export CFLAGS_x86="${CFLAGS_x86} -march=${t}"
390                                         einfo "Auto adding -march=${t} to CFLAGS_x86 #185404 (ABI=${ABI})"
391                                 fi
392                                 # For compatibility with older binaries at slight performance cost.
393                                 use stack-realign && export CFLAGS_x86+=" -mstackrealign"
395                                 # Workaround for bug #823780.
396                                 # Need to save/restore CC because earlier on, we stuff it full of CFLAGS, and tc-getCPP doesn't like that.
397                                 CC_mangled=${CC}
398                                 CC=${glibc__GLIBC_CC}
399                                 if tc-is-gcc && (($(gcc-major-version) == 11)) && (($(gcc-minor-version) <= 2)) && (($(gcc-micro-version) == 0)) ; then
400                                         export CFLAGS_x86="${CFLAGS_x86} -mno-avx512f"
401                                         einfo "Auto adding -mno-avx512f to CFLAGS_x86 for buggy GCC version (bug #823780) (ABI=${ABI})"
402                                 fi
403                                 CC=${CC_mangled}
404                         fi
405                 ;;
406                 mips)
407                         # The mips abi cannot support the GNU style hashes. #233233
408                         filter-ldflags -Wl,--hash-style=gnu -Wl,--hash-style=both
409                 ;;
410                 ppc|ppc64)
411                         # Many arch-specific implementations do not work on ppc with
412                         # cache-block not equal to 128 bytes. This breaks memset:
413                         #   https://sourceware.org/PR26522
414                         #   https://bugs.gentoo.org/737996
415                         # Use default -mcpu=. For ppc it means non-multiarch setup.
416                         filter-flags '-mcpu=*'
417                 ;;
418                 sparc)
419                         # Both sparc and sparc64 can use -fcall-used-g6.  -g7 is bad, though.
420                         filter-flags "-fcall-used-g7"
421                         append-flags "-fcall-used-g6"
423                         local cpu
424                         case ${CTARGET} in
425                         sparc64-*)
426                                 cpu="sparc64"
427                                 case $(get-flag mcpu) in
428                                 v9)
429                                         # We need to force at least v9a because the base build doesn't
430                                         # work with just v9.
431                                         # https://sourceware.org/bugzilla/show_bug.cgi?id=19477
432                                         append-flags "-Wa,-xarch=v9a"
433                                         ;;
434                                 esac
435                                 ;;
436                         sparc-*)
437                                 case $(get-flag mcpu) in
438                                 v8|supersparc|hypersparc|leon|leon3)
439                                         cpu="sparcv8"
440                                         ;;
441                                 *)
442                                         cpu="sparcv9"
443                                         ;;
444                                 esac
445                         ;;
446                         esac
447                         [[ -n ${cpu} ]] && CTARGET_OPT="${cpu}-${CTARGET#*-}"
448                 ;;
449         esac
452 setup_flags() {
453         # Make sure host make.conf doesn't pollute us
454         if is_crosscompile || tc-is-cross-compiler ; then
455                 CHOST=${CTARGET} strip-unsupported-flags
456         fi
458         # Store our CFLAGS because it's changed depending on which CTARGET
459         # we are building when pulling glibc on a multilib profile
460         CFLAGS_BASE=${CFLAGS_BASE-${CFLAGS}}
461         CFLAGS=${CFLAGS_BASE}
462         CXXFLAGS_BASE=${CXXFLAGS_BASE-${CXXFLAGS}}
463         CXXFLAGS=${CXXFLAGS_BASE}
464         ASFLAGS_BASE=${ASFLAGS_BASE-${ASFLAGS}}
465         ASFLAGS=${ASFLAGS_BASE}
467         # Allow users to explicitly avoid flag sanitization via
468         # USE=custom-cflags.
469         if ! use custom-cflags; then
470                 # Over-zealous CFLAGS can often cause problems.  What may work for one
471                 # person may not work for another.  To avoid a large influx of bugs
472                 # relating to failed builds, we strip most CFLAGS out to ensure as few
473                 # problems as possible.
474                 strip-flags
475                 # Lock glibc at -O2; we want to be conservative here.
476                 filter-flags '-O?'
477                 append-flags -O2
478         fi
480         strip-unsupported-flags
481         filter-lto
482         filter-flags -m32 -m64 '-mabi=*'
484         # glibc aborts if rpath is set by LDFLAGS
485         filter-ldflags '-Wl,-rpath=*'
487         # ld can't use -r & --relax at the same time, bug #788901
488         # https://sourceware.org/PR27837
489         filter-ldflags '-Wl,--relax'
491         # Flag added for cross-prefix, but causes ldconfig to segfault. Not needed
492         # anyway because glibc already handles this by itself.
493         filter-ldflags '-Wl,--dynamic-linker=*'
495         # some weird software relies on sysv hashes in glibc, bug 863863, bug 864100
496         # we have to do that here already so mips can filter it out again :P
497         if use hash-sysv-compat ; then
498                 append-ldflags '-Wl,--hash-style=both'
499         fi
501         # #492892
502         filter-flags -frecord-gcc-switches
504         # #898098
505         filter-flags -fno-builtin
507         # #829583
508         filter-lfs-flags
510         unset CBUILD_OPT CTARGET_OPT
511         if use multilib ; then
512                 CTARGET_OPT=$(get_abi_CTARGET)
513                 [[ -z ${CTARGET_OPT} ]] && CTARGET_OPT=$(get_abi_CHOST)
514         fi
516         setup_target_flags
518         if [[ -n ${CTARGET_OPT} && ${CBUILD} == ${CHOST} ]] && ! is_crosscompile; then
519                 CBUILD_OPT=${CTARGET_OPT}
520         fi
522         # glibc's headers disallow -O0 and fail at build time:
523         #  include/libc-symbols.h:75:3: #error "glibc cannot be compiled without optimization"
524         # https://sourceware.org/glibc/wiki/FAQ#Why_do_I_get:.60.23error_.22glibc_cannot_be_compiled_without_optimization.22.27.2C_when_trying_to_compile_GNU_libc_with_GNU_CC.3F
525         replace-flags -O0 -O1
527         # glibc handles this internally already where it's appropriate;
528         # can't always have SSP when we're the ones setting it up, etc
529         filter-flags '-fstack-protector*'
531         # Similar issues as with SSP. Can't inject yourself that early.
532         filter-flags '-fsanitize=*'
534         # See end of bug #830454; we handle this via USE=cet
535         filter-flags '-fcf-protection=*'
537         # When bootstrapping, we may have a situation where
538         # CET-enabled gcc from seed is used to build CET-disabled
539         # glibc. As such, gcc implicitly enables CET if no
540         # -fcf-protection flag is passed. For a typical package it
541         # should not be a problem, but for glibc it matters as it is
542         # dealing with CET in ld.so. So if CET is supposed to be
543         # disabled for glibc, be explicit about it.
544         if ! use cet; then
545                 if use amd64 || use x86; then
546                         append-flags '-fcf-protection=none'
547                 elif use arm64; then
548                         append-flags '-mbranch-protection=none'
549                 fi
550         fi
553 use_multiarch() {
554         # Allow user to disable runtime arch detection in multilib.
555         use multiarch || return 1
556         # Make sure binutils is new enough to support indirect functions,
557         # #336792. This funky sed supports gold and bfd linkers.
558         local bver nver
559         bver=$($(tc-getLD ${CTARGET}) -v | sed -n -r '1{s:[^0-9]*::;s:^([0-9.]*).*:\1:;p}')
560         case $(tc-arch ${CTARGET}) in
561         amd64|x86) nver="2.20" ;;
562         arm)       nver="2.22" ;;
563         hppa)      nver="2.23" ;;
564         ppc|ppc64) nver="2.20" ;;
565         # ifunc support was added in 2.23, but glibc also needs
566         # machinemode which is in 2.24.
567         s390)      nver="2.24" ;;
568         sparc)     nver="2.21" ;;
569         *)         return 1 ;;
570         esac
571         ver_test ${bver} -ge ${nver}
574 # Setup toolchain variables that had historically been defined in the
575 # profiles for these archs.
576 setup_env() {
577         # silly users
578         unset LD_RUN_PATH
579         unset LD_ASSUME_KERNEL
581         if is_crosscompile || tc-is-cross-compiler ; then
582                 multilib_env ${CTARGET_OPT:-${CTARGET}}
584                 if ! use multilib ; then
585                         MULTILIB_ABIS=${DEFAULT_ABI}
586                 else
587                         MULTILIB_ABIS=${MULTILIB_ABIS:-${DEFAULT_ABI}}
588                 fi
590                 # If the user has CFLAGS_<CTARGET> in their make.conf, use that,
591                 # and fall back on CFLAGS.
592                 local VAR=CFLAGS_${CTARGET//[-.]/_}
593                 CFLAGS=${!VAR-${CFLAGS}}
594                 einfo " $(printf '%15s' 'Manual CFLAGS:')   ${CFLAGS}"
595         fi
597         setup_flags
599         export ABI=${ABI:-${DEFAULT_ABI:-default}}
601         if just_headers ; then
602                 # Avoid mixing host's CC and target's CFLAGS_${ABI}:
603                 # At this bootstrap stage we have only binutils for
604                 # target but not compiler yet.
605                 einfo "Skip CC ABI injection. We can't use (cross-)compiler yet."
606                 return 0
607         fi
609         # Glibc does not work with gold (for various reasons) #269274.
610         tc-ld-disable-gold
612         if use doc ; then
613                 export MAKEINFO=makeinfo
614         else
615                 export MAKEINFO=/dev/null
616         fi
618         # Reset CC and CXX to the value at start of emerge
619         export CC=${glibc__ORIG_CC:-${CC:-$(tc-getCC ${CTARGET})}}
620         export CXX=${glibc__ORIG_CXX:-${CXX:-$(tc-getCXX ${CTARGET})}}
622         # and make sure glibc__ORIG_CC and glibc__ORIG_CXX is defined now.
623         export glibc__ORIG_CC=${CC}
624         export glibc__ORIG_CXX=${CXX}
626         if tc-is-clang && ! use custom-cflags && ! is_crosscompile ; then
627                 export glibc__force_gcc=yes
628                 # once this is toggled on, it needs to stay on, since with CPP manipulated
629                 # tc-is-clang does not work correctly anymore...
630         fi
632         if [[ ${glibc__force_gcc} == "yes" ]] ; then
633                 # If we are running in an otherwise clang/llvm environment, we need to
634                 # recover the proper gcc and binutils settings here, at least until glibc
635                 # is finally building with clang. So let's override everything that is
636                 # set in the clang profiles.
637                 # Want to shoot yourself into the foot? Set USE=custom-cflags, that's always
638                 # a good start into that direction.
639                 # Also, if you're crosscompiling, let's assume you know what you are doing.
640                 # Hopefully.
641                 # Last, we need the settings of the *build* environment, not of the
642                 # target environment...
644                 local current_binutils_path=$(env ROOT="${BROOT}" binutils-config -B)
645                 local current_gcc_path=$(env ROOT="${BROOT}" gcc-config -B)
646                 einfo "Overriding clang configuration, since it won't work here"
648                 export CC="${current_gcc_path}/gcc"
649                 export CPP="${current_gcc_path}/cpp"
650                 export CXX="${current_gcc_path}/g++"
651                 export LD="${current_binutils_path}/ld.bfd"
652                 export AR="${current_binutils_path}/ar"
653                 export AS="${current_binutils_path}/as"
654                 export NM="${current_binutils_path}/nm"
655                 export STRIP="${current_binutils_path}/strip"
656                 export RANLIB="${current_binutils_path}/ranlib"
657                 export OBJCOPY="${current_binutils_path}/objcopy"
658                 export STRINGS="${current_binutils_path}/strings"
659                 export OBJDUMP="${current_binutils_path}/objdump"
660                 export READELF="${current_binutils_path}/readelf"
661                 export ADDR2LINE="${current_binutils_path}/addr2line"
663                 # do we need to also do flags munging here? yes! at least...
664                 filter-flags '-fuse-ld=*'
665                 filter-flags '-D_FORTIFY_SOURCE=*'
667         else
669                 # this is the "normal" case
671                 export CC="$(tc-getCC ${CTARGET})"
672                 export CXX="$(tc-getCXX ${CTARGET})"
674                 # Always use tuple-prefixed toolchain. For non-native ABI glibc's configure
675                 # can't detect them automatically due to ${CHOST} mismatch and fallbacks
676                 # to unprefixed tools. Similar to multilib.eclass:multilib_toolchain_setup().
677                 export NM="$(tc-getNM ${CTARGET})"
678                 export READELF="$(tc-getREADELF ${CTARGET})"
680         fi
682         # We need to export CFLAGS with abi information in them because glibc's
683         # configure script checks CFLAGS for some targets (like mips).  Keep
684         # around the original clean value to avoid appending multiple ABIs on
685         # top of each other. (Why does the comment talk about CFLAGS if the code
686         # acts on CC?)
687         export glibc__GLIBC_CC=${CC}
688         export glibc__GLIBC_CXX=${CXX}
690         export glibc__abi_CFLAGS="$(get_abi_CFLAGS)"
692         # CFLAGS can contain ABI-specific flags like -mfpu=neon, see bug #657760
693         # To build .S (assembly) files with the same ABI-specific flags
694         # upstream currently recommends adding CFLAGS to CC/CXX:
695         #    https://sourceware.org/PR23273
696         # Note: Passing CFLAGS via CPPFLAGS overrides glibc's arch-specific CFLAGS
697         # and breaks multiarch support. See 659030#c3 for an example.
698         # The glibc configure script doesn't properly use LDFLAGS all the time.
699         export CC="${glibc__GLIBC_CC} ${glibc__abi_CFLAGS} ${CFLAGS} ${LDFLAGS}"
701         # Some of the tests are written in C++, so we need to force our multlib abis in, bug 623548
702         export CXX="${glibc__GLIBC_CXX} ${glibc__abi_CFLAGS} ${CFLAGS}"
704         if is_crosscompile; then
705                 # Assume worst-case bootstrap: glibc is built for the first time
706                 # with ${CTARGET}-g++ not available yet. We avoid
707                 # building auxiliary programs that require C++: bug #683074
708                 # It should not affect final result.
709                 export libc_cv_cxx_link_ok=no
710                 # The line above has the same effect. We set CXX explicitly
711                 # to make build logs less confusing.
712                 export CXX=
713         fi
716 foreach_abi() {
717         setup_env
719         local ret=0
720         local abilist=""
721         if use multilib ; then
722                 abilist=$(get_install_abis)
723         else
724                 abilist=${DEFAULT_ABI}
725         fi
726         local -x ABI
727         for ABI in ${abilist:-default} ; do
728                 setup_env
729                 einfo "Running $1 for ABI ${ABI}"
730                 $1
731                 : $(( ret |= $? ))
732         done
733         return ${ret}
736 glibc_banner() {
737         local b="Gentoo ${GLIBC_PVR}"
738         [[ -n ${PATCH_VER} ]] && ! use vanilla && b+=" (patchset ${PATCH_VER})"
739         echo "${b}, LibLoL ${PVR}"
742 # The following Kernel version handling functions are mostly copied from portage
743 # source. It's better not to use linux-info.eclass here since a) it adds too
744 # much magic, see bug 326693 for some of the arguments, and b) some of the
745 # functions are just not provided.
747 g_get_running_KV() {
748         uname -r
749         return $?
752 g_KV_major() {
753         [[ -z $1 ]] && return 1
754         local KV=$@
755         echo "${KV%%.*}"
758 g_KV_minor() {
759         [[ -z $1 ]] && return 1
760         local KV=$@
761         KV=${KV#*.}
762         echo "${KV%%.*}"
765 g_KV_micro() {
766         [[ -z $1 ]] && return 1
767         local KV=$@
768         KV=${KV#*.*.}
769         echo "${KV%%[^[:digit:]]*}"
772 g_KV_to_int() {
773         [[ -z $1 ]] && return 1
774         local KV_MAJOR=$(g_KV_major "$1")
775         local KV_MINOR=$(g_KV_minor "$1")
776         local KV_MICRO=$(g_KV_micro "$1")
777         local KV_int=$(( KV_MAJOR * 65536 + KV_MINOR * 256 + KV_MICRO ))
779         # We make version 2.2.0 the minimum version we will handle as
780         # a sanity check ... if its less, we fail ...
781         if [[ ${KV_int} -ge 131584 ]] ; then
782                 echo "${KV_int}"
783                 return 0
784         fi
785         return 1
788 g_int_to_KV() {
789         local version=$1 major minor micro
790         major=$((version / 65536))
791         minor=$(((version % 65536) / 256))
792         micro=$((version % 256))
793         echo ${major}.${minor}.${micro}
796 eend_KV() {
797         [[ $(g_KV_to_int $1) -ge $(g_KV_to_int $2) ]]
798         eend $?
801 get_kheader_version() {
802         printf '#include <linux/version.h>\nLINUX_VERSION_CODE\n' | \
803         $(tc-getCPP ${CTARGET}) -I "$(build_eprefix)$(alt_build_headers)" - | \
804         tail -n 1
807 # We collect all sanity checks here. Consistency is not guranteed between
808 # pkg_ and src_ phases, so we call this function both in pkg_pretend and in
809 # src_unpack.
810 sanity_prechecks() {
811         # Prevent native builds from downgrading
812         if [[ ${MERGE_TYPE} != "buildonly" ]] && \
813            [[ -z ${ROOT} ]] && \
814            [[ ${CBUILD} == ${CHOST} ]] && \
815            [[ ${CHOST} == ${CTARGET} ]] ; then
817                 # The high rev # is to allow people to downgrade between -r#
818                 # versions. We want to block 2.20->2.19, but 2.20-r3->2.20-r2
819                 # should be fine. Hopefully we never actually use a r# this
820                 # high.
821                 if has_version ">${CATEGORY}/${P}-r10000" ; then
822                         eerror "Sanity check to keep you from breaking your system:"
823                         eerror " Downgrading glibc is not supported and a sure way to destruction."
824                         [[ ${I_ALLOW_TO_BREAK_MY_SYSTEM} = yes ]] || die "Aborting to save your system."
825                 fi
827                 if ! do_run_test '#include <unistd.h>\n#include <sys/syscall.h>\nint main(){return syscall(1000)!=-1;}\n' ; then
828                         eerror "Your old kernel is broken. You need to update it to a newer"
829                         eerror "version as syscall(<bignum>) will break. See bug 279260."
830                         die "Old and broken kernel."
831                 fi
832         fi
834         if [[ ${CTARGET} == i386-* ]] ; then
835                 eerror "i386 CHOSTs are no longer supported."
836                 eerror "Chances are you don't actually want/need i386."
837                 eerror "Please read https://www.gentoo.org/doc/en/change-chost.xml"
838                 die "Please fix your CHOST"
839         fi
841         if [[ -e /proc/xen ]] && [[ $(tc-arch) == "x86" ]] && ! is-flag -mno-tls-direct-seg-refs ; then
842                 ewarn "You are using Xen but don't have -mno-tls-direct-seg-refs in your CFLAGS."
843                 ewarn "This will result in a 50% performance penalty when running with a 32bit"
844                 ewarn "hypervisor, which is probably not what you want."
845         fi
847         # ABI-specific checks follow here. Hey, we have a lot more specific conditions that
848         # we test for...
849         if ! is_crosscompile ; then
850                 if use amd64 && use multilib && [[ ${MERGE_TYPE} != "binary" ]] ; then
851                         ebegin "Checking that IA32 emulation is enabled in the running kernel"
852                         echo 'int main(){return 0;}' > "${T}/check-ia32-emulation.c"
853                         local STAT
854                         if ${CC-${CHOST}-gcc} ${CFLAGS_x86} "${T}/check-ia32-emulation.c" -o "${T}/check-ia32-emulation.elf32"; then
855                                 "${T}/check-ia32-emulation.elf32"
856                                 STAT=$?
857                         else
858                                 # Don't fail here to allow single->multi ABI switch
859                                 # or recover from breakage like bug #646424
860                                 ewarn "Failed to compile the ABI test. Broken host glibc?"
861                                 STAT=0
862                         fi
863                         rm -f "${T}/check-ia32-emulation.elf32"
864                         eend $STAT
865                         [[ $STAT -eq 0 ]] || die "CONFIG_IA32_EMULATION must be enabled in the kernel to compile a multilib glibc."
866                 fi
868         fi
870         # When we actually have to compile something...
871         if ! just_headers && [[ ${MERGE_TYPE} != "binary" ]] ; then
872                 if [[ -d "${ESYSROOT}"/usr/lib/include ]] ; then
873                         # bug #833620, bug #643302
874                         eerror "Found ${ESYSROOT}/usr/lib/include directory!"
875                         eerror "This is known to break glibc's build."
876                         eerror "Please backup its contents then remove the directory."
877                         die "Found directory (${ESYSROOT}/usr/lib/include) which will break build (bug #833620)!"
878                 fi
880                 if [[ ${CTARGET} == *-linux* ]] ; then
881                         local run_kv build_kv want_kv
883                         run_kv=$(g_get_running_KV)
884                         build_kv=$(g_int_to_KV $(get_kheader_version))
885                         want_kv=${MIN_KERN_VER}
887                         if ! is_crosscompile && ! tc-is-cross-compiler ; then
888                                 # Building fails on an non-supporting kernel
889                                 ebegin "Checking running kernel version (${run_kv} >= ${want_kv})"
890                                 if ! eend_KV ${run_kv} ${want_kv} ; then
891                                         echo
892                                         eerror "You need a kernel of at least ${want_kv}!"
893                                         die "Kernel version too low!"
894                                 fi
895                         fi
897                         # Do not run this check for pkg_pretend, just pkg_setup and friends (if we ever get used there).
898                         # It's plausible (seen it in the wild) that Portage will (correctly) schedule a linux-headers
899                         # upgrade before glibc, but because pkg_pretend gets run before any packages are merged at all (not
900                         # just glibc), the whole emerge gets aborted without a good reason. We probably don't
901                         # need to run this check at all given we have a dependency on the right headers,
902                         # but let's leave it as-is for now.
903                         if [[ ${EBUILD_PHASE_FUNC} != pkg_pretend ]] ; then
904                                 ebegin "Checking linux-headers version (${build_kv} >= ${want_kv})"
905                                 if ! eend_KV ${build_kv} ${want_kv} ; then
906                                         echo
907                                         eerror "You need linux-headers of at least ${want_kv}!"
908                                         die "linux-headers version too low!"
909                                 fi
910                         fi
911                 fi
912         fi
915 upgrade_warning() {
916         # unneeded for liblol
917         return
921 # the phases
924 # pkg_pretend
926 pkg_pretend() {
927         upgrade_warning
930 # pkg_setup
932 pkg_setup() {
933         # see bug 682570
934         [[ -z ${BOOTSTRAP_RAP} ]] && python-any-r1_pkg_setup
937 # src_unpack
939 src_unpack() {
940         setup_env
942         einfo "Checking general environment sanity."
943         sanity_prechecks
945         use multilib-bootstrap && unpack gcc-multilib-bootstrap-${GCC_BOOTSTRAP_VER}.tar.xz
947         if [[ ${PV} == 9999* ]] ; then
948                 EGIT_REPO_URI="https://anongit.gentoo.org/git/proj/toolchain/glibc-patches.git"
949                 EGIT_CHECKOUT_DIR=${WORKDIR}/patches-git
950                 git-r3_src_unpack
951                 mv patches-git/9999 patches || die
953                 EGIT_REPO_URI="https://sourceware.org/git/glibc.git"
954                 EGIT_CHECKOUT_DIR=${S}
955                 git-r3_src_unpack
956         else
957                 unpack glibc-${GLIBC_PV}.tar.xz
959                 cd "${WORKDIR}" || die
960                 unpack glibc-${GLIBC_PV}-patches-${PATCH_VER}.tar.xz
962                 unpack "liblol-${PV}.tar.gz"
963         fi
965         cd "${WORKDIR}" || die
966         use systemd && unpack glibc-systemd-${GLIBC_SYSTEMD_VER}.tar.gz
969 # src_prepare
971 src_prepare() {
972         local patchsetname
973         if ! use vanilla ; then
974                 if [[ ${PV} == 9999* ]] ; then
975                         patchsetname="from git master"
976                 else
977                         patchsetname="${GLIBC_PV}-${PATCH_VER}"
978                 fi
979                 einfo "Applying Gentoo Glibc patchset ${patchsetname}"
980                 eapply "${WORKDIR}"/patches
981                 einfo "Done."
982         fi
984         einfo "Applying libLoL patchset"
985         eapply "${WORKDIR}/liblol-${PV}/autobuild/patches/glibc"
986         einfo "Done."
988         default
990         gnuconfig_update
992         cd "${WORKDIR}" || die
993         find . -name configure -exec touch {} +
995         # Fix permissions on some of the scripts.
996         chmod u+x "${S}"/scripts/*.sh
998         cd "${S}" || die
1001 # src_configure
1003 glibc_do_configure() {
1004         dump_build_environment
1006         local myconf=()
1008         # Use '=strong' instead of '=all' to protect only functions
1009         # worth protecting from stack smashes.
1010         myconf+=( --enable-stack-protector=$(usex ssp strong no) )
1012         # Keep a whitelist of targets supporing IFUNC. glibc's ./configure
1013         # is not robust enough to detect proper support:
1014         #    https://bugs.gentoo.org/641216
1015         #    https://sourceware.org/PR22634#c0
1016         case $(tc-arch ${CTARGET}) in
1017                 # Keep whitelist of targets where autodetection mostly works.
1018                 amd64|x86|sparc|ppc|ppc64|arm|arm64|s390|riscv|loong) ;;
1019                 # Blacklist everywhere else
1020                 *) myconf+=( libc_cv_ld_gnu_indirect_function=no ) ;;
1021         esac
1023         case ${ABI}-${CTARGET} in
1024                 amd64-x86_64-*|x32-x86_64-*-*-gnux32) myconf+=( $(use_enable cet) ) ;;
1025                 *) ;;
1026         esac
1028         [[ $(tc-is-softfloat) == "yes" ]] && myconf+=( --without-fp )
1030         myconf+=( --enable-kernel=${MIN_KERN_VER} )
1032         # Since SELinux support is only required for nscd, only enable it if:
1033         # 1. USE selinux
1034         # 2. only for the primary ABI on multilib systems
1035         # 3. Not a crosscompile
1036         if ! is_crosscompile && use selinux ; then
1037                 if use multilib ; then
1038                         if is_final_abi ; then
1039                                 myconf+=( --with-selinux )
1040                         else
1041                                 myconf+=( --without-selinux )
1042                         fi
1043                 else
1044                         myconf+=( --with-selinux )
1045                 fi
1046         else
1047                 myconf+=( --without-selinux )
1048         fi
1050         # Force a few tests where we always know the answer but
1051         # configure is incapable of finding it.
1052         if is_crosscompile ; then
1053                 export \
1054                         libc_cv_c_cleanup=yes \
1055                         libc_cv_forced_unwind=yes
1056         fi
1058         myconf+=(
1059                 --disable-werror
1060                 --enable-bind-now
1061                 --enable-fortify-source
1062                 --enable-obsolete-rpc  # liblol passes this, not sure if essential
1063                 --build=${CBUILD_OPT:-${CBUILD}}
1064                 --host=${CTARGET_OPT:-${CTARGET}}
1065                 $(use_enable profile)
1066                 $(use_with gd)
1067                 --with-headers=$(build_eprefix)$(alt_build_headers)
1068                 --prefix="$(host_eprefix)/usr"
1069                 --sysconfdir="$(eprefix_lol)/etc"
1070                 --localstatedir="$(eprefix_lol)/var"
1071                 --libdir='$(prefix)'/$(get_libdir)
1072                 --mandir='$(prefix)'/share/man
1073                 --infodir='$(prefix)'/share/info
1074                 --libexecdir='$(libdir)'/misc/glibc
1075                 --with-bugurl=https://github.com/AOSC-Dev/liblol/issues
1076                 --with-pkgversion="$(glibc_banner)"
1077                 $(use_multiarch || echo --disable-multi-arch)
1078                 $(use_enable systemtap)
1079                 $(use_enable nscd)
1081                 # /usr/bin/mtrace has a Perl shebang. Gentoo Prefix QA checks fail if
1082                 # Perl hasn't been installed inside the prefix yet and configure picks
1083                 # up a Perl from outside the prefix instead. configure will fail to
1084                 # execute Perl during configure if we're cross-compiling a prefix, but
1085                 # it will just disable mtrace in that case.
1086                 # Note: mtrace is needed by the test suite.
1087                 ac_cv_path_PERL="$(usex perl "${EPREFIX}"/usr/bin/perl $(usex test "${EPREFIX}"/usr/bin/perl $(usex doc "${EPREFIX}"/usr/bin/perl no)))"
1089                 # locale data is arch-independent
1090                 # https://bugs.gentoo.org/753740
1091                 libc_cv_complocaledir='${exec_prefix}/lib/locale'
1093                 # On aarch64 there is no way to override -mcpu=native, and if
1094                 # the current cpu does not support SVE configure fails.
1095                 # Let's boldly assume our toolchain can always build SVE instructions.
1096                 libc_cv_aarch64_sve_asm=yes
1098                 ${EXTRA_ECONF}
1099         )
1101         # We rely on sys-libs/timezone-data for timezone tools normally.
1102         myconf+=( $(use_enable vanilla timezone-tools) )
1104         # These libs don't have configure flags.
1105         ac_cv_lib_audit_audit_log_user_avc_message=$(usex audit || echo no)
1106         ac_cv_lib_cap_cap_init=$(usex caps || echo no)
1108         # There is no configure option for this and we need to export it
1109         # since the glibc build will re-run configure on itself
1110         export libc_cv_rootsbindir="$(host_eprefix)/sbin"
1111         export libc_cv_slibdir="$(host_eprefix)/$(get_libdir)"
1113         local builddir=$(builddir nptl)
1114         mkdir -p "${builddir}"
1115         cd "${builddir}"
1117         # set some variables not accessible with configure arguments
1118         cat > configparms <<EOF
1119 user-defined-trusted-dirs-pre = $(eprefix_lol)/local/$(get_libdir)/preload $(eprefix_lol)/$(get_libdir)/preload
1120 user-defined-trusted-dirs = $(eprefix_lol)/local/$(get_libdir) $(eprefix_lol)/$(get_libdir)
1123         set -- "${S}"/configure "${myconf[@]}"
1124         echo "$@"
1125         "$@" || die "failed to configure glibc"
1127         # If we're trying to migrate between ABI sets, we need
1128         # to lie and use a local copy of gcc.  Like if the system
1129         # is built with MULTILIB_ABIS="amd64 x86" but we want to
1130         # add x32 to it, gcc/glibc don't yet support x32.
1131         #
1132         if [[ -n ${GCC_BOOTSTRAP_VER} ]] && use multilib-bootstrap ; then
1133                 echo 'int main(void){}' > "${T}"/test.c || die
1134                 if ! $(tc-getCC ${CTARGET}) ${CFLAGS} ${LDFLAGS} "${T}"/test.c -Wl,-emain -lgcc 2>/dev/null ; then
1135                         sed -i -e '/^CC = /s:$: -B$(objdir)/../'"gcc-multilib-bootstrap-${GCC_BOOTSTRAP_VER}/${ABI}:" config.make || die
1136                 fi
1137         fi
1140 glibc_headers_configure() {
1141         export ABI=default
1143         local builddir=$(builddir "headers")
1144         mkdir -p "${builddir}"
1145         cd "${builddir}"
1147         # if we don't have a compiler yet, we can't really test it now ...
1148         # hopefully they don't affect header generation, so let's hope for
1149         # the best here ...
1150         local v vars=(
1151                 ac_cv_header_cpuid_h=yes
1152                 libc_cv_{386,390,alpha,arm,hppa,mips,{powerpc,sparc}{,32,64},sh,x86_64}_tls=yes
1153                 libc_cv_asm_cfi_directives=yes
1154                 libc_cv_broken_visibility_attribute=no
1155                 libc_cv_c_cleanup=yes
1156                 libc_cv_compiler_powerpc64le_binary128_ok=yes
1157                 libc_cv_forced_unwind=yes
1158                 libc_cv_gcc___thread=yes
1159                 libc_cv_mlong_double_128=yes
1160                 libc_cv_mlong_double_128ibm=yes
1161                 libc_cv_ppc_machine=yes
1162                 libc_cv_ppc_rel16=yes
1163                 libc_cv_predef_fortify_source=no
1164                 libc_cv_target_power8_ok=yes
1165                 libc_cv_visibility_attribute=yes
1166                 libc_cv_z_combreloc=yes
1167                 libc_cv_z_execstack=yes
1168                 libc_cv_z_initfirst=yes
1169                 libc_cv_z_nodelete=yes
1170                 libc_cv_z_nodlopen=yes
1171                 libc_cv_z_relro=yes
1172                 libc_mips_abi=${ABI}
1173                 libc_mips_float=$([[ $(tc-is-softfloat) == "yes" ]] && echo soft || echo hard)
1174                 # These libs don't have configure flags.
1175                 ac_cv_lib_audit_audit_log_user_avc_message=no
1176                 ac_cv_lib_cap_cap_init=no
1177         )
1179         einfo "Forcing cached settings:"
1180         for v in "${vars[@]}" ; do
1181                 einfo " ${v}"
1182                 export ${v}
1183         done
1185         local headers_only_arch_CPPFLAGS=()
1187         # Blow away some random CC settings that screw things up. #550192
1188         if [[ -d ${S}/sysdeps/mips ]]; then
1189                 pushd "${S}"/sysdeps/mips >/dev/null
1190                 sed -i -e '/^CC +=/s:=.*:= -D_MIPS_SZPTR=32:' mips32/Makefile mips64/n32/Makefile || die
1191                 sed -i -e '/^CC +=/s:=.*:= -D_MIPS_SZPTR=64:' mips64/n64/Makefile || die
1193                 # Force the mips ABI to the default.  This is OK because the set of
1194                 # installed headers in this phase is the same between the 3 ABIs.
1195                 # If this ever changes, this hack will break, but that's unlikely
1196                 # as glibc discourages that behavior.
1197                 # https://crbug.com/647033
1198                 sed -i -e 's:abiflag=.*:abiflag=_ABIO32:' preconfigure || die
1200                 popd >/dev/null
1201         fi
1203         local myconf=()
1205         case ${CTARGET} in
1206         aarch64*)
1207                 # The configure checks fail during cross-build, so disable here
1208                 # for headers-only
1209                 myconf+=(
1210                         --disable-mathvec
1211                 ) ;;
1212         riscv*)
1213                 # RISC-V interrogates the compiler to determine which target to
1214                 # build.  If building the headers then we don't strictly need a
1215                 # RISC-V compiler, so the built-in definitions that are provided
1216                 # along with all RISC-V compiler might not exist.  This causes
1217                 # glibc's RISC-V preconfigure script to blow up.  Since we're just
1218                 # building the headers any value will actually work here, so just
1219                 # pick the standard one (rv64g/lp64d) to make the build scripts
1220                 # happy for now -- the headers are all the same anyway so it
1221                 # doesn't matter.
1222                 headers_only_arch_CPPFLAGS+=(
1223                         -D__riscv_xlen=64
1224                         -D__riscv_flen=64
1225                         -D__riscv_float_abi_double=1
1226                         -D__riscv_atomic=1
1227                 ) ;;
1228         esac
1230         myconf+=(
1231                 --disable-sanity-checks
1232                 --enable-hacker-mode
1233                 --disable-werror
1234                 --enable-bind-now
1235                 --build=${CBUILD_OPT:-${CBUILD}}
1236                 --host=${CTARGET_OPT:-${CTARGET}}
1237                 --with-headers=$(build_eprefix)$(alt_build_headers)
1238                 --prefix="$(host_eprefix)/usr"
1239                 ${EXTRA_ECONF}
1240         )
1242         # Nothing is compiled here which would affect the headers for the target.
1243         # So forcing CC/CFLAGS is sane.
1244         local headers_only_CC=$(tc-getBUILD_CC)
1245         local headers_only_CFLAGS="-O1 -pipe"
1246         local headers_only_CPPFLAGS="-U_FORTIFY_SOURCE ${headers_only_arch_CPPFLAGS[*]}"
1247         local headers_only_LDFLAGS=""
1248         set -- "${S}"/configure "${myconf[@]}"
1249         echo \
1250                 "CC=${headers_only_CC}" \
1251                 "CFLAGS=${headers_only_CFLAGS}" \
1252                 "CPPFLAGS=${headers_only_CPPFLAGS}" \
1253                 "LDFLAGS=${headers_only_LDFLAGS}" \
1254                 "$@"
1255         CC=${headers_only_CC} \
1256         CFLAGS=${headers_only_CFLAGS} \
1257         CPPFLAGS=${headers_only_CPPFLAGS} \
1258         LDFLAGS="" \
1259         "$@" || die "failed to configure glibc"
1262 do_src_configure() {
1263         if just_headers ; then
1264                 glibc_headers_configure
1265         else
1266                 glibc_do_configure nptl
1267         fi
1270 src_configure() {
1271         foreach_abi do_src_configure
1274 # src_compile
1276 remap_symvers() {
1277         local file="$1"
1278         local symvers="$2"
1280         args=(
1281                 --page-size "$(( 16 * 1024 ))"
1282                 --remap-symvers "$symvers"
1283                 --also-remap-verneed
1284                 "$file"
1285         )
1287         patchelf-liblol "${args[@]}" || die
1290 lol_build() {
1291         local path="$1"
1292         local maketarget="${PWD}/$path"
1293         local dir="$(dirname -- "$path")"
1294         local lib="$(basename -- "$path")"
1295         local emakeargs
1297         einfo "Building $path"
1298         case "$lib" in
1299         libc.so*)
1300                 emakeargs=( "$maketarget" )
1301                 ;;
1302         *)
1303                 emakeargs=(
1304                         -C "${S}/$dir"
1305                         subdir="$dir"
1306                         ..=../
1307                         objdir="$PWD"
1308                         "$maketarget"
1309                 )
1310                 ;;
1311         esac
1313         emake "${emakeargs[@]}"
1316 lol_patch() {
1317         local path="$1"
1318         local maketarget="${PWD}/$path"
1319         local lib="$(basename -- "$path")"
1320         local symvers
1321         local sv
1323         local libc_map="GLIBC_2.36=GLIBC_2.27,GLIBC_2.28"
1324         local pthread_map="GLIBC_2.27=GLIBC_2.0,GLIBC_2.2,GLIBC_2.2.1,GLIBC_2.2.2,GLIBC_2.2.3,GLIBC_2.2.4,GLIBC_2.2.6,GLIBC_2.3,GLIBC_2.3.2,GLIBC_2.3.3,GLIBC_2.3.4,GLIBC_2.4,GLIBC_2.5,GLIBC_2.6,GLIBC_2.7,GLIBC_2.8,GLIBC_2.9,GLIBC_2.10,GLIBC_2.11,GLIBC_2.12,GLIBC_2.13,GLIBC_2.14,GLIBC_2.15,GLIBC_2.16,GLIBC_2.17,GLIBC_2.18,GLIBC_2.19,GLIBC_2.20,GLIBC_2.21,GLIBC_2.22,GLIBC_2.23,GLIBC_2.24,GLIBC_2.25,GLIBC_2.26"
1326         case "$lib" in
1327         libc.so*)
1328                 symvers=( "$pthread_map" "$libc_map" )
1329                 ;;
1330         libpthread.so.0)
1331                 symvers=( "$pthread_map" )
1332                 ;;
1333         ld.so.1|libm.so.6|libresolv.so.2|libc_malloc_debug.so.0|libthread_db.so.1|libBrokenLocale.so.1)
1334                 symvers=( "$libc_map" )
1335                 ;;
1336         esac
1338         [[ ${#symvers[@]} -eq 0 ]] && return
1340         einfo "Patching ELF symbol versions of $path"
1341         for sv in "${symvers[@]}"; do
1342                 remap_symvers "$maketarget" "$sv"
1343         done
1346 do_src_compile() {
1347         local build_order_phase1=(
1348                 libc.so.6
1349                 linkobj/libc.so
1350                 elf/ld.so.1
1351         )
1352         local patch_order_phase1=(
1353                 elf/ld.so.1
1354                 libc.so.6
1355                 linkobj/libc.so
1356         )
1357         local build_order_phase2=(
1358                 nptl/libpthread.so.0
1359                 "${LOL_LIBS[@]}"
1360                 "${LOL_MERGED_LIBS[@]}"
1361         )
1362         local i
1364         cd "$(builddir nptl)" || die
1366         for i in "${build_order_phase1[@]}"; do
1367                 lol_build "$i"
1368         done
1369         for i in "${patch_order_phase1[@]}"; do
1370                 lol_patch "$i"
1371         done
1373         for i in "${build_order_phase2[@]}"; do
1374                 lol_build "$i"
1375         done
1376         for i in "${build_order_phase2[@]}"; do
1377                 lol_patch "$i"
1378         done
1380         ebegin "Generating a dummy ld-linux-loongarch-lp64d.so.1"
1381         $CC -shared \
1382                 -x c /dev/null \
1383                 -o ld-linux-loongarch-lp64d.so.1 \
1384                 -Wl,--version-script -Wl,ld.map \
1385                 -nostdlib \
1386                 $CFLAGS \
1387                 $LDFLAGS
1388         eend $?
1391 src_compile() {
1392         if just_headers ; then
1393                 return
1394         fi
1396         foreach_abi do_src_compile
1399 # src_test
1401 glibc_src_test() {
1402         cd "$(builddir nptl)"
1404         die "TODO: check abiversions"
1407 src_test() {
1408         if just_headers ; then
1409                 return
1410         fi
1412         foreach_abi glibc_src_test || die "tests failed"
1415 # src_install
1417 # locale_gen is unneeded for liblol
1419 liblol_install() {
1420         local i
1421         local files_to_install=(
1422                 libc.so.6
1423                 ld-linux-loongarch-lp64d.so.1
1424                 elf/ld.so.1
1425                 nptl/libpthread.so.0
1426                 "${LOL_LIBS[@]}"
1427                 "${LOL_MERGED_LIBS[@]}"
1428         )
1429         local liblol_libdir="$(eprefix_lol)/$(get_libdir)/preload"
1430         local host_libdir
1432         if use split-usr; then
1433                 host_libdir="${EPREFIX}/$(get_libdir)"
1434         else
1435                 host_libdir="${EPREFIX}/usr/$(get_libdir)"
1436         fi
1438         dodir "$liblol_libdir"
1439         for i in "${files_to_install[@]}"; do
1440                 # pwd is builddir
1441                 # the targets are all symlinks, so doins cannot be used
1442                 cp "$i" "${D}${liblol_libdir}/${i##*/}" || die
1443         done
1445         dosym -r "${liblol_libdir}/ld.so.1" "${host_libdir}/ld.so.1"
1447         keepdir "$(eprefix_lol)/local/$(get_libdir)/preload"
1450 glibc_do_src_install() {
1451         local builddir=$(builddir nptl)
1452         cd "${builddir}"
1454         liblol_install
1456         # Normally upstream_pv is ${PV}. Live ebuilds are exception, there we need
1457         # to infer upstream version:
1458         # '#define VERSION "2.26.90"' -> '2.26.90'
1459         local upstream_pv=$(sed -n -r 's/#define VERSION "(.*)"/\1/p' "${S}"/version.h)
1461         # Avoid stripping binaries not targeted by ${CHOST}. Or else
1462         # ${CHOST}-strip would break binaries build for ${CTARGET}.
1463         is_crosscompile && dostrip -x /
1465         # gdb thread introspection relies on local libpthreads symbols. stripping breaks it
1466         # See Note [Disable automatic stripping]
1467         dostrip -x $(alt_libdir)/libpthread-${upstream_pv}.so
1468         # valgrind requires knowledge about ld.so symbols.
1469         dostrip -x $(alt_libdir)/ld-*.so*
1471         # Everything past this point just needs to be done once ...
1472         is_final_abi || return 0
1474         #################################################################
1475         # EVERYTHING AFTER THIS POINT IS FOR NATIVE GLIBC INSTALLS ONLY #
1476         #################################################################
1478         # Make sure we install some symlink hacks so that when we build
1479         # a 2nd stage cross-compiler, gcc finds the target system
1480         # headers correctly.  See gcc/doc/gccinstall.info
1481         if is_crosscompile ; then
1482                 # We need to make sure that /lib and /usr/lib always exists.
1483                 # gcc likes to use relative paths to get to its multilibs like
1484                 # /usr/lib/../lib64/.  So while we don't install any files into
1485                 # /usr/lib/, we do need it to exist.
1486                 keepdir $(alt_prefix)/lib
1487                 keepdir $(alt_prefix)/usr/lib
1489                 dosym usr/include $(alt_prefix)/sys-include
1490                 return 0
1491         fi
1493         cd "${S}" || die
1495         for d in BUGS ChangeLog CONFORMANCE FAQ NEWS NOTES PROJECTS README* ; do
1496                 [[ -s ${d} ]] && dodoc ${d}
1497         done
1498         dodoc -r ChangeLog.old
1501 glibc_headers_install() {
1502         local builddir=$(builddir "headers")
1503         cd "${builddir}"
1504         emake install_root="${D}/$(build_eprefix)$(alt_prefix)" install-headers
1506         insinto $(alt_headers)/gnu
1507         doins "${S}"/include/gnu/stubs.h
1509         # Make sure we install the sys-include symlink so that when
1510         # we build a 2nd stage cross-compiler, gcc finds the target
1511         # system headers correctly.  See gcc/doc/gccinstall.info
1512         dosym usr/include $(alt_prefix)/sys-include
1515 src_install() {
1516         if just_headers ; then
1517                 export ABI=default
1518                 glibc_headers_install
1519                 return
1520         fi
1522         foreach_abi glibc_do_src_install
1524         if ! use static-libs ; then
1525                 einfo "Not installing static glibc libraries"
1526                 find "${ED}" -name "*.a" -and -not -name "*_nonshared.a" -delete
1527         fi
1530 refresh_lib_symlinks() {
1531         local liblol_libdir="${EROOT}${LOLPREFIX}/$(get_libdir)/preload"
1532         local gcc_libs=(
1533                 libatomic.so.1
1534                 libgcc_s.so.1
1535                 libgfortran.so.5
1536                 libgomp.so.1
1537                 libstdc++.so.6
1538         )
1539         local gcc_lib
1540         local lol_lib
1542         if has_version sys-devel/gcc-config && has_version sys-devel/gcc; then
1543                 local gcc_path="$(gcc-config --get-lib-path 2>/dev/null)"
1544                 # only keep the first entry
1545                 gcc_path="${gcc_path%%:*}"
1547                 einfo "Symlinking GCC libs at $gcc_path to libLoL preload libdir"
1548                 for i in "${gcc_libs[@]}"; do
1549                         gcc_lib="${gcc_path}/$i"
1550                         lol_lib="${liblol_libdir}/$i"
1552                         if ! [[ -f "$gcc_lib" ]]; then
1553                                 continue
1554                         fi
1556                         rm -f "$lol_lib"
1557                         ln -s "$gcc_lib" "$lol_lib"
1558                 done
1559         fi
1562 pkg_postinst() {
1563         refresh_lib_symlinks
1565         elog "Because libLoL cannot hook into env-update, you need to manually"
1566         elog "refresh symlinks after e.g. GCC version changes, by running:"
1567         elog
1568         elog "    emerge --config ${CATEGORY}/${PN}"
1571 pkg_config() {
1572         refresh_lib_symlinks