[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gentoo-dev
Subject:    [gentoo-dev] [PATCH 01/21] sep-usr.eclass: new eclass to hold gen_usr_ldscript and related logic #41
From:       Mike Frysinger <vapier () gentoo ! org>
Date:       2016-03-30 23:58:20
Message-ID: 1459382320-20672-2-git-send-email-vapier () gentoo ! org
[Download RAW message or body]

This is mostly a copy of the func as it exists in the toolchain-funcs
eclass, but with some of the initial logic shifted to USE=sep-usr.
Once all ebuilds have switched over to this eclass, we can drop it
from the toolchain-funcs eclass.  In the meantime, make sure this is
inherited last.
---
 eclass/sep-usr.eclass | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++
 profiles/use.desc     |   1 +
 2 files changed, 153 insertions(+)
 create mode 100644 eclass/sep-usr.eclass

diff --git a/eclass/sep-usr.eclass b/eclass/sep-usr.eclass
new file mode 100644
index 0000000..c6791e1
--- /dev/null
+++ b/eclass/sep-usr.eclass
@@ -0,0 +1,152 @@
+# Copyright 1999-2016 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+# @ECLASS: sep-usr.eclass
+# @MAINTAINER:
+# Toolchain Ninjas <toolchain@gentoo.org>
+# @BLURB: functions to support a split /usr partition
+# @DESCRIPTION:
+# Some core packages might install extra files into / instead of /usr when
+# the expectation is that /usr is a separate mount point.  This eclass holds
+# various functions to simplify that process for ebuild writers.
+
+if [[ -z ${_SEP_USR_ECLASS} ]]; then
+_SEP_USR_ECLASS=1
+
+inherit multilib
+
+IUSE="sep-usr"
+
+# @FUNCTION: gen_usr_ldscript
+# @USAGE: [-a] <list of libs to create linker scripts for>
+# @DESCRIPTION:
+# This function generate linker scripts in /usr/lib for dynamic
+# libs in /lib.  This is to fix linking problems when you have
+# the .so in /lib, and the .a in /usr/lib.  What happens is that
+# in some cases when linking dynamic, the .a in /usr/lib is used
+# instead of the .so in /lib due to gcc/libtool tweaking ld's
+# library search path.  This causes many builds to fail.
+# See bug #4411 for more info.
+#
+# Note that you should in general use the unversioned name of
+# the library (libfoo.so), as ldconfig should usually update it
+# correctly to point to the latest version of the library present.
+gen_usr_ldscript() {
+	local lib libdir=$(get_libdir) output_format="" auto=false suffix=$(get_libname)
+	[[ -z ${ED+set} ]] && local ED=${D%/}${EPREFIX}/
+
+	# This code only matters when it's been enabled. #417451
+	use sep-usr || return 0
+
+	# We only care about stuffing / for the native ABI. #479448
+	if [[ $(type -t multilib_is_native_abi) == "function" ]] ; then
+		multilib_is_native_abi || return 0
+	fi
+
+	# Just make sure it exists
+	dodir /usr/${libdir}
+
+	if [[ $1 == "-a" ]] ; then
+		auto=true
+		shift
+		dodir /${libdir}
+	fi
+
+	# OUTPUT_FORMAT gives hints to the linker as to what binary format
+	# is referenced ... makes multilib saner
+	local flags=( ${CFLAGS} ${LDFLAGS} -Wl,--verbose )
+	if $(tc-getLD) --version | grep -q 'GNU gold' ; then
+		# If they're using gold, manually invoke the old bfd. #487696
+		local d="${T}/bfd-linker"
+		mkdir -p "${d}"
+		ln -sf $(which ${CHOST}-ld.bfd) "${d}"/ld
+		flags+=( -B"${d}" )
+	fi
+	output_format=$($(tc-getCC) "${flags[@]}" 2>&1 | sed -n \
's/^OUTPUT_FORMAT("\([^"]*\)",.*/\1/p') +	[[ -n ${output_format} ]] && \
output_format="OUTPUT_FORMAT ( ${output_format} )" +
+	for lib in "$@" ; do
+		local tlib
+		if ${auto} ; then
+			lib="lib${lib}${suffix}"
+		else
+			# Ensure /lib/${lib} exists to avoid dangling scripts/symlinks.
+			# This especially is for AIX where $(get_libname) can return ".a",
+			# so /lib/${lib} might be moved to /usr/lib/${lib} (by accident).
+			[[ -r ${ED}/${libdir}/${lib} ]] || continue
+			#TODO: better die here?
+		fi
+
+		case ${CTARGET:-${CHOST}} in
+		*-darwin*)
+			if ${auto} ; then
+				tlib=$(scanmacho -qF'%S#F' "${ED}"/usr/${libdir}/${lib})
+			else
+				tlib=$(scanmacho -qF'%S#F' "${ED}"/${libdir}/${lib})
+			fi
+			[[ -z ${tlib} ]] && die "unable to read install_name from ${lib}"
+			tlib=${tlib##*/}
+
+			if ${auto} ; then
+				mv "${ED}"/usr/${libdir}/${lib%${suffix}}.*${suffix#.} "${ED}"/${libdir}/ || die
+				# some install_names are funky: they encode a version
+				if [[ ${tlib} != ${lib%${suffix}}.*${suffix#.} ]] ; then
+					mv "${ED}"/usr/${libdir}/${tlib%${suffix}}.*${suffix#.} "${ED}"/${libdir}/ || \
die +				fi
+				rm -f "${ED}"/${libdir}/${lib}
+			fi
+
+			# Mach-O files have an id, which is like a soname, it tells how
+			# another object linking against this lib should reference it.
+			# Since we moved the lib from usr/lib into lib this reference is
+			# wrong.  Hence, we update it here.  We don't configure with
+			# libdir=/lib because that messes up libtool files.
+			# Make sure we don't lose the specific version, so just modify the
+			# existing install_name
+			if [[ ! -w "${ED}/${libdir}/${tlib}" ]] ; then
+				chmod u+w "${ED}${libdir}/${tlib}" # needed to write to it
+				local nowrite=yes
+			fi
+			install_name_tool \
+				-id "${EPREFIX}"/${libdir}/${tlib} \
+				"${ED}"/${libdir}/${tlib} || die "install_name_tool failed"
+			[[ -n ${nowrite} ]] && chmod u-w "${ED}${libdir}/${tlib}"
+			# Now as we don't use GNU binutils and our linker doesn't
+			# understand linker scripts, just create a symlink.
+			pushd "${ED}/usr/${libdir}" > /dev/null
+			ln -snf "../../${libdir}/${tlib}" "${lib}"
+			popd > /dev/null
+			;;
+		*)
+			if ${auto} ; then
+				tlib=$(scanelf -qF'%S#F' "${ED}"/usr/${libdir}/${lib})
+				[[ -z ${tlib} ]] && die "unable to read SONAME from ${lib}"
+				mv "${ED}"/usr/${libdir}/${lib}* "${ED}"/${libdir}/ || die
+				# some SONAMEs are funky: they encode a version before the .so
+				if [[ ${tlib} != ${lib}* ]] ; then
+					mv "${ED}"/usr/${libdir}/${tlib}* "${ED}"/${libdir}/ || die
+				fi
+				rm -f "${ED}"/${libdir}/${lib}
+			else
+				tlib=${lib}
+			fi
+			cat > "${ED}/usr/${libdir}/${lib}" <<-END_LDSCRIPT
+			/* GNU ld script
+			   Since Gentoo has critical dynamic libraries in /lib, and the static versions
+			   in /usr/lib, we need to have a "fake" dynamic lib in /usr/lib, otherwise we
+			   run into linking problems.  This "fake" dynamic lib is a linker script that
+			   redirects the linker to the real lib.  And yes, this works in the cross-
+			   compiling scenario as the sysroot-ed linker will prepend the real path.
+
+			   See bug https://bugs.gentoo.org/4411 for more info.
+			 */
+			${output_format}
+			GROUP ( ${EPREFIX}/${libdir}/${tlib} )
+			END_LDSCRIPT
+			;;
+		esac
+		fperms a+x "/usr/${libdir}/${lib}" || die "could not change perms on ${lib}"
+	done
+}
+
+fi
diff --git a/profiles/use.desc b/profiles/use.desc
index 6acf19f..6297fee 100644
--- a/profiles/use.desc
+++ b/profiles/use.desc
@@ -299,6 +299,7 @@ seamonkey - Add support for the Seamonkey web-browser
 seccomp - Enable seccomp (secure computing mode) to perform system call filtering at \
runtime to increase security of programs  selinux - !!internal use only!! Security \
Enhanced Linux support, this must be set by the selinux profile or breakage will \
occur  semantic-desktop - Cross-KDE support for semantic search and information \
retrieval +sep-usr - Install some critical files into / instead of /usr (for when \
/usr is a separate mount point)  session - Add persistent session support
 sharedmem - Add support for shared memory use
 shorten - Add support for the shorten audio compressor
-- 
2.7.4


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic