#!/bin/bash # this gem of a hack gathers all fiels required by the client for the platform # by deep magic, it works on osx, linux and windows. on MY osx, linux # and windows, that is. STRIP="strip" LIBEXT=so LIB0=so.? SO=so SYSLIB=/usr/lib MAKE=make ARCHNAME=x86 GENPACK_ENVVARS="LD_LIBRARY_PATH=." umask 022 if [ "$(uname -s)" = CYGWIN_NT-5.0 ]; then . ~/.setenv OS=windows URLADER=.exe unset PANGO PERL=/c/perl/bin/perl MAKE=nmake SYSLIB=/c/gtk/bin LIBEXT=dll LIB0=dll SO=dll STRIP=":" # stripping the perl library kills it, and apparently, everythignis always stripped # fontconfig apparently ignores env vars and always looks at ./etc/fonts/fonts.conf, # but only if . isn't actually called bin or lib. hope for the best. GENPACK_ENVVARS="FONTCONFIG_PATH=pm/Deliantra/Client/private/resources/fonts FONTCONFIG_FILE=fonts.conf" pango-querymodules() { /c/gtk/bin/pango-querymodules # empty output usually } elif [ "$(uname -s)" = Darwin ]; then OS=darwin URLADER=-osx105 PANGO=1.6.0 PERL=/opt/local/bin/perl GENPACK_ENVVARS="DYLD_LIBRARY_PATH=." SYSLIB=/opt/local/lib LIB0=dylib SO=bundle STRIP="strip -x" elif [ $(arch) = i686 ]; then OS=linux URLADER=-x86 PANGO=1.5.0 PERL=/usr/bin/perl else OS=linux URLADER=-amd64 PANGO=1.5.0 PERL=/usr/bin/perl ARCHNAME=amd64 fi export DIST="$(pwd)/dist/$OS-$ARCHNAME" rm -rf "$DIST" mkdir -p "$DIST" #PERL=/opt/perl #PANGO=1.6.0 export EV_EVENTFD=0 export EV_INOTIFY=0 export EV_SIGNALFD=0 if true; then for mod in deliantra/Deliantra deliantra/Deliantra-Client; do # for mod in common-sense AnyEvent EV JSON-XS deliantra/Deliantra Compress-LZF BDB Guard deliantra/Deliantra-Client; do # for mod in CFPlus; do ( cd /root/src/$mod cvs update -AdP $PERL Makefile.PL /dev/null $MAKE clean >/dev/null $PERL Makefile.PL /dev/null if ! $MAKE install >log 2>&1; then cat log exit fi rm -f log $MAKE clean >/dev/null ) || exit done fi cat <"$DIST"/pango.rc [Pango] ModuleFiles = pango.modules EOF ( exec 5>"$DIST"/pango.modules pango-querymodules | grep ^/ | while read lib rest; do base=$(basename "$lib") [ "$base" = pango-basic-x.$LIBEXT ] && continue cp -p "$lib" "$DIST"/. echo "$base $rest" >&5 done ) ############################################################################# IFS=" " # space tab nl cr - cr for windows eval $($PERL -V:sitebinexp -V:sitearchexp -V:sitelib -V:vendorarchexp -V:vendorlibexp -V:archlibexp -V:privlibexp) mkdir -p "$DIST"/pm/bin cp "$sitebinexp"/deliantra "$DIST"/pm/bin/ cp -p util/run "$DIST" ( exec ) { s/\015?\012$//; next if /^(#|$)/; s/\.dynob$/.'$SO'/; my $found; for my $lib (@path) { chdir $lib || next; my @glob = File::Glob::bsd_glob $_, 0; # explicit 0 needed if (@glob) { ++$found; for (@glob) { if (-d $_) { system "rsync", "-aR", $_, "$ENV{DIST}/pm/."; } else { File::Path::mkpath "$ENV{OSDIST}/pm/" . dirname $_; File::Copy::syscopy "$_", "$ENV{OSDIST}/pm/$_" or die "$ENV{OSDIST}/pm/$_: $!"; if (s/\.pm$//) { $auto = "auto/$_"; for my $glob ("*.'$SO'", "autosplit.ix", "*.al") { for (bsd_glob "$auto/$glob", 0) { File::Path::mkpath "$ENV{OSDIST}/pm/" . dirname $_; File::Copy::syscopy "$_", "$ENV{OSDIST}/pm/$_"; } } } } } last; } } warn "$_: not found\n" unless $found; } ' ) || exit ############################################################################# if [ "$OS" = windows ]; then libdeps() { objdump -p "$1" | awk '/\tDLL Name:/ { print $3 }' | while read lib; do set -- $(type "$lib") case "$3" in /c/WINNT/* | /c/sdk/* ) ;; * ) echo "$3" ;; esac done } elif [ "$OS" = darwin ]; then libdeps() { otool -L "$1" | perl -ne 'print "$1\n" if m%^\s+(/opt\S+)%' } else libdeps() { ldd "$1" | perl -ne 'print "$1\n" if / => (\S+)/' } fi add_deps() { local so="$1" libdeps "$so" | while read path; do base="$(basename "$path")" if ! [ -e "$base" ]; then cp -p "$path" . chmod 755 "$base" add_deps "$base" fi done } ( cd "$DIST" cp -p "$PERL" . if [ "$OS" = windows ]; then cp -p $SYSLIB/libvorbisfile-3.dll $SYSLIB/mikmod.dll $SYSLIB/libpng12-0.dll . cp /root/src/CFPlus/util/splash.bmp . chmod -R u+rwX pm/auto # convert perl to a non-console-app $PERL -MWin32::Exe -e '$e = new Win32::Exe"perl.exe"; $e->set_subsystem_windows; $e->write' else # patch braindamaged pango perl -pe 's{/u(?=sr/lib(32)?/pango)}{/\x00}g; s{\Q'$PANGO'\E\x00}{y.t.u\x00}g' <$SYSLIB/libpango-1.0.$LIB0 >libpango-1.0.$LIB0 chmod 755 libpango-1.0.$LIB0 for lib in mikmod vorbisfile; do cp -p $SYSLIB/lib$lib.$LIB0 . chmod 755 lib$lib.$LIB0 done fi for so in $(find . -name "*.$SO" -o -name "*.$LIBEXT" -o -name "*.$LIB0") perl; do add_deps "$so" done rm -f pm/auto/POSIX/*.al for lib in \ dl c m rt pthread nsl crypt \ X11 Xext Xau Xdmcp ICE SM Xrandr Xrender Xxf86vm drm GL \ z do rm -f lib"$lib".$SO0 done if [ "$OS" = darwin ]; then # "dll hell" is most severe on os x, because apple # does not generally give a shit for backwards compatibility, # alwayss ships outdated libraries and often provides libraries # of the same name as well-known libs (such as libjpeg), that # of course do something completely different patchlibs() { <"$1" \ perl -0777 -pe ' s%('"/opt/local/lib[^\x00]*/lib"'([^\x00/]+)\.dylib\x00)% my $s = $1; my $r = "libdeliantra-$2.dylib\x00"; (length $r) <= (length $s) or die "lib replacement <$r> larger than <$s>\n"; substr $s, 0, length $r, $r; $s %ge ' \ >"$1~" && mv "$1~" "$1" || exit 67 } # patch bundles and pango modules with external dependencies, # should be few, so hardcode(tm) for so in \ pm/auto/BDB/BDB.bundle \ pm/auto/Deliantra/Client/Client.bundle \ *.$LIBEXT do patchlibs "$so" done # now patch and rename all .dylibs for lib in *.$LIB0; do stem="${lib#lib}" stem="${stem%.$LIB0}" patchlibs "$lib" mv "$lib" "libdeliantra-$stem.dylib" done fi [ "$OS" = linux ] && chrpath -d perl # debian perls have an rpath. really. $STRIP $(find . -name "*.$SO" -o -name "*.$LIBEXT" -o -name "*.$LIB0") perl ) printf -- urlader$URLADER >"$DIST".urlader echo >"$DIST".genpack genpack deliantra_S-$OS-"$ARCHNAME" '"$EXE_VER"' '"$1"' $GENPACK_ENVVARS ./perl run exit tar cf deliantra-gnu-linux-$ARCHNAME.tar deliantra-gnu-linux-$ARCHNAME gzip -9vf deliantra-gnu-linux-$ARCHNAME.tar todata deliantra-gnu-linux-$ARCHNAME.tar.gz