Include statically linked binaries in the binary distribution.
[libguestfs.git] / relink-static.sh
diff --git a/relink-static.sh b/relink-static.sh
new file mode 100755 (executable)
index 0000000..9dd5a22
--- /dev/null
@@ -0,0 +1,75 @@
+#!/bin/bash -
+# Copyright (C) 2010 Red Hat Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Written by Richard W.M. Jones <rjones@redhat.com>
+#
+# Take a dynamically linked ELF binary and relink it, maximizing the
+# use of static libraries.
+#
+# Example:
+#   binary foo
+#            ---> dynamically links to libbar.so.0
+#            ---> dynamically links to libzab.so.3
+# If libbar.a is available, but there is no libzab.a, then we would
+# end up with:
+#   binary foo.static with libbar.a statically inside it
+#            ---> still dynamically linking with libzab.so.3
+#
+# We need to have access to the original link command.  This script
+# works by post-processing it to find the '-lbar' arguments, which are
+# replaced sometimes by direct static library names.
+#
+# Therefore to use this, you have to add this rule to your
+# Makefile.am:
+#
+# foo.static$(EXEEXT): $(foo_OBJECTS) $(foo_DEPENDENCIES)
+#   relink-static.sh \
+#   $(foo_LINK) $(foo_OBJECTS) -static $(foo_LDADD) $(foo_LIBS)
+
+declare -a args
+
+i=0
+for arg; do
+    case "$arg" in
+    -l*)    # get just the library name (eg. "xml2")
+            lib=${arg:2}
+            # does a static version exist?
+            for d in /usr/local/lib{64,} /usr/lib{64,} /lib{64,}; do
+                path="$d/lib$lib.a"
+                if [ -f "$path" ]; then
+                    arg="$path"
+                    break
+                fi
+            done
+            ;;
+    *.la)   # hack around libtool mess
+            d=$(dirname "$arg")
+            b=$(basename "$arg")
+            b=${b:0:${#b}-3}
+            if [ -f "$d/.libs/$b.a" ]; then
+                arg="$d/.libs/$b.a"
+            fi
+            ;;
+    *) ;;
+    esac
+    args[$i]="$arg"
+    i=$(($i+1))
+done
+
+# Run the final command.
+echo "${args[@]}"
+"${args[@]}"