mailarchive of the ptxdist mailing list
 help / color / mirror / Atom feed
From: Bernhard Walle <bernhard@bwalle.de>
To: ptxdist@pengutronix.de
Subject: [ptxdist] [PATCH 2/2] ptxd_make_world_install_post: Darwin: Edit install name of binaries
Date: Mon, 18 Jun 2012 21:42:54 +0200	[thread overview]
Message-ID: <1340048574-953-2-git-send-email-bernhard@bwalle.de> (raw)
In-Reply-To: <1340048574-953-1-git-send-email-bernhard@bwalle.de>

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    |   76 ++++++++++++++++++++
 2 Dateien geändert, 81 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..dcb6a61 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}"
+
+    # host and cross packages
+    if [ "${pkg_type}" != "target" ]; then
+	ptxd_make_world_install_library_path
+    fi
 }
 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..20e570c
--- /dev/null
+++ b/scripts/lib/ptxd_make_world_install_library_path.sh
@@ -0,0 +1,76 @@
+#!/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
+
+    for used_library in $(otool -LX "${binary}" | awk '{print $1}') ; do
+	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.
+ptxd_make_world_install_library_path()
+{
+    if [ "$(uname -s)" != Darwin ] ; then
+	return
+    fi
+
+    local file
+    local installed_file
+
+    echo "install.post: Fixup library paths"
+    for file in $(find "${pkg_pkg_dir}" -type f) ; do
+
+	# skip non-Mach-O files
+	file -b "${file}" | grep -q '^Mach-O' || continue
+
+	installed_file=$(echo $file | sed -e "s@${pkg_pkg_dir}@${pkg_sysroot_dir}@g")
+
+	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

  reply	other threads:[~2012-06-18 19:43 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
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       ` Bernhard Walle [this message]
2012-06-30 11:02         ` [ptxdist] [PATCH 2/2] ptxd_make_world_install_post: Darwin: Edit install name of binaries 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=1340048574-953-2-git-send-email-bernhard@bwalle.de \
    --to=bernhard@bwalle.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