develooper Front page | perl.perl5.porters | Postings from November 2000

[PATCH 5.7.0] Liblist returns found libraries

Thread Next
From:
Ilya Zakharevich
Date:
November 22, 2000 13:08
Subject:
[PATCH 5.7.0] Liblist returns found libraries
Message ID:
20001122160812.A24269@monk.mps.ohio-state.edu
This is a minor change to optionally return the list of the found
libraries.

 perl -MExtUtils::Liblist -wle \
      'print for @{(ExtUtils::Liblist->ext("-lz -lm",0,1))[4]}'
 /usr/local/lib/libz.so.1.1.3
 /opt/SUNWspro/SC5.0/lib/libm.so.1

Is there some code in the source (outside of Configure ;-) to extract
the names of symbols in a library?

MakeMaker still works, and I bumped up the version of the Liblist (which
my previous patch did not).

Enjoy,
Ilya

--- ././lib/ExtUtils/Liblist.pm-pre-list	Tue Nov 21 22:02:41 2000
+++ ././lib/ExtUtils/Liblist.pm	Tue Nov 21 22:28:44 2000
@@ -24,7 +24,7 @@ package ExtUtils::Liblist::Kid;
 use 5.005_64;
 # Broken out of MakeMaker from version 4.11
 
-our $VERSION = substr q$Revision: 1.25 $, 10;
+our $VERSION = substr q$Revision: 1.26 $, 10;
 
 use Config;
 use Cwd 'cwd';
