1#!/usr/bin/env bash
2
3set -e
4set -u
5
6THIS_DIR="$(cd $(dirname $0); echo $PWD)"
7cd $THIS_DIR
8
9. common_make_packages.sh
10
11RENODE_ROOT_DIR=$THIS_DIR/../..
12RENODE_OUTPUT_DIR=$RENODE_ROOT_DIR/output/bin/$TARGET
13RENODE_BIN=$RENODE_OUTPUT_DIR/Renode.exe
14DESTINATION=renode_${VERSION}_portable
15WORKDIR=$THIS_DIR/renode_${VERSION}_portable-workdir
16MONO_VERSION=4.5
17OS_NAME=linux
18SED_COMMAND="sed -i"
19DIR=$DESTINATION
20
21. common_copy_files_portable.sh
22
23mkdir -p $WORKDIR
24rm -rf $WORKDIR/*
25
26# Prepare dlls config
27
28CONFIG_FILE=$WORKDIR/config
29cat /etc/mono/config > $CONFIG_FILE
30sed -e 's/$mono_libdir\///g' -i $CONFIG_FILE
31
32# this tag will be added later
33sed -e '/<\/configuration>/d' -i $CONFIG_FILE
34
35# this seems to be necessary, otherwise Renode crashes on opening tlib
36echo '<dllmap dll="i:dl">' >> $CONFIG_FILE
37echo '  <dllentry dll="__Internal" name="dlopen" target="dlopen"/>' >> $CONFIG_FILE
38echo '</dllmap>' >> $CONFIG_FILE
39
40AWK_COMMANDS='
41/--- REMAPPED SYMBOLS SECTION STARTS ---/ { flag = 1; next }
42/--- REMAPPED SYMBOLS SECTION ENDS ---/   { flag = 0; }
43flag                                      { gsub(/\(\);/, "", $0); print }
44'
45
46# remap functions from MonoPosixHelper to __Internal
47echo '<dllmap dll="i:MonoPosixHelper">' >> $CONFIG_FILE
48FUNCTIONS=`awk "$AWK_COMMANDS" $THIS_DIR/linux_portable/additional.c`
49for F in $FUNCTIONS ; do
50    echo "  <dllentry dll=\"__Internal\" name=\"$F\" target=\"$F\"/>" >> $CONFIG_FILE
51done
52echo '</dllmap>' >> $CONFIG_FILE
53
54echo '
55  <dllmap dll="libglib-2.0-0.dll" target="libglib-2.0.so.0"/>
56  <dllmap dll="libgobject-2.0-0.dll" target="libgobject-2.0.so.0"/>
57  <dllmap dll="libgthread-2.0-0.dll" target="libgthread-2.0.so.0"/>
58
59  <dllmap dll="libpango-1.0-0.dll" target="libpango-1.0.so.0"/>
60  <dllmap dll="libpangocairo-1.0-0.dll" target="libpangocairo-1.0.so.0"/>
61
62  <dllmap dll="libatk-1.0-0.dll" target="libatk-1.0.so.0"/>
63
64  <dllmap dll="libgtk-win32-2.0-0.dll" target="libgtk-x11-2.0.so.0"/>
65  <dllmap dll="libgdk-win32-2.0-0.dll" target="libgdk-x11-2.0.so.0"/>
66
67  <dllmap dll="libgdk_pixbuf-2.0-0.dll" target="libgdk_pixbuf-2.0.so.0"/>
68
69  <dllmap dll="glibsharpglue-2" target="libglibsharpglue-2.so"/>
70  <dllmap dll="gtksharpglue-2" target="libgtksharpglue-2.so"/>
71  <dllmap dll="gdksharpglue-2" target="libgdksharpglue-2.so"/>
72</configuration>
73' >> $CONFIG_FILE
74
75# Generate bundle
76
77ln -sf $RENODE_OUTPUT_DIR/LZ4.dll $WORKDIR/LZ4cc.dll
78ln -sf $RENODE_OUTPUT_DIR/LZ4.dll $WORKDIR/LZ4mm.dll
79ln -sf $RENODE_OUTPUT_DIR/LZ4.dll $WORKDIR/LZ4pn.dll
80
81function find_file() {
82  FOUND=`(find /usr/lib -name $1 -type f 2> /dev/null | head -n 1) || true`
83  if [ "$FOUND" = "" ] ; then
84      FOUND=`(find /usr/lib64 -name $1 -type f 2> /dev/null | head -n 1) || true`
85  fi
86  echo -n $FOUND
87}
88
89mkdir -p $WORKDIR/dependencies
90cp `find_file atk-sharp.dll` $WORKDIR/dependencies
91cp `find_file gtk-sharp.dll` $WORKDIR/dependencies
92cp `find_file gdk-sharp.dll` $WORKDIR/dependencies
93cp `find_file glib-sharp.dll` $WORKDIR/dependencies
94cp `find_file pango-sharp.dll` $WORKDIR/dependencies
95
96# this is ok to crash here, we will re-compile it
97set +e
98(cd $WORKDIR; ls $RENODE_OUTPUT_DIR/*.dll | xargs mkbundle \
99    --simple \
100    --custom \
101    --machine-config /etc/mono/$MONO_VERSION/machine.config \
102    --config $CONFIG_FILE \
103    -L $RENODE_OUTPUT_DIR \
104    -L $WORKDIR/dependencies \
105    -L /usr/lib/mono/$MONO_VERSION \
106    -z --static --keeptemp --nomain \
107    $RENODE_BIN 2>/dev/null)
108set -e
109
110# Re-compile bundle
111
112WRAPPER_SOURCE_FILE=$WORKDIR/bundler.c
113
114echo "extern int mono_environment_exitcode_get();" > $WRAPPER_SOURCE_FILE
115echo "extern void mono_aot_register_module();" >> $WRAPPER_SOURCE_FILE
116
117# this file is generated by `mkbundle`
118cat $WORKDIR/temp.c >> $WRAPPER_SOURCE_FILE
119
120# this file is proveded by us
121cat $THIS_DIR/linux_portable/additional.c >> $WRAPPER_SOURCE_FILE
122
123gcc \
124    -Wl,--wrap=powf  \
125    -Wl,--wrap=logf  \
126    -Wl,--wrap=expf  \
127    -Wl,--wrap=getrandom  \
128    -Wl,--wrap=mono_dl_open_file \
129    -Wl,--wrap=mono_dl_lookup_symbol \
130    -Wl,--wrap=__shm_directory \
131    -fvisibility=hidden \
132    -Wl,--export-dynamic \
133    $WRAPPER_SOURCE_FILE  \
134    $WORKDIR/temp.s  \
135    -I/usr/include/mono-2.0  \
136    -ldl  \
137    -Wl,-Bstatic  \
138    -lmono-2.0  \
139    -lMonoPosixHelper \
140    -lz \
141    -lrt \
142    -lbsd \
143    -Wl,-Bdynamic `pkg-config --libs-only-l mono-2 | sed -e "s/\-lmono-2.0 //" | sed -e "s/\-lm//" | sed -e "s/\-lrt //"`  \
144    $RENODE_ROOT_DIR/lib/resources/libraries/libopenlibm-Linux.a  \
145    -static-libgcc \
146    -o $DESTINATION/renode
147
148# Copy dependencies
149
150cp $RENODE_OUTPUT_DIR/libllvm-disas.so $DESTINATION
151
152cp `find_file libmono-btls-shared.so` $DESTINATION
153cp `find_file libglibsharpglue-2.so` $DESTINATION
154cp `find_file libgtksharpglue-2.so` $DESTINATION
155cp `find_file libgdksharpglue-2.so` $DESTINATION
156
157# Create tar
158mkdir -p ../../output/packages
159tar -czf ../../output/packages/renode-$VERSION.linux-portable.tar.gz $DESTINATION
160
161echo "Created a portable package in output/packages/renode-$VERSION.linux-portable.tar.gz"
162
163# Cleanup
164
165if $REMOVE_WORKDIR
166then
167    rm -rf $DESTINATION
168    rm -rf $WORKDIR
169fi
170