This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
3129ed981cd5908c43b1f926501f003d2520ddd9
[perl5.git] / dist / ExtUtils-CBuilder / lib / ExtUtils / CBuilder / Platform / os2.pm
1 package ExtUtils::CBuilder::Platform::os2;
2 $ExtUtils::CBuilder::Platform::os2::VERSION = '0.280223';
3 use strict;
4 use ExtUtils::CBuilder::Platform::Unix;
5
6 use vars qw(@ISA);
7 @ISA = qw(ExtUtils::CBuilder::Platform::Unix);
8
9 sub need_prelink { 1 }
10
11 sub prelink {
12   # Generate import libraries (XXXX currently near .DEF; should be near DLL!)
13   my $self = shift;
14   my %args = @_;
15
16   my @res = $self->SUPER::prelink(%args);
17   die "Unexpected number of DEF files" unless @res == 1;
18   die "Can't find DEF file in the output"
19     unless $res[0] =~ m,^(.*)\.def$,si;
20   my $libname = "$1$self->{config}{lib_ext}";   # Put .LIB file near .DEF file
21   $self->do_system('emximp', '-o', $libname, $res[0]) or die "emxexp: res=$?";
22   return (@res, $libname);
23 }
24
25 sub _do_link {
26   my $self = shift;
27   my ($how, %args) = @_;
28   if ($how eq 'lib_file'
29       and (defined $args{module_name} and length $args{module_name})) {
30
31     # Now know the basename, find directory parts via lib_file, or objects
32     my $objs = ( (ref $args{objects}) ? $args{objects} : [$args{objects}] );
33     my $near_obj = $self->lib_file(@$objs);
34     my $exp_dir = ($near_obj =~ m,(.*)[/\\],s ? "$1/" : '' );
35
36     $args{dl_file} = $1 if $near_obj =~ m,(.*)\.,s; # put ExportList near OBJ
37
38     # XXX _do_link does not have place to put libraries?
39     push @$objs, $self->perl_inc() . "/libperl$self->{config}{lib_ext}";
40     $args{objects} = $objs;
41   }
42   # Some 'env' do exec(), thus return too early when run from ksh;
43   # To avoid 'env', remove (useless) shrpenv
44   local $self->{config}{shrpenv} = '';
45   return $self->SUPER::_do_link($how, %args);
46 }
47
48 sub extra_link_args_after_prelink {
49   # Add .DEF file to the link line
50   my ($self, %args) = @_;
51
52   my @DEF = grep /\.def$/i, @{$args{prelink_res}};
53   die "More than one .def files created by 'prelink' stage" if @DEF > 1;
54   # XXXX No "$how" argument here, so how to test for dynamic link?
55   die "No .def file created by 'prelink' stage"
56     unless @DEF or not @{$args{prelink_res}};
57
58   my @after_libs = ($OS2::is_aout ? ()
59       : $self->perl_inc() . "/libperl_override$self->{config}{lib_ext}");
60   # , "-L", "-lperl"
61   (@after_libs, @DEF);
62 }
63
64 sub link_executable {
65   # ldflags is not expecting .exe extension given on command line; remove -Zexe
66   my $self = shift;
67   local $self->{config}{ldflags} = $self->{config}{ldflags};
68   $self->{config}{ldflags} =~ s/(?<!\S)-Zexe(?!\S)//;
69   return $self->SUPER::link_executable(@_);
70 }
71
72
73 1;