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;
|
---|