From: Michael Olbrich <m.olbrich@pengutronix.de>
To: ptxdist@pengutronix.de
Subject: Re: [ptxdist] [PATCH 2/2] ptxd_make_world_install_post: Darwin: Edit install name of binaries
Date: Thu, 14 Jun 2012 02:05:40 +0200 [thread overview]
Message-ID: <20120614000540.GD14446@pengutronix.de> (raw)
In-Reply-To: <1339340732-8741-3-git-send-email-bernhard@bwalle.de>
On Sun, Jun 10, 2012 at 05:05:32PM +0200, Bernhard Walle wrote:
> This patch should solve the problem that binaries in
> $PTXDIST_SYSROOT_HOST/bin must be able to find their libraries in
> $PTXDIST_SYSROOT_HOST/lib. On ELF systems that problem is solved
> by using rpath. However, rpath doesn't exist (works different) on
> Darwin that uses the Mach-O binary format.
>
> After copying the files to $PTXDIST_SYSROOT_HOST, we do following:
>
> - For every library (lib/*.*.dylib), we change the install name
> from /lib/libfoo.x.dylib to $PTXDIST_SYSROOT_HOST/lib/libfoo.x.dylib.
> That way programs linked against that library can be executed
> immediately, even in the build directory before installation
> to $PTXDIST_SYSROOT_HOST.
>
> That's the call of "install_name_tool -id".
>
> - For every library (lib/*.*.dylib) and executable (bin/*), we
> change the install name of dependent libraries to point to
> $PTXDIST_SYSROOT_HOST/lib. The call of "otool -L" lists the
> dependent libraries (like "readelf -d" on ELF systems) and
> the call "install_name_tool -change" changes it. That step
> is necessary because multiple libraries and binaries can be
> built and installed at the same time, so the binary is already
> built before "install_name_tool -id" is invoked.
>
> That way I'm finally able to build host-qemu with host-glib and
> host-gettext-dummy (that provides -lintl which host-glib uses).
>
> Signed-off-by: Bernhard Walle <bernhard@bwalle.de>
> ---
> scripts/lib/ptxd_make_world_install.sh | 5 ++
> .../lib/ptxd_make_world_install_library_path.sh | 92 ++++++++++++++++++++
> 2 Dateien geändert, 97 Zeilen hinzugefügt(+)
> create mode 100644 scripts/lib/ptxd_make_world_install_library_path.sh
>
> diff --git a/scripts/lib/ptxd_make_world_install.sh b/scripts/lib/ptxd_make_world_install.sh
> index 3d5d5e5..e0418dc 100644
> --- a/scripts/lib/ptxd_make_world_install.sh
> +++ b/scripts/lib/ptxd_make_world_install.sh
> @@ -175,5 +175,10 @@ ptxd_make_world_install_post() {
> done &&
>
> cp -dprf -- "${pkg_pkg_dir}"/* "${pkg_sysroot_dir}"
> +
> + # only for host packages
> + if [ "${pkg_sysroot_dir}" = "${PTXDIST_SYSROOT_HOST}" ] ; then
> + ptxd_make_world_install_library_path "${pkg_pkg_dir}"
> + fi
if [ "${pkg_type}" != "target" ]; then
ptxd_make_world_install_library_path
fi
for cross packages too, and use pkg_pkg_dir directly below.
> }
> export -f ptxd_make_world_install_post
> diff --git a/scripts/lib/ptxd_make_world_install_library_path.sh b/scripts/lib/ptxd_make_world_install_library_path.sh
> new file mode 100644
> index 0000000..32b4b45
> --- /dev/null
> +++ b/scripts/lib/ptxd_make_world_install_library_path.sh
> @@ -0,0 +1,92 @@
> +#!/bin/bash
> +#
> +# (c) 2012 Bernhard Walle <bernhard@bwalle.de>
> +#
> +
> +# This function is Darwin (Mac OS) specific. Helper function for
> +# ptxd_make_world_install_library_path.
> +#
> +# It should be invoked on one binary in ptxdist platform-*/sysroot-host (both
> +# for executables and libraries after installation. For binaries and libraries,
> +# edits the dependent shared library install name to point to sysroot-host/lib.
> +# For libraries only it changes also the install name (-id). That way the
> +# binaries linked against a library in sysroot-target/lib can be executed
> +# directly without setting environment variables.
> +#
> +# Arguments: $1 - the binary
> +ptxd_make_world_install_library_path_one()
> +{
> + local binary="$1"
> + local filename installfile
> +
> + if ! [ -r "${binary}" ] ; then
> + return
> + fi
this was already checked, right?
> +
> + for used_library in $(otool -LX "${binary}" | awk '{print $1}') ; do
> + filename=${used_library##*/} # basename
filename="$(basename "${used_library}")"
> +
> + # if the library exists in sysroot-host, we use that one
> + # using @executable_path even keeps the tree relocatable.
> + installfile="${PTXDIST_SYSROOT_HOST}/lib/${filename}"
> + if [ -r "${installfile}" ] ; then
> + install_name_tool -change \
> + "${used_library}" "${installfile}" \
> + "${binary}"
> + fi
> +
> + # if it's a library, change also the ID so that binaries
> + # that link against the binary get it right in the first
> + # place (so they can get executed before installation)
> + if [[ ${installfile} == *.dylib ]] ; then
> + install_name_tool -id "${binary}" "${binary}"
> + fi
> + done
> +}
> +export -f ptxd_make_world_install_library_path_one
> +
> +# This function is Darwin (Mac OS) specific. It does nothing on other
> +# operating systems.
> +#
> +# The function gets invoked in install.post stage after the binaries
> +# have been copied from the package dir to the sysroot-host directory.
> +# The function must be called with the package directory as argument.
> +# For every binary (library and executable) in that package directory
> +# it translates the path to the correspondent path after copying
> +# to the sysroot-host and invokes ptxd_make_world_install_library_path_one
> +# which finally edits the install path of libaries/executables.
> +#
> +# Arguments: $1 - pkgdir of a package
> +ptxd_make_world_install_library_path()
> +{
> + if [ "$(uname -s)" != Darwin ] ; then
> + return
> + fi
> +
> + local pkgdir="$1"
use pkg_pkg_dir directly everywhere
> + local file
> + local installed_file
> +
> + echo "install.post: Fixup library paths"
> + for file in ${pkgdir}/bin/* ${pkgdir}/lib/*.*.dylib ; do
> +
> + # for unexpanded wildcards
> + if ! [ -r "${file}" ] ; then
> + continue
> + fi
use "find "${pkgdir}" -type f" and
file "${file}" | grep -q 'dynamically linked' || continue
or something like that. Otherwise you might miss something.
> +
> + installed_file=$(echo $file | sed -e "s@${pkgdir}@${PTXDIST_SYSROOT_HOST}@g")
use ${pkg_sysroot_dir} (works for cross too)
> +
> + # sanity check
> + if ! [ -r "${installed_file}" ] ; then
> + echo >&2 "File '${file}' exists but '${installed_file}' does not after coping???"
> + continue
> + fi
imho not needed. The files where copied just before calling this.
> +
> + echo "${installed_file}"
remove.
Michael
> + ptxd_make_world_install_library_path_one "${installed_file}"
> + done
> +
> + echo "install.post: Fixup library paths: done"
> +}
> +export -f ptxd_make_world_install_library_path
> --
> 1.7.10.4
>
>
> --
> ptxdist mailing list
> ptxdist@pengutronix.de
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
--
ptxdist mailing list
ptxdist@pengutronix.de
next prev parent reply other threads:[~2012-06-14 0:05 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-10 15:05 [ptxdist] Replace DYLD_FALLBACK_LIBRARY_PATH by something that works Bernhard Walle
2012-06-10 15:05 ` [ptxdist] [PATCH 1/2] Remove DYLD_FALLBACK_LIBRARY_PATH (Darwin) Bernhard Walle
2012-06-10 15:05 ` [ptxdist] [PATCH 2/2] ptxd_make_world_install_post: Darwin: Edit install name of binaries Bernhard Walle
2012-06-14 0:05 ` Michael Olbrich [this message]
2012-06-16 19:54 ` [ptxdist] [PATCH 1/2] Remove DYLD_FALLBACK_LIBRARY_PATH (Darwin) Bernhard Walle
2012-06-16 19:54 ` [ptxdist] [PATCH 2/2] ptxd_make_world_install_post: Darwin: Edit install name of binaries Bernhard Walle
2012-06-17 7:51 ` [ptxdist] [PATCH 1/2] Remove DYLD_FALLBACK_LIBRARY_PATH (Darwin) Bernhard Walle
2012-06-17 7:51 ` [ptxdist] [PATCH 2/2] ptxd_make_world_install_post: Darwin: Edit install name of binaries Bernhard Walle
2012-06-18 19:42 ` [ptxdist] [PATCH 1/2] Remove DYLD_FALLBACK_LIBRARY_PATH (Darwin) Bernhard Walle
2012-06-18 19:42 ` [ptxdist] [PATCH 2/2] ptxd_make_world_install_post: Darwin: Edit install name of binaries Bernhard Walle
2012-06-30 11:02 ` Michael Olbrich
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=20120614000540.GD14446@pengutronix.de \
--to=m.olbrich@pengutronix.de \
--cc=ptxdist@pengutronix.de \
/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