summaryrefslogtreecommitdiffstats
path: root/scripts/lib/ptxd_make_world_install_library_path.sh
diff options
context:
space:
mode:
authorBernhard Walle <bernhard@bwalle.de>2012-06-18 21:42:54 +0200
committerMichael Olbrich <m.olbrich@pengutronix.de>2012-06-30 12:48:14 +0200
commit2f240a72868a2c87e72c63001f500185543b00fe (patch)
tree4e45f05217317e676b63098ff1421be97ffae386 /scripts/lib/ptxd_make_world_install_library_path.sh
parentd171b876fc472e4edf5030f214102d5389b7b38d (diff)
downloadptxdist-2f240a72868a2c87e72c63001f500185543b00fe.tar.gz
ptxdist-2f240a72868a2c87e72c63001f500185543b00fe.tar.xz
ptxd_make_world_install_post: Darwin: Edit install name of binaries
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> Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
Diffstat (limited to 'scripts/lib/ptxd_make_world_install_library_path.sh')
-rw-r--r--scripts/lib/ptxd_make_world_install_library_path.sh76
1 files changed, 76 insertions, 0 deletions
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 000000000..20e570c7f
--- /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