1 package Module::Build::Platform::VMS;
5 $VERSION = '0.2808_01';
6 $VERSION = eval $VERSION;
7 use Module::Build::Base;
10 @ISA = qw(Module::Build::Base);
16 Module::Build::Platform::VMS - Builder class for VMS platforms
20 This module inherits from C<Module::Build::Base> and alters a few
21 minor details of its functionality. Please see L<Module::Build> for
24 =head2 Overridden Methods
30 Change $self->{build_script} to 'Build.com' so @Build works.
36 $self->SUPER::_set_defaults(@_);
38 $self->{properties}{build_script} = 'Build.com';
44 '@Build foo' on VMS will not preserve the case of 'foo'. Rather than forcing
45 people to write '@Build "foo"' we'll dispatch case-insensitively.
51 my($action, $args) = $self->SUPER::cull_args(@_);
52 my @possible_actions = grep { lc $_ eq lc $action } $self->known_actions;
54 die "Ambiguous action '$action'. Could be one of @possible_actions"
55 if @possible_actions > 1;
57 return ($possible_actions[0], $args);
61 =item manpage_separator
63 Use '__' instead of '::'.
67 sub manpage_separator {
74 Prefixify taking into account VMS' filepath syntax.
78 # Translated from ExtUtils::MM_VMS::prefixify()
80 my($self, $path, $sprefix, $type) = @_;
81 my $rprefix = $self->prefix;
83 $self->log_verbose(" prefixify $path from $sprefix to $rprefix\n");
85 # Translate $(PERLPREFIX) to a real path.
86 $rprefix = VMS::Filespec::vmspath($rprefix) if $rprefix;
87 $sprefix = VMS::Filespec::vmspath($sprefix) if $sprefix;
89 $self->log_verbose(" rprefix translated to $rprefix\n".
90 " sprefix translated to $sprefix\n");
92 if( length $path == 0 ) {
93 $self->log_verbose(" no path to prefixify.\n")
95 elsif( !File::Spec->file_name_is_absolute($path) ) {
96 $self->log_verbose(" path is relative, not prefixifying.\n");
98 elsif( $sprefix eq $rprefix ) {
99 $self->log_verbose(" no new prefix.\n");
102 my($path_vol, $path_dirs) = File::Spec->splitpath( $path );
103 my $vms_prefix = $self->config('vms_prefix');
104 if( $path_vol eq $vms_prefix.':' ) {
105 $self->log_verbose(" $vms_prefix: seen\n");
107 $path_dirs =~ s{^\[}{\[.} unless $path_dirs =~ m{^\[\.};
108 $path = $self->_catprefix($rprefix, $path_dirs);
111 $self->log_verbose(" cannot prefixify.\n");
112 return $self->prefix_relpaths($self->installdirs, $type);
116 $self->log_verbose(" now $path\n");
123 Command-line arguments (but not the command itself) must be quoted
124 to ensure case preservation.
129 # Returns a string that can become [part of] a command line with
130 # proper quoting so that the subprocess sees this same list of args,
131 # or if we get a single arg that is an array reference, quote the
132 # elements of it and return the reference.
133 my ($self, @args) = @_;
134 my $got_arrayref = (scalar(@args) == 1
135 && UNIVERSAL::isa($args[0], 'ARRAY'))
139 map { $_ = q(").$_.q(") if !/^\"/ && length($_) > 0 }
140 ($got_arrayref ? @{$args[0]}
144 return $got_arrayref ? $args[0]
150 There is no native fork(), so some constructs depending on it are not
155 sub have_forkpipe { 0 }
159 Override to ensure that we quote the arguments but not the command.
164 # The command must not be quoted but the arguments to it must be.
165 my ($self, @cmd) = @_;
166 my $cmd = shift @cmd;
167 my $args = $self->_quote_args(@cmd);
173 Override to ensure that we quote the arguments but not the command.
178 # The command must not be quoted but the arguments to it must be.
179 my ($self, @cmd) = @_;
180 $self->log_info("@cmd\n");
181 my $cmd = shift @cmd;
182 my $args = $self->_quote_args(@cmd);
183 return !system("$cmd $args");
188 Inherit the standard version but tweak the library file name to be
189 something Dynaloader can find.
197 my $spec = $self->SUPER::_infer_xs_spec($file);
199 # Need to create with the same name as DynaLoader will load with.
200 if (defined &DynaLoader::mod2fname) {
201 my $file = $$spec{module_name} . '.' . $self->{config}->get('dlext');
203 $file = DynaLoader::mod2fname([$file]);
204 $$spec{lib_file} = File::Spec->catfile($$spec{archdir}, $file);
212 Inherit the standard version but remove dots at end of name. This may not be
213 necessary if File::Find has been fixed or DECC$FILENAME_UNIX_REPORT is in effect.
218 my ($self, $dir, $pattern) = @_;
220 my $result = $self->SUPER::rscan_dir( $dir, $pattern );
222 for my $file (@$result) { $file =~ s/\.$//; }
228 Inherit the standard version but replace embedded dots with underscores because
229 a dot is the directory delimiter on VMS.
236 my $dist_dir = $self->SUPER::dist_dir;
237 $dist_dir =~ s/\./_/g;
243 Inherit the standard version but chop the extra manpage delimiter off the front if
244 there is one. The VMS version of splitdir('[.foo]') returns '', 'foo'.
251 my $mpname = $self->SUPER::man3page_name( shift );
252 my $sep = $self->manpage_separator;
253 $mpname =~ s/^$sep//;
257 =item expand_test_dir
259 Inherit the standard version but relativize the paths as the native glob() doesn't
264 sub expand_test_dir {
265 my ($self, $dir) = @_;
267 my @reldirs = $self->SUPER::expand_test_dir( $dir );
269 for my $eachdir (@reldirs) {
270 my ($v,$d,$f) = File::Spec->splitpath( $eachdir );
271 my $reldir = File::Spec->abs2rel( File::Spec->catpath( $v, $d, '' ) );
272 $eachdir = File::Spec->catfile( $reldir, $f );
279 The home-grown glob() does not currently handle tildes, so provide limited support
280 here. Expect only UNIX format file specifications for now.
285 my ($self, $arg) = @_;
287 # Apparently double ~ are not translated.
288 return $arg if ($arg =~ /^~~/);
290 # Apparently ~ followed by whitespace are not translated.
291 return $arg if ($arg =~ /^~ /);
299 # Remove any slash folloing the tilde if present.
302 # break up the paths for the merge
303 my $home = VMS::Filespec::unixify($ENV{HOME});
305 # Trivial case of just ~ by it self
310 my ($hvol, $hdir, $hfile) = File::Spec::Unix->splitpath($home);
312 # Someone has tampered with $ENV{HOME}
313 # So hfile is probably the directory since this should be
318 my ($vol, $dir, $file) = File::Spec::Unix->splitpath($spec);
320 my @hdirs = File::Spec::Unix->splitdir($hdir);
321 my @dirs = File::Spec::Unix->splitdir($dir);
325 # Two cases of tilde handling
326 if ($arg =~ m#^~/#) {
328 # Simple case, just merge together
329 $newdirs = File::Spec::Unix->catdir(@hdirs, @dirs);
333 # Complex case, need to add an updir - No delimiters
334 my @backup = File::Spec::Unix->splitdir(File::Spec::Unix->updir);
336 $newdirs = File::Spec::Unix->catdir(@hdirs, @backup, @dirs);
340 # Now put the two cases back together
341 $arg = File::Spec::Unix->catpath($hvol, $newdirs, $file);
349 =item find_perl_interpreter
351 On VMS, $^X returns the fully qualified absolute path including version
352 number. It's logically impossible to improve on it for getting the perl
353 we're currently running, and attempting to manipulate it is usually
358 sub find_perl_interpreter { return $^X; }
364 Michael G Schwern <schwern@pobox.com>
365 Ken Williams <kwilliams@cpan.org>
366 Craig A. Berry <craigberry@mac.com>
370 perl(1), Module::Build(3), ExtUtils::MakeMaker(3)