office-gobmx/solenv/bin/linkoo

396 lines
11 KiB
Text
Raw Normal View History

:
eval 'exec perl -S $0 ${1+"$@"}'
if 0;
use strict;
#*************************************************************************
#
# This app makes it easy to link a live build
# set into an install set. Then your devel iteration
# is: 'build', execute.
#
#*************************************************************************
#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# Copyright 2000, 2010 Oracle and/or its affiliates.
#
# OpenOffice.org - a multi-platform office productivity suite
#
# This file is part of OpenOffice.org.
#
# OpenOffice.org is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License version 3
# only, as published by the Free Software Foundation.
#
# OpenOffice.org is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License version 3 for more details
# (a copy is included in the LICENSE file that accompanied this code).
#
# You should have received a copy of the GNU Lesser General Public License
# version 3 along with OpenOffice.org. If not, see
# <http://www.openoffice.org/license.html>
# for a copy of the LGPLv3 License.
#
# This file substantially, if not wholely written by volunteers, not Oracle
#
#*************************************************************************
# ends up in program/ooenv
( my $moz_lib = `pkg-config --variable=libdir mozilla-nss` ) =~ tr/\n/:/;
my $env_script = '
java_path=`$thisdir/../basis-link/ure-link/bin/javaldx 2>/dev/null`
export LD_LIBRARY_PATH="$thisdir:$java_path:' . $moz_lib . '$LD_LIBRARY_PATH"
ulimit -c unlimited
export PATH="$thisdir/:$thisdir/../basis-link/program:$thisdir/../basis-link/ure-link/bin:$PATH"
export GNOME_DISABLE_CRASH_DIALOG=1
export STAR_RESOURCEPATH=$thisdir/../basis-link/program/resource
# debugging assistance
2010-10-08 10:41:31 -05:00
export G_SLICE=always-malloc
export MALLOC_CHECK_=2
export OOO_DISABLE_RECOVERY=1
export SAL_ALLOW_LINKOO_SYMLINKS=1
';
my $dry_run = 0;
my $usage = 0;
my $LANG;
my $TARGET;
my $LIBVER;
my $OOO_BUILD;
my $OOO_INSTALL;
my $program_dir = 'basis-link/program';
my $brand_program_dir = 'program';
my $ure_misc_dir = 'basis-link/ure-link/share/misc';
my $ure_java_dir = 'basis-link/ure-link/share/java';
my $ure_lib_dir = 'basis-link/ure-link/lib';
$program_dir = 'openoffice.org/basis-link/MacOS' if ($ENV{OS} eq 'MACOSX'); # FIXME probably wrong
2009-10-08 08:48:40 -05:00
my @exceptions = ( 'cppuhelper', 'sunjavaplugin', 'libjvmfwk' );
my %replaceable = (
2010-12-03 10:57:17 -06:00
$program_dir => '\.so',
$program_dir . '/resource' => '\.res$',
$program_dir . '/classes' => '\.jar$',
'basis-link/share/config' => '\.zip$',
# 'share/uno_packages' => '\.zip$'
);
# strangely enough, OSX has those small differences...
$replaceable{$program_dir} = '\.dylib$' if ($ENV{OS} eq 'MACOSX');
$replaceable{$ure_lib_dir} = '\.dylib$' if ($ENV{OS} eq 'MACOSX');
my @search_dirs = ( 'lib', 'bin', 'class' );
my @known_duplicates = ( 'db.jar', 'libi18n' );
sub sniff_target($)
{
my $build_dir = shift;
my ($dirhandle, $fname);
2010-12-03 10:57:17 -06:00
my ($target, $libver, $lang) = ( 'unxlngi6.pro', '680', 'en-US' ); # defaults
opendir ($dirhandle, $build_dir) || die "Can't open $build_dir";
while ($fname = readdir ($dirhandle)) {
$fname =~ /Set.sh$/ || next;
2010-12-03 10:57:17 -06:00
my $file;
open ($file, "$build_dir/$fname") || die "Can't open $build_dir/$fname";
while (<$file>) {
/\s*(\S+)\s*=\s*\"(\S+)\"/ || next;
if ($1 eq 'INPATH') {
$target = $2;
}
if ($1 eq 'UPD') {
$libver = $2;
}
}
close ($file);
}
closedir ($dirhandle);
print "Sniffed target: $target, $libver\n";
return ($target, $libver, $lang);
}
sub build_installed_list($)
{
my $path = shift;
my %files = ();
for my $suffix (keys %replaceable) {
my $dirname = "$path/$suffix";
my $dirhandle;
my $pattern = $replaceable{$suffix};
if (opendir ($dirhandle, $dirname)) {
while (my $fname = readdir ($dirhandle)) {
$fname =~ m/$pattern/ || next;
my $skip = 0;
for $pattern (@exceptions) {
$fname =~ /$pattern/ || next;
$skip = 1;
}
$files{$fname} = $dirname if !$skip;
}
closedir ($dirhandle);
} else {
print "Couldn't find '$dirname': skipping\n";
}
}
return \%files;
}
sub check_create_linked($)
{
my $path = shift;
my $linked_dir = "$path/linked";
if (! -d $linked_dir) {
mkdir $linked_dir || die "Can't make $linked_dir: $!";
}
}
sub do_link($$$$@)
{
my $src = shift;
my $dest = shift;
my $src_name = shift;
my $dest_name = shift;
my $dont_check_link = shift;
if (-l "$dest/$dest_name" ) {
my $link = readlink ("$dest/$dest_name");
if ($link =~ /^\//) { # Absolute path
if (!$dry_run) {
# re-write the link
unlink ("$dest/$dest_name");
symlink ("$src/$src_name", "$dest/$dest_name") || die "Failed to symlink: $!";
print " [$dest_name]";
} else {
print "re-make link $src/$src_name => $dest/$dest_name\n";
}
} elsif ($dry_run) {
print "skipping symbolic link $dest/$dest_name -> $link\n";
}
} else {
check_create_linked ($dest);
if (!$dry_run) {
# move / write the link
rename ("$dest/$dest_name", "$dest/linked/$dest_name") ||
defined $dont_check_link || die "Failed rename of $dest/$dest_name: $!";
symlink ("$src/$src_name", "$dest/$dest_name") || die "Failed to symlink: $!";
print " $dest_name";
} else {
print "move / symlink $src/$src_name => $dest/$dest_name\n";
}
}
}
sub scan_one_dir($$$$)
{
my ($installed_files, $build_files, $path, $solver) = @_;
for my $elem (@search_dirs) {
my $dirh_module;
my $module_path = "$path/$elem";
if (opendir ($dirh_module, $module_path)) {
while (my $file = readdir ($dirh_module)) {
if (defined $installed_files->{$file}) {
if (defined $build_files->{$file}) {
my $known = 0;
for my $regexp (@known_duplicates) {
if ($file =~ m/$regexp/) {
$known = 1;
}
}
if (!$known && !$solver) {
print STDERR "\nlinkoo:: Unknown duplicate file '$file' in: '" .
$build_files->{$file} . "' vs '" .
$module_path . "' in module $path\n";
exit (1);
}
} else {
$build_files->{$file} = $module_path;
}
}
}
}
closedir ($dirh_module);
}
}
sub scan_and_link_files($$$)
{
my $build_path = shift;
my $installed_files = shift;
my $target = shift;
2010-12-03 10:57:17 -06:00
my @modules = ();
my $dirh_toplevel;
opendir ($dirh_toplevel, $build_path) || die "Can't open '$build_path': $!";
while (my $subdir = readdir ($dirh_toplevel)) {
$subdir =~ m/\./ && next; # eg. vcl.old,
my $test = "$build_path/$subdir/$target";
-d $test || next;
push @modules, $test;
}
closedir ($dirh_toplevel);
# Scan the old-style module/$target/lib directories ...
my %build_files;
for my $module (@modules) {
scan_one_dir ($installed_files, \%build_files, $module, 0);
}
# Now scan the solver
Merge commit 'ooo/DEV300_m101' into integration/dev300_m101 * commit 'ooo/DEV300_m101': (500 commits) masterfix DEV300: #i10000# remove hard dep masterfix DEV300: #i10000# usage of L10N build_type masterfix DEV300: #i10000# usage of L10N build_type masterfix DEV300: #i100000# dep. fix masterfix DEV300: #i10000# removed one hard dep masterfix DEV300: #i10000# fixed patch handling masterfix DEV300: #i10000# new configure DEV300 masterfix DEV300: #i10000# nawk -> awk l10nmove: adjust repository handling l10nmove: fixed regex l10nmove: minor fixes l10nmove: add l10n repo to gb_REPOS DEV300 masterfix: gnumake3: subsequenttests requires in environment ab80: Adding changes of cws mib21, ab77, ab77run2, dr77i to dev300 DEV300 masterfix: #i10000#: windows: more bizare hacks ... locales34: have a matching configure as well DEV300 locales34: back out change from autoreconf gnumake3: JunitTest.mk: bizarre hacks to make it work on windows ... Conflicts: configure configure.in instsetoo_native/prj/build.lst instsetoo_native/util/makefile.mk instsetoo_native/util/openoffice.lst instsetoo_native/util/pack.lst ooo.lst scp2/source/canvas/canvascommons.scp scp2/source/canvas/mtfrenderer.scp scp2/source/ooo/common_brand.scp scp2/source/ooo/directory_ooo.scp scp2/source/ooo/file_library_ooo.scp scp2/source/ooo/file_ooo.scp scp2/source/ooo/makefile.mk scp2/source/ooo/module_hidden_ooo.scp scp2/source/ooo/module_langpack.ulf scp2/source/ooo/ure.scp scp2/source/python/file_python.scp scp2/source/sdkoo/sdkoo.scp scp2/source/templates/module_langpack_accessories_templates.sct scp2/source/templates/module_langpack_accessories_templates_root.sct set_soenv.in soldep/bootstrp/appdef.cxx soldep/bootstrp/dep.cxx soldep/bootstrp/hashtbl.cxx soldep/bootstrp/makefile.mk soldep/bootstrp/minormk.cxx soldep/bootstrp/prj.cxx soldep/bootstrp/prodmap.cxx soldep/inc/dep.hxx soldep/inc/minormk.hxx soldep/inc/prodmap.hxx soldep/inc/soldep/appdef.hxx soldep/inc/soldep/connctr.hxx soldep/inc/soldep/depper.hxx soldep/inc/soldep/depwin.hxx soldep/inc/soldep/hashtbl.hxx soldep/inc/soldep/objwin.hxx soldep/inc/soldep/prj.hxx soldep/inc/soldep/sdtresid.hxx soldep/inc/soldep/soldep.hxx soldep/inc/soldep/soldlg.hxx soldep/inc/soldep/tbox.hxx soldep/prj/d.lst soldep/source/connctr.cxx soldep/source/depapp.hxx soldep/source/depper.cxx soldep/source/depwin.cxx soldep/source/makefile.mk soldep/source/objwin.cxx soldep/source/soldep.cxx soldep/source/soldlg.cxx soldep/source/soldlg.src soldep/source/tbox.cxx solenv/bin/build.pl solenv/bin/cws.pl solenv/bin/make_installer.pl solenv/bin/mhids.pl solenv/bin/modules/CwsConfig.pm solenv/bin/modules/RepositoryHelper.pm solenv/bin/modules/installer/regmerge.pm solenv/bin/modules/installer/scriptitems.pm solenv/bin/modules/installer/servicesfile.pm solenv/bin/modules/installer/simplepackage.pm solenv/bin/modules/installer/substfilenamefiles.pm solenv/config/ssolar.cmn solenv/inc/_tg_rslb.mk solenv/inc/extension_post.mk solenv/inc/libs.mk solenv/inc/minor.mk solenv/inc/postset.mk solenv/inc/settings.mk solenv/inc/tg_rslb.mk solenv/inc/unxlng.mk solenv/inc/wntmsc.mk soltools/HIDCompiler/hidclex.l stlport/prj/d.lst stlport/systemstlguards/postextstl.h
2011-03-08 19:43:29 -06:00
my $upd = 300;
$upd = $ENV{UPD} if (defined $ENV{UPD});
scan_one_dir ($installed_files, \%build_files, "$build_path/solver/$upd/$target", 1);
for my $file (keys %build_files) {
my $src = $build_files{$file};
my $dest = $installed_files->{$file};
2010-12-03 10:57:17 -06:00
do_link ($src, $dest, $file, $file);
}
print "\n";
}
sub evilness($)
{
my $doit = shift;
my $name = 'librecentfile.so';
my $src = "$OOO_BUILD/shell/$TARGET/lib/$name";
my $dest = "$OOO_BUILD/sfx2/$TARGET/lib/$name";
if ($doit eq 'undo') {
if (-l $dest) {
print " unlink $name\n";
unlink $dest;
}
} else {
$doit eq 'do' || die;
if (-f $src) {
print " link $name\n";
symlink $src, $dest;
}
}
}
sub link_iso_res()
{
print "Special iso.res case: ";
my $ooo_res="$OOO_INSTALL/" . $brand_program_dir . "/resource/ooo".$LIBVER.$LANG.".res";
my $star_res="$OOO_INSTALL/" . $brand_program_dir . "/resource/iso".$LIBVER.$LANG.".res";
if (-l $ooo_res && -l $star_res) {
if ($dry_run) {
print "link $ooo_res to $star_res";
} else {
unlink ($star_res);
symlink ($ooo_res, $star_res);
print "clobbered";
}
}
print "\n";
}
# Hack for (renamed) types.rdb (types.db)
sub link_oovbaapi_rdb()
{
print "oovbaapi.rdb case:";
my $src = "$OOO_BUILD/oovbaapi/$TARGET/ucr";
my $dest = "$OOO_INSTALL/" . $program_dir;
do_link ($src, $dest, 'oovbaapi.db', 'oovbaapi.rdb');
print "\n";
}
2010-12-03 10:57:17 -06:00
sub link_types_rdb()
{
print "Types.rdb case:";
my $src = "$OOO_BUILD/offapi/$TARGET/ucr";
my $dest = "$OOO_INSTALL/" . $ure_misc_dir;
do_link ($src, $dest, 'types.db', 'types.rdb');
print "\n";
}
2010-12-03 10:57:17 -06:00
sub link_pagein_files()
{
print "pagein case:";
my $src = "$OOO_BUILD/desktop/$TARGET/misc";
my $dest = "$OOO_INSTALL/" . $program_dir;
for my $c ('calc', 'draw', 'impress', 'writer', 'common') {
do_link ($src, $dest, "pagein-$c", "pagein-$c");
}
print "\n";
}
for my $a (@ARGV) {
# options
if ($a =~ /--dry-run/) {
$dry_run = 1;
} elsif (($a eq '--help') || ($a eq '-h')) {
$usage = 1;
# ordered arguments
} elsif (!defined $OOO_INSTALL) {
$OOO_INSTALL = $a;
} elsif (!defined $OOO_BUILD) {
$OOO_BUILD = $a;
} else {
print "Unknown argument '$a'\n";
$usage = 1;
}
}
if (!defined $OOO_BUILD && defined $ENV{SRC_ROOT}) {
$OOO_BUILD = $ENV{SRC_ROOT};
}
if ($usage || !defined $OOO_INSTALL || !defined $OOO_BUILD) {
printf "Usage: linkoo </path/to/ooo/install> [</path/to/ooo/build/tree>] [--dry-run]\n";
exit (1);
}
substr ($OOO_INSTALL, 0, 1) eq '/' || die "linkoo requires absolute paths ($OOO_INSTALL does not qualify)";
substr ($OOO_BUILD, 0, 1) eq '/' || die "linkoo requires absolute paths ($OOO_BUILD does not qualify)";
-d $OOO_INSTALL || die "No such directory $OOO_INSTALL";
-w $OOO_INSTALL || die "You need write access to $OOO_INSTALL";
-d $OOO_BUILD || die "No such directory $OOO_BUILD";
-d "$OOO_INSTALL/" . $program_dir . "/resource" || die "$OOO_INSTALL doesn't look like an OO install";
($TARGET, $LIBVER, $LANG) = sniff_target ($OOO_BUILD);
evilness ('undo');
my $installed_files = build_installed_list ($OOO_INSTALL);
scan_and_link_files ($OOO_BUILD, $installed_files, $TARGET);
link_iso_res();
link_types_rdb();
link_oovbaapi_rdb();
2010-12-03 10:57:17 -06:00
link_pagein_files();
if (!-f "$OOO_INSTALL/" . $brand_program_dir . "/ooenv") {
my $ooenv;
print "Creating '$OOO_INSTALL/", $brand_program_dir, "/ooenv'\n";
open ($ooenv, ">$OOO_INSTALL/" . $brand_program_dir . "/ooenv") || die "Can't open $OOO_INSTALL/" . $brand_program_dir . "/ooenv: $!";
print $ooenv "thisdir=$OOO_INSTALL/" . $brand_program_dir . "/\n";
print $ooenv $env_script;
print $ooenv "# testtool\nexport SRC_ROOT=$OOO_BUILD\n";
close ($ooenv);
}
evilness ('do');
print "\nlinkoo finished, please don't forget to source ooenv before ./soffice.\n";