Commit | Line | Data |
8736538c |
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 | |
b53432e4 |
6 | # these are pretty mandatory |
8736538c |
7 | my $CC = '@CC@'; |
8736538c |
8 | my $EXPORT_ALL = @EXPORT_ALL@; |
b53432e4 |
9 | |
8736538c |
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 |
b53432e4 |
13 | # my $DEF_EXT = '@DEF_EXT@'; |
8736538c |
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; }; |
dfc05e5b |
49 | my $v_e_r_s = '@VERSION@'; |
50 | $v_e_r_s =~ tr/./_/; |
53f5e3f0 |
51 | if ( $dllname =~ /libperl.*/) { |
b53432e4 |
52 | $dllname ="cygperl$v_e_r_s.dll"; |
53 | } else { |
53f5e3f0 |
54 | $dllname ="$libname.dll"; |
b53432e4 |
55 | } |
8736538c |
56 | $libname ="lib$libname" unless ($libname =~ /^lib/); |
57 | print DEBUGFILE "dll name: $dllname\nimport library: $libname\npath: $path\n" if $DEBUG; |
58 | |
b53432e4 |
59 | $command ="$CC -shared -o $dllname"; |
60 | # $command .=" --verbose" if $verbose; |
8736538c |
61 | |
b53432e4 |
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; |
a0457be1 |
66 | $command .=" -Wl,--enable-auto-import -Wl,--stack,8388608"; # always |
8736538c |
67 | |
68 | # other args are passed through |
69 | shellexec("$command \\\n$args\n"); |
70 | |
71 | if ($path) { |
72 | $command ="mv $dllname"; |
b53432e4 |
73 | $command .=" $libname.dll$LIB_EXT" if $LIB_EXT; |
8736538c |
74 | shellexec("$command $path\n"); |
75 | }; |
76 | }; |
77 | close DEBUGFILE if $DEBUG; |
78 | |
79 | #--------------------------------------------------------------------------- |
53f5e3f0 |
80 | sub shellexec { |
81 | my $command = shift; |
82 | print STDERR $command; |
8736538c |
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; |