]> sigrok.org Git - sigrok-util.git/blob - cross-compile/android/fix-libraries.sh
sigrok-cross-android: Add Qt5Svg to PV libraries
[sigrok-util.git] / cross-compile / android / fix-libraries.sh
1 #!/bin/sh
2
3 set -e
4 tmpdir=/tmp/fixlib$$
5 trap 'rm -rf "$tmpdir"' 0 1 2 3 15
6 mkdir -p "$tmpdir"
7
8 if [ $# -lt 3 ]; then
9   echo >&2 "Usage: $0 srclib destlib library ..."
10   exit 1
11 fi
12
13 : ${READELF=readelf}
14
15 srclib="$1"
16 destlib="$2"
17 shift
18 shift
19 rm -f "$tmpdir"/todo
20 touch "$tmpdir"/todo
21 for lib; do
22   echo "$lib" >> "$tmpdir"/todo
23 done
24
25 process()
26 {
27   libname="$1"
28   libfile="$destlib"/"$libname"
29   if [ ! -f "$libfile" ]; then
30     echo >&2 "$libfile not found"
31     exit 1
32   fi
33   "$READELF" -d "$libfile" | awk '$1=="0x00000001" {print $NF}' | tr -d '][' | grep '\.so\.' | sort >> "$tmpdir"/worklist
34 }
35
36 install()
37 {
38   libname="$1"
39   libfile=`echo "$libname" | sed -e 's/\.so\..*/.so/'`
40   cp "$srclib"/"$libname" "$destlib"/"$libfile"
41   echo "$libfile" >> "$tmpdir"/worklist
42   for deplib in `"$READELF" -d "$destlib"/"$libfile" | awk '$1=="0x00000001" {print $NF}' | tr -d '][' | grep '\.so\.' | sort`; do
43     echo "$deplib $libname"  >> "$tmpdir"/liblist
44   done
45 }
46
47 rm -f "$tmpdir"/liblist
48 touch "$tmpdir"/liblist
49 sort "$tmpdir"/todo > "$tmpdir"/processed
50 while [ -s "$tmpdir"/todo ]; do
51   rm -f "$tmpdir"/worklist
52   touch "$tmpdir"/worklist
53   cat "$tmpdir"/todo | while read lib; do
54     if [ ! -z "$lib" ]; then
55       process "$lib"
56     fi
57   done
58   sort "$tmpdir"/worklist | uniq > "$tmpdir"/todo.tmp
59   comm -13 "$tmpdir"/processed "$tmpdir"/todo.tmp > "$tmpdir"/todo
60   sort -m "$tmpdir"/processed "$tmpdir"/todo | uniq > "$tmpdir"/processed.tmp
61   mv "$tmpdir"/processed.tmp "$tmpdir"/processed
62   rm -f "$tmpdir"/worklist
63   touch "$tmpdir"/worklist
64   cat "$tmpdir"/todo | while read lib; do
65     if [ ! -z "$lib" ]; then
66       install "$lib"
67     fi
68   done
69   mv "$tmpdir"/worklist "$tmpdir"/todo
70 done
71 tsort "$tmpdir"/liblist