delibtoolize.pl revision 493
#
# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
#
# 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,
# to whom the Software is furnished to do so, provided that the above
# copyright notice(s) and this permission notice appear in all copies of
# the Software and that both the above copyright notice(s) and this
# permission notice appear in supporting documentation.
#
# 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
# OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
# INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
# Except as contained in this notice, the name of a copyright holder
# shall not be used in advertising or otherwise to promote the sale, use
# or other dealings in this Software without prior written authorization
# of the copyright holder.
#
# ident "@(#)delibtoolize.pl 1.11 08/08/08 SMI"
#
#
# Undo libtool damage to makefiles to allow us to control the linker
# settings that libtool tries to force on us.
#
# Usage: delibtoolize.pl [-P] <path>
use strict;
use warnings;
use integer;
my %opts;
my $pic_size = "pic";
if (exists($opts{'P'})) {
$pic_size = "PIC";
}
'gcc' => "-f$pic_size -DPIC" );
'gcc' => '-shared -Wl,-z,allextract' );
my %so_versions = ();
my @Makefiles;
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 = "";
while (my $n = <$OLD>) {
$l .= $n;
# handle line continuation
next if ($n =~ m/\\$/);
if ($l =~ m/^([^\#\s]*)_la_LDFLAGS\s*=(.*)/ms) {
my $libname = $1;
my $flags = $2;
my $vtype = $1;
my $v = $2;
} elsif ($v =~ m/^(\d+)[:\d]*$/ms) {
} else {
$so_versions{$libname} = $v;
}
}
}
}
$l = "";
}
close($OLD) or die;
}
}
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/\\$/);
if ($l =~ m/^\s*CC\s*=\s*(\S*)/) {
$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_LIBTOOLFLAGS\) [\\\s]+ \$\(LIBTOOLFLAGS\))?
# Remove libtool script from link step
$l =~ s{\$\(LIBTOOL\)
(?:[\\\s]+ \$\(LT_QUIET\))?
(?:[\\\s]+ \$\(AM_LIBTOOLFLAGS\) [\\\s]+ \$\(LIBTOOLFLAGS\))?
[\\\s]+ --mode=link
}{}xs;
# Change -rpath to -R in 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
foreach my $so (keys %so_versions) {
} 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;
# my $installdir = '$(DESTDIR)$(' . $dirname . 'dir)';
# foreach my $so (keys %so_versions) {
# if ($so_versions{$so} ne 'none') {
# $l .= "\t-rm -f $installdir/$so.so\n";
# $l .= "\tln -s $so.so.$so_versions{$so} $installdir/$so.so\n";
# }
# }
}
}
# Static libraries
if ($curtarget =~ m/^.*\.a$/) {
}
print $NEW $l, "\n";
$l = "";
}
close($NEW) or die;
}
modify_file($mf);
}