| 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 = '@VERSION@';
|
|---|
| 50 | $v_e_r_s =~ tr/./_/;
|
|---|
| 51 | if ( $dllname =~ /libperl.*/) {
|
|---|
| 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 STDERR $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;
|
|---|