http://www.perlmonks.org?node_id=226665


in reply to Test::Harness not working on my machine

Using Win32::GetShortPathName() is a band-aid solution, but since this problem only seems to come up rarely and then only on Windows it should hold. I'd rather either do the shell escaping or use something that doesn't invoke a shell.

Cross-platform shell escaping is a ROYAL PAIN IN THE ASS as I'm finding out in MakeMaker. This is an old, old, old problem which was simply left to rot because its so difficult to get right. ActiveState simply worked around the problem by moving the default install location from C:\Program Files\Perl to C:\Perl.

Using open | doesn't please me but it seems to be the only cross-platform, backwards compatible thing to do. Can't use any whizz-bang 5.8.0 features, this thing has to work back to 5.4.0.

--

Michael G Schwern 	Just Another Stupid Consultant
schwern@pobox.com	http://www.pobox.com/~schwern/
  • Comment on Re: Test::Harness not working on my machine

Replies are listed 'Best First'.
Re: Re: Test::Harness not working on my machine
by John M. Dlugosz (Monsignor) on Jan 14, 2003 at 05:04 UTC
    I agree. My thought is to propose a function to add to the system-specific File::Spec module, but I'll post another node on that when I'm ready.

    re compatible: how about using the fancy Openxxx modules instead of the open| syntax? That is, you can use the list form of system() and arrange to have its standard output file handle piped to something you can read from.

    Hmm, the list form of system() already has platform-specific code for dealing with the arguments. It bypasses the shell and doesn't have to re-assemble them on UNIX I beleive, and on Windows it knows to put quotes around every individual argument before concatenating it together to form the command tail.

    Basically, using the no-shell form prevents the need for shell escapes, but there is still a portability issue of keeping the arguments separate (which already works fine).

    Also, what's wrong with using the list form of open in 5.8, and concatenating the list together for 5.6 or older? Just a line or two difference, easy to check the Perl version in an if() statement.

    —John

      > re compatible: how about using the fancy Openxxx modules instead of the open| syntax?

      I remember having lots of trouble getting IPC::Open* working on some OS's. Currently I think that's whatever doesn't implement fork() (VMS immediately comes to mind). Most of the time it will work on Windows, but not if you use Borland's C compiler according to the tests.

      And that's just with the latest version of Perl. Don't want to know what it gets like as you go to older versions.

      > Hmm, the list form of system() already has platform-specific code for dealing with the arguments. It bypasses the shell and doesn't have to re-assemble them on UNIX I beleive, and on Windows it knows to put quotes around every individual argument before concatenating it together to form the command tail.

      system() doesn't help me, I can't capture the output reliably. :( Often system() will not respond to redirecting/tying *STDOUT and *STDERR inside Perl.

      > Also, what's wrong with using the list form of open in 5.8, and concatenating the list together for 5.6 or older? Just a line or two difference, easy to check the Perl version in an if() statement.

      Ok, send me a patch. Oh, and don't forget to try it out on Win98, Cygwin, VMS and Unix. 5.6.1 and 5.8.0 at least on each. 5.5.3 and 5.4.5 if you can. Thanks.

      Sorry to be a dick, but that's what's minimally involved in trying out new things with Mission Critical core modules like Test::Harness and MakeMaker. It Has To Work. Worse, It Has To Work Everywhere. And I'm usually the one that has to make sure it works everywhere. :( Its very time consuming. Yes I'm being crotchity.

      The latest Test::Harness alpha on CPAN has a work around that should work.