diff options
author | Bernhard Walle <bernhard@bwalle.de> | 2012-06-18 21:42:54 +0200 |
---|---|---|
committer | Michael Olbrich <m.olbrich@pengutronix.de> | 2012-06-30 12:48:14 +0200 |
commit | 2f240a72868a2c87e72c63001f500185543b00fe (patch) | |
tree | 4e45f05217317e676b63098ff1421be97ffae386 /scripts/lib/ptxd_make_world_install_library_path.sh | |
parent | d171b876fc472e4edf5030f214102d5389b7b38d (diff) | |
download | ptxdist-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.sh | 76 |
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 |