ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/util/gatherer
Revision: 1.3
Committed: Fri Dec 30 06:31:41 2011 UTC (12 years, 4 months ago) by root
Branch: MAIN
Changes since 1.2: +13 -7 lines
Log Message:
*** empty log message ***

File Contents

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