| # |
| # Perl script being a wrapper around the gnu ld. When a dll is specified to |
| # to be built, special processing is done, else the standard ld is called. |
| # |
| |
| # these are pretty mandatory |
| my $CC = 'gcc'; |
| my $EXPORT_ALL = 1; |
| |
| # if some of extensions are undefined, |
| # no corresponding output will be done. |
| # most probably, you'd like to have an export library |
| # my $DEF_EXT = '.def'; |
| # my $EXP_EXT = '.exp'; |
| my $LIB_EXT = '.a'; |
| |
| #my $DEBUG ="perlld.out"; |
| my $DEBUG =undef; |
| |
| my $args = join(" ",@ARGV); # get args |
| my $verbose =grep(/^\-(v|\-verbose)$/, @ARGV); |
| |
| sub shellexec; |
| |
| if ($DEBUG) { |
| open DEBUGFILE, ">>$DEBUG"; |
| print DEBUGFILE "\n--- " .localtime() ."\nargs:\n$args\n\nenvironment:\n"; |
| foreach (keys(%ENV)) { print DEBUGFILE $_, "=", $ENV{$_}, "\n"; }; |
| } |
| |
| if ($args !~ /\-o (\S+)/) { |
| print DEBUGFILE "+ no dll output -- passing to gcc\n\n" if $DEBUG; |
| shellexec("$CC $args\n"); |
| } else { |
| my ($path, $command, $dllname, $libname) =''; |
| |
| $dllname =$1; |
| print DEBUGFILE "output file: $dllname\n" if $DEBUG; |
| # remove -o from args |
| $args =~ s/(^| )\-o \S+/$1/; |
| |
| # Check for path: |
| if( $dllname =~ /.*[\/\\]/){ |
| $dllname = $'; |
| $path = $&; |
| $path =~ s,[/\\](\.[/\\])*,/,g; |
| } |
| if ($dllname =~ /\./) { $libname =$`; } else { $libname =$dllname; }; |
| my $v_e_r_s = substr("5.6.1",0,-2); |
| $v_e_r_s =~ tr/./_/; |
| if ( $dllname =~ /libperl.*/) { |
| $dllname ="msys-perl$v_e_r_s.dll"; |
| } else { |
| $dllname ="$libname.dll"; |
| } |
| $libname ="lib$libname" unless ($libname =~ /^lib/); |
| print DEBUGFILE "dll name: $dllname\nimport library: $libname\npath: $path\n" if $DEBUG; |
| |
| $command ="$CC -shared -o $dllname"; |
| # $command .=" --verbose" if $verbose; |
| $command .=" -Wl,--output-def=$libname$DEF_EXT" if $DEF_EXT; |
| $command .=" -Wl,--output-exp=$libname$EXP_EXT" if $EXP_EXT; |
| $command .=" -Wl,--out-implib=$libname.dll$LIB_EXT" if $LIB_EXT; |
| $command .=" -Wl,--export-all-symbols" if $EXPORT_ALL; |
| $command .=" -Wl,--enable-auto-import -Wl,--stack,8388608"; # always |
| $command .=" -Wl,--enable-auto-image-base"; # always |
| |
| # other args are passed through |
| shellexec("$command \\\n$args\n"); |
| |
| if ($path) { |
| $command ="mv $dllname"; |
| $command .=" $libname.dll$LIB_EXT" if $LIB_EXT; |
| shellexec("$command $path\n"); |
| }; |
| }; |
| close DEBUGFILE if $DEBUG; |
| |
| #--------------------------------------------------------------------------- |
| sub shellexec { |
| my $command = shift; |
| print STDERR $command; |
| print DEBUGFILE $command if $DEBUG; |
| system($command) == 0 |
| or die "perlld: *** system() failed to execute\n$command\n"; |
| }; |
| |
| 1; |