From: "Mike Frysinger" <vapier@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/gcc-config:master commit in: /
Date: Sat, 12 Jan 2013 17:17:42 +0000 (UTC) [thread overview]
Message-ID: <1358011224.93a98ac9befc5f4450436d106c8cc9190c12b4d1.vapier@gentoo> (raw)
commit: 93a98ac9befc5f4450436d106c8cc9190c12b4d1
Author: Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Fri Jan 11 09:31:45 2013 +0000
Commit: Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Sat Jan 12 17:20:24 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gcc-config.git;a=commit;h=93a98ac9
gcc-config: prefix: copy GCC's libs to emulate ld.so.conf magic
Because Prefix doesn't have ld.so.conf magic in place (either because it
doesn't exist, or because we don't have the privileges to touch it), we
need to ensure that GCC's libs can be found at runtime. To do so, we
use a special dir in which we stack all GCC's libs per version. This
dir is in RPATH (or equivalent), such that applications and libraries
can find their libgcc_s.so.1 (needed on Solaris) or libstdc++.so.6, or
libgomp.so, ... etc.
Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>
Signed-off-by: Mike Frysinger <vapier <AT> gentoo.org>
---
gcc-config | 234 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 234 insertions(+), 0 deletions(-)
diff --git a/gcc-config b/gcc-config
index 3b3941a..89fc32c 100755
--- a/gcc-config
+++ b/gcc-config
@@ -340,6 +340,239 @@ handle_split_usr() {
return 0
}
+prefix_copy_gcc_libs() {
+ # no business here if not Prefix
+ [[ -z ${EPREFIX} ]] && return 0
+
+ # To emulate properly what ld.so.conf magic does for non-prefix,
+ # we have to copy the libs of all installed (native) GCC's and
+ # make sure we do the current one as last, such that the
+ # pointers for the unversioned libs point to the currently
+ # selected version. This is only necessary for platforms that use
+ # shared libs, and only record the object name (not the full path).
+ case ${CHOST} in
+ *-mint*)
+ # static only, nothing to do here
+ return 0
+ ;;
+ *-darwin*)
+ # Mach-O records all references with full path, hence each
+ # object has links to the GCC-specific version of the lib.
+ return 0
+ ;;
+ esac
+
+ # dstlibgcc location is added to RPATH by the binutils wrapper
+ local dstlibgcc=${EROOT}/usr/${CHOST}/lib/gcc
+
+ # Prepare empty directories first
+ local temporary=.gcc.config.new
+ rm -rf "${dstlibgcc}"/${temporary} || return 1
+ mkdir -p "${dstlibgcc}"/${temporary} || return 1
+
+ local LIBSUFFIX
+ case ${CHOST} in
+ *-aix*)
+ LIBSUFFIX="a"
+ AIXLIBS=
+
+ do_single_runtime() {
+ local sourcedir=$1; shift
+ local libname=$1; shift
+ local targetdir=$1; shift
+ local finaldir=$1; shift
+
+ aixdll \
+ --merge-runtime \
+ --finish=false \
+ --target="${targetdir}"/lib${libname}.${LIBSUFFIX} \
+ "${sourcedir}"/lib${libname}.${LIBSUFFIX} \
+ || return 1
+ [[ ${AIXLIBS} == *":${targetdir}/lib${libname}.${LIBSUFFIX}:"* ]] \
+ || AIXLIBS="${AIXLIBS}:${targetdir}/lib${libname}.${LIBSUFFIX}:"
+ }
+
+ finish_runtime_dir() {
+ local sourcedir=$1; shift
+ local targetdir=$1; shift
+ local cleanup=$1; shift
+
+ local f save_IFS
+ save_IFS=$IFS; IFS=:
+ for f in ${AIXLIBS}; do
+ IFS=$save_IFS
+ [[ -n ${f} ]] || continue
+ aixdll \
+ --finish-merge \
+ --keepdir=false \
+ "${f}" \
+ || return 1
+ done
+ IFS=$save_IFS
+ unset AIXLIBS
+
+ finish_runtime_dir_elf \
+ "${sourcedir}" \
+ "${targetdir}" \
+ ${cleanup} \
+ || return 1
+ }
+ ;;
+ hppa64*-hpux*)
+ LIBSUFFIX="sl"
+ do_single_runtime() {
+ do_single_runtime_elf "$@"
+ }
+ finish_runtime_dir() {
+ finish_runtime_dir_elf "$@"
+ }
+ ;;
+ hppa*-hpux*)
+ LIBSUFFIX="sl"
+ do_single_runtime() {
+ local sourcedir=$1; shift
+ local libname=$1; shift
+ local targetdir=$1; shift
+ local finaldir=$1; shift
+
+ # when using some simple shell script wrappers (again :)),
+ # there may be no libs around!
+ if [[ -n $(ls "${sourcedir}"/lib${libname}.*${LIBSUFFIX}* 2>/dev/null) ]]; then
+ cp -fpP "${sourcedir}"/lib${libname}.*${LIBSUFFIX}* "${targetdir}" || return 1
+ # gcc creates "libgcc_s.4" with symlink "libgcc_s.sl -> libgcc_s.4", and
+ # we patch it to also set the 'internal name' (=soname) (gcc-PR40913).
+ if [[ ${libname} == 'gcc_s' ]]; then
+ if [[ -n $(ls "${sourcedir}"/lib${libname}.[0-9] 2>/dev/null) ]]; then
+ cp -fpP "${sourcedir}"/lib${libname}.[0-9] "${targetdir}" || return 1
+ fi
+ fi
+ # we do not need the unversioned lib, as linking
+ # is done against the used gcc's private copy.
+ rm -f "${targetdir}"/lib${libname}.${LIBSUFFIX} || return 1
+ fi
+ }
+ finish_runtime_dir() {
+ finish_runtime_dir_elf "$@"
+ }
+ ;;
+ *)
+ LIBSUFFIX="so"
+ do_single_runtime() {
+ do_single_runtime_elf "$@"
+ }
+ finish_runtime_dir() {
+ finish_runtime_dir_elf "$@"
+ }
+ ;;
+ esac
+
+ do_single_runtime_elf() {
+ local sourcedir=$1; shift
+ local libname=$1; shift
+ local targetdir=$1; shift
+ local finaldir=$1; shift
+
+ # when using some simple shell script wrappers (again :)),
+ # there may be no libs around!
+ if [[ -n $(ls "${sourcedir}"/lib${libname}.*${LIBSUFFIX}* 2>/dev/null) ]]; then
+ cp -fpP "${sourcedir}"/lib${libname}.*${LIBSUFFIX}* "${targetdir}" || return 1
+ # we do not need the unversioned lib, as linking
+ # is done against the used gcc's private copy.
+ rm -f "${targetdir}"/lib${libname}.${LIBSUFFIX} || return 1
+ fi
+ }
+
+ finish_runtime_dir_elf() {
+ local sourcedir=$1; shift
+ local targetdir=$1; shift
+ local cleanup=$1; shift
+
+ if [[ ${cleanup} == clean ]]; then
+ for f in "${targetdir}"/*; do
+ [[ ${f} == ${sourcedir} ]] && continue
+ [[ -e "${sourcedir}/${f##*/}" ]] && continue
+ rm -f "${f}"
+ done
+ fi
+
+ # move symlinks first:
+ # because of file ordering, the real files may be
+ # moved before the symlinks, causing the symlinks
+ # going broken.
+ for f in "${sourcedir}"/*; do
+ [[ -e ${f} && -L ${f} ]] || continue
+ # use backups: hpux cannot overwrite sharedlibs in use: "Text file busy"
+ rm -f "${targetdir}"/${f##*/}*'~' >/dev/null 2>&1
+ mv -f --backup=numbered --suffix='~' "${f}" "${targetdir}"/${f##*/} || return 1
+ rm -f "${targetdir}"/${f##*/}*'~' >/dev/null 2>&1
+ done
+
+ for f in "${sourcedir}"/*; do
+ [[ -f "${f}" ]] || continue
+ # use backups: hpux cannot overwrite sharedlibs in use: "Text file busy"
+ rm -f "${targetdir}"/${f##*/}*'~' >/dev/null 2>&1
+ mv -f --backup=numbered --suffix='~' "${f}" "${targetdir}"/${f##*/} || return 1
+ rm -f "${targetdir}"/${f##*/}*'~' >/dev/null 2>&1
+ done
+ rmdir "${sourcedir}"
+ }
+
+ local GCC_PROFILES=$(LC_ALL="C" ls ${GCC_ENV_D}/${CHOST}-*)
+
+ local targetdirs= GCC_PATH= LDPATH=
+ for x in ${GCC_PROFILES} ; do
+ unset GCC_PATH LDPATH
+ eval $(
+ source "${x}"
+ echo "GCC_PATH='${GCC_PATH}'"
+ echo "LDPATH='${LDPATH%%:*}'"
+ )
+
+ pushd "${ROOT%/}${LDPATH}" > /dev/null || return 1
+
+ local donelibs= lib= gcclib=
+ for lib in lib*.${LIBSUFFIX}; do
+ gcclib=${lib#lib}
+ gcclib=${gcclib%.${LIBSUFFIX}}
+ gcclib=${gcclib%%.[0-9]*} # we need the unversioned libname.
+ [[ ${donelibs} != *" ${gcclib} "* ]] || continue
+ donelibs="${donelibs} ${gcclib} "
+
+ [[ ${targetdirs} == *":${dstlibgcc},clean:"* ]] ||
+ targetdirs="${targetdirs}:${dstlibgcc},clean:"
+
+ do_single_runtime \
+ "${ROOT%/}${LDPATH}" \
+ ${gcclib} \
+ "${dstlibgcc}"/${temporary} \
+ "${dstlibgcc}" \
+ || return 1
+ done
+
+ popd > /dev/null
+ done
+
+ local clean= targetdir=
+ local save_IFS=$IFS
+ IFS=:
+ for targetdir in ${targetdirs}; do
+ IFS=${save_IFS}
+ [[ -n ${targetdir} ]] || continue
+
+ # eventually cleanup old files
+ clean=${targetdir##*,}
+
+ targetdir=${targetdir%,*}
+
+ finish_runtime_dir \
+ "${targetdir}"/${temporary} \
+ "${targetdir}" \
+ ${clean} \
+ || return 1
+ done
+ IFS=${save_IFS}
+}
+
switch_profile() {
local OLD_CC_COMP OLD_CC_COMP_VERSION OLD_GCC_PATH OLD_GCC_VER
local GCC_PATH
@@ -446,6 +679,7 @@ switch_profile() {
find "${pkgconfdir}"/libgcj*.pc -xtype l -delete 2>/dev/null
done
+ prefix_copy_gcc_libs
handle_split_usr
: $(( envd_changed += $? ))
fi
next reply other threads:[~2013-01-12 20:55 UTC|newest]
Thread overview: 86+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-12 17:17 Mike Frysinger [this message]
-- strict thread matches above, loose matches on Subject: below --
2024-12-08 3:26 [gentoo-commits] proj/gcc-config:master commit in: / Sam James
2024-12-08 3:19 Sam James
2024-12-08 3:18 Sam James
2023-05-31 5:55 Sam James
2023-05-31 5:54 Sam James
2023-05-14 17:25 Sam James
2023-04-30 2:59 Sam James
2023-01-05 0:16 Sam James
2022-12-28 19:12 Sam James
2022-12-28 19:12 Sam James
2022-12-28 19:12 Sam James
2022-10-10 14:09 Sam James
2022-10-09 20:55 Sam James
2022-10-08 22:02 Sam James
2022-09-29 22:36 Sam James
2022-09-29 22:36 Sam James
2022-09-22 23:46 Sam James
2021-11-13 4:49 Sam James
2021-11-13 4:49 Sam James
2021-02-26 9:36 Sergei Trofimovich
2021-02-26 9:36 Sergei Trofimovich
2021-02-26 9:36 Sergei Trofimovich
2021-02-26 9:36 Sergei Trofimovich
2021-02-26 8:40 Sergei Trofimovich
2021-01-23 17:51 Sergei Trofimovich
2020-09-05 18:11 Sergei Trofimovich
2020-06-24 20:47 Sergei Trofimovich
2020-06-21 11:53 Sergei Trofimovich
2020-06-21 11:50 Sergei Trofimovich
2020-05-23 7:28 Sergei Trofimovich
2020-05-22 13:23 Sergei Trofimovich
2020-05-22 13:20 Sergei Trofimovich
2020-05-22 11:33 Sergei Trofimovich
2020-05-22 10:39 Sergei Trofimovich
2020-05-22 10:03 Sergei Trofimovich
2020-05-22 9:40 Sergei Trofimovich
2020-04-10 10:08 Sergei Trofimovich
2020-01-26 13:44 Sergei Trofimovich
2020-01-26 13:26 Sergei Trofimovich
2019-09-08 8:37 Sergei Trofimovich
2019-09-08 8:29 Sergei Trofimovich
2019-09-07 22:08 Sergei Trofimovich
2019-09-07 9:39 Sergei Trofimovich
2019-09-07 9:39 Sergei Trofimovich
2019-09-07 9:15 Sergei Trofimovich
2019-09-07 9:01 Sergei Trofimovich
2019-09-07 8:47 Sergei Trofimovich
2019-09-07 8:22 Sergei Trofimovich
2019-09-06 7:29 Sergei Trofimovich
2019-09-06 7:23 Sergei Trofimovich
2019-09-06 6:53 Sergei Trofimovich
2019-09-06 6:53 Sergei Trofimovich
2019-09-05 22:35 Sergei Trofimovich
2019-09-05 7:24 Sergei Trofimovich
2019-09-05 6:47 Sergei Trofimovich
2019-09-05 6:42 Sergei Trofimovich
2019-09-05 6:28 Sergei Trofimovich
2019-09-04 19:00 Sergei Trofimovich
2019-09-04 19:00 Sergei Trofimovich
2018-08-24 16:40 Sergei Trofimovich
2018-08-24 8:50 Sergei Trofimovich
2018-08-24 0:23 Sergei Trofimovich
2018-08-13 22:39 Sergei Trofimovich
2018-08-13 21:55 Sergei Trofimovich
2017-12-16 21:11 Andreas Hüttel
2017-12-16 20:15 Andreas Hüttel
2017-12-15 8:33 Fabian Groffen
2015-08-05 8:12 Mike Frysinger
2015-08-05 7:52 Mike Frysinger
2015-05-13 4:26 Ryan Hill
2013-05-22 23:54 Mike Frysinger
2013-01-12 17:20 Mike Frysinger
2013-01-12 17:14 Mike Frysinger
2013-01-12 17:05 Mike Frysinger
2013-01-02 18:30 Mike Frysinger
2013-01-02 3:52 Mike Frysinger
2012-12-29 21:08 Mike Frysinger
2012-11-19 6:52 Mike Frysinger
2012-11-19 1:11 Mike Frysinger
2012-11-19 1:11 Mike Frysinger
2012-06-10 4:00 Mike Frysinger
2012-06-10 4:00 Mike Frysinger
2012-04-14 1:22 Mike Frysinger
2012-04-14 1:22 Mike Frysinger
2012-04-14 1:22 Mike Frysinger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1358011224.93a98ac9befc5f4450436d106c8cc9190c12b4d1.vapier@gentoo \
--to=vapier@gentoo.org \
--cc=gentoo-commits@lists.gentoo.org \
--cc=gentoo-dev@lists.gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox