Second try: Here are some miscellaneous VMS specific things that need to be fixed for VMS to work with the VMS C Run-Time Library (CRTL) UNIX filename mode that do not require any other changes to Perl for implementation.
When the VMS CRTL is in UNIX filename mode, the VMS C library calls return filenames in UNIX format. t/op/anonsub.t : t/op/closure.t : t/op/lex_assign.t : t/op/runlevel.t : t/lib/warnings/doio : lib/Test/Harness/Straps.pm : Remove 'MCR'. It is not needed, and it breaks Perl when the VMS CRTL is in UNIX filename mode. PERL on VMS usually knows when to add the MCR command and how to handle $^X as either a VMS or UNIX file specification. lib/vmsish.t: vms/ext/Stdio/test.pl: MCR is still needed in these cases, but must make sure that $^X is a VMS file specification if MCR is prefixing it. utils/c2ph.pl : VMS now supports LINK, but still uses a different filename. Since link is configured, the link routine is expected to succeed. Note that not all file systems on VMS support the link(), but we are assuming that if someone built a binary with link(), they are building on a file system with link support on. t/op/chdir.t Clean up SYS$LOGIN after this script is run out side of the test harness. A bit strange to exit a script and find the pointer to the login directory gone. t/op/stat.t Perl could find a /bin/ls on VMS but not really know how to run it yet, resulting in some interesting test failures. t/x2p/s2p.t RMSEXPAND needs a VMS format file specification. When the VMS CRTL is in UNIX filename mode, these additional vmsify() commands are needed. t/pod/find.t VMS could be in a UNIX filename mode, so if you want a filename in VMS format, it needs to be converted. -John [EMAIL PROTECTED] Personal Opinion Only
--- t/op/anonsub.t_25282 Wed Aug 10 22:34:55 2005 +++ t/op/anonsub.t Fri Aug 5 23:58:45 2005 @@ -32,7 +32,7 @@ print TEST "$prog\n"; close TEST or die "Could not close: $!"; my $results = $Is_VMS ? - `MCR $^X "-I[-.lib]" $switch $tmpfile 2>&1` : + `$^X "-I[-.lib]" $switch $tmpfile 2>&1` : $Is_MSWin32 ? `.\\perl -I../lib $switch $tmpfile 2>&1` : $Is_MacOS ? --- utils/c2ph.PL_25282 Wed Aug 10 23:16:16 2005 +++ utils/c2ph.PL Wed Aug 10 23:14:07 2005 @@ -1435,9 +1435,9 @@ close OUT or die "Can't close $file: $!"; chmod 0755, $file or die "Can't reset permissions for $file: $!\n"; unlink 'pstruct'; -print "Linking c2ph to pstruct.\n"; +print "Linking $file to pstruct.\n"; if (defined $Config{d_link}) { - link 'c2ph', 'pstruct'; + link $file, 'pstruct'; } else { unshift @INC, '../lib'; require File::Copy; --- t/op/chdir.t_25282 Wed Aug 10 22:35:19 2005 +++ t/op/chdir.t Fri Aug 5 23:59:49 2005 @@ -138,6 +138,10 @@ # Restore the environment for VMS (and doesn't hurt for anyone else) @[EMAIL PROTECTED] = @[EMAIL PROTECTED]; + + # On VMS this must be deleted or process table is wrong on exit + # when this script is run interactively. + delete $ENV{'SYS$LOGIN'} if $IsVMS; } --- t/op/closure.t_25282 Wed Aug 10 22:35:31 2005 +++ t/op/closure.t Sat Aug 6 00:00:54 2005 @@ -466,7 +466,7 @@ my $errfile = "terr$$"; $errfile++ while -e $errfile; my @tmpfiles = ($cmdfile, $errfile); open CMD, ">$cmdfile"; print CMD $code; close CMD; - my $cmd = (($^O eq 'VMS') ? "MCR $^X" + my $cmd = (($^O eq 'VMS') ? "$^X" : ($^O eq 'MSWin32') ? '.\perl' : ($^O eq 'MacOS') ? $^X : ($^O eq 'NetWare') ? 'perl' --- t/lib/warnings/doio.25282 Wed Aug 10 23:04:22 2005 +++ t/lib/warnings/doio Fri Aug 5 23:45:24 2005 @@ -60,10 +60,10 @@ __END__ # doio.c [Perl_do_open9] use warnings 'io' ; -open(F, '|'.($^O eq 'VMS' ? 'mcr ':'')."$^X -e 1|"); +open(F, '|'."$^X -e 1|"); close(F); no warnings 'io' ; -open(G, '|'.($^O eq 'VMS' ? 'mcr ':'')."$^X -e 1|"); +open(G, '|'."$^X -e 1|"); close(G); EXPECT Can't open bidirectional pipe at - line 3. --- t/pod/find.t_25282 Wed Aug 10 22:37:09 2005 +++ t/pod/find.t Fri Aug 5 23:53:47 2005 @@ -88,6 +88,7 @@ require Config; if ($^O eq 'VMS') { # privlib is perl_root:[lib] OK but not under mms + $result = VMS::Filespec::vmsify($result); #if you want VMS you need to force it. $compare = "lib.File]Find.pm"; $result =~ s/perl_root:\[\-?\.?//i; $result =~ s/\[\-?\.?//i; # needed under `mms test` --- t/op/lex_assign.t_25282 Wed Aug 10 22:35:38 2005 +++ t/op/lex_assign.t Sat Aug 6 00:04:33 2005 @@ -8,7 +8,7 @@ $| = 1; umask 0; $xref = \ ""; -$runme = ($^O eq 'VMS' ? 'MCR ' : '') . $^X; +$runme = $^X; @a = (1..5); %h = (1..6); $aref = [EMAIL PROTECTED]; --- t/op/runlevel.t_25282 Wed Aug 10 22:35:52 2005 +++ t/op/runlevel.t Sat Aug 6 00:06:30 2005 @@ -34,7 +34,7 @@ print TEST "$prog\n"; close TEST or die "Could not close: $!"; my $results = $Is_VMS ? - `MCR $^X "-I[-.lib]" $switch $tmpfile 2>&1` : + `$^X "-I[-.lib]" $switch $tmpfile 2>&1` : $Is_MSWin32 ? `.\\perl -I../lib $switch $tmpfile 2>&1` : $Is_NetWare ? --- t/x2p/s2p.t_25282 Wed Aug 10 22:38:09 2005 +++ t/x2p/s2p.t Fri Aug 5 23:55:33 2005 @@ -791,6 +791,8 @@ my $psed = File::Spec->catfile( File::Spec->curdir(), 'psed' ); if ($^O eq 'VMS') { # default in the .com extenson if it's not already there + $s2p = VMS::Filespec::vmsify($s2p); + $psed = VMS::Filespec::vmsify($psed); $s2p = VMS::Filespec::rmsexpand($s2p, '.com'); $psed = VMS::Filespec::rmsexpand($psed, '.com'); } --- t/op/stat.t_25282 Wed Aug 10 22:36:01 2005 +++ t/op/stat.t Sat Aug 6 00:07:40 2005 @@ -49,6 +49,8 @@ open(FOO, ">$tmpfile") || DIE("Can't open temp test file: $!"); my($nlink, $mtime, $ctime) = (stat(FOO))[$NLINK, $MTIME, $CTIME]; + +#VMS Fix-me: nlink should work on VMS if applicable link support configured. SKIP: { skip "No link count", 1 if $Is_VMS; @@ -211,6 +213,16 @@ unless -d '/dev' && -r '/dev' && -x '/dev'; skip "Skipping: unexpected ls output in MP-RAS", 6 if $Is_MPRAS; + + # VMS problem: If GNV or other UNIX like tool is installed, then + # sometimes Perl will find /bin/ls, and will try to run it. + # But since Perl on VMS does not know to run it under Bash, it will + # try to run the DCL verb LS. And if the VMS product Language + # Sensitive Editor is installed, or some other LS verb, that will + # be run instead. So do not do this until we can teach Perl + # when to use BASH on VMS. + skip "ls command not available to Perl in OpenVMS right now.", 6 + if $Is_VMS; my $LS = $Config{d_readlink} ? "ls -lL" : "ls -l"; my $CMD = "$LS /dev 2>/dev/null"; --- lib/Test/Harness/Straps.pm_25282 Wed Aug 10 22:18:30 2005 +++ lib/Test/Harness/Straps.pm Fri Aug 5 23:52:01 2005 @@ -356,7 +356,6 @@ my $self = shift; return $ENV{HARNESS_PERL} if defined $ENV{HARNESS_PERL}; - return "MCR $^X" if $self->{_is_vms}; return Win32::GetShortPathName($^X) if $self->{_is_win32}; return $^X; } --- vms/ext/Stdio/test.pl_25282 Wed Aug 10 22:42:23 2005 +++ vms/ext/Stdio/test.pl Sat Aug 6 00:09:08 2005 @@ -5,6 +5,10 @@ print "1..18\n"; print +(defined(&getname) ? '' : 'not '), "ok 1\n"; +#VMS can pretend that it is UNIX. +my $perl = $^X; +$perl = VMS::Filespec::vmsify($perl) if $^O eq 'VMS'; + $name = "test$$"; $name++ while -e "$name.tmp"; $fh = VMS::Stdio::vmsopen("+>$name",'ctx=rec','shr=put','fop=dlt','dna=.tmp'); @@ -28,6 +32,11 @@ print +($line eq localtime($time) ? '' : 'not '), "ok 9\n"; ($gotname) = (getname($fh) =~/\](.*);/); + +#we may be in UNIX emulation mode. +if (!defined($gotname)) { + ($gotname) = (VMS::Filespec::vmsify(getname($fh)) =~/\](.*)/); +} print +("\U$gotname" eq "\U$name.tmp" ? '' : 'not '), "ok 10\n"; $sfh = VMS::Stdio::vmssysopen($name, O_RDONLY, 0, @@ -43,7 +52,7 @@ print +(&VMS::Stdio::tmpnam ? '' : 'not '),"ok 14\n"; -#if (open(P, qq[| MCR $^X -e "1 while (<STDIN>);print 'Foo';1 while (<STDIN>); print 'Bar'" >$name.tmp])) { +#if (open(P, qq[| $^X -e "1 while (<STDIN>);print 'Foo';1 while (<STDIN>); print 'Bar'" >$name.tmp])) { # print P "Baz\nQuux\n"; # print +(VMS::Stdio::writeof(P) ? '' : 'not '),"ok 15\n"; # print P "Baz\nQuux\n"; @@ -59,7 +68,7 @@ #} $sfh = VMS::Stdio::vmsopen(">$name.tmp"); -$setuperl = "\$ MCR $^X\nBEGIN { [EMAIL PROTECTED] = qw(@INC) };\nuse VMS::Stdio qw(&setdef);"; +$setuperl = "\$ MCR $perl\nBEGIN { [EMAIL PROTECTED] = qw(@INC) };\nuse VMS::Stdio qw(&setdef);"; print $sfh qq[\$ here = F\$Environment("Default")\n]; print $sfh "$setuperl\nsetdef();\n\$ Show Default\n\$ Set Default 'here'\n"; print $sfh "$setuperl\nsetdef('..');\n\$ Show Default\n"; --- lib/vmsish.t_25282 Wed Aug 10 22:12:54 2005 +++ lib/vmsish.t Fri Aug 5 23:50:41 2005 @@ -5,7 +5,10 @@ @INC = '../lib'; } -my $Invoke_Perl = qq(MCR $^X "-I[-.lib]"); +my $perl = $^X; +$perl = VMS::Filespec::vmsify($perl) if $^O eq 'VMS'; + +my $Invoke_Perl = qq(MCR $perl "-I[-.lib]"); require "./test.pl"; plan(tests => 25);