@@ -37,7 +37,7 @@ sub ext {
 }
 
 sub _unix_os2_ext {
-    my($self,$potential_libs, $verbose) = @_;
+    my($self,$potential_libs, $verbose, $give_libs) = @_;
     if ($^O =~ 'os2' and $Config{perllibs}) { 
 	# Dynamic libraries are not transitive, so we may need including
 	# the libraries linked against perl.dll again.
@@ -45,7 +45,7 @@ sub _unix_os2_ext {
 	$potential_libs .= " " if $potential_libs;
 	$potential_libs .= $Config{perllibs};
     }
-    return ("", "", "", "") unless $potential_libs;
+    return ("", "", "", "", ($give_libs ? [] : ())) unless $potential_libs;
     warn "Potential libraries are '$potential_libs':\n" if $verbose;
 
     my($so)   = $Config{'so'};
@@ -60,6 +60,7 @@ sub _unix_os2_ext {
     my(@searchpath); # from "-L/path" entries in $potential_libs
     my(@libpath) = split " ", $Config{'libpth'};
     my(@ldloadlibs, @bsloadlibs, @extralibs, @ld_run_path, %ld_run_path_seen);
+    my(@libs, %libs_seen);
     my($fullname, $thislib, $thispth, @fullname);
     my($pwd) = cwd(); # from Cwd.pm
     my($found) = 0;
@@ -153,6 +154,7 @@ sub _unix_os2_ext {
 	    warn "'-l$thislib' found at $fullname\n" if $verbose;
 	    my($fullnamedir) = dirname($fullname);
 	    push @ld_run_path, $fullnamedir unless $ld_run_path_seen{$fullnamedir}++;
+	    push @libs, $fullname unless $libs_seen{$fullname}++;
 	    $found++;
 	    $found_lib++;
 
@@ -200,19 +202,19 @@ sub _unix_os2_ext {
 		     ."No library found for -l$thislib\n"
 	    unless $found_lib>0;
     }
-    return ('','','','') unless $found;
-    ("@extralibs", "@bsloadlibs", "@ldloadlibs",join(":",@ld_run_path));
+    return ('','','','', ($give_libs ? \@libs : ())) unless $found;
+    ("@extralibs", "@bsloadlibs", "@ldloadlibs",join(":",@ld_run_path), ($give_libs ? \@libs : ()));
 }
 
 sub _win32_ext {
 
     require Text::ParseWords;
 
-    my($self, $potential_libs, $verbose) = @_;
+    my($self, $potential_libs, $verbose, $give_libs) = @_;
 
     # If user did not supply a list, we punt.
     # (caller should probably use the list in $Config{libs})
-    return ("", "", "", "") unless $potential_libs;
+    return ("", "", "", "", ($give_libs ? [] : ())) unless $potential_libs;
 
     my $cc		= $Config{cc};
     my $VC		= 1 if $cc =~ /^cl/i;
@@ -222,6 +224,7 @@ sub _win32_ext {
     my $libs		= $Config{'perllibs'};
     my $libpth		= $Config{'libpth'};
     my $libext		= $Config{'lib_ext'} || ".lib";
+    my(@libs, %libs_seen);
 
     if ($libs and $potential_libs !~ /:nodefault/i) { 
 	# If Config.pm defines a set of default libs, we always
@@ -319,6 +322,7 @@ sub _win32_ext {
 	    $found++;
 	    $found_lib++;
 	    push(@extralibs, $fullname);
+	    push @libs, $fullname unless $libs_seen{$fullname}++;
 	    last;
 	}
 
@@ -340,10 +344,11 @@ sub _win32_ext {
 
     }
 
-    return ('','','','') unless $found;
+    return ('','','','', ($give_libs ? \@libs : ())) unless $found;
 
     # make sure paths with spaces are properly quoted
     @extralibs = map { (/\s/ && !/^".*"$/) ? qq["$_"] : $_ } @extralibs;
+    @libs = map { (/\s/ && !/^".*"$/) ? qq["$_"] : $_ } @libs;
     $lib = join(' ',@extralibs);
 
     # normalize back to backward slashes (to help braindead tools)
@@ -352,12 +357,12 @@ sub _win32_ext {
     $lib =~ s,/,\\,g;
 
     warn "Result: $lib\n" if $verbose;
-    wantarray ? ($lib, '', $lib, '') : $lib;
+    wantarray ? ($lib, '', $lib, '', ($give_libs ? \@libs : ())) : $lib;
 }
 
 
 sub _vms_ext {
-  my($self, $potential_libs,$verbose) = @_;
+  my($self, $potential_libs,$verbose,$give_libs) = @_;
   my(@crtls,$crtlstr);
   my($dbgqual) = $self->{OPTIMIZE} || $Config{'optimize'} ||
                  $self->{CCFLAS}   || $Config{'ccflags'};
@@ -386,7 +391,7 @@ sub _vms_ext {
 
   unless ($potential_libs) {
     warn "Result:\n\tEXTRALIBS: \n\tLDLOADLIBS: $crtlstr\n" if $verbose;
-    return ('', '', $crtlstr, '');
+    return ('', '', $crtlstr, '', ($give_libs ? [] : ()));
   }
 
   my(@dirs,@libs,$dir,$lib,%found,@fndlibs,$ldlib);
@@ -395,6 +400,7 @@ sub _vms_ext {
   # List of common Unix library names and there VMS equivalents
   # (VMS equivalent of '' indicates that the library is automatially
   # searched by the linker, and should be skipped here.)
+  my(@flibs, %libs_seen);
   my %libmap = ( 'm' => '', 'f77' => '', 'F77' => '', 'V77' => '', 'c' => '',
                  'malloc' => '', 'crypt' => '', 'resolv' => '', 'c_s' => '',
                  'socket' => '', 'X11' => 'DECW$XLIBSHR',
@@ -499,6 +505,7 @@ sub _vms_ext {
         if ($cand eq 'VAXCCURSE') { unshift @{$found{$ctype}}, $cand; }  
         else                      { push    @{$found{$ctype}}, $cand; }
         warn "\tFound as $cand (really $test), type $ctype\n" if $verbose > 1;
+	push @flibs, $name unless $libs_seen{$fullname}++;
         next LIB;
       }
     }
@@ -513,7 +520,7 @@ sub _vms_ext {
 
   $ldlib = $crtlstr ? "$lib $crtlstr" : $lib;
   warn "Result:\n\tEXTRALIBS: $lib\n\tLDLOADLIBS: $ldlib\n" if $verbose;
-  wantarray ? ($lib, '', $ldlib, '') : $lib;
+  wantarray ? ($lib, '', $ldlib, '', ($give_libs ? \@flibs : ())) : $lib;
 }
 
 1;
@@ -528,20 +535,22 @@ ExtUtils::Liblist - determine libraries 
 
 C<require ExtUtils::Liblist;>
 
-C<ExtUtils::Liblist::ext($self, $potential_libs, $verbose);>
+C<ExtUtils::Liblist::ext($self, $potential_libs, $verbose, $need_names);>
 
 =head1 DESCRIPTION
 
 This utility takes a list of libraries in the form C<-llib1 -llib2
--llib3> and prints out lines suitable for inclusion in an extension
+-llib3> and returns lines suitable for inclusion in an extension
 Makefile.  Extra library paths may be included with the form
 C<-L/another/path> this will affect the searches for all subsequent
 libraries.
 
-It returns an array of four scalar values: EXTRALIBS, BSLOADLIBS,
-LDLOADLIBS, and LD_RUN_PATH.  Some of these don't mean anything
-on VMS and Win32.  See the details about those platform specifics
-below.
+It returns an array of four or five scalar values: EXTRALIBS,
+BSLOADLIBS, LDLOADLIBS, LD_RUN_PATH, and, optionally, a reference to
+the array of the filenames of actual libraries.  Some of these don't
+mean anything unless on Unix.  See the details about those platform
+specifics below.  The list of the filenames is returned only if
+$need_names argument is true.
 
 Dependent libraries can be linked in one of three ways:
 

Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About