Add ARM files
[dh-make-perl] / dev / arm / libmodule-build-perl / libmodule-build-perl-0.2808.01 / lib / Module / Build / Platform / VMS.pm
diff --git a/dev/arm/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Platform/VMS.pm b/dev/arm/libmodule-build-perl/libmodule-build-perl-0.2808.01/lib/Module/Build/Platform/VMS.pm
new file mode 100644 (file)
index 0000000..ed0a682
--- /dev/null
@@ -0,0 +1,375 @@
+package Module::Build::Platform::VMS;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.2808_01';
+$VERSION = eval $VERSION;
+use Module::Build::Base;
+
+use vars qw(@ISA);
+@ISA = qw(Module::Build::Base);
+
+
+
+=head1 NAME
+
+Module::Build::Platform::VMS - Builder class for VMS platforms
+
+=head1 DESCRIPTION
+
+This module inherits from C<Module::Build::Base> and alters a few
+minor details of its functionality.  Please see L<Module::Build> for
+the general docs.
+
+=head2 Overridden Methods
+
+=over 4
+
+=item _set_defaults
+
+Change $self->{build_script} to 'Build.com' so @Build works.
+
+=cut
+
+sub _set_defaults {
+    my $self = shift;
+    $self->SUPER::_set_defaults(@_);
+
+    $self->{properties}{build_script} = 'Build.com';
+}
+
+
+=item cull_args
+
+'@Build foo' on VMS will not preserve the case of 'foo'.  Rather than forcing
+people to write '@Build "foo"' we'll dispatch case-insensitively.
+
+=cut
+
+sub cull_args {
+    my $self = shift;
+    my($action, $args) = $self->SUPER::cull_args(@_);
+    my @possible_actions = grep { lc $_ eq lc $action } $self->known_actions;
+
+    die "Ambiguous action '$action'.  Could be one of @possible_actions"
+        if @possible_actions > 1;
+
+    return ($possible_actions[0], $args);
+}
+
+
+=item manpage_separator
+
+Use '__' instead of '::'.
+
+=cut
+
+sub manpage_separator {
+    return '__';
+}
+
+
+=item prefixify
+
+Prefixify taking into account VMS' filepath syntax.
+
+=cut
+
+# Translated from ExtUtils::MM_VMS::prefixify()
+sub _prefixify {
+    my($self, $path, $sprefix, $type) = @_;
+    my $rprefix = $self->prefix;
+
+    $self->log_verbose("  prefixify $path from $sprefix to $rprefix\n");
+
+    # Translate $(PERLPREFIX) to a real path.
+    $rprefix = VMS::Filespec::vmspath($rprefix) if $rprefix;
+    $sprefix = VMS::Filespec::vmspath($sprefix) if $sprefix;
+
+    $self->log_verbose("  rprefix translated to $rprefix\n".
+                       "  sprefix translated to $sprefix\n");
+
+    if( length $path == 0 ) {
+        $self->log_verbose("  no path to prefixify.\n")
+    }
+    elsif( !File::Spec->file_name_is_absolute($path) ) {
+        $self->log_verbose("    path is relative, not prefixifying.\n");
+    }
+    elsif( $sprefix eq $rprefix ) {
+        $self->log_verbose("  no new prefix.\n");
+    }
+    else {
+        my($path_vol, $path_dirs) = File::Spec->splitpath( $path );
+       my $vms_prefix = $self->config('vms_prefix');
+        if( $path_vol eq $vms_prefix.':' ) {
+            $self->log_verbose("  $vms_prefix: seen\n");
+
+            $path_dirs =~ s{^\[}{\[.} unless $path_dirs =~ m{^\[\.};
+            $path = $self->_catprefix($rprefix, $path_dirs);
+        }
+        else {
+            $self->log_verbose("    cannot prefixify.\n");
+           return $self->prefix_relpaths($self->installdirs, $type);
+        }
+    }
+
+    $self->log_verbose("    now $path\n");
+
+    return $path;
+}
+
+=item _quote_args
+
+Command-line arguments (but not the command itself) must be quoted
+to ensure case preservation.
+
+=cut
+
+sub _quote_args {
+  # Returns a string that can become [part of] a command line with
+  # proper quoting so that the subprocess sees this same list of args,
+  # or if we get a single arg that is an array reference, quote the
+  # elements of it and return the reference.
+  my ($self, @args) = @_;
+  my $got_arrayref = (scalar(@args) == 1 
+                      && UNIVERSAL::isa($args[0], 'ARRAY')) 
+                   ? 1 
+                   : 0;
+
+  map { $_ = q(").$_.q(") if !/^\"/ && length($_) > 0 }
+     ($got_arrayref ? @{$args[0]} 
+                    : @args
+     );
+
+  return $got_arrayref ? $args[0] 
+                       : join(' ', @args);
+}
+
+=item have_forkpipe
+
+There is no native fork(), so some constructs depending on it are not
+available.
+
+=cut
+
+sub have_forkpipe { 0 }
+
+=item _backticks
+
+Override to ensure that we quote the arguments but not the command.
+
+=cut
+
+sub _backticks {
+  # The command must not be quoted but the arguments to it must be.
+  my ($self, @cmd) = @_;
+  my $cmd = shift @cmd;
+  my $args = $self->_quote_args(@cmd);
+  return `$cmd $args`;
+}
+
+=item do_system
+
+Override to ensure that we quote the arguments but not the command.
+
+=cut
+
+sub do_system {
+  # The command must not be quoted but the arguments to it must be.
+  my ($self, @cmd) = @_;
+  $self->log_info("@cmd\n");
+  my $cmd = shift @cmd;
+  my $args = $self->_quote_args(@cmd);
+  return !system("$cmd $args");
+}
+
+=item _infer_xs_spec
+
+Inherit the standard version but tweak the library file name to be 
+something Dynaloader can find.
+
+=cut
+
+sub _infer_xs_spec {
+  my $self = shift;
+  my $file = shift;
+
+  my $spec = $self->SUPER::_infer_xs_spec($file);
+
+  # Need to create with the same name as DynaLoader will load with.
+  if (defined &DynaLoader::mod2fname) {
+    my $file = $$spec{module_name} . '.' . $self->{config}->get('dlext');
+    $file =~ tr/:/_/;
+    $file = DynaLoader::mod2fname([$file]);
+    $$spec{lib_file} = File::Spec->catfile($$spec{archdir}, $file);
+  }
+
+  return $spec;
+}
+
+=item rscan_dir
+
+Inherit the standard version but remove dots at end of name.  This may not be 
+necessary if File::Find has been fixed or DECC$FILENAME_UNIX_REPORT is in effect.
+
+=cut
+
+sub rscan_dir {
+  my ($self, $dir, $pattern) = @_;
+
+  my $result = $self->SUPER::rscan_dir( $dir, $pattern );
+
+  for my $file (@$result) { $file =~ s/\.$//; }
+  return $result;
+}
+
+=item dist_dir
+
+Inherit the standard version but replace embedded dots with underscores because 
+a dot is the directory delimiter on VMS.
+
+=cut
+
+sub dist_dir {
+  my $self = shift;
+
+  my $dist_dir = $self->SUPER::dist_dir;
+  $dist_dir =~ s/\./_/g;
+  return $dist_dir;
+}
+
+=item man3page_name
+
+Inherit the standard version but chop the extra manpage delimiter off the front if 
+there is one.  The VMS version of splitdir('[.foo]') returns '', 'foo'.
+
+=cut
+
+sub man3page_name {
+  my $self = shift;
+
+  my $mpname = $self->SUPER::man3page_name( shift );
+  my $sep = $self->manpage_separator;
+  $mpname =~ s/^$sep//;
+  return $mpname;
+}
+
+=item expand_test_dir
+
+Inherit the standard version but relativize the paths as the native glob() doesn't
+do that for us.
+
+=cut
+
+sub expand_test_dir {
+  my ($self, $dir) = @_;
+
+  my @reldirs = $self->SUPER::expand_test_dir( $dir );
+
+  for my $eachdir (@reldirs) {
+    my ($v,$d,$f) = File::Spec->splitpath( $eachdir );
+    my $reldir = File::Spec->abs2rel( File::Spec->catpath( $v, $d, '' ) );
+    $eachdir = File::Spec->catfile( $reldir, $f );
+  }
+  return @reldirs;
+}
+
+=item _detildefy
+
+The home-grown glob() does not currently handle tildes, so provide limited support
+here.  Expect only UNIX format file specifications for now.
+
+=cut
+
+sub _detildefy {
+    my ($self, $arg) = @_;
+
+    # Apparently double ~ are not translated.
+    return $arg if ($arg =~ /^~~/);
+
+    # Apparently ~ followed by whitespace are not translated.
+    return $arg if ($arg =~ /^~ /);
+
+    if ($arg =~ /^~/) {
+        my $spec = $arg;
+
+        # Remove the tilde
+        $spec =~ s/^~//;
+
+        # Remove any slash folloing the tilde if present.
+        $spec =~ s#^/##;
+
+        # break up the paths for the merge
+        my $home = VMS::Filespec::unixify($ENV{HOME});
+
+        # Trivial case of just ~ by it self
+        if ($spec eq '') {
+            return $home;
+        }
+
+        my ($hvol, $hdir, $hfile) = File::Spec::Unix->splitpath($home);
+        if ($hdir eq '') {
+             # Someone has tampered with $ENV{HOME}
+             # So hfile is probably the directory since this should be
+             # a path.
+             $hdir = $hfile;
+        }
+
+        my ($vol, $dir, $file) = File::Spec::Unix->splitpath($spec);
+
+        my @hdirs = File::Spec::Unix->splitdir($hdir);
+        my @dirs = File::Spec::Unix->splitdir($dir);
+
+        my $newdirs;
+
+        # Two cases of tilde handling
+        if ($arg =~ m#^~/#) {
+
+            # Simple case, just merge together
+            $newdirs = File::Spec::Unix->catdir(@hdirs, @dirs);
+
+        } else {
+
+            # Complex case, need to add an updir - No delimiters
+            my @backup = File::Spec::Unix->splitdir(File::Spec::Unix->updir);
+
+            $newdirs = File::Spec::Unix->catdir(@hdirs, @backup, @dirs);
+
+        }
+        
+        # Now put the two cases back together
+        $arg = File::Spec::Unix->catpath($hvol, $newdirs, $file);
+
+    } else {
+        return $arg;
+    }
+
+}
+
+=item find_perl_interpreter
+
+On VMS, $^X returns the fully qualified absolute path including version
+number.  It's logically impossible to improve on it for getting the perl
+we're currently running, and attempting to manipulate it is usually
+lossy.
+
+=cut
+
+sub find_perl_interpreter { return $^X; }
+
+=back
+
+=head1 AUTHOR
+
+Michael G Schwern <schwern@pobox.com>
+Ken Williams <kwilliams@cpan.org>
+Craig A. Berry <craigberry@mac.com>
+
+=head1 SEE ALSO
+
+perl(1), Module::Build(3), ExtUtils::MakeMaker(3)
+
+=cut
+
+1;
+__END__