ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/util/gatherer
Revision: 1.11
Committed: Wed Jan 18 23:10:18 2012 UTC (12 years, 3 months ago) by root
Branch: MAIN
Changes since 1.10: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 #!/bin/bash
2
3 # this gem of a hack gathers all files required by the client for the platform
4 # by deep magic, it works on osx, linux and windows. on MY osx, linux
5 # and windows, that is.
6
7 STRIP="strip"
8 LIBEXT=so
9 LIB0=so.?
10 SO=so
11 SYSLIB=/usr/lib
12 MAKE=make
13 ARCHNAME=x86
14 GENPACK_ENVVARS="LD_LIBRARY_PATH=."
15
16 umask 022
17
18 if [ "$(uname -s)" = CYGWIN_NT-5.0 ]; then
19 . ~/.setenv
20
21 OS=windows
22 URLADER=windows-x86
23 unset PANGO
24 PERL=/c/perl/bin/perl
25 MAKE=nmake
26 SYSLIB=/c/gtk/bin
27 LIBEXT=dll
28 LIB0=dll
29 SO=dll
30 STRIP=":" # stripping the perl library kills it, and apparently, everythignis always stripped
31
32 # fontconfig apparently ignores env vars and always looks at ./etc/fonts/fonts.conf,
33 # but only if . isn't actually called bin or lib. hope for the best.
34 GENPACK_ENVVARS="FONTCONFIG_PATH=pm/Deliantra/Client/private/resources/fonts FONTCONFIG_FILE=fonts.conf"
35
36 pango-querymodules() {
37 /c/gtk/bin/pango-querymodules # empty output usually
38 }
39
40 elif [ "$(uname -s)" = Darwin ]; then
41 OS=darwin
42 URLADER=darwin-x86
43 PANGO=1.6.0
44 PERL=/opt/local/bin/perl
45 GENPACK_ENVVARS="DYLD_LIBRARY_PATH=."
46
47 SYSLIB=/opt/local/lib
48 LIB0=dylib
49 SO=bundle
50 STRIP="strip -x"
51 elif [ $(arch) = i686 ]; then
52 OS=linux
53 URLADER=linux-x86
54 PANGO=1.5.0
55 PERL=/usr/bin/perl
56 else
57 OS=linux
58 URLADER=linux-amd64
59 PANGO=1.5.0
60 PERL=/usr/bin/perl
61 ARCHNAME=amd64
62 fi
63
64 export DIST="$(pwd)/dist/$OS-$ARCHNAME"
65
66 rm -rf "$DIST"
67 mkdir -p "$DIST"
68
69 #PERL=/opt/perl
70 #PANGO=1.6.0
71
72 export EV_EVENTFD=0
73 export EV_INOTIFY=0
74 export EV_SIGNALFD=0
75
76 cat <<EOF >"$DIST"/pango.rc
77 [Pango]
78 ModuleFiles = pango.modules
79 EOF
80
81 (
82 exec 5>"$DIST"/pango.modules
83 pango-querymodules | grep ^/ | while read lib rest; do
84 base=$(basename "$lib")
85 [ "$base" = pango-basic-x.$LIBEXT ] && continue
86 cp -p "$lib" "$DIST"/.
87 echo "./$base $rest" >&5 # using ./ seems to help pango not to rummage around in /usr/lib etc.
88 done
89 )
90
91 #############################################################################
92
93 IFS="
94 " # space tab nl cr - cr for windows
95 eval $($PERL -V:sitebinexp -V:sitearchexp -V:sitelib -V:vendorarchexp -V:vendorlibexp -V:archlibexp -V:privlibexp)
96
97 mkdir -p "$DIST"/pm/bin
98 cp "$sitebinexp"/deliantra "$DIST"/pm/bin/
99 cp -p util/run "$DIST"
100
101 (
102 exec <util/modules.dep
103
104 # while read type name; do
105 # if [ "$type" = d ]; then
106 # # not implemented
107 # dir=$(echo "$name" | sed -e s%::%/%g)
108 # for lib in "$sitearchexp" "$sitelib" "$vendorarchexp" "$vendorlibexp" "$archlibexp" "$privlibexp"; do
109 # if [ -e "$lib/auto/$dir/.packlist" ]; then
110 # cat "$lib/auto/$dir/.packlist"
111 # fi
112 # echo "x $lib $dir"
113 # done
114 # elif [ $type = m ]; then
115 # :
116 # else
117 # echo "unknown type $type ($name)"
118 # exit 1
119 # fi
120 # done
121 mkdir -p "$DIST"/pm
122
123 export OSDIST="$DIST"
124 [ "$OS" = windows ] && OSDIST=$(cygpath -w "$OSDIST")
125
126 $PERL -e '
127 use Config;
128 use File::Glob qw(:glob);
129 use File::Copy;
130 use File::Path;
131 use File::Basename;
132
133 my @path = do {
134 my %seen;
135 grep !$seen{$_}++, grep length, map $Config{$_}, qw(
136 sitearchexp
137 sitelib
138 vendorarchexp
139 vendorlibexp
140 archlibexp
141 privlibexp
142 )
143 };
144
145 while (<>) {
146 s/\015?\012$//;
147 next if /^(#|$)/;
148 s/\.dynob$/.'$SO'/;
149
150 my $found;
151 for my $lib (@path) {
152 chdir $lib || next;
153
154 my @glob = File::Glob::bsd_glob $_, 0; # explicit 0 needed
155
156 if (@glob) {
157 ++$found;
158
159 for (@glob) {
160 if (-d $_) {
161 system "rsync", "-aR", $_, "$ENV{DIST}/pm/.";
162 } else {
163 File::Path::mkpath "$ENV{OSDIST}/pm/" . dirname $_;
164 File::Copy::syscopy "$_", "$ENV{OSDIST}/pm/$_"
165 or die "$lib/$_ => $ENV{OSDIST}/pm/$_: $!";
166
167 if (s/\.pm$//) {
168 $auto = "auto/$_";
169
170 for my $glob ("*.'$SO'", "autosplit.ix", "*.al") {
171 for (bsd_glob "$auto/$glob", 0) {
172 File::Path::mkpath "$ENV{OSDIST}/pm/" . dirname $_;
173 File::Copy::syscopy "$_", "$ENV{OSDIST}/pm/$_";
174 }
175 }
176 }
177 }
178 }
179
180 last;
181 }
182 }
183
184 warn "$_: not found\n"
185 unless $found;
186 }
187 '
188 ) || exit
189
190 #############################################################################
191
192 if [ "$OS" = windows ]; then
193 libdeps() {
194 objdump -p "$1" | awk '/\tDLL Name:/ { print $3 }' | while read lib; do
195 set -- $(type "$lib")
196 case "$3" in
197 /c/WINNT/* | /c/sdk/* )
198 ;;
199 * )
200 echo "$3"
201 ;;
202 esac
203 done
204 }
205 elif [ "$OS" = darwin ]; then
206 libdeps() {
207 otool -L "$1" | perl -ne 'print "$1\n" if m%^\s+(/opt\S+)%'
208 }
209 else
210 libdeps() {
211 ldd "$1" | perl -ne 'print "$1\n" if / => (\S+)/'
212 }
213 fi
214
215 add_deps() {
216 local so="$1"
217 libdeps "$so" | while read path; do
218 base="$(basename "$path")"
219 if ! [ -e "$base" ]; then
220 cp -p "$path" .
221 chmod 755 "$base"
222 add_deps "$base"
223 fi
224 done
225 }
226
227 (
228 cd "$DIST"
229
230 cp -p "$PERL" .
231
232 if [ "$OS" = windows ]; then
233 cp -p $SYSLIB/libvorbisfile-3.dll $SYSLIB/mikmod.dll $SYSLIB/libpng12-0.dll .
234 cp /root/src/CFPlus/util/splash.bmp .
235 chmod -R u+rwX pm/auto
236
237 # convert perl to a non-console-app
238 $PERL -MWin32::Exe -e '$e = new Win32::Exe"perl.exe"; $e->set_subsystem_windows; $e->write'
239
240 else
241 for lib in mikmod vorbisfile; do
242 cp -p $SYSLIB/lib$lib.$LIB0 .
243 chmod 755 lib$lib.$LIB0
244 done
245 fi
246
247 for so in $(find . -name "*.$SO" -o -name "*.$LIBEXT" -o -name "*.$LIB0") perl; do
248 add_deps "$so"
249 done
250
251 rm -f pm/auto/POSIX/*.al
252
253 for lib in \
254 dl c m rt pthread nsl crypt \
255 X11 Xext Xau Xdmcp ICE SM Xrandr Xrender Xxf86vm drm GL \
256 z
257 do
258 rm -f lib"$lib".$LIB0
259 done
260
261 if [ "$OS" != windows ]; then
262 # patch braindamaged pango
263
264 if [ "$OS" != darwin ]; then
265 set libpango-1.0.$LIB0
266 perl -pe 's{/u(?=sr/lib(32)?/pango)}{.\x00}g;' <"$1" >"$1~" && mv "$1~" "$1"
267 else
268 set lib*pango-1.0.0.dylib
269 perl -pe 's{/o(?=pt/local/.../pango)}{.\x00}g;' <"$1" >"$1~" && mv "$1~" "$1"
270 fi
271 chmod 755 "$1"
272 fi
273
274 if [ "$OS" = darwin ]; then
275 # "dll hell" is most severe on os x, because apple
276 # does not generally give a shit for backwards compatibility,
277 # alwayss ships outdated libraries and often provides libraries
278 # of the same name as well-known libs (such as libjpeg), that
279 # of course do something completely different
280 patchlibs() {
281 <"$1" \
282 perl -0777 -pe '
283 s%('"/opt/local/lib[^\x00]*/lib"'([^\x00/]+)\.dylib\x00)%
284 my $s = $1;
285 my $r = "libdeliantra-$2.dylib\x00";
286 (length $r) <= (length $s)
287 or die "lib replacement <$r> larger than <$s>\n";
288 substr $s, 0, length $r, $r;
289 $s
290 %ge
291 ' \
292 >"$1~" && mv "$1~" "$1" || exit 67
293 }
294
295 # patch bundles and pango modules with external dependencies,
296 # should be few, so hardcode(tm)
297 for so in \
298 pm/auto/BDB/BDB.bundle \
299 pm/auto/Deliantra/Client/Client.bundle \
300 *.$LIBEXT
301 do
302 patchlibs "$so"
303 done
304
305 # now patch and rename all .dylibs
306 for lib in *.$LIB0; do
307 stem="${lib#lib}"
308 stem="${stem%.$LIB0}"
309 patchlibs "$lib"
310 mv "$lib" "libdeliantra-$stem.dylib"
311 done
312 fi
313
314 [ "$OS" = linux ] && chrpath -d perl $(find pm -name "*.so") # debian perls have an rpath, many modules too
315 $STRIP $(find . -name "*.$SO" -o -name "*.$LIBEXT" -o -name "*.$LIB0") perl
316
317 : >timidity.cfg
318 )
319
320 cat >"$DIST".vars <<EOF
321 G_URLADER="$URLADER"
322 G_OS="$OS"
323 G_ARCHNAME="$ARCHNAME"
324 G_ENVVARS="$GENPACK_ENVVARS"
325 G_COMMAND="./perl run"
326 EOF
327