133 lines
3.1 KiB
Perl
133 lines
3.1 KiB
Perl
#!/usr/bin/perl
|
|
# $OpenBSD: resolve-lib,v 1.4 2002/11/28 19:20:37 espie Exp $
|
|
#
|
|
# Copyright (c) 2001
|
|
# Marc Espie. All rights reserved.
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions
|
|
# are met:
|
|
# 1. Redistributions of code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
# 2. Neither the name of OpenBSD nor the names of its contributors
|
|
# may be used to endorse or promote products derived from this software
|
|
# without specific prior written permission.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY ITS AUTHOR AND THE OpenBSD project ``AS IS'' AND
|
|
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
# SUCH DAMAGE.
|
|
|
|
use strict;
|
|
|
|
my $noshared;
|
|
my $sharedonly;
|
|
my $strict;
|
|
my $reqmajor;
|
|
my $reqminor;
|
|
|
|
# Grab arguments
|
|
$_=shift;
|
|
if ($_ eq '-noshared') {
|
|
$noshared = 1;
|
|
$_ = shift;
|
|
}
|
|
|
|
s/\.$//;
|
|
# Parse spec
|
|
if (m/\.a$/) {
|
|
$_ = $`;
|
|
$noshared = 1;
|
|
} else {
|
|
if (m/\.(\d+)\.(\d+)$/) {
|
|
$reqmajor = $1;
|
|
$reqminor = $2;
|
|
$_ = $`;
|
|
} elsif (m/\.\=(\d+)\.(\d+)$/) {
|
|
$reqmajor = $1;
|
|
$reqminor = $2;
|
|
$_ = $`;
|
|
$strict = 1;
|
|
} elsif (m/\.(\d+)$/) {
|
|
$reqmajor = $1;
|
|
$reqminor = 0;
|
|
$_ = $`;
|
|
} elsif (m/\.\=(\d+)$/) {
|
|
$reqmajor = $1;
|
|
$reqminor = 0;
|
|
$strict = 1;
|
|
$_ = $`;
|
|
}
|
|
if (m/\.so$/) {
|
|
$_ = $`;
|
|
$sharedonly = 1;
|
|
}
|
|
}
|
|
|
|
{
|
|
my $libname=$_;
|
|
|
|
my $bestmajor=-1;
|
|
my $bestminor=-1;
|
|
|
|
my $found_shared;
|
|
my $found_goodshared;
|
|
my $found_unshared;
|
|
|
|
while(<>) {
|
|
chomp;
|
|
if (!$noshared && m/^lib\Q$libname\E\.so\.(\d+)\.(\d+)$/) {
|
|
$found_shared = 1;
|
|
my $major = $1;
|
|
my $minor = $2;
|
|
if ($strict) {
|
|
if ($major > $reqmajor) {
|
|
print "Error: strict library too high\n";
|
|
exit(0);
|
|
}
|
|
if ($major < $reqmajor) {
|
|
next;
|
|
}
|
|
if ($minor < $reqminor) {
|
|
next;
|
|
}
|
|
$found_goodshared = 1;
|
|
$bestmajor = $major;
|
|
if ($minor >= $bestminor) {
|
|
$bestminor = $minor;
|
|
}
|
|
} else {
|
|
if ($major < $reqmajor || ($major == $reqmajor &&
|
|
$minor < $reqminor)) {
|
|
next;
|
|
}
|
|
$found_goodshared = 1;
|
|
if ($major > $bestmajor || ($major == $bestmajor &&
|
|
$minor > $bestminor)) {
|
|
$bestmajor = $major;
|
|
$bestminor = $minor;
|
|
}
|
|
}
|
|
} elsif (!$sharedonly && m/^lib\Q$libname\E\.a$/) {
|
|
$found_unshared = 1;
|
|
}
|
|
}
|
|
|
|
if ($found_goodshared) {
|
|
print "$libname.$bestmajor.$bestminor\n";
|
|
} elsif ($found_shared) {
|
|
print "Error: bad shared library\n";
|
|
} elsif ($found_unshared) {
|
|
print "$libname.a\n";
|
|
} else {
|
|
print "Missing library\n";
|
|
}
|
|
|
|
}
|