Re: [rt.cpan.org #81375] chdir without cc

[email protected] ("[email protected] via RT")
Newsgroups perl.inline
Message-ID <[email protected]>
Mon Nov 26 18:53:28 2012: Request 81375 was acted upon.
Transaction: Correspondence added by [email protected]
       Queue: Inline
     Subject: Re: [rt.cpan.org #81375] chdir without cc
   Broken in: 0.50
    Severity: Normal
       Owner: Nobody
  Requestors: [email protected]
      Status: open
 Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=81375 >


For the curious, a CPAN solution that handles this *very* nicely is
p3rl.org/File::chdir

David
On Nov 24, 2012 6:52 PM, "Sisyphus via RT" <[email protected]> wrote:

> Sat Nov 24 19:52:30 2012: Request 81375 was acted upon.
> Transaction: Correspondence added by SISYPHUS
>        Queue: Inline
>      Subject: chdir without cc
>    Broken in: 0.50
>     Severity: Normal
>        Owner: Nobody
>   Requestors: [email protected]
>       Status: open
>  Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=81375 >
>
>
> On Sat Nov 24 07:56:37 2012, bmwiedemann wrote:
>
> > I appended to your script:
> > system("pwd");
>
> [snip]
>
> > Using Pure Perl Implementation
> > 42
> > /home/bernhard/temp/_Inline/build/testc_pl_b91d
> >
> > and it showed that it changed the current dir for the perl process
>
> Yes, this could be fixed from within the script I provided as follows:
>
> #################################
> use strict;
> use warnings;
> use Cwd;
>
>
> my $cwd = getcwd();
>
> eval {
>  require Inline; Inline->import (C => Config =>
>     #CC => 'bogus', # Easy way to make the build fail
>     BUILD_NOISY => 1);
>
>  require Inline; Inline->import (C =><<' EOC');
>
>  int foo() {
>    warn("Using Inline\n");
>    return 42;
>  }
>
>  EOC
> };
>
> # If Inline is unavailable, foo() simply calls
> # the sub bar() pure perl implementation.
> if($@) {
>   chdir $cwd or warn "Couldn't chdir to $cwd";
>   *foo =\&bar;
> }
>
> sub bar {
>   warn("Using Pure Perl Implementation\n");
>   return 42;
> }
>
> my $x = foo();
> print "$x\n";
> print $cwd, "\n";
> #################################
>
> (I've used Cwd::getcwd instead of the pwd system call because pwd is not
> available on all systems.)
>
> However, I think (not yet fully tested) this can also be fixed quite
> simply from within C.pm by rewriting sub compile as:
>
> #################################
> sub compile {
>     my $o = shift;
>
>     my $build_dir = $o->{API}{build_dir};
>     my $cwd = &cwd;
>     ($cwd) = $cwd =~ /(.*)/ if $o->UNTAINT;
>
>     chdir $build_dir;
>     eval {
>     $o->call('makefile_pl', '"perl Makefile.PL"', 2);
>     $o->call('make', '"make"', 2);
>     $o->call('make_install', '"make install"', 2);
>     };
>     chdir $cwd;
>     die if $@;
>     $o->call('cleanup', 'Cleaning Up', 2);
> }
> #################################
>
> So I'll go with that changed version of C.pm's sub compile unless, in
> the course of more thorough testing, I discover a problem with it.
> If it tests ok for me, I'll release an Inline-0.51_03 that contains the
> fix in a day or two.
>
> Thanks for the report !
>
> Cheers,
> Rob
>
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.