1#*************************************************************************
2#
3# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4#
5# Copyright 2000, 2010 Oracle and/or its affiliates.
6#
7# OpenOffice.org - a multi-platform office productivity suite
8#
9# This file is part of OpenOffice.org.
10#
11# OpenOffice.org is free software: you can redistribute it and/or modify
12# it under the terms of the GNU Lesser General Public License version 3
13# only, as published by the Free Software Foundation.
14#
15# OpenOffice.org is distributed in the hope that it will be useful,
16# but WITHOUT ANY WARRANTY; without even the implied warranty of
17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18# GNU Lesser General Public License version 3 for more details
19# (a copy is included in the LICENSE file that accompanied this code).
20#
21# You should have received a copy of the GNU Lesser General Public License
22# version 3 along with OpenOffice.org.  If not, see
23# <http://www.openoffice.org/license.html>
24# for a copy of the LGPLv3 License.
25#
26#*************************************************************************
27
28use lib ("$ENV{SOLARENV}/bin/modules");
29use macosxotoolhelper;
30
31sub locate($)
32{
33    my ($lib) = @_;
34    my $dir;
35    foreach $dir (@dirs)
36    {
37        my $path = "$dir/$lib";
38        if (-e $path)
39        {
40            return $path;
41        }
42    }
43    return;
44}
45
46sub handle($$)
47{
48    my ($from, $to) = @_;
49    # wrap -dylib_file in -Wl so that hopefully any used tool whatsoever (e.g.,
50    # libtool generated from xmlsec1-1.2.6/configure included in
51    # libxmlsec/download/xmlsec1-1.2.6.tar.gz:1.3) passes it through to the
52    # linker:
53    !($from =~ /,/ || $to =~ /,/) or
54        die "$from:$to contains commas and cannot go into -Wl";
55    print " -Wl,-dylib_file,$from:$to";
56    $done{$from} = 1;
57    push(@todo, $to) if (grep {$_ eq $to} @todo) == 0;
58}
59
60foreach (@ARGV) { push(@dirs, $1) if /^-L(.*)$/; }
61foreach (@ARGV)
62{
63    if (/^-l(.*)$/)
64    {
65        my $loc = locate("lib$1.dylib");
66        handle($1, $loc) if defined $loc && otoolD($loc) =~ m'^(@.+/.+)\n$';
67    }
68}
69foreach $file (@todo)
70{
71    my $call = "otool -L $file";
72    open(IN, "-|", $call) or die "cannot $call";
73    while (<IN>)
74    {
75        if (m'^\s*(@.+/([^/]+)) \(compatibility version \d+\.\d+\.\d+, current version \d+\.\d+\.\d+\)\n$')
76        {
77            my $full = $1;
78            my $loc = locate($2);
79            if (defined $loc)
80            {
81                handle($full, $loc) unless defined $done{$full};
82            }
83            else
84            {
85                die "unknown $full (from $file)";
86            }
87        }
88    }
89    close(IN);
90}
91print "\n";
92