#!/usr/bin/env perl
use strict;
use Config;
# Create/update symbolic links to libraries.
# This script may be useful to compile and link programs that
# * do not provide a "configure" script, only a Makefile,
# * need to link with static libraries (for efficiency reasons).
# e.g. BaCSeL .
# The reason is that for compilation and conventional linking, one can
# use environment variables, such as C_INCLUDE_PATH, LIBRARY_PATH and
# LD_LIBRARY_PATH, but when one wants to link with a static library,
# one needs to either provide the full path to the library file or use
# non-standard compiler flags in the Makefile, i.e. which may not work
# on some platforms. This script makes the (recommended) former method
# a bit easier.
# Example (with BaCSeL):
# $ ./liblinks lib libgmp.a libmpfr.a
# $ make GMP=. DEFS="-DUSE_DPE -DZUSE_MPZ -DVBSE -DAUTOMATIC"
# Copyright 2006 Vincent Lefevre.
# LORIA / INRIA Lorraine, France.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# This program 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 General Public License for more details.
# You should have received a copy of the GNU General Public License along
# with this program; if not, see .
my ($proc) = '$Id: liblinks 171413 2024-09-01 12:25:23Z vinc17/qaa $'
=~ /^.Id: (\S+) / or die;
@ARGV > 1 or $! = 1, die "Usage: $proc ...\n";
my $dest = shift;
-d $dest or mkdir $dest
or die "$proc: can't create directory $dest ($!)\n";
my (@paths,%paths);
foreach (split(':', $ENV{'LIBRARY_PATH'}),
split(':', $ENV{'LD_LIBRARY_PATH'}),
map { $Config{'osname'} =~ /linux/i &&
$Config{'archname'} =~ /x86_64/i ? $_.'64' : $_ }
qw(/usr/local/lib /lib /usr/lib))
{ push @paths, $_ unless $paths{$_}++ }
print "Searching directories:\n", map " $_\n", @paths;
FILES: foreach my $lib (@ARGV)
{
my $dst = $dest eq '.' ? $lib : "$dest/$lib";
my $link;
if (lstat $dst)
{
if (-l _)
{
$link = readlink $dst;
}
else
{
warn "$proc: file $dst exists and is not a symbolic link\n";
next;
}
}
foreach my $dir (@paths)
{
-e "$dir/$lib" or next; # test the existence first!
$link eq "$dir/$lib" and next FILES; # nothing to do.
print "Symlinking $dst -> $dir/$lib\n";
unlink $dst; # in case there was already a symlink.
symlink "$dir/$lib", $dst
or warn "$proc: can't create symlink $dst ($!)\n";
next FILES;
}
warn "$proc: can't find library $lib\n";
}