#
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice (including the next
# paragraph) shall be included in all copies or substantial portions of the
# Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
#
#
# Undo libtool damage to makefiles to allow us to control the linker
# settings that libtool tries to force on us.
#
# Usage: delibtoolize.pl [-P] [-s] [--shared=<so>] <path>
# -s - Only track libraries from a single file at a time, instead of across all
# files in a project
# --shared=libname.so.0 - force libname to be treated as a shared library,
# even if version flags are not found
use strict;
use warnings;
use integer;
my @shared_args = ();
die unless GetOptions(
"P" => \$large_pic,
"s" => \$single_file,
"shared=s" => \@shared_args
);
'gcc' => "-f$pic_size -DPIC" );
'gcc' => '-shared -Wl,-z,allextract' );
my %so_versions = ();
my %ltlib_names = ();
my @Makefiles;
# initialize %so_versions with command line flags
foreach my $so ( @shared_args ) {
} else {
die "Unable to parse --shared object name $so\n";
}
}
sub rulename_to_filename {
my $rulename = $_[0];
if (exists($ltlib_names{$rulename})) {
return $ltlib_names{$rulename};
} else {
return $rulename;
}
}
# Expands make macros in a string
sub expand_macros {
$in =~ s{\$\(([^\)]+)\)}{
return $in;
}
sub scan_file {
if ($_ eq 'Makefile' && -f $_) {
my $old_file = $_;
or die "Can't open $old_file for reading: $!\n";
# Read in original file and preprocess for data we'll need later
my $l = "";
my %makefile_macros = ();
my %makefile_ldflags = ();
my @makefile_ltlibs = ();
while (my $n = <$OLD>) {
$l .= $n;
# handle line continuation
next if ($n =~ m/\\$/);
# Save macros for later expansion if needed
if ($l =~ m/^([^\#\s]*)\s*=\s*(.*?)\s*$/ms) {
}
if ($l =~ m/^([^\#\s]*)_la_LDFLAGS\s*=(.*)/ms) {
my $libname = $1;
my $flags = $2;
}
elsif ($l =~ m/^[^\#\s]*_LTLIBRARIES\s*=(.*)$/ms) {
push @makefile_ltlibs, $1;
}
$l = "";
}
close($OLD) or die;
foreach my $ltline ( @makefile_ltlibs ) {
foreach my $ltl (split /\s+/, $ltline_exp) {
my $transformed = $ltl;
$transformed =~ s{[^\w\@]}{_}msg;
}
}
foreach my $librulename (keys %makefile_ldflags) {
\%makefile_macros);
my $vers;
my $vtype = $1;
my $v = $2;
} elsif ($v =~ m/^(\d+)[:\d]*$/ms) {
$vers = $1;
} else {
$vers = $v;
}
}
$vers = 'none';
}
if ($single_file) {
}
# print "Set version to $so_versions{$ln} for $ln.\n";
}
}
}
}
sub modify_file {
my ($filename) = @_;
print "delibtoolizing $filename...\n";
die "Can't rename $new_file to $old_file: $!\n";
or die "Can't open $old_file for reading: $!\n";
or die "Can't open $new_file for writing: $!\n";
my $compiler;
my @inlines = ();
# Read in original file and preprocess for data we'll need later
my $l = "";
while (my $n = <$OLD>) {
$l .= $n;
# handle line continuation
next if ($n =~ m/\\$/);
$compiler = $1;
}
push @inlines, $l;
$l = "";
}
close($OLD) or die;
$compiler_type = 'gcc';
}
my $curtarget = "";
foreach $l (@inlines) {
chomp $l;
# Remove libtool script from compile steps &
# add PIC flags that libtool normally provides
$l =~ s{\$\(LIBTOOL\)
(?:[\\\s]+ \$\(LT_QUIET\))?
(?:[\\\s]+ \$\(AM_V_lt\))?
(?:[\\\s]+ \$\(AM_LIBTOOLFLAGS\) [\\\s]+ \$\(LIBTOOLFLAGS\))?
# Remove libtool script from link step
$l =~ s{\$\(LIBTOOL\)
(?:[\\\s]+ \$\(LT_QUIET\))?
(?:[\\\s]+ \$\(AM_V_lt\))?
(?:[\\\s]+ \$\(AM_LIBTOOLFLAGS\) [\\\s]+ \$\(LIBTOOLFLAGS\))?
[\\\s]+ --mode=link
}{}xs;
# Remove -rpath <directory> from link arguments
# Change flags for building shared object from arguments to libtool
# script into arguments to linker
if ($l =~ m/_la_LDFLAGS\s*=/) {
$l =~ s{(\s*$sharedobjflags)+\b}{}msg;
}
# Change file names
my @so_list = keys %so_versions;
if ($single_file) {
}
my $v = $so_versions{$so};
if ($v eq 'none') {
} else {
}
}
if ($l =~ m/^(\S+):/) {
$newtarget = $1;
} elsif ($l =~ m/^\s*$/) {
$newtarget = "";
}
# Need to add in .so links that libtool makes for .la installs
my $dirname = $1;
my $installrule = <<'END_RULE';
echo "rm -f $(DESTDIR)$(<DIRNAME>dir)/$$so" ; \
echo "ln -s $$p $(DESTDIR)$(<DIRNAME>dir)/$$so" ; \
fi; \
$l .= $installrule;
}
}
# Static libraries
if ($curtarget =~ m/^.*\.a$/) {
}
print $NEW $l, "\n";
$l = "";
}
close($NEW) or die;
}
modify_file($mf);
}