blob: 316578317a5ee258fe5ecbfc561d767c2e0ad6e8 [file] [log] [blame]
#!/usr/bin/env bash
set -e
set -u
THIS_DIR="$(cd $(dirname $0); echo $PWD)"
cd $THIS_DIR
. common_make_packages.sh
RENODE_ROOT_DIR=$THIS_DIR/../..
RENODE_OUTPUT_DIR=$RENODE_ROOT_DIR/output/bin/$TARGET
RENODE_BIN=$RENODE_OUTPUT_DIR/Renode.exe
DESTINATION=renode_${VERSION}_portable
WORKDIR=$THIS_DIR/renode_${VERSION}_portable-workdir
MONO_VERSION=4.5
. common_make_linux_portable.sh
mkdir -p $WORKDIR
rm -rf $WORKDIR/*
# Prepare dlls config
CONFIG_FILE=$WORKDIR/config
cat /etc/mono/config > $CONFIG_FILE
sed -e 's/$mono_libdir\///g' -i $CONFIG_FILE
# this tag will be added later
sed -e '/<\/configuration>/d' -i $CONFIG_FILE
# this seems to be necessary, otherwise Renode crashes on opening tlib
echo '<dllmap dll="i:dl">' >> $CONFIG_FILE
echo ' <dllentry dll="__Internal" name="dlopen" target="dlopen"/>' >> $CONFIG_FILE
echo '</dllmap>' >> $CONFIG_FILE
AWK_COMMANDS='
/--- REMAPPED SYMBOLS SECTION STARTS ---/ { flag = 1; next }
/--- REMAPPED SYMBOLS SECTION ENDS ---/ { flag = 0; }
flag { gsub(/\(\);/, "", $0); print }
'
# remap functions from MonoPosixHelper to __Internal
echo '<dllmap dll="i:MonoPosixHelper">' >> $CONFIG_FILE
FUNCTIONS=`awk "$AWK_COMMANDS" $THIS_DIR/linux_portable/additional.c`
for F in $FUNCTIONS ; do
echo " <dllentry dll=\"__Internal\" name=\"$F\" target=\"$F\"/>" >> $CONFIG_FILE
done
echo '</dllmap>' >> $CONFIG_FILE
echo '
<dllmap dll="libglib-2.0-0.dll" target="libglib-2.0.so.0"/>
<dllmap dll="libgobject-2.0-0.dll" target="libgobject-2.0.so.0"/>
<dllmap dll="libgthread-2.0-0.dll" target="libgthread-2.0.so.0"/>
<dllmap dll="libpango-1.0-0.dll" target="libpango-1.0.so.0"/>
<dllmap dll="libpangocairo-1.0-0.dll" target="libpangocairo-1.0.so.0"/>
<dllmap dll="libatk-1.0-0.dll" target="libatk-1.0.so.0"/>
<dllmap dll="libgtk-win32-2.0-0.dll" target="libgtk-x11-2.0.so.0"/>
<dllmap dll="libgdk-win32-2.0-0.dll" target="libgdk-x11-2.0.so.0"/>
<dllmap dll="libgdk_pixbuf-2.0-0.dll" target="libgdk_pixbuf-2.0.so.0"/>
<dllmap dll="glibsharpglue-2" target="libglibsharpglue-2.so"/>
<dllmap dll="gtksharpglue-2" target="libgtksharpglue-2.so"/>
<dllmap dll="gdksharpglue-2" target="libgdksharpglue-2.so"/>
</configuration>
' >> $CONFIG_FILE
# Generate bundle
ln -sf $RENODE_OUTPUT_DIR/LZ4.dll $WORKDIR/LZ4cc.dll
ln -sf $RENODE_OUTPUT_DIR/LZ4.dll $WORKDIR/LZ4mm.dll
ln -sf $RENODE_OUTPUT_DIR/LZ4.dll $WORKDIR/LZ4pn.dll
function find_file() {
FOUND=`(find /usr/lib -name $1 -type f 2> /dev/null | head -n 1) || true`
if [ "$FOUND" = "" ] ; then
FOUND=`(find /usr/lib64 -name $1 -type f 2> /dev/null | head -n 1) || true`
fi
echo -n $FOUND
}
mkdir -p $WORKDIR/dependencies
cp `find_file atk-sharp.dll` $WORKDIR/dependencies
cp `find_file gtk-sharp.dll` $WORKDIR/dependencies
cp `find_file gdk-sharp.dll` $WORKDIR/dependencies
cp `find_file glib-sharp.dll` $WORKDIR/dependencies
cp `find_file pango-sharp.dll` $WORKDIR/dependencies
# this is ok to crash here, we will re-compile it
set +e
(cd $WORKDIR; ls $RENODE_OUTPUT_DIR/*.dll | xargs mkbundle \
--simple \
--custom \
--machine-config /etc/mono/$MONO_VERSION/machine.config \
--config $CONFIG_FILE \
-L $RENODE_OUTPUT_DIR \
-L $WORKDIR/dependencies \
-L /usr/lib/mono/$MONO_VERSION \
-z --static --keeptemp --nomain \
$RENODE_BIN 2>/dev/null)
set -e
# Re-compile bundle
WRAPPER_SOURCE_FILE=$WORKDIR/bundler.c
echo "extern int mono_environment_exitcode_get();" > $WRAPPER_SOURCE_FILE
echo "extern void mono_aot_register_module();" >> $WRAPPER_SOURCE_FILE
# this file is generated by `mkbundle`
cat $WORKDIR/temp.c >> $WRAPPER_SOURCE_FILE
# this file is proveded by us
cat $THIS_DIR/linux_portable/additional.c >> $WRAPPER_SOURCE_FILE
gcc \
-Wl,--wrap=powf \
-Wl,--wrap=logf \
-Wl,--wrap=expf \
-Wl,--wrap=getrandom \
-Wl,--wrap=mono_dl_open_file \
-Wl,--wrap=mono_dl_lookup_symbol \
-Wl,--wrap=__shm_directory \
-fvisibility=hidden \
-Wl,--export-dynamic \
$WRAPPER_SOURCE_FILE \
$WORKDIR/temp.s \
-I/usr/include/mono-2.0 \
-ldl \
-Wl,-Bstatic \
-lmono-2.0 \
-lMonoPosixHelper \
-lz \
-lrt \
-lbsd \
-Wl,-Bdynamic `pkg-config --libs-only-l mono-2 | sed -e "s/\-lmono-2.0 //" | sed -e "s/\-lm//" | sed -e "s/\-lrt //"` \
$RENODE_ROOT_DIR/lib/resources/libraries/libopenlibm-Linux.a \
-static-libgcc \
-o $DESTINATION/renode
# Copy dependencies
cp $RENODE_OUTPUT_DIR/libllvm-disas.so $DESTINATION
cp `find_file libmono-btls-shared.so` $DESTINATION
cp `find_file libglibsharpglue-2.so` $DESTINATION
cp `find_file libgtksharpglue-2.so` $DESTINATION
cp `find_file libgdksharpglue-2.so` $DESTINATION
# Create tar
mkdir -p ../../output/packages
tar -czf ../../output/packages/renode-$VERSION.linux-portable.tar.gz $DESTINATION
echo "Created a portable package in output/packages/renode-$VERSION.linux-portable.tar.gz"
# Cleanup
if $REMOVE_WORKDIR
then
rm -rf $DESTINATION
rm -rf $WORKDIR
fi