From 20a2a76f28e38677431e2a16d07e180ed03bedfe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Vivek=20Das=C2=A0Mohapatra?= <vivek@collabora.co.uk>
Date: Mon, 17 Jul 2017 16:20:43 +0100
Subject: [PATCH] Move generate-stublib.sh to data, rename and rewrite for
 external use

The script needs some changes to properly make it useful for capsule
proxy libraries that are not part of the libcapsule tree.
---
 generate-stublib.sh => data/capsule-mkstublib | 80 +++++++++----------
 1 file changed, 38 insertions(+), 42 deletions(-)
 rename generate-stublib.sh => data/capsule-mkstublib (75%)

diff --git a/generate-stublib.sh b/data/capsule-mkstublib
similarity index 75%
rename from generate-stublib.sh
rename to data/capsule-mkstublib
index 80a00d628..2a85d86f2 100755
--- a/generate-stublib.sh
+++ b/data/capsule-mkstublib
@@ -22,14 +22,9 @@ set -e
 
 major_version=0;
 
-parse_ldflags ()
+parse_ltver ()
 {
-    while [ $# -ge 2 ] && [ "$1" != -version-number ]; do shift; done;
-
-    if [ $# -ge 2 ] && [ "$1" = -version-number ] && [ -n "$2" ];
-    then
-        major_version=${2%%:*};
-    fi
+    major_version=${1%%:*};
 }
 
 declare -A NODE;
@@ -40,34 +35,46 @@ proxied_dso=$1;    shift;
 proxy_excluded=$1; shift;
 proxy_extra=$1;    shift;
 proxy_src=$1;      shift;
-ldflags=$1;        shift;
+ltver=$1;          shift;
 
-parse_ldflags $ldflags;
+parse_ltver $ltver;
 
-proxied_dso=${proxied_dso%.so*}.so.${major_version};
+dso_base=${proxied_dso#lib}
+dso_base=${dso_base%.so*}
+proxied_dso=lib${dso_base}.so.${major_version};
 
 symbol_file=${proxy_src%.c}.symbols;
 map_file=${proxy_src%.c}.map;
 dlopen_file=${proxy_src}.dlopen;
-
-echo -n > $symbol_file;
-echo -n > $map_file;
+sharedir=$(pkg-config --variable=makeinc capsule)
 
 exec >$proxy_src.tmp;
 
-cat $top/capsule-shim.h;
+cat $sharedir/capsule-shim.h
 
-if (for pt in $proxied_dso $(cat $proxy_extra);
-    do
-        $top/print-libstubs $pt /host || exit 1;
-    done) > $symbol_file.tmp;
+# generate the .symbols file if it doesn't exist, or if the proxy_extra
+# control file has been updated:
+if [ $symbol_file -ot $proxy_extra ];
 then
-    mv $symbol_file.tmp $symbol_file;
-else
-    code=$?;
-    rm $symbol_file.tmp
-    exit $code;
-fi
+    echo -n > $symbol_file;
+    if (for pt in $proxied_dso $(cat $proxy_extra);
+        do
+            if [ x$V = x1 ];
+            then
+                echo "  $top/capsule-symbols $pt /host" >&2;
+            else
+                echo "  SYMBOLS $pt /host" >&2;
+            fi;
+            $top/capsule-symbols $pt /host || exit 1;
+        done) > $symbol_file.tmp;
+    then
+        mv $symbol_file.tmp $symbol_file;
+    else
+        code=$?;
+        rm $symbol_file.tmp
+        exit $code;
+    fi;
+fi;
 
 
 while read symbol version dependency;
@@ -110,24 +117,6 @@ then
     cat $dlopen_file;
     echo "// end of ${proxy_src%.c} dlopen wrapper";
     echo "// -------------------------------------------------------------";
-else
-    cat - <<EOF
-// -------------------------------------------------------------------------
-// start of default capsule dlopen wrapper function section
-static void *_dlopen (const char *filename, int flag)
-{
-    if( flag & RTLD_GLOBAL )
-    {
-        fprintf( stderr, "Warning: libcapsule dlopen wrapper cannot pass "
-                         "RTLD_GLOBAL to underlying dlmopen(%s...) call\\n",
-                 filename );
-        flag = (flag & ~RTLD_GLOBAL) & 0xfffff;
-    }
-    return capsule_shim_dlopen( symbol_ns, prefix, exclude, filename, flag );
-}
-// end of default capsule dlopen wrapper function section
-// -------------------------------------------------------------------------
-EOF
 fi
 
 cat - <<EOF
@@ -182,6 +171,7 @@ cat - <<EOF
 }
 EOF
 
+echo -n > $map_file;
 exec >& $map_file;
 
 for node in ${!NODE[@]};
@@ -196,4 +186,10 @@ do
     echo;
 done;
 
+# scrub the (symbol version) map file if it's empty:
+if [ ! -s $map_file ];
+then
+    rm -f $map_file;
+fi;
+
 mv "$proxy_src.tmp" "$proxy_src";
-- 
GitLab