package ExtUtils::CBuilder::Platform::VMS; use strict; use ExtUtils::CBuilder::Base; use vars qw($VERSION @ISA); $VERSION = '0.12'; @ISA = qw(ExtUtils::CBuilder::Base); sub need_prelink { 0 } sub arg_defines { my ($self, %args) = @_; s/"/""/g foreach values %args; my @config_defines; # VMS can only have one define qualifier; add the one from config, if any. if ($self->{config}{ccflags} =~ s{/ def[^=]+ =+ \(? ([^\/\)]*) } {}ix) { push @config_defines, $1; } return '' unless keys(%args) || @config_defines; return ('/define=(' . join(',', @config_defines, map "\"$_" . ( length($args{$_}) ? "=$args{$_}" : '') . "\"", keys %args) . ')'); } sub arg_include_dirs { my ($self, @dirs) = @_; # VMS can only have one include list, add the one from config. if ($self->{config}{ccflags} =~ s{/inc[^=]+(?:=)+(?:\()?([^\/\)]*)} {}i) { unshift @dirs, $1; } return unless @dirs; return ('/include=(' . join(',', @dirs) . ')'); } sub _do_link { my ($self, $type, %args) = @_; my $objects = delete $args{objects}; $objects = [$objects] unless ref $objects; # VMS has two option files, the external symbol, and to pull in PerlShr if ($args{lddl}) { my @temp_files = $self->prelink(%args, dl_name => $args{module_name}); $objects->[-1] .= ','; # If creating a loadable library, the link option file is needed. push @$objects, 'sys$disk:[]' . $temp_files[0] . '/opt,'; # VMS always needs the option file for the Perl shared image. push @$objects, $self->perl_inc() . 'PerlShr.Opt/opt'; } return $self->SUPER::_do_link($type, %args, objects => $objects); } sub arg_nolink { return; } sub arg_object_file { my ($self, $file) = @_; return "/obj=$file"; } sub arg_exec_file { my ($self, $file) = @_; return ("/exe=$file"); } sub arg_share_object_file { my ($self, $file) = @_; return ("$self->{config}{lddlflags}=$file"); } sub lib_file { my ($self, $dl_file) = @_; $dl_file =~ s/\.[^.]+$//; $dl_file =~ tr/"//d; $dl_file = $dl_file .= '.' . $self->{config}{dlext}; # Need to create with the same name as DynaLoader will load with. if (defined &DynaLoader::mod2fname) { my ($dev,$dir,$file) = File::Spec->splitpath($dl_file); $file = DynaLoader::mod2fname([$file]); $dl_file = File::Spec->catpath($dev,$dir,$file); } return $dl_file; } 1;