update dev300-m58
[ooovba.git] / solenv / bin / linkoo
bloba4615d5ee0e27ae8e14c22a7d39625da487a8a61
2     eval 'exec perl -S $0 ${1+"$@"}'
3         if 0;
5 #*************************************************************************
7 #    This app makes it easy to link a live build
8 # set into an install set. Then your devel iteration
9 # is: 'build', execute.
11 #*************************************************************************
13 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
14
15 # Copyright 2008 by Sun Microsystems, Inc.
17 # OpenOffice.org - a multi-platform office productivity suite
19 # $RCSfile: linkoo,v $
21 # $Revision: 1.17 $
23 # This file is part of OpenOffice.org.
25 # OpenOffice.org is free software: you can redistribute it and/or modify
26 # it under the terms of the GNU Lesser General Public License version 3
27 # only, as published by the Free Software Foundation.
29 # OpenOffice.org is distributed in the hope that it will be useful,
30 # but WITHOUT ANY WARRANTY; without even the implied warranty of
31 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
32 # GNU Lesser General Public License version 3 for more details
33 # (a copy is included in the LICENSE file that accompanied this code).
35 # You should have received a copy of the GNU Lesser General Public License
36 # version 3 along with OpenOffice.org.  If not, see
37 # <http://www.openoffice.org/license.html>
38 # for a copy of the LGPLv3 License.
40 #*************************************************************************
42 # ends up in program/ooenv
43 ( $moz_lib = `pkg-config --variable=libdir mozilla-nss` ) =~ tr/\n/:/;
44 $env_script = '
45 java_path=`../basis-link/ure-link/bin/javaldx`
46 export LD_LIBRARY_PATH=".:$java_path:' . $moz_lib . '$LD_LIBRARY_PATH"
47 ulimit -c unlimited
48 export PATH=".:../basis-link/program:../basis-link/ure-link/bin:$PATH"
49 export GNOME_DISABLE_CRASH_DIALOG=1
50 export STAR_RESOURCEPATH=`pwd`/../basis-link/program/resource
51 # debugging assistance
52 export OOO_FORCE_SYSALLOC=1
53 export MALLOC_CHECK_=2
54 export OOO_DISABLE_RECOVERY=1
55 export SAL_ALLOW_LINKOO_SYMLINKS=1
58 $program_dir = 'basis-link/program';
59 $brand_program_dir = 'program';
60 $ure_misc_dir = 'basis-link/ure-link/share/misc';
62 $program_dir = 'openoffice.org/basis-link/MacOS' if ($ENV{OS} eq 'MACOSX'); # FIXME probably wrong
64 my @exceptions = ( 'cppuhelper', 'configmgr2', 'sunjavaplugin', 'libjvmfwk' );
66 %replaceable = (
67         $program_dir => '\.so',
68     $program_dir . '/resource' => '\.res$',
69     $program_dir . '/classes' => '\.jar$',
70     'basis-link/share/config' => '\.zip$',
71 #    'share/uno_packages' => '\.zip$'
74 # strangely enough, OSX has those small differences...
75 $replaceable{$program_dir} = '\.dylib$' if ($ENV{OS} eq 'MACOSX');
77 @search_dirs = ( 'lib', 'bin', 'class' );
79 @known_duplicates = ( 'db.jar', 'libi18n' );
81 sub sniff_target($)
83     my $build_dir = shift;
84     my ($dirhandle, $fname);
85     my ($target, $libver, $lang) = ( 'unxlngi4.pro', '680', 'en-US' ); # defaults
86     
87     opendir ($dirhandle, $build_dir) || die "Can't open $build_dir";
88     while ($fname = readdir ($dirhandle)) {
89         $fname =~ /Set.sh$/ || next;
90         
91         my $file;
92         open ($file, "$build_dir/$fname") || die "Can't open $build_dir/$fname";
93         while (<$file>) {
94             /\s*(\S+)\s*=\s*\"(\S+)\"/ || next;
95             if ($1 eq 'INPATH') {
96                 $target = $2;
97             }
98             if ($1 eq 'UPD') {
99                 $libver = $2;
100             }
101         }
102         close ($file);
103     }
105     closedir ($dirhandle);
107     print "Sniffed target: $target, $libver\n";
109     return ($target, $libver, $lang);
112 sub build_installed_list($)
114     my $path = shift;
115     my %files = ();
117     for my $suffix (keys %replaceable) {
118         my $dirname = "$path/$suffix";
119         my $dirhandle;
120         my $pattern = $replaceable{$suffix};
121         if (opendir ($dirhandle, $dirname)) {
122             while (my $fname = readdir ($dirhandle)) {
123                 $fname =~ m/$pattern/ || next;
125                 my $skip = 0;
126                 for $pattern (@exceptions) {
127                     $fname =~ /$pattern/ || next;
128                     $skip = 1;
129                 }
130                 $files{$fname} = $dirname if !$skip;
131             }
132             closedir ($dirhandle);
133         } else {
134             print "Couldn't find '$dirname': skipping\n";
135         }
136     }
137     return \%files;
140 sub check_create_linked($)
142     my $path = shift;
143     my $linked_dir = "$path/linked";
144     if (! -d $linked_dir) {
145         mkdir $linked_dir || die "Can't make $linked_dir: $!";
146     }
149 sub do_link($$$$@)
151     my $src = shift;
152     my $dest = shift;
153     my $src_name = shift;
154     my $dest_name = shift;
155     my $dont_check_link = shift;
157     if (-l "$dest/$dest_name" ) {
158         my $link = readlink ("$dest/$dest_name");
159         if ($link =~ /^\//) { # Absolute path
160             if (!$dry_run) {
161                 # re-write the link
162                 unlink ("$dest/$dest_name");
163                 symlink ("$src/$src_name", "$dest/$dest_name") || die "Failed to symlink: $!";
164                 print " [$dest_name]";
165             } else {
166                 print "re-make link $src/$src_name => $dest/$dest_name\n";
167             }
168         } elsif ($dry_run) {
169             print "skipping symbolic link $dest/$dest_name -> $link\n";
170         }
171     } else {
172         check_create_linked ($dest);
173         if (!$dry_run) {
174             # move / write the link
175             rename ("$dest/$dest_name", "$dest/linked/$dest_name") ||
176                 defined $dont_check_link || die "Failed rename of $dest/$dest_name: $!";
178             symlink ("$src/$src_name", "$dest/$dest_name") || die "Failed to symlink: $!";
179             print " $dest_name";
180         } else {
181             print "move / symlink $src/$src_name => $dest/$dest_name\n";
182         }
183     }
186 sub scan_and_link_files($$$)
188     my $build_path = shift;
189     my $installed_files = shift;
190     my $target = shift;
191     
192     my @modules = ();
193     my $dirh_toplevel;
194     opendir ($dirh_toplevel, $build_path) || die "Can't open '$build_path': $!";
195     while (my $subdir = readdir ($dirh_toplevel)) {
196         $subdir =~ m/\./ && next; # eg. vcl.old,
197         my $test = "$build_path/$subdir/$target";
198         -d $test || next;
199         push @modules, $test;
200     }
201     closedir ($dirh_toplevel);
203 # FIXME: re-implement the $product functionality
204     my $module;
205     my %build_files;
206     for $module (@modules) {
207         for $elem (@search_dirs) {
208             my $dirh_module;
209             my $module_path = "$module/$elem";
210             if (opendir ($dirh_module, $module_path)) {
211                         while (my $file = readdir($dirh_module)) {
212                                 if (defined $installed_files->{$file}) {
213                                         if (defined $build_files{$file}) {
214                                                 my $known = 0;
215                                                 for my $regexp (@known_duplicates) {
216                                                         if ($file =~ m/$regexp/) {
217                                                                 $known = 1;
218                                                         }
219                                                 }
220                                                 if (!$known) {
221                                                         print "Unknown duplicate file '$file' in: '" . 
222                                                         $build_files{$file} . "' vs '" .
223                                                         $module_path . "' in module $module\n";
224                                                         exit (1);
225                                                 }
226                                         }
227                                         $build_files{$file} = $module_path;
228                                 }
229                         }
230                 }
231             closedir ($dirh_module);
232         }
233     }
235     for my $file (keys %build_files) {
236         my $src = $build_files{$file};
237         my $dest = $installed_files->{$file};
238         
239         do_link ($src, $dest, $file, $file);
240     }
241     print "\n";
244 sub evilness($)
246     my $doit = shift;
247     my $name = 'librecentfile.so';
248     my $src  = "$OOO_BUILD/shell/$TARGET/lib/$name";
249     my $dest = "$OOO_BUILD/sfx2/$TARGET/lib/$name";
251     if ($doit eq 'undo') {
252         if (-l $dest) {
253             print " unlink $name\n";
254             unlink $dest;
255         }
256     } else {
257         $doit eq 'do' || die;
258         if (-f $src) {
259             print " link $name\n";
260             symlink $src, $dest;
261         }
262     }
265 sub link_iso_res()
267     print "Special iso.res case: ";
268     my $ooo_res="$OOO_INSTALL/" . $brand_program_dir . "/resource/ooo".$LIBVER.$LANG.".res";
269     my $star_res="$OOO_INSTALL/" . $brand_program_dir . "/resource/iso".$LIBVER.$LANG.".res";
270     if (-l $ooo_res && -l $star_res) {
271         if ($dry_run) {
272             print "link $ooo_res to $star_res";
273         } else {
274             unlink ($star_res);
275             symlink ($ooo_res, $star_res);
276             print "clobbered";
277         }
278     }
279     print "\n";
282 # Hack for (renamed) types.rdb (types.db)
283 sub link_oovbaapi_rdb()
285     print "oovbaapi.rdb case:";
286     my $src  = "$OOO_BUILD/oovbaapi/$TARGET/ucr";
287     my $dest = "$OOO_INSTALL/" . $program_dir;
288     do_link ($src, $dest, 'oovbaapi.db', 'oovbaapi.rdb');
289     print "\n";
291 sub link_types_rdb()
293     print "Types.rdb case:";
294     my $src  = "$OOO_BUILD/offapi/$TARGET/ucr";
295     my $dest = "$OOO_INSTALL/" . $ure_misc_dir;
296     do_link ($src, $dest, 'types.db', 'types.rdb');
297     print "\n";
300 # link installed files back into src tree:
301 sub link_soffice_bin_files()
303     my $dest;
304     my $src = "$OOO_INSTALL/" . $brand_program_dir;
306     print "soffice files";
307     $dest = "$OOO_BUILD/desktop/$TARGET/bin";
308     do_link ($src, $dest, 'soffice', 'soffice.bin', 1);
309     do_link ($src, $dest, 'bootstraprc', 'bootstraprc', 1);
310     do_link ($src, $dest, 'intro.bmp', 'intro.bmp', 1);
311     do_link ("$OOO_INSTALL", "$OOO_BUILD/desktop/$TARGET", 'share', 'share', 1);
313     $dest = "$OOO_BUILD/configmgr/$TARGET/lib";
314     do_link ($src, $dest, 'configmgrrc', 'configmgrrc', 1);
316     print "\n";
319 my $a;
320 my $usage = 0;
321 for $a (@ARGV) {
323 # options
324     if ($a =~ /--product/) {
325         $product = 1;
326     } elsif ($a =~ /--dry-run/) {
327         $dry_run = 1;
328     } elsif (($a eq '--help') || ($a eq '-h')) {
329         $usage = 1;
331 # ordered arguments
332     } elsif (!defined $OOO_INSTALL) {
333         $OOO_INSTALL = $a;
334     } elsif (!defined $OOO_BUILD) {
335         $OOO_BUILD = $a;
336     } else {
337         print "Unknown argument '$a'\n";
338         $usage = 1;
339     }
342 if (!defined $OOO_BUILD && defined $ENV{SRC_ROOT}) {
343     $OOO_BUILD = $ENV{SRC_ROOT};
346 if ($usage || !defined $OOO_INSTALL || !defined $OOO_BUILD) {
347     printf "Usage: linkoo </path/to/ooo/install> [</path/to/ooo/build/tree>] [--product] [--dry-run]\n";
348     exit (1);
351 substr ($OOO_INSTALL, 0, 1) eq '/' || die "linkoo requires absolute paths ($OOO_INSTALL does not qualify)";
352 substr ($OOO_BUILD, 0, 1)   eq '/' || die "linkoo requires absolute paths ($OOO_BUILD does not qualify)";
354 -d $OOO_INSTALL || die "No such directory $OOO_INSTALL";
355 -w $OOO_INSTALL || die "You need write access to $OOO_INSTALL";
356 -d $OOO_BUILD || die "No such directory $OOO_BUILD";
357 -d "$OOO_INSTALL/" . $program_dir . "/resource" || die "$OOO_INSTALL doesn't look like an OO install";
359 ($TARGET, $LIBVER, $LANG) = sniff_target ($OOO_BUILD);
361 evilness ('undo');
363 my $installed_files = build_installed_list ($OOO_INSTALL);
365 scan_and_link_files ($OOO_BUILD, $installed_files, $TARGET);
366 link_iso_res();
367 link_types_rdb();
368 link_oovbaapi_rdb();
369 link_soffice_bin_files();
371 if (!-f "$OOO_INSTALL/" . $brand_program_dir . "/ooenv") {
372     print "Creating '$OOO_INSTALL/", $brand_program_dir, "/ooenv'\n";
373     open ($ooenv, ">$OOO_INSTALL/" . $brand_program_dir . "/ooenv") || die "Can't open $OOO_INSTALL/" . $brand_program_dir . "/ooenv: $!";
374     print $ooenv $env_script;
375         print $ooenv "# testtool\nexport SRC_ROOT=$OOO_BUILD\n";
376     close ($ooenv);
379 evilness ('do');
381 print "\nlinkoo finished, please don't forget to source ooenv before ./soffice.\n";