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

# User Rev Content
1 root 1.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 root 1.3 if true; then
72     for mod in Deliantra CFPlus; do
73 root 1.1 # for mod in common-sense AnyEvent EV JSON-XS Deliantra Compress-LZF BDB Guard CFPlus; do
74 root 1.3 # for mod in CFPlus; do
75 root 1.1 (
76     cd /root/src/$mod
77 root 1.3 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 root 1.1 )
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 root 1.2 File::Path::mkpath "$ENV{OSDIST}/pm/" . dirname $_;
179 root 1.1 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 root 1.2 File::Path::mkpath "$ENV{OSDIST}/pm/" . dirname $_;
188 root 1.1 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 root 1.2 cp -p "$PERL" .
246 root 1.1
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 root 1.2
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 root 1.1 else
256 root 1.2 # 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 root 1.1 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 root 1.2 echo >"$DIST".genpack genpack deliantra_S-$OS-"$ARCHNAME" '"$EXE_VER"' '"$1"' $GENPACK_ENVVARS ./perl run
327 root 1.1
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