VMS updates (direct)
[p5sagit/p5-mst-13.2.git] / lib / ExtUtils / Mksymlists.pm
index 3583194..4ec091d 100644 (file)
@@ -7,7 +7,7 @@ use Exporter;
 use vars qw( @ISA @EXPORT $VERSION );
 @ISA = 'Exporter';
 @EXPORT = '&Mksymlists';
-$VERSION = '1.03';
+$VERSION = substr q$Revision: 1.16 $, 10;
 
 sub Mksymlists {
     my(%spec) = @_;
@@ -48,7 +48,8 @@ sub Mksymlists {
 
     if    ($osname eq 'aix') { _write_aix(\%spec); }
     elsif ($osname eq 'VMS') { _write_vms(\%spec) }
-    elsif ($osname =~ m|^os/?2$|i) { _write_os2(\%spec) }
+    elsif ($osname eq 'os2') { _write_os2(\%spec) }
+    elsif ($osname eq 'MSWin32') { _write_win32(\%spec) }
     else { croak("Don't know how to create linker option file for $osname\n"); }
 }
 
@@ -93,13 +94,61 @@ while (($name, $exp)= each %{$data->{IMPORTS}}) {
     close DEF;
 }
 
+sub _write_win32 {
+    my($data) = @_;
+
+    require Config;
+    if (not $data->{DLBASE}) {
+        ($data->{DLBASE} = $data->{NAME}) =~ s/.*:://;
+        $data->{DLBASE} = substr($data->{DLBASE},0,7) . '_';
+    }
+    rename "$data->{FILE}.def", "$data->{FILE}_def.old";
+
+    open(DEF,">$data->{FILE}.def")
+        or croak("Can't create $data->{FILE}.def: $!\n");
+    # put library name in quotes (it could be a keyword, like 'Alias')
+    if ($Config::Config{'cc'} !~ /^gcc/i) {
+      print DEF "LIBRARY \"$data->{DLBASE}\"\n";
+      print DEF "CODE LOADONCALL\n";
+      print DEF "DATA LOADONCALL NONSHARED MULTIPLE\n";
+    }
+    print DEF "EXPORTS\n  ";
+    my @syms;
+    # Export public symbols both with and without underscores to
+    # ensure compatibility between DLLs from different compilers
+    # NOTE: DynaLoader itself only uses the names without underscores,
+    # so this is only to cover the case when the extension DLL may be
+    # linked to directly from C. GSAR 97-07-10
+    if ($Config::Config{'cc'} =~ /^bcc/i) {
+       for (@{$data->{DL_VARS}}, @{$data->{FUNCLIST}}) {
+           push @syms, "_$_", "$_ = _$_";
+       }
+    }
+    else {
+       for (@{$data->{DL_VARS}}, @{$data->{FUNCLIST}}) {
+           push @syms, "$_", "_$_ = $_";
+       }
+    }
+    print DEF join("\n  ",@syms, "\n") if @syms;
+    if (%{$data->{IMPORTS}}) {
+        print DEF "IMPORTS\n";
+        my ($name, $exp);
+        while (($name, $exp)= each %{$data->{IMPORTS}}) {
+            print DEF "  $name=$exp\n";
+        }
+    }
+    close DEF;
+}
+
 
 sub _write_vms {
     my($data) = @_;
 
     require Config; # a reminder for once we do $^O
+    require ExtUtils::XSSymSet;
 
     my($isvax) = $Config::Config{'arch'} =~ /VAX/i;
+    my($set) = new ExtUtils::XSSymSet;
     my($sym);
 
     rename "$data->{FILE}.opt", "$data->{FILE}.opt_old";
@@ -115,23 +164,18 @@ sub _write_vms {
     # the GSMATCH criteria for a dynamic extension
 
     foreach $sym (@{$data->{FUNCLIST}}) {
-        if ($isvax) { print OPT "UNIVERSAL=$sym\n" }
-        else        { print OPT "SYMBOL_VECTOR=($sym=PROCEDURE)\n"; }
+        my $safe = $set->addsym($sym);
+        if ($isvax) { print OPT "UNIVERSAL=$safe\n" }
+        else        { print OPT "SYMBOL_VECTOR=($safe=PROCEDURE)\n"; }
     }
     foreach $sym (@{$data->{DL_VARS}}) {
+        my $safe = $set->addsym($sym);
         print OPT "PSECT_ATTR=${sym},PIC,OVR,RD,NOEXE,WRT,NOSHR\n";
-        if ($isvax) { print OPT "UNIVERSAL=$sym\n" }
-        else        { print OPT "SYMBOL_VECTOR=($sym=DATA)\n"; }
+        if ($isvax) { print OPT "UNIVERSAL=$safe\n" }
+        else        { print OPT "SYMBOL_VECTOR=($safe=DATA)\n"; }
     }
     close OPT;
 
-    # Options file specifying RTLs to which this extension must be linked.
-    # Eventually, the list of libraries will be supplied by a working
-    # extliblist routine.
-    open OPT,'>rtls.opt';
-    print OPT "PerlShr/Share\n";
-    foreach $rtl (split(/\s+/,$Config::Config{'libs'})) { print OPT "$rtl\n"; }
-    close OPT;
 }
 
 1;
@@ -153,13 +197,15 @@ ExtUtils::Mksymlists - write linker options files for dynamic extension
 =head1 DESCRIPTION
 
 C<ExtUtils::Mksymlists> produces files used by the linker under some OSs
-during the creation of shared libraries for synamic extensions.  It is
+during the creation of shared libraries for dynamic extensions.  It is
 normally called from a MakeMaker-generated Makefile when the extension
 is built.  The linker option file is generated by calling the function
 C<Mksymlists>, which is exported by default from C<ExtUtils::Mksymlists>.
 It takes one argument, a list of key-value pairs, in which the following
 keys are recognized:
 
+=over
+
 =item NAME
 
 This gives the name of the extension (I<e.g.> Tk::Canvas) for which
@@ -213,6 +259,8 @@ extension itself (for instance, some linkers add an '_' to the
 name of the extension).  If it is not specified, it is derived
 from the NAME attribute.  It is presently used only by OS2.
 
+=back
+
 When calling C<Mksymlists>, one should always specify the NAME
 attribute.  In most cases, this is all that's necessary.  In
 the case of unusual extensions, however, the other attributes