This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
8055054328e2245b25d6346e7620e35521aa2481
[perl5.git] / cygwin / perlld.in
1 #
2 # Perl script being a wrapper around the gnu ld. When a dll is specified to
3 #   to be built, special processing is done, else the standard ld is called.
4 #
5
6 # these are pretty mandatory
7 my $CC = '@CC@';
8 my $EXPORT_ALL = @EXPORT_ALL@;
9
10 # if some of extensions are undefined,
11 # no corresponding output will be done.
12 # most probably, you'd like to have an export library
13 # my $DEF_EXT = '@DEF_EXT@';
14 # my $EXP_EXT = '@EXP_EXT@';
15 my $LIB_EXT = '@LIB_EXT@';
16
17 #my $DEBUG ="perlld.out";
18 my $DEBUG =undef;
19
20 my $args = join(" ",@ARGV); # get args
21 my $verbose =grep(/^\-(v|\-verbose)$/, @ARGV);
22
23 sub shellexec;
24
25 if ($DEBUG) {
26   open DEBUGFILE, ">>$DEBUG";
27   print DEBUGFILE "\n--- " .localtime() ."\nargs:\n$args\n\nenvironment:\n";
28   foreach (keys(%ENV)) { print DEBUGFILE $_, "=", $ENV{$_}, "\n"; };
29 }
30
31 if ($args !~ /\-o (\S+)/) {
32   print DEBUGFILE "+ no dll output -- passing to gcc\n\n" if $DEBUG;
33   shellexec("$CC $args\n");
34 } else {
35   my ($path, $command, $dllname, $libname) ='';
36
37   $dllname =$1;
38   print DEBUGFILE "output file: $dllname\n" if $DEBUG;
39   # remove -o from args
40   $args =~ s/(^| )\-o \S+/$1/;
41
42   # Check for path:
43   if( $dllname =~ /.*[\/\\]/){
44     $dllname = $';
45     $path = $&;
46     $path =~ s,[/\\](\.[/\\])*,/,g;
47   }
48   if ($dllname =~ /\./) { $libname =$`; } else { $libname =$dllname; };
49   my $v_e_r_s;
50   ($v_e_r_s = sprintf("%vd", $^V)) =~ tr/./_/; # v5.8.1 -> 5_8_1
51   if ( $dllname =~ /.*perl.*/) { 
52     $dllname ="cygperl$v_e_r_s.dll";
53   } else {
54   $dllname ="$libname.dll";
55   }
56   $libname ="lib$libname" unless ($libname =~ /^lib/);
57   print DEBUGFILE "dll name: $dllname\nimport library: $libname\npath: $path\n" if $DEBUG;
58
59   $command ="$CC -shared -o  $dllname";
60 #  $command .=" --verbose" if $verbose;
61
62   $command .=" -Wl,--output-def=$libname$DEF_EXT" if $DEF_EXT;
63   $command .=" -Wl,--output-exp=$libname$EXP_EXT" if $EXP_EXT;
64   $command .=" -Wl,--out-implib=$libname.dll$LIB_EXT" if $LIB_EXT;
65   $command .=" -Wl,--export-all-symbols" if $EXPORT_ALL;
66   $command .=" -Wl,--enable-auto-import -Wl,--stack,8388608"; # always
67
68   # other args are passed through
69   shellexec("$command \\\n$args\n");
70
71   if ($path) {
72     $command ="mv $dllname";
73     $command .=" $libname.dll$LIB_EXT" if $LIB_EXT;
74     shellexec("$command $path\n");
75   };
76 };
77 close DEBUGFILE if $DEBUG;
78
79 #---------------------------------------------------------------------------
80 sub shellexec{
81   my $command =shift;
82   print $command;
83   print DEBUGFILE $command if $DEBUG;
84   system($command) == 0
85     or die "perlld: *** system() failed to execute\n$command\n";
86 };
87
88 1;