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