190d20d74e
This is 7e585ded0f1cce41fd3dec6146526d07783d2d38 again, removed in 981e63a40a5918135f3547c849394a36f8012af9, probably by mistake. With the linking it's possible that soffice.bin becomes the wrapper script that ends up calling itself recursively.
395 lines
11 KiB
Text
Executable file
395 lines
11 KiB
Text
Executable file
:
|
|
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
|
|
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
|
|
|
|
my @exceptions = ( 'cppuhelper', 'sunjavaplugin', 'libjvmfwk' );
|
|
|
|
my %replaceable = (
|
|
$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);
|
|
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;
|
|
|
|
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;
|
|
|
|
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
|
|
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};
|
|
|
|
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";
|
|
}
|
|
|
|
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";
|
|
}
|
|
|
|
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();
|
|
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";
|