profile
viewpoint
If you are wondering where the data of this site comes from, please visit https://api.github.com/users/Arfrever/events. GitMemory does not store any data, but only uses NGINX to cache data for a period of time. The idea behind GitMemory is simply to give users a better reading experience.

Pull request review commentgentoo/portage

Bugfix 674212: Warn if portage home directory is missing

 def _init_dirs(self): 				writemsg("!!! %s\n" % str(e), 					noiselevel=-1) +	def _check_portage_homedir(self):+		"""+		Warn if portage home directory is missing or has incorrect ownership+		"""+		try:+			stat = os.stat(os.path.expanduser(f"~{_portage_username}"))+			stat_gid = stat.st_gid+			stat_uid = stat.st_uid+			assert stat_gid == portage_gid+			assert stat_uid == portage_uid+		except (FileNotFoundError, AssertionError):+			writemsg(+				colorize("BAD",+				_("portage: 'portage' user home directory either "

Also I am not sure if this message should have portage: prefix...

steeznson

comment created time in 3 days

PullRequestReviewEvent

Pull request review commentgentoo/portage

Bugfix 674212: Warn if portage home directory is missing

 def _init_dirs(self): 				writemsg("!!! %s\n" % str(e), 					noiselevel=-1) +	def _check_portage_homedir(self):+		"""+		Warn if portage home directory is missing or has incorrect ownership+		"""+		try:+			stat = os.stat(os.path.expanduser(f"~{_portage_username}"))+			stat_gid = stat.st_gid+			stat_uid = stat.st_uid+			assert stat_gid == portage_gid+			assert stat_uid == portage_uid+		except (FileNotFoundError, AssertionError):+			writemsg(+				colorize("BAD",+				_("portage: 'portage' user home directory either "

Please also update this instance of portage to {_portage_username}.

steeznson

comment created time in 3 days

PullRequestReviewEvent

pull request commentgentoo/portage

rewrite has()

This patch results in returning incorrect result (true instead of false) for:

has x $'x\ax'
rindeal

comment created time in 3 days

Pull request review commentgentoo/portage

Bugfix 674212: Warn if portage home directory is missing

 def _init_dirs(self): 				writemsg("!!! %s\n" % str(e), 					noiselevel=-1) +	def _check_portage_homedir(self):+		"""+		Warn if portage home directory is missing or has incorrect ownership+		"""+		try:+			stat = os.stat(os.path.expanduser("~portage"))+			stat_gid = stat.st_gid+			stat_uid = stat.st_uid+			assert stat_gid == portage_gid+			assert stat_uid == portage_uid+		except (FileNotFoundError, AssertionError):+			writemsg(+				colorize("BAD",+				_("portage: 'portage' user home directory either "+				+ "does not exist, or is not owned by "+				+ "'portage' group and user."))

And in this message.

steeznson

comment created time in 3 days

PullRequestReviewEvent
PullRequestReviewEvent

Pull request review commentgentoo/portage

Bugfix 674212: Warn if portage home directory is missing

 def _init_dirs(self): 				writemsg("!!! %s\n" % str(e), 					noiselevel=-1) +	def _check_portage_homedir(self):+		"""+		Warn if portage home directory is missing or has incorrect ownership+		"""+		try:+			stat = os.stat(os.path.expanduser("~portage"))

You should not hardcode portage, but respect portage.data._portage_username.

portage.data._portage_username and portage.data._portage_grpname respect PORTAGE_USERNAME and PORTAGE_GRPNAME variables (which can be set in environment or make.conf).

steeznson

comment created time in 3 days

Pull request review commentgentoo/gentoo

dev-lang/rust: fix build for libcxx/musl.

 DEPEND=" 	net-misc/curl:=[http2,ssl] 	sys-libs/zlib:= 	dev-libs/openssl:0=-	elibc_musl? ( sys-libs/libunwind:= )+	elibc_musl? (+		llvm-libunwind? ( sys-libs/llvm-libunwind:= )+		!llvm-libunwind? ( sys-libs/libunwind:= )+	)+	libcxx? ( sys-libs/libcxx )

... and USE=libcxx here look unnecessary. Current policies are to not usually specify explicitly dependencies on C / C++ standard library, and sys-libs/libcxx is one of such implementations of C++ standard library. Users should select libc++ as C++ standard library by -stdlib=libc++ compiler option or USE=default-libcxx for sys-devel/clang.

ahmedcharles

comment created time in 3 days

Pull request review commentgentoo/gentoo

dev-lang/rust: fix build for libcxx/musl.

 src_configure() { 		ninja = true 		targets = "${LLVM_TARGETS// /;}" 		experimental-targets = ""+		use-libcxx = $(usex libcxx true false)

Before this cat, I suggest:

local libcxx=false
$(tc-getCXX) ${CXXFLAGS} ${LDFLAGS} $(no-as-needed) -o "${T}/test-c++-std-lib" -x c++ - <<<"int main() { return 0; }"
if type -p scanelf > /dev/null; then
	local lib
	while IFS= read -d , lib; do
		if [[ ${lib} =~ ^"libc++.so"(\..)?$ ]]; then
			libcxx=true
		fi
	done <<<"$(scanelf -qF "#F%n" "${T}/test-c++-std-lib")"
fi

And then here:

use-libcxx = ${libcxx}
ahmedcharles

comment created time in 3 days

PullRequestReviewEvent

Pull request review commentgentoo/gentoo

dev-lang/rust: fix build for libcxx/musl.

 LLVM_TARGET_USEDEPS=${ALL_LLVM_TARGETS[@]/%/(-)?}  LICENSE="|| ( MIT Apache-2.0 ) BSD-1 BSD-2 BSD-4 UoI-NCSA" -IUSE="clippy cpu_flags_x86_sse2 debug doc miri nightly parallel-compiler rls rustfmt system-bootstrap system-llvm test wasm ${ALL_LLVM_TARGETS[*]}"+IUSE="clippy cpu_flags_x86_sse2 debug doc libcxx llvm-libunwind miri nightly parallel-compiler rls rustfmt system-bootstrap system-llvm test wasm ${ALL_LLVM_TARGETS[*]}"

This USE=libcxx here...

ahmedcharles

comment created time in 3 days

PullRequestReviewEvent
CommitCommentEvent

Pull request review commentgentoo/portage

Detect corrupt ELF files in VDB

 def is_libdir(obj_parent): 			errors='strict') as f: 			f.write(soname_deps.requires) -	if soname_deps.provides is not None:+	if soname_deps.provides: 		with io.open(_unicode_encode(os.path.join(build_info_dir, 			'PROVIDES'), encoding=_encodings['fs'], errors='strict'), 			mode='w', encoding=_encodings['repo.content'], 			errors='strict') as f: 			f.write(soname_deps.provides)+	else:+		# Let's check if we've got inconsistent results.+		# If we're installing dynamic libraries (.so files), we should+		# really have a PROVIDES.+		# (This is a complementary check at the point of creation for the+		# ingestion check in Binpkg.py)+		# Note: we could check a non-empty PROVIDES against the list of .sos,+		#		but this doesn't gain us anything. We're interested in failure+		#		to properly parse the installed files at all, which should really+		#		be a global problem (e.g. bug #811462)+		installed_dynlibs = glob.glob(image_dir + '/**/*.so', recursive=True)

if they upgrade to a gcc that changes the libstdc++.so soname

SONAME of libstdc++.so has not changed in IIRC about 20 years. Upstreams of glibc and GCC prefer to use symbol versioning, and they sometimes even break ABI without SONAME bumps.

thesamesam

comment created time in 11 days

PullRequestReviewEvent

Pull request review commentgentoo/portage

Detect corrupt ELF files in VDB

 def is_libdir(obj_parent): 			errors='strict') as f: 			f.write(soname_deps.requires) -	if soname_deps.provides is not None:+	if soname_deps.provides: 		with io.open(_unicode_encode(os.path.join(build_info_dir, 			'PROVIDES'), encoding=_encodings['fs'], errors='strict'), 			mode='w', encoding=_encodings['repo.content'], 			errors='strict') as f: 			f.write(soname_deps.provides)+	else:+		# Let's check if we've got inconsistent results.+		# If we're installing dynamic libraries (.so files), we should+		# really have a PROVIDES.+		# (This is a complementary check at the point of creation for the+		# ingestion check in Binpkg.py)+		# Note: we could check a non-empty PROVIDES against the list of .sos,+		#		but this doesn't gain us anything. We're interested in failure+		#		to properly parse the installed files at all, which should really+		#		be a global problem (e.g. bug #811462)+		installed_dynlibs = glob.glob(image_dir + '/**/*.so', recursive=True)

Ideas for better heuristics welcome too, but ideally something we could do from pure Python without having to invoke *elf again

You might consider using dev-python/pyelftools... dev-python/pyelftools already happens to be dependency of app-misc/pax-utils[python]. In Portage's source code, usage of elftools modules would have to be guarded by try: ... except ImportError: pass, but I would be fine with ebuilds of sys-apps/portage having almost unconditional dependency on dev-python/pyelftools (in !build? ( ... ) branch of RDEPEND).

thesamesam

comment created time in 11 days

PullRequestReviewEvent

pull request commentgentoo/portage

Modern metadata passing API & add INHERIT key to md5-cache

There is already INHERITED key which contains names of eclasses inherited directly or indirectly. Name INHERIT is not informative about content of this variable and will cause confusion for API consumers. Could you rename this new key to e.g. DIRECTLY_INHERITED?

mgorny

comment created time in 11 days

Pull request review commentgentoo/portage

Detect corrupt ELF files in VDB

 def _unpack_contents_exit(self, unpack_contents): 			self._async_unlock_builddir(returncode=self.returncode) 			return +		# Before anything else, let's do an integrity check.+		provides, = self._bintree.dbapi.aux_get(self.pkg.cpv, ['PROVIDES'])+		if not provides:+			# Let's check if we've got inconsistent results.+			# If we're installing dynamic libraries (.so files), we should+			# really have a PROVIDES.+			# (This is a complementary check at the point of ingestion for the+			# creation check in doebuild.py)+			# Note: we could check a non-empty PROVIDES against the list of .sos,+			#		but this doesn't gain us anything. We're interested in failure+			#		to properly parse the installed files at all, which should really+			#		be a global problem (e.g. bug #811462)+			installed_dynlibs = glob.glob(self.settings["D"] + '/**/*.so', recursive=True)

The same problem here.

thesamesam

comment created time in 11 days

PullRequestReviewEvent

Pull request review commentgentoo/portage

Detect corrupt ELF files in VDB

 def is_libdir(obj_parent): 			errors='strict') as f: 			f.write(soname_deps.requires) -	if soname_deps.provides is not None:+	if soname_deps.provides: 		with io.open(_unicode_encode(os.path.join(build_info_dir, 			'PROVIDES'), encoding=_encodings['fs'], errors='strict'), 			mode='w', encoding=_encodings['repo.content'], 			errors='strict') as f: 			f.write(soname_deps.provides)+	else:+		# Let's check if we've got inconsistent results.+		# If we're installing dynamic libraries (.so files), we should+		# really have a PROVIDES.+		# (This is a complementary check at the point of creation for the+		# ingestion check in Binpkg.py)+		# Note: we could check a non-empty PROVIDES against the list of .sos,+		#		but this doesn't gain us anything. We're interested in failure+		#		to properly parse the installed files at all, which should really+		#		be a global problem (e.g. bug #811462)+		installed_dynlibs = glob.glob(image_dir + '/**/*.so', recursive=True)

This will cause false positives for almost all .so modules of Python, Perl, Ruby etc. Most of them do not have SONAMEs (and there is no reason for them to have SONAMEs).

Checking only image_dir + '/lib*/lib*.so' and image_dir + '/usr/lib*/lib*.so' would reduce number of false positives, but maybe some languages or applications put their modules directly in /lib* or /usr/lib* (instead of in some subdirectories).

thesamesam

comment created time in 11 days

PullRequestReviewEvent

issue openedlinux-pam/linux-pam

Incompatibility with systemd 249

When systemd >=249 is installed and nsswitch.conf contains:

shadow:     files systemd

And when PAM code is run by process with non-root user, authentication will fail. See https://bugs.gentoo.org/803050 for more details.

created time in 2 months

Pull request review commentgentoo/gentoo

sys-libs/glibc: add preserve-libs for libcrypt

+# Copyright 1999-2021 Gentoo Authors+# Distributed under the terms of the GNU General Public License v2++EAPI=7++PYTHON_COMPAT=( python3_{7,8,9,10} )+TMPFILES_OPTIONAL=1++inherit python-any-r1 prefix preserve-libs toolchain-funcs flag-o-matic gnuconfig \+	multilib systemd multiprocessing tmpfiles++DESCRIPTION="GNU libc C library"+HOMEPAGE="https://www.gnu.org/software/libc/"+LICENSE="LGPL-2.1+ BSD HPND ISC inner-net rc PCRE"+SLOT="2.2"++EMULTILIB_PKG="true"++# Gentoo patchset (ignored for live ebuilds)+PATCH_VER=4+PATCH_DEV=dilfridge++if [[ ${PV} == 9999* ]]; then+	inherit git-r3+else+	KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86"+	SRC_URI="mirror://gnu/glibc/${P}.tar.xz"+	SRC_URI+=" https://dev.gentoo.org/~${PATCH_DEV}/distfiles/${P}-patches-${PATCH_VER}.tar.xz"+fi++RELEASE_VER=${PV}++GCC_BOOTSTRAP_VER=20201208++LOCALE_GEN_VER=2.10++SRC_URI+=" https://gitweb.gentoo.org/proj/locale-gen.git/snapshot/locale-gen-${LOCALE_GEN_VER}.tar.gz"+SRC_URI+=" multilib-bootstrap? ( https://dev.gentoo.org/~dilfridge/distfiles/gcc-multilib-bootstrap-${GCC_BOOTSTRAP_VER}.tar.xz )"++IUSE="audit caps cet compile-locales +crypt custom-cflags doc gd headers-only +multiarch multilib multilib-bootstrap nscd profile selinux +ssp +static-libs static-pie suid systemtap test vanilla"++# Minimum kernel version that glibc requires+MIN_KERN_VER="3.2.0"++# Here's how the cross-compile logic breaks down ...+#  CTARGET - machine that will target the binaries+#  CHOST   - machine that will host the binaries+#  CBUILD  - machine that will build the binaries+# If CTARGET != CHOST, it means you want a libc for cross-compiling.+# If CHOST != CBUILD, it means you want to cross-compile the libc.+#  CBUILD = CHOST = CTARGET    - native build/install+#  CBUILD != (CHOST = CTARGET) - cross-compile a native build+#  (CBUILD = CHOST) != CTARGET - libc for cross-compiler+#  CBUILD != CHOST != CTARGET  - cross-compile a libc for a cross-compiler+# For install paths:+#  CHOST = CTARGET  - install into /+#  CHOST != CTARGET - install into /usr/CTARGET/+#+export CBUILD=${CBUILD:-${CHOST}}+export CTARGET=${CTARGET:-${CHOST}}+if [[ ${CTARGET} == ${CHOST} ]] ; then+	if [[ ${CATEGORY} == cross-* ]] ; then+		export CTARGET=${CATEGORY#cross-}+	fi+fi++# Note [Disable automatic stripping]+# Disabling automatic stripping for a few reasons:+# - portage's attempt to strip breaks non-native binaries at least on+#   arm: bug #697428+# - portage's attempt to strip libpthread.so.0 breaks gdb thread+#   enumeration: bug #697910. This is quite subtle:+#   * gdb uses glibc's libthread_db-1.0.so to enumerate threads.+#   * libthread_db-1.0.so needs access to libpthread.so.0 local symbols+#     via 'ps_pglobal_lookup' symbol defined in gdb.+#   * 'ps_pglobal_lookup' uses '.symtab' section table to resolve all+#     known symbols in 'libpthread.so.0'. Specifically 'nptl_version'+#     (unexported) is used to sanity check compatibility before enabling+#     debugging.+#     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+#   * normal 'strip' command trims '.symtab'+#   Thus our main goal here is to prevent 'libpthread.so.0' from+#   losing it's '.symtab' entries.+# As Gentoo's strip does not allow us to pass less aggressive stripping+# options and does not check the machine target we strip selectively.++# We need a new-enough binutils/gcc to match upstream baseline.+# Also we need to make sure our binutils/gcc supports TLS,+# and that gcc already contains the hardened patches.+# Lastly, let's avoid some openssh nastiness, bug 708224, as+# convenience to our users.++# gzip, grep, awk are needed by locale-gen, bug 740750++BDEPEND="+	${PYTHON_DEPS}+	>=app-misc/pax-utils-0.1.10+	sys-devel/bison+	doc? ( sys-apps/texinfo )+	!compile-locales? (+		app-arch/gzip+		sys-apps/grep+		virtual/awk+	)+"+COMMON_DEPEND="+	gd? ( media-libs/gd:2= )+	nscd? ( selinux? (+		audit? ( sys-process/audit )+		caps? ( sys-libs/libcap )+	) )+	suid? ( caps? ( sys-libs/libcap ) )+	selinux? ( sys-libs/libselinux )+	systemtap? ( dev-util/systemtap )+	!<net-misc/openssh-8.1_p1-r2+"+DEPEND="${COMMON_DEPEND}+	compile-locales? (+		app-arch/gzip+		sys-apps/grep+		virtual/awk+	)+	test? ( >=net-dns/libidn2-2.3.0 )+"+RDEPEND="${COMMON_DEPEND}+	app-arch/gzip+	sys-apps/grep+	virtual/awk+	sys-apps/gentoo-functions+"++RESTRICT="!test? ( test )"++if [[ ${CATEGORY} == cross-* ]] ; then+	BDEPEND+=" !headers-only? (+		>=${CATEGORY}/binutils-2.27+		>=${CATEGORY}/gcc-6+	)"+	[[ ${CATEGORY} == *-linux* ]] && DEPEND+=" ${CATEGORY}/linux-headers"+else+	BDEPEND+="+		>=sys-devel/binutils-2.27+		>=sys-devel/gcc-6+	"+	DEPEND+=" virtual/os-headers "+	RDEPEND+="+		>=net-dns/libidn2-2.3.0+		vanilla? ( !sys-libs/timezone-data )+	"+	PDEPEND+=" !vanilla? ( sys-libs/timezone-data )"+fi++# Ignore tests whitelisted below+GENTOO_GLIBC_XFAIL_TESTS="${GENTOO_GLIBC_XFAIL_TESTS:-yes}"++# The following tests fail due to the Gentoo build system and are thus+# executed but ignored:+XFAIL_TEST_LIST=(+	# 9) Failures of unknown origin+	tst-latepthread++	# buggy test, assumes /dev/ and /dev/null on a single filesystem+	# 'mount --bind /dev/null /chroot/dev/null' breaks it.+	# https://sourceware.org/PR25909+	tst-support_descriptors++	# Flaky test, known to fail occasionally:+	# https://sourceware.org/PR19329+	# https://bugs.gentoo.org/719674#c12+	tst-stack4+)++#+# Small helper functions+#++is_crosscompile() {+	[[ ${CHOST} != ${CTARGET} ]]+}++just_headers() {+	is_crosscompile && use headers-only+}++alt_prefix() {+	is_crosscompile && echo /usr/${CTARGET}+}++# This prefix is applicable to CHOST when building against this+# glibc. It is baked into the library at configure time.+host_eprefix() {+	is_crosscompile || echo "${EPREFIX}"+}++# This prefix is applicable to CBUILD when building against this+# glibc. It determines the destination path at install time.+build_eprefix() {+	is_crosscompile && echo "${EPREFIX}"+}++# We need to be able to set alternative headers for compiling for non-native+# platform. Will also become useful for testing kernel-headers without screwing+# up the whole system.+alt_headers() {+	echo ${ALT_HEADERS:=$(alt_prefix)/usr/include}+}++alt_build_headers() {+	if [[ -z ${ALT_BUILD_HEADERS} ]] ; then+		ALT_BUILD_HEADERS="$(host_eprefix)$(alt_headers)"+		if tc-is-cross-compiler ; then+			ALT_BUILD_HEADERS=${SYSROOT}$(alt_headers)+			if [[ ! -e ${ALT_BUILD_HEADERS}/linux/version.h ]] ; then+				local header_path=$(echo '#include <linux/version.h>' | $(tc-getCPP ${CTARGET}) ${CFLAGS} 2>&1 | grep -o '[^"]*linux/version.h')+				ALT_BUILD_HEADERS=${header_path%/linux/version.h}+			fi+		fi+	fi+	echo "${ALT_BUILD_HEADERS}"+}++alt_libdir() {+	echo $(alt_prefix)/$(get_libdir)+}+alt_usrlibdir() {+	echo $(alt_prefix)/usr/$(get_libdir)+}++builddir() {+	echo "${WORKDIR}/build-${ABI}-${CTARGET}-$1"+}++do_compile_test() {+	local ret save_cflags=${CFLAGS}+	CFLAGS+=" $1"+	shift++	pushd "${T}" >/dev/null++	rm -f glibc-test*+	printf '%b' "$*" > glibc-test.c++	# Most of the time CC is already set, but not in early sanity checks.+	nonfatal emake glibc-test CC="${CC-$(tc-getCC ${CTARGET})}"+	ret=$?++	popd >/dev/null++	CFLAGS=${save_cflags}+	return ${ret}+}++do_run_test() {+	local ret++	if [[ ${MERGE_TYPE} == "binary" ]] ; then+		# ignore build failures when installing a binary package #324685+		do_compile_test "" "$@" 2>/dev/null || return 0+	else+		if ! do_compile_test "" "$@" ; then+			ewarn "Simple build failed ... assuming this is desired #324685"+			return 0+		fi+	fi++	pushd "${T}" >/dev/null++	./glibc-test+	ret=$?+	rm -f glibc-test*++	popd >/dev/null++	return ${ret}+}++setup_target_flags() {+	# This largely mucks with compiler flags.  None of which should matter+	# when building up just the headers.+	just_headers && return 0++	case $(tc-arch) in+		x86)+			# -march needed for #185404 #199334+			# TODO: When creating the first glibc cross-compile, this test will+			# always fail as it does a full link which in turn requires glibc.+			# Probably also applies when changing multilib profile settings (e.g.+			# enabling x86 when the profile was amd64-only previously).+			# We could change main to _start and pass -nostdlib here so that we+			# only test the gcc code compilation.  Or we could do a compile and+			# then look for the symbol via scanelf.+			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+				local t=${CTARGET_OPT:-${CTARGET}}+				t=${t%%-*}+				filter-flags '-march=*'+				export CFLAGS="-march=${t} ${CFLAGS}"+				einfo "Auto adding -march=${t} to CFLAGS #185404"+			fi+		;;+		amd64)+			# -march needed for #185404 #199334+			# TODO: See cross-compile issues listed above for x86.+			[[ ${ABI} == x86 ]] &&+			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+				local t=${CTARGET_OPT:-${CTARGET}}+				t=${t%%-*}+				# Normally the target is x86_64-xxx, so turn that into the -march that+				# gcc actually accepts. #528708+				[[ ${t} == "x86_64" ]] && t="x86-64"+				filter-flags '-march=*'+				# ugly, ugly, ugly.  ugly.+				CFLAGS_x86=$(CFLAGS=${CFLAGS_x86} filter-flags '-march=*'; echo "${CFLAGS}")+				export CFLAGS_x86="${CFLAGS_x86} -march=${t}"+				einfo "Auto adding -march=${t} to CFLAGS_x86 #185404 (ABI=${ABI})"+			fi+		;;+		mips)+			# The mips abi cannot support the GNU style hashes. #233233+			filter-ldflags -Wl,--hash-style=gnu -Wl,--hash-style=both+		;;+		ppc|ppc64)+			# Many arch-specific implementations do not work on ppc with+			# cache-block not equal to 128 bytes. This breaks memset:+			#   https://sourceware.org/PR26522+			#   https://bugs.gentoo.org/737996+			# Use default -mcpu=. For ppc it means non-multiarch setup.+			filter-flags '-mcpu=*'+		;;+		sparc)+			# Both sparc and sparc64 can use -fcall-used-g6.  -g7 is bad, though.+			filter-flags "-fcall-used-g7"+			append-flags "-fcall-used-g6"++			local cpu+			case ${CTARGET} in+			sparc64-*)+				cpu="sparc64"+				case $(get-flag mcpu) in+				v9)+					# We need to force at least v9a because the base build doesn't+					# work with just v9.+					# https://sourceware.org/bugzilla/show_bug.cgi?id=19477+					append-flags "-Wa,-xarch=v9a"+					;;+				esac+				;;+			sparc-*)+				case $(get-flag mcpu) in+				v8|supersparc|hypersparc|leon|leon3)+					cpu="sparcv8"+					;;+				*)+					cpu="sparcv9"+					;;+				esac+			;;+			esac+			[[ -n ${cpu} ]] && CTARGET_OPT="${cpu}-${CTARGET#*-}"+		;;+	esac+}++setup_flags() {+	# Make sure host make.conf doesn't pollute us+	if is_crosscompile || tc-is-cross-compiler ; then+		CHOST=${CTARGET} strip-unsupported-flags+	fi++	# Store our CFLAGS because it's changed depending on which CTARGET+	# we are building when pulling glibc on a multilib profile+	CFLAGS_BASE=${CFLAGS_BASE-${CFLAGS}}+	CFLAGS=${CFLAGS_BASE}+	CXXFLAGS_BASE=${CXXFLAGS_BASE-${CXXFLAGS}}+	CXXFLAGS=${CXXFLAGS_BASE}+	ASFLAGS_BASE=${ASFLAGS_BASE-${ASFLAGS}}+	ASFLAGS=${ASFLAGS_BASE}++	# Allow users to explicitly avoid flag sanitization via+	# USE=custom-cflags.+	if ! use custom-cflags; then+		# Over-zealous CFLAGS can often cause problems.  What may work for one+		# person may not work for another.  To avoid a large influx of bugs+		# relating to failed builds, we strip most CFLAGS out to ensure as few+		# problems as possible.+		strip-flags+		# Lock glibc at -O2; we want to be conservative here.+		filter-flags '-O?'+		append-flags -O2+	fi+	strip-unsupported-flags+	filter-flags -m32 -m64 '-mabi=*'++	# glibc aborts if rpath is set by LDFLAGS+	filter-ldflags '-Wl,-rpath=*'++	# ld can't use -r & --relax at the same time, bug #788901+	# https://sourceware.org/PR27837+	filter-ldflags '-Wl,--relax'++	# #492892+	filter-flags -frecord-gcc-switches++	unset CBUILD_OPT CTARGET_OPT+	if use multilib ; then+		CTARGET_OPT=$(get_abi_CTARGET)+		[[ -z ${CTARGET_OPT} ]] && CTARGET_OPT=$(get_abi_CHOST)+	fi++	setup_target_flags++	if [[ -n ${CTARGET_OPT} && ${CBUILD} == ${CHOST} ]] && ! is_crosscompile; then+		CBUILD_OPT=${CTARGET_OPT}+	fi++	# glibc's headers disallow -O0 and fail at build time:+	#  include/libc-symbols.h:75:3: #error "glibc cannot be compiled without optimization"+	replace-flags -O0 -O1++	filter-flags '-fstack-protector*'+}++want_tls() {+	# Archs that can use TLS (Thread Local Storage)+	case $(tc-arch) in+		x86)+			# requires i486 or better #106556+			[[ ${CTARGET} == i[4567]86* ]] && return 0+			return 1+		;;+	esac+	return 0+}++want__thread() {+	want_tls || return 1++	# For some reason --with-tls --with__thread is causing segfaults on sparc32.+	[[ ${PROFILE_ARCH} == "sparc" ]] && return 1++	[[ -n ${WANT__THREAD} ]] && return ${WANT__THREAD}++	# only test gcc -- can't test linking yet+	tc-has-tls -c ${CTARGET}+	WANT__THREAD=$?++	return ${WANT__THREAD}+}++use_multiarch() {+	# Allow user to disable runtime arch detection in multilib.+	use multiarch || return 1+	# Make sure binutils is new enough to support indirect functions,+	# #336792. This funky sed supports gold and bfd linkers.+	local bver nver+	bver=$($(tc-getLD ${CTARGET}) -v | sed -n -r '1{s:[^0-9]*::;s:^([0-9.]*).*:\1:;p}')+	case $(tc-arch ${CTARGET}) in+	amd64|x86) nver="2.20" ;;+	arm)       nver="2.22" ;;+	hppa)      nver="2.23" ;;+	ppc|ppc64) nver="2.20" ;;+	# ifunc support was added in 2.23, but glibc also needs+	# machinemode which is in 2.24.+	s390)      nver="2.24" ;;+	sparc)     nver="2.21" ;;+	*)         return 1 ;;+	esac+	ver_test ${bver} -ge ${nver}+}++# Setup toolchain variables that had historically been defined in the+# profiles for these archs.+setup_env() {+	# silly users+	unset LD_RUN_PATH+	unset LD_ASSUME_KERNEL++	if is_crosscompile || tc-is-cross-compiler ; then+		multilib_env ${CTARGET_OPT:-${CTARGET}}++		if ! use multilib ; then+			MULTILIB_ABIS=${DEFAULT_ABI}+		else+			MULTILIB_ABIS=${MULTILIB_ABIS:-${DEFAULT_ABI}}+		fi++		# If the user has CFLAGS_<CTARGET> in their make.conf, use that,+		# and fall back on CFLAGS.+		local VAR=CFLAGS_${CTARGET//[-.]/_}+		CFLAGS=${!VAR-${CFLAGS}}+		einfo " $(printf '%15s' 'Manual CFLAGS:')   ${CFLAGS}"+	fi++	setup_flags++	export ABI=${ABI:-${DEFAULT_ABI:-default}}++	if just_headers ; then+		# Avoid mixing host's CC and target's CFLAGS_${ABI}:+		# At this bootstrap stage we have only binutils for+		# target but not compiler yet.+		einfo "Skip CC ABI injection. We can't use (cross-)compiler yet."+		return 0+	fi+	local VAR=CFLAGS_${ABI}+	# We need to export CFLAGS with abi information in them because glibc's+	# configure script checks CFLAGS for some targets (like mips).  Keep+	# around the original clean value to avoid appending multiple ABIs on+	# top of each other.+	: ${__GLIBC_CC:=$(tc-getCC ${CTARGET})}+	export __GLIBC_CC CC="${__GLIBC_CC} ${!VAR}"+	einfo " $(printf '%15s' 'Manual CC:')   ${CC}"+}++foreach_abi() {+	setup_env++	local ret=0+	local abilist=""+	if use multilib ; then+		abilist=$(get_install_abis)+	else+		abilist=${DEFAULT_ABI}+	fi+	local -x ABI+	for ABI in ${abilist:-default} ; do+		setup_env+		einfo "Running $1 for ABI ${ABI}"+		$1+		: $(( ret |= $? ))+	done+	return ${ret}+}++glibc_banner() {+	local b="Gentoo ${PVR}"+	[[ -n ${PATCH_VER} ]] && ! use vanilla && b+=" p${PATCH_VER}"+	echo "${b}"+}++# The following Kernel version handling functions are mostly copied from portage+# source. It's better not to use linux-info.eclass here since a) it adds too+# much magic, see bug 326693 for some of the arguments, and b) some of the+# functions are just not provided.++g_get_running_KV() {+	uname -r+	return $?+}++g_KV_major() {+	[[ -z $1 ]] && return 1+	local KV=$@+	echo "${KV%%.*}"+}++g_KV_minor() {+	[[ -z $1 ]] && return 1+	local KV=$@+	KV=${KV#*.}+	echo "${KV%%.*}"+}++g_KV_micro() {+	[[ -z $1 ]] && return 1+	local KV=$@+	KV=${KV#*.*.}+	echo "${KV%%[^[:digit:]]*}"+}++g_KV_to_int() {+	[[ -z $1 ]] && return 1+	local KV_MAJOR=$(g_KV_major "$1")+	local KV_MINOR=$(g_KV_minor "$1")+	local KV_MICRO=$(g_KV_micro "$1")+	local KV_int=$(( KV_MAJOR * 65536 + KV_MINOR * 256 + KV_MICRO ))++	# We make version 2.2.0 the minimum version we will handle as+	# a sanity check ... if its less, we fail ...+	if [[ ${KV_int} -ge 131584 ]] ; then+		echo "${KV_int}"+		return 0+	fi+	return 1+}++g_int_to_KV() {+	local version=$1 major minor micro+	major=$((version / 65536))+	minor=$(((version % 65536) / 256))+	micro=$((version % 256))+	echo ${major}.${minor}.${micro}+}++eend_KV() {+	[[ $(g_KV_to_int $1) -ge $(g_KV_to_int $2) ]]+	eend $?+}++get_kheader_version() {+	printf '#include <linux/version.h>\nLINUX_VERSION_CODE\n' | \+	$(tc-getCPP ${CTARGET}) -I "$(build_eprefix)$(alt_build_headers)" - | \+	tail -n 1+}++# We collect all sanity checks here. Consistency is not guranteed between+# pkg_ and src_ phases, so we call this function both in pkg_pretend and in+# src_unpack.+sanity_prechecks() {+	# Prevent native builds from downgrading+	if [[ ${MERGE_TYPE} != "buildonly" ]] && \+	   [[ -z ${ROOT} ]] && \+	   [[ ${CBUILD} == ${CHOST} ]] && \+	   [[ ${CHOST} == ${CTARGET} ]] ; then++		# The high rev # is to allow people to downgrade between -r#+		# versions. We want to block 2.20->2.19, but 2.20-r3->2.20-r2+		# should be fine. Hopefully we never actually use a r# this+		# high.+		if has_version ">${CATEGORY}/${P}-r10000" ; then+			eerror "Sanity check to keep you from breaking your system:"+			eerror " Downgrading glibc is not supported and a sure way to destruction."+			[[ ${I_ALLOW_TO_BREAK_MY_SYSTEM} = yes ]] || die "Aborting to save your system."+		fi++		if ! do_run_test '#include <unistd.h>\n#include <sys/syscall.h>\nint main(){return syscall(1000)!=-1;}\n' ; then+			eerror "Your old kernel is broken. You need to update it to a newer"+			eerror "version as syscall(<bignum>) will break. See bug 279260."+			die "Old and broken kernel."+		fi+	fi++	# Users have had a chance to phase themselves, time to give em the boot+	if [[ -e ${EROOT}/etc/locale.gen ]] && [[ -e ${EROOT}/etc/locales.build ]] ; then+		eerror "You still haven't deleted ${EROOT}/etc/locales.build."+		eerror "Do so now after making sure ${EROOT}/etc/locale.gen is kosher."+		die "Lazy upgrader detected"+	fi++	if [[ ${CTARGET} == i386-* ]] ; then+		eerror "i386 CHOSTs are no longer supported."+		eerror "Chances are you don't actually want/need i386."+		eerror "Please read https://www.gentoo.org/doc/en/change-chost.xml"+		die "Please fix your CHOST"+	fi++	if [[ -e /proc/xen ]] && [[ $(tc-arch) == "x86" ]] && ! is-flag -mno-tls-direct-seg-refs ; then+		ewarn "You are using Xen but don't have -mno-tls-direct-seg-refs in your CFLAGS."+		ewarn "This will result in a 50% performance penalty when running with a 32bit"+		ewarn "hypervisor, which is probably not what you want."+	fi++	# ABI-specific checks follow here. Hey, we have a lot more specific conditions that+	# we test for...+	if ! is_crosscompile ; then+		if use amd64 && use multilib && [[ ${MERGE_TYPE} != "binary" ]] ; then+			ebegin "Checking that IA32 emulation is enabled in the running kernel"+			echo 'int main(){return 0;}' > "${T}/check-ia32-emulation.c"+			local STAT+			if "${CC-${CHOST}-gcc}" ${CFLAGS_x86} "${T}/check-ia32-emulation.c" -o "${T}/check-ia32-emulation.elf32"; then+				"${T}/check-ia32-emulation.elf32"+				STAT=$?+			else+				# Don't fail here to allow single->multi ABI switch+				# or recover from breakage like bug #646424+				ewarn "Failed to compile the ABI test. Broken host glibc?"+				STAT=0+			fi+			rm -f "${T}/check-ia32-emulation.elf32"+			eend $STAT+			[[ $STAT -eq 0 ]] || die "CONFIG_IA32_EMULATION must be enabled in the kernel to compile a multilib glibc."+		fi++	fi++	# When we actually have to compile something...+	if ! just_headers ; then+		ebegin "Checking gcc for __thread support"+		if ! eend $(want__thread ; echo $?) ; then+			echo+			eerror "Could not find a gcc that supports the __thread directive!"+			eerror "Please update your binutils/gcc and try again."+			die "No __thread support in gcc!"+		fi++		if [[ ${CTARGET} == *-linux* ]] ; then+			local run_kv build_kv want_kv++			run_kv=$(g_get_running_KV)+			build_kv=$(g_int_to_KV $(get_kheader_version))+			want_kv=${MIN_KERN_VER}++			if ! is_crosscompile && ! tc-is-cross-compiler ; then+				# Building fails on an non-supporting kernel+				ebegin "Checking running kernel version (${run_kv} >= ${want_kv})"+				if ! eend_KV ${run_kv} ${want_kv} ; then+					echo+					eerror "You need a kernel of at least ${want_kv}!"+					die "Kernel version too low!"+				fi+			fi++			ebegin "Checking linux-headers version (${build_kv} >= ${want_kv})"+			if ! eend_KV ${build_kv} ${want_kv} ; then+				echo+				eerror "You need linux-headers of at least ${want_kv}!"+				die "linux-headers version too low!"+			fi+		fi+	fi+}++#+# the phases+#++# pkg_pretend++pkg_pretend() {+	# All the checks...+	einfo "Checking general environment sanity."+	sanity_prechecks+}++pkg_setup() {+	# see bug 682570+	[[ -z ${BOOTSTRAP_RAP} ]] && python-any-r1_pkg_setup+}++# src_unpack++src_unpack() {+	# Consistency is not guaranteed between pkg_ and src_ ...+	sanity_prechecks++	use multilib-bootstrap && unpack gcc-multilib-bootstrap-${GCC_BOOTSTRAP_VER}.tar.xz++	setup_env++	if [[ ${PV} == 9999* ]] ; then+		EGIT_REPO_URI="https://anongit.gentoo.org/git/proj/toolchain/glibc-patches.git"+		EGIT_CHECKOUT_DIR=${WORKDIR}/patches-git+		git-r3_src_unpack+		mv patches-git/9999 patches || die++		EGIT_REPO_URI="https://sourceware.org/git/glibc.git"+		EGIT_CHECKOUT_DIR=${S}+		git-r3_src_unpack+	else+		unpack ${P}.tar.xz++		cd "${WORKDIR}" || die+		unpack glibc-${RELEASE_VER}-patches-${PATCH_VER}.tar.xz+	fi++	cd "${WORKDIR}" || die+	unpack locale-gen-${LOCALE_GEN_VER}.tar.gz+}++src_prepare() {+	local patchsetname+	if ! use vanilla ; then+		if [[ ${PV} == 9999* ]] ; then+			patchsetname="from git master"+		else+			patchsetname="${RELEASE_VER}-${PATCH_VER}"+		fi+		einfo "Applying Gentoo Glibc Patchset ${patchsetname}"+		eapply "${WORKDIR}"/patches+		einfo "Done."+	fi++	default++	gnuconfig_update++	cd "${WORKDIR}"+	find . -name configure -exec touch {} +++	# move the external locale-gen to its old place+	mkdir extra || die+	mv locale-gen-${LOCALE_GEN_VER} extra/locale || die++	eprefixify extra/locale/locale-gen++	# Fix permissions on some of the scripts.+	chmod u+x "${S}"/scripts/*.sh++	cd "${S}"+}++glibc_do_configure() {+	# Glibc does not work with gold (for various reasons) #269274.+	tc-ld-disable-gold++	# CXX isnt handled by the multilib system, so if we dont unset here+	# we accumulate crap across abis+	unset CXX++	einfo "Configuring glibc for nptl"++	if use doc ; then+		export MAKEINFO=makeinfo+	else+		export MAKEINFO=/dev/null+	fi++	local v+	for v in ABI CBUILD CHOST CTARGET CBUILD_OPT CTARGET_OPT CC CXX LD {AS,C,CPP,CXX,LD}FLAGS MAKEINFO NM READELF; do+		einfo " $(printf '%15s' ${v}:)   ${!v}"+	done++	# CFLAGS can contain ABI-specific flags like -mfpu=neon, see bug #657760+	# To build .S (assembly) files with the same ABI-specific flags+	# upstream currently recommends adding CFLAGS to CC/CXX:+	#    https://sourceware.org/PR23273+	# Note: Passing CFLAGS via CPPFLAGS overrides glibc's arch-specific CFLAGS+	# and breaks multiarch support. See 659030#c3 for an example.+	# The glibc configure script doesn't properly use LDFLAGS all the time.+	export CC="$(tc-getCC ${CTARGET}) ${CFLAGS} ${LDFLAGS}"+	einfo " $(printf '%15s' 'Manual CC:')   ${CC}"++	# Some of the tests are written in C++, so we need to force our multlib abis in, bug 623548+	export CXX="$(tc-getCXX ${CTARGET}) $(get_abi_CFLAGS) ${CFLAGS}"++	if is_crosscompile; then+		# Assume worst-case bootstrap: glibc is buil first time+		# when ${CTARGET}-g++ is not available yet. We avoid+		# building auxiliary programs that require C++: bug #683074+		# It should not affect final result.+		export libc_cv_cxx_link_ok=no+		# The line above has the same effect. We set CXX explicitly+		# to make build logs less confusing.+		export CXX=+	fi+	einfo " $(printf '%15s' 'Manual CXX:')   ${CXX}"++	# Always use tuple-prefixed toolchain. For non-native ABI glibc's configure+	# can't detect them automatically due to ${CHOST} mismatch and fallbacks+	# to unprefixed tools. Similar to multilib.eclass:multilib_toolchain_setup().+	export NM="$(tc-getNM ${CTARGET})"+	export READELF="$(tc-getREADELF ${CTARGET})"+	einfo " $(printf '%15s' 'Manual NM:')   ${NM}"+	einfo " $(printf '%15s' 'Manual READELF:')   ${READELF}"++	echo++	local myconf=()++	case ${CTARGET} in+		m68k*)+			# setjmp() is not compatible with stack protection:+			# https://sourceware.org/PR24202+			myconf+=( --enable-stack-protector=no )+			;;+		*)+			# Use '=strong' instead of '=all' to protect only functions+			# worth protecting from stack smashes.+			# '=all' is also known to have a problem in IFUNC resolution+			# tests: https://sourceware.org/PR25680, bug #712356.+			myconf+=( --enable-stack-protector=$(usex ssp strong no) )+			;;+	esac+	myconf+=( --enable-stackguard-randomization )++	# Keep a whitelist of targets supporing IFUNC. glibc's ./configure+	# is not robust enough to detect proper support:+	#    https://bugs.gentoo.org/641216+	#    https://sourceware.org/PR22634#c0+	case $(tc-arch ${CTARGET}) in+		# Keep whitelist of targets where autodetection mostly works.+		amd64|x86|sparc|ppc|ppc64|arm|arm64|s390) ;;+		# Blacklist everywhere else+		*) myconf+=( libc_cv_ld_gnu_indirect_function=no ) ;;+	esac++	# Enable Intel Control-flow Enforcement Technology on amd64 if requested+	case ${CTARGET} in+		x86_64-*) myconf+=( $(use_enable cet) ) ;;+		*) ;;+	esac++	[[ $(tc-is-softfloat) == "yes" ]] && myconf+=( --without-fp )++	myconf+=( --enable-kernel=${MIN_KERN_VER} )++	# Since SELinux support is only required for nscd, only enable it if:+	# 1. USE selinux+	# 2. only for the primary ABI on multilib systems+	# 3. Not a crosscompile+	if ! is_crosscompile && use selinux ; then+		if use multilib ; then+			if is_final_abi ; then+				myconf+=( --with-selinux )+			else+				myconf+=( --without-selinux )+			fi+		else+			myconf+=( --with-selinux )+		fi+	else+		myconf+=( --without-selinux )+	fi++	# Force a few tests where we always know the answer but+	# configure is incapable of finding it.+	if is_crosscompile ; then+		export \+			libc_cv_c_cleanup=yes \+			libc_cv_forced_unwind=yes+	fi++	myconf+=(+		--without-cvs+		--disable-werror+		--enable-bind-now+		--build=${CBUILD_OPT:-${CBUILD}}+		--host=${CTARGET_OPT:-${CTARGET}}+		$(use_enable profile)+		$(use_with gd)+		--with-headers=$(build_eprefix)$(alt_build_headers)+		--prefix="$(host_eprefix)/usr"+		--sysconfdir="$(host_eprefix)/etc"+		--localstatedir="$(host_eprefix)/var"+		--libdir='$(prefix)'/$(get_libdir)+		--mandir='$(prefix)'/share/man+		--infodir='$(prefix)'/share/info+		--libexecdir='$(libdir)'/misc/glibc+		--with-bugurl=https://bugs.gentoo.org/+		--with-pkgversion="$(glibc_banner)"+		$(use_enable crypt)+		$(use_multiarch || echo --disable-multi-arch)+		$(use_enable static-pie)+		$(use_enable systemtap)+		$(use_enable nscd)++		# locale data is arch-independent+		# https://bugs.gentoo.org/753740+		libc_cv_complocaledir='${exec_prefix}/lib/locale'++		# -march= option tricks build system to infer too+		# high ISA level: https://sourceware.org/PR27318+		libc_cv_include_x86_isa_level=no+		# Explicit override of https://sourceware.org/PR27991+		# exposes a bug in glibc's configure:+		# https://sourceware.org/PR27991+		libc_cv_have_x86_lahf_sahf=no+		libc_cv_have_x86_movbe=no++		${EXTRA_ECONF}+	)++	# We rely on sys-libs/timezone-data for timezone tools normally.+	myconf+=( $(use_enable vanilla timezone-tools) )++	# These libs don't have configure flags.+	ac_cv_lib_audit_audit_log_user_avc_message=$(usex audit || echo no)+	ac_cv_lib_cap_cap_init=$(usex caps || echo no)++	# There is no configure option for this and we need to export it+	# since the glibc build will re-run configure on itself+	export libc_cv_rootsbindir="$(host_eprefix)/sbin"+	export libc_cv_slibdir="$(host_eprefix)/$(get_libdir)"++	# We take care of patching our binutils to use both hash styles,+	# and many people like to force gnu hash style only, so disable+	# this overriding check.  #347761+	export libc_cv_hashstyle=no++	local builddir=$(builddir nptl)+	mkdir -p "${builddir}"+	cd "${builddir}"+	set -- "${S}"/configure "${myconf[@]}"+	echo "$@"+	"$@" || die "failed to configure glibc"++	# ia64 static cross-compilers are a pita in so much that they+	# can't produce static ELFs (as the libgcc.a is broken).  so+	# disable building of the programs for those targets if it+	# doesn't work.+	# XXX: We could turn this into a compiler test, but ia64 is+	# the only one that matters, so this should be fine for now.+	if is_crosscompile && [[ ${CTARGET} == ia64* ]] ; then+		sed -i '1i+link-static = touch $@' config.make+	fi++	# If we're trying to migrate between ABI sets, we need+	# to lie and use a local copy of gcc.  Like if the system+	# is built with MULTILIB_ABIS="amd64 x86" but we want to+	# add x32 to it, gcc/glibc don't yet support x32.+	#+	if [[ -n ${GCC_BOOTSTRAP_VER} ]] && use multilib-bootstrap ; then+		echo 'main(){}' > "${T}"/test.c+		if ! $(tc-getCC ${CTARGET}) ${CFLAGS} ${LDFLAGS} "${T}"/test.c -Wl,-emain -lgcc 2>/dev/null ; then+			sed -i -e '/^CC = /s:$: -B$(objdir)/../'"gcc-multilib-bootstrap-${GCC_BOOTSTRAP_VER}/${ABI}:" config.make || die+		fi+	fi+}++glibc_headers_configure() {+	export ABI=default++	local builddir=$(builddir "headers")+	mkdir -p "${builddir}"+	cd "${builddir}"++	# if we don't have a compiler yet, we can't really test it now ...+	# hopefully they don't affect header generation, so let's hope for+	# the best here ...+	local v vars=(+		ac_cv_header_cpuid_h=yes+		libc_cv_{386,390,alpha,arm,hppa,ia64,mips,{powerpc,sparc}{,32,64},sh,x86_64}_tls=yes+		libc_cv_asm_cfi_directives=yes+		libc_cv_broken_visibility_attribute=no+		libc_cv_c_cleanup=yes+		libc_cv_compiler_powerpc64le_binary128_ok=yes+		libc_cv_forced_unwind=yes+		libc_cv_gcc___thread=yes+		libc_cv_mlong_double_128=yes+		libc_cv_mlong_double_128ibm=yes+		libc_cv_ppc_machine=yes+		libc_cv_ppc_rel16=yes+		libc_cv_predef_fortify_source=no+		libc_cv_target_power8_ok=yes+		libc_cv_visibility_attribute=yes+		libc_cv_z_combreloc=yes+		libc_cv_z_execstack=yes+		libc_cv_z_initfirst=yes+		libc_cv_z_nodelete=yes+		libc_cv_z_nodlopen=yes+		libc_cv_z_relro=yes+		libc_mips_abi=${ABI}+		libc_mips_float=$([[ $(tc-is-softfloat) == "yes" ]] && echo soft || echo hard)+		# These libs don't have configure flags.+		ac_cv_lib_audit_audit_log_user_avc_message=no+		ac_cv_lib_cap_cap_init=no+	)++	einfo "Forcing cached settings:"+	for v in "${vars[@]}" ; do+		einfo " ${v}"+		export ${v}+	done++	local headers_only_arch_CPPFLAGS=()++	# Blow away some random CC settings that screw things up. #550192+	if [[ -d ${S}/sysdeps/mips ]]; then+		pushd "${S}"/sysdeps/mips >/dev/null+		sed -i -e '/^CC +=/s:=.*:= -D_MIPS_SZPTR=32:' mips32/Makefile mips64/n32/Makefile || die+		sed -i -e '/^CC +=/s:=.*:= -D_MIPS_SZPTR=64:' mips64/n64/Makefile || die++		# Force the mips ABI to the default.  This is OK because the set of+		# installed headers in this phase is the same between the 3 ABIs.+		# If this ever changes, this hack will break, but that's unlikely+		# as glibc discourages that behavior.+		# https://crbug.com/647033+		sed -i -e 's:abiflag=.*:abiflag=_ABIO32:' preconfigure || die++		popd >/dev/null+	fi++	case ${CTARGET} in+	riscv*)+		# RISC-V interrogates the compiler to determine which target to+		# build.  If building the headers then we don't strictly need a+		# RISC-V compiler, so the built-in definitions that are provided+		# along with all RISC-V compiler might not exist.  This causes+		# glibc's RISC-V preconfigure script to blow up.  Since we're just+		# building the headers any value will actually work here, so just+		# pick the standard one (rv64g/lp64d) to make the build scripts+		# happy for now -- the headers are all the same anyway so it+		# doesn't matter.+		headers_only_arch_CPPFLAGS+=(+			-D__riscv_xlen=64+			-D__riscv_flen=64+			-D__riscv_float_abi_double=1+			-D__riscv_atomic=1+		) ;;+	esac++	local myconf=()+	myconf+=(+		--disable-sanity-checks+		--enable-hacker-mode+		--without-cvs+		--disable-werror+		--enable-bind-now+		--build=${CBUILD_OPT:-${CBUILD}}+		--host=${CTARGET_OPT:-${CTARGET}}+		--with-headers=$(build_eprefix)$(alt_build_headers)+		--prefix="$(host_eprefix)/usr"+		${EXTRA_ECONF}+	)++	# Nothing is compiled here which would affect the headers for the target.+	# So forcing CC/CFLAGS is sane.+	local headers_only_CC=$(tc-getBUILD_CC)+	local headers_only_CFLAGS="-O1 -pipe"+	local headers_only_CPPFLAGS="-U_FORTIFY_SOURCE ${headers_only_arch_CPPFLAGS[*]}"+	local headers_only_LDFLAGS=""+	set -- "${S}"/configure "${myconf[@]}"+	echo \+		"CC=${headers_only_CC}" \+		"CFLAGS=${headers_only_CFLAGS}" \+		"CPPFLAGS=${headers_only_CPPFLAGS}" \+		"LDFLAGS=${headers_only_LDFLAGS}" \+		"$@"+	CC=${headers_only_CC} \+	CFLAGS=${headers_only_CFLAGS} \+	CPPFLAGS=${headers_only_CPPFLAGS} \+	LDFLAGS="" \+	"$@" || die "failed to configure glibc"+}++do_src_configure() {+	if just_headers ; then+		glibc_headers_configure+	else+		glibc_do_configure nptl+	fi+}++src_configure() {+	foreach_abi do_src_configure+}++do_src_compile() {+	emake -C "$(builddir nptl)"+}++src_compile() {+	if just_headers ; then+		return+	fi++	foreach_abi do_src_compile+}++glibc_src_test() {+	cd "$(builddir nptl)"++	local myxfailparams=""+	if [[ "${GENTOO_GLIBC_XFAIL_TESTS}" == "yes" ]] ; then+		for myt in ${XFAIL_TEST_LIST[@]} ; do+			myxfailparams+="test-xfail-${myt}=yes "+		done+	fi++	# sandbox does not understand unshare() and prevents+	# writes to /proc/, which makes many tests fail++	SANDBOX_ON=0 LD_PRELOAD= emake ${myxfailparams} check+}++do_src_test() {+	local ret=0++	glibc_src_test+	: $(( ret |= $? ))++	return ${ret}+}++src_test() {+	if just_headers ; then+		return+	fi++	# Give tests more time to complete.+	export TIMEOUTFACTOR=5++	foreach_abi do_src_test || die "tests failed"+}++run_locale_gen() {+	# if the host locales.gen contains no entries, we'll install everything+	local root="$1"+	local inplace=""++	if [[ "${root}" == "--inplace-glibc" ]] ; then+		inplace="--inplace-glibc"+		root="$2"+	fi++	local locale_list="${root}/etc/locale.gen"++	pushd "${ED}"/$(get_libdir) >/dev/null++	if [[ -z $(locale-gen --list --config "${locale_list}") ]] ; then+		[[ -z ${inplace} ]] && ewarn "Generating all locales; edit /etc/locale.gen to save time/space"+		locale_list="${root}/usr/share/i18n/SUPPORTED"+	fi++	set -- locale-gen ${inplace} --jobs $(makeopts_jobs) --config "${locale_list}" \+		--destdir "${root}"+	echo "$@"+	"$@"++	popd >/dev/null+}++glibc_do_src_install() {+	local builddir=$(builddir nptl)+	cd "${builddir}"++	emake install_root="${D}/$(build_eprefix)$(alt_prefix)" install++	# This version (2.26) provides some compatibility libraries for the NIS/NIS+ support+	# which come without headers etc. Only needed for binary packages since the+	# external net-libs/libnsl has increased soversion. Keep only versioned libraries.+	find "${D}" -name "libnsl.a" -delete+	find "${D}" -name "libnsl.so" -delete++	# Normally upstream_pv is ${PV}. Live ebuilds are exception, there we need+	# to infer upstream version:+	# '#define VERSION "2.26.90"' -> '2.26.90'+	local upstream_pv=$(sed -n -r 's/#define VERSION "(.*)"/\1/p' "${S}"/version.h)++	# Avoid stripping binaries not targeted by ${CHOST}. Or else+	# ${CHOST}-strip would break binaries build for ${CTARGET}.+	is_crosscompile && dostrip -x /+	# gdb thread introspection relies on local libpthreas symbols. stripping breaks it+	# See Note [Disable automatic stripping]+	dostrip -x $(alt_libdir)/libpthread-${upstream_pv}.so++	if [[ -e ${ED}/$(alt_usrlibdir)/libm-${upstream_pv}.a ]] ; then+		# Move versioned .a file out of libdir to evade portage QA checks+		# instead of using gen_usr_ldscript(). We fix ldscript as:+		# "GROUP ( /usr/lib64/libm-<pv>.a ..." -> "GROUP ( /usr/lib64/glibc-<pv>/libm-<pv>.a ..."+		sed -i "s@\(libm-${upstream_pv}.a\)@${P}/\1@" "${ED}"/$(alt_usrlibdir)/libm.a || die+		dodir $(alt_usrlibdir)/${P}+		mv "${ED}"/$(alt_usrlibdir)/libm-${upstream_pv}.a "${ED}"/$(alt_usrlibdir)/${P}/libm-${upstream_pv}.a || die+	fi++	# We'll take care of the cache ourselves+	rm -f "${ED}"/etc/ld.so.cache++	# Everything past this point just needs to be done once ...+	is_final_abi || return 0++	# Make sure the non-native interp can be found on multilib systems even+	# if the main library set isn't installed into the right place.  Maybe+	# we should query the active gcc for info instead of hardcoding it ?+	local i ldso_abi ldso_name+	local ldso_abi_list=(+		# x86+		amd64   /lib64/ld-linux-x86-64.so.2+		x32     /libx32/ld-linux-x32.so.2+		x86     /lib/ld-linux.so.2+		# mips+		o32     /lib/ld.so.1+		n32     /lib32/ld.so.1+		n64     /lib64/ld.so.1+		# powerpc+		ppc     /lib/ld.so.1+		# riscv+		ilp32d  /lib/ld-linux-riscv32-ilp32d.so.1+		ilp32   /lib/ld-linux-riscv32-ilp32.so.1+		lp64d   /lib/ld-linux-riscv64-lp64d.so.1+		lp64    /lib/ld-linux-riscv64-lp64.so.1+		# s390+		s390    /lib/ld.so.1+		s390x   /lib/ld64.so.1+		# sparc+		sparc32 /lib/ld-linux.so.2+		sparc64 /lib64/ld-linux.so.2+	)+	case $(tc-endian) in+	little)+		ldso_abi_list+=(+			# arm+			arm64   /lib/ld-linux-aarch64.so.1+			# ELFv2 (glibc does not support ELFv1 on LE)+			ppc64   /lib64/ld64.so.2+		)+		;;+	big)+		ldso_abi_list+=(+			# arm+			arm64   /lib/ld-linux-aarch64_be.so.1+			# ELFv1 (glibc does not support ELFv2 on BE)+			ppc64   /lib64/ld64.so.1+		)+		;;+	esac+	if [[ ${SYMLINK_LIB} == "yes" ]] && [[ ! -e ${ED}/$(alt_prefix)/lib ]] ; then+		dosym $(get_abi_LIBDIR ${DEFAULT_ABI}) $(alt_prefix)/lib+	fi+	for (( i = 0; i < ${#ldso_abi_list[@]}; i += 2 )) ; do+		ldso_abi=${ldso_abi_list[i]}+		has ${ldso_abi} $(get_install_abis) || continue++		ldso_name="$(alt_prefix)${ldso_abi_list[i+1]}"+		if [[ ! -L ${ED}/${ldso_name} && ! -e ${ED}/${ldso_name} ]] ; then+			dosym ../$(get_abi_LIBDIR ${ldso_abi})/${ldso_name##*/} ${ldso_name}+		fi+	done++	# In the LSB 5.0 definition, someone had the excellent idea to "standardize"+	# the runtime loader name, see also https://xkcd.com/927/+	# Normally, in Gentoo one should never come across executables that require this.+	# However, binary commercial packages are known to adhere to weird practices.+	# https://refspecs.linuxfoundation.org/LSB_5.0.0/LSB-Core-AMD64/LSB-Core-AMD64.html#BASELIB+	local lsb_ldso_name native_ldso_name lsb_ldso_abi+	local lsb_ldso_abi_list=(+		# x86+		amd64	ld-linux-x86-64.so.2	ld-lsb-x86-64.so.3+	)+	for (( i = 0; i < ${#lsb_ldso_abi_list[@]}; i += 3 )) ; do+		lsb_ldso_abi=${lsb_ldso_abi_list[i]}+		native_ldso_name=${lsb_ldso_abi_list[i+1]}+		lsb_ldso_name=${lsb_ldso_abi_list[i+2]}+		has ${lsb_ldso_abi} $(get_install_abis) || continue++		if [[ ! -L ${ED}/$(get_abi_LIBDIR ${lsb_ldso_abi})/${lsb_ldso_name} && ! -e ${ED}/$(get_abi_LIBDIR ${lsb_ldso_abi})/${lsb_ldso_name} ]] ; then+			dosym ${native_ldso_name} "$(alt_prefix)/$(get_abi_LIBDIR ${lsb_ldso_abi})/${lsb_ldso_name}"+		fi+	done++	# With devpts under Linux mounted properly, we do not need the pt_chown+	# binary to be setuid.  This is because the default owners/perms will be+	# exactly what we want.+	if ! use suid ; then+		find "${ED}" -name pt_chown -exec chmod -s {} ++	fi++	#################################################################+	# EVERYTHING AFTER THIS POINT IS FOR NATIVE GLIBC INSTALLS ONLY #+	# Make sure we install some symlink hacks so that when we build+	# a 2nd stage cross-compiler, gcc finds the target system+	# headers correctly.  See gcc/doc/gccinstall.info+	if is_crosscompile ; then+		# We need to make sure that /lib and /usr/lib always exists.+		# gcc likes to use relative paths to get to its multilibs like+		# /usr/lib/../lib64/.  So while we don't install any files into+		# /usr/lib/, we do need it to exist.+		keepdir $(alt_prefix)/lib+		keepdir $(alt_prefix)/usr/lib++		dosym usr/include $(alt_prefix)/sys-include+		return 0+	fi++	# Files for Debian-style locale updating+	dodir /usr/share/i18n+	sed \+		-e "/^#/d" \+		-e "/SUPPORTED-LOCALES=/d" \+		-e "s: \\\\::g" -e "s:/: :g" \+		"${S}"/localedata/SUPPORTED > "${ED}"/usr/share/i18n/SUPPORTED \+		|| die "generating /usr/share/i18n/SUPPORTED failed"+	cd "${WORKDIR}"/extra/locale+	dosbin locale-gen+	doman *.[0-8]+	insinto /etc+	doins locale.gen++	keepdir /usr/lib/locale++	cd "${S}"++	# Install misc network config files+	insinto /etc+	doins posix/gai.conf nss/nsswitch.conf++	# Gentoo-specific+	newins "${FILESDIR}"/host.conf-1 host.conf++	if use nscd ; then+		doins nscd/nscd.conf++		newinitd "$(prefixify_ro "${FILESDIR}"/nscd-1)" nscd++		local nscd_args=(+			-e "s:@PIDFILE@:$(strings "${ED}"/usr/sbin/nscd | grep nscd.pid):"+		)++		sed -i "${nscd_args[@]}" "${ED}"/etc/init.d/nscd++		systemd_dounit nscd/nscd.service+		newtmpfiles nscd/nscd.tmpfiles nscd.conf+	fi++	echo 'LDPATH="include ld.so.conf.d/*.conf"' > "${T}"/00glibc+	doenvd "${T}"/00glibc++	for d in BUGS ChangeLog CONFORMANCE FAQ NEWS NOTES PROJECTS README* ; do+		[[ -s ${d} ]] && dodoc ${d}+	done+	dodoc -r ChangeLog.old++	# Prevent overwriting of the /etc/localtime symlink.  We'll handle the+	# creation of the "factory" symlink in pkg_postinst().+	rm -f "${ED}"/etc/localtime++	# Generate all locales if this is a native build as locale generation+	if use compile-locales && ! is_crosscompile ; then+		run_locale_gen --inplace-glibc "${ED}/"+		sed -e 's:COMPILED_LOCALES="":COMPILED_LOCALES="1":' -i "${ED}"/usr/sbin/locale-gen || die+	fi+}++glibc_headers_install() {+	local builddir=$(builddir "headers")+	cd "${builddir}"+	emake install_root="${D}/$(build_eprefix)$(alt_prefix)" install-headers++	insinto $(alt_headers)/gnu+	doins "${S}"/include/gnu/stubs.h++	# Make sure we install the sys-include symlink so that when+	# we build a 2nd stage cross-compiler, gcc finds the target+	# system headers correctly.  See gcc/doc/gccinstall.info+	dosym usr/include $(alt_prefix)/sys-include+}++src_install() {+	if just_headers ; then+		export ABI=default+		glibc_headers_install+		return+	fi++	foreach_abi glibc_do_src_install++	if ! use static-libs ; then+		einfo "Not installing static glibc libraries"+		find "${ED}" -name "*.a" -and -not -name "*_nonshared.a" -delete+	fi+}++# Simple test to make sure our new glibc isn't completely broken.+# Make sure we don't test with statically built binaries since+# they will fail.  Also, skip if this glibc is a cross compiler.+#+# If coreutils is built with USE=multicall, some of these files+# will just be wrapper scripts, not actual ELFs we can test.+glibc_sanity_check() {+	cd / #228809++	# We enter ${ED} so to avoid trouble if the path contains+	# special characters; for instance if the path contains the+	# colon character (:), then the linker will try to split it+	# and look for the libraries in an unexpected place. This can+	# lead to unsafe code execution if the generated prefix is+	# within a world-writable directory.+	# (e.g. /var/tmp/portage:${HOSTNAME})+	pushd "${ED}"/$(get_libdir) >/dev/null++	local x striptest+	for x in cal date env free ls true uname uptime ; do+		x=$(type -p ${x})+		[[ -z ${x} || ${x} != ${EPREFIX}/* ]] && continue+		striptest=$(LC_ALL="C" file -L ${x} 2>/dev/null) || continue+		case ${striptest} in+		*"statically linked"*) continue;;+		*"ASCII text"*) continue;;+		esac+		# We need to clear the locale settings as the upgrade might want+		# incompatible locale data.  This test is not for verifying that.+		LC_ALL=C \+		./ld-*.so --library-path . ${x} > /dev/null \+			|| die "simple run test (${x}) failed"+	done++	popd >/dev/null+}++pkg_preinst() {+	# nothing to do if just installing headers+	just_headers && return++	# prepare /etc/ld.so.conf.d/ for files+	mkdir -p "${EROOT}"/etc/ld.so.conf.d++	# Default /etc/hosts.conf:multi to on for systems with small dbs.+	if [[ $(wc -l < "${EROOT}"/etc/hosts) -lt 1000 ]] ; then+		sed -i '/^multi off/s:off:on:' "${ED}"/etc/host.conf+		einfo "Defaulting /etc/host.conf:multi to on"+	fi++	[[ -n ${ROOT} ]] && return 0+	[[ -d ${ED}/$(get_libdir) ]] || return 0+	[[ -z ${BOOTSTRAP_RAP} ]] && glibc_sanity_check++	if [[ -L ${EROOT}/usr/lib/locale ]]; then+		# Help portage migrate this to a directory+		# https://bugs.gentoo.org/753740+		rm "${EROOT}"/usr/lib/locale || die+	fi++	# Keep around libcrypt so that Perl doesn't break when merging libxcrypt+	# (libxcrypt is the new provider for now of libcrypt.so.{1,2}).+	# bug #802207+	if use crypt; then

This use crypt is called in pkg_preinst() phase, so it will return result for newly installed instance of glibc, not previously installed instance. You should use:

	if has_version "${CATEGORY}/${PN}[crypt]"; then
thesamesam

comment created time in 2 months

PullRequestReviewEvent

Pull request review commentgentoo/devmanual

general-concepts/slotting: develop subslot subsection, discuss ABI breakage

 Other ebuilds that install binaries which link to <c>libfoo-2</c> (or <c>libfoo< can then request to be automatically rebuilt when the installed version of <c>foo:2</c> or <c>foo:1</c> changes sub-slots <d/> for example, when the user upgrades from <c>foo-2.0</c> to <c>foo-2.1</c>.-If an ebuild does not explicitly declare a sub-slot, the regular slot is used-as the value of the sub-slot by default. </p>+</body>+</subsubsection>++<subsubsection>+<title>Multiple libraries within a single package</title>+<body>  <p>-You may wish to review the-<uri link="https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Subslots">-QA team's documentation on subslots</uri>.+A package might need to install several libraries. The canonical example+of this is <c>media-video/ffmpeg</c>: </p> -<note>-Care must be taken when using sub-slots in a library ebuild for the first time.-Adding sub-slots will trigger rebuilds for all the packages that already use sub-slot-dependencies (e.g. Switching from SLOT="0" to SLOT="0/14" in <c>media-libs/libpng</c> and-package <c>foo</c> depends on <c>libpng:0=</c>).-Therefore, it's best if you start using sub-slots in the library when the existing library-interface changes.-</note>+<codesample lang="ebuild">+# Subslot: &lt;libavutil_major&gt;.&lt;libavcodec_major&gt;.&lt;libavformat_major&gt;+# Since FFmpeg ships several libraries, subslot is kind of limited here.+# Most consumers will use those three libraries, if a "less used" library+# changes its soname, consumers will have to be rebuilt the old way+# (preserve-libs) - which should not be relied upon.+# If, for example, a package does not link to libavformat and only libavformat+# changes its ABI then this package will be rebuilt needlessly. Hence, such a+# package is free _not_ to := depend on FFmpeg but I would strongly encourage+# doing so since such a case is unlikely.+SLOT="0/56.58.58"+</codesample>++<p>+In such cases, make the subslot a composite of the major SONAMEs of each of+the installed libraries. This emphasises a point made above <d/> subslots do+not need to be equal to the exact SONAME of installed libraries, they only need

I have never seen them being equal to the exact SONAME, as that is usually libsomething.so.someversion, not just someversion, so you can re-phrase this part of sentence to e.g. the SONAME-derived version or the version derived from SONAME or (somehow less precise)the SONAME version.

thesamesam

comment created time in 3 months

PullRequestReviewEvent
PullRequestReviewEvent