Hi,

May I suggest the following solution.

You have two scripts you wish to call via make.

test1.pl
test2.pl

You would like to call plain perl scripts under linux, and distribute a pp'd 
exec under Win32.

Solution-

put test1.pl and test2.pl in directory /var/local/myscripts

Change your build script so that where before it called

test1.pl @args

now it calls

nicetest test1.pl @args

An example nicetest is attached.

To package on Win32 do

pp --lib="c:/var/local/myscripts" -M "test1.pl" -M "test2.pl" -o nicetest.exe 
nicetest

so now, on Win32 with nicetest exe installed,
nicetest test1.pl @args

is the same as
nicetest test1.pl @args
with perl installed.

Regards

Mark


Roderich Schupp wrote:
> On 5/7/07, Duncan Murdoch <[EMAIL PROTECTED]> wrote:
>> I have a Perl script in scripts.par being run by parl.  The script calls
>> make, and make in turn calls parl to run a different script in the same
>> scripts.par.
>>
>> Things work fine if I manually execute the call to make, but when nested
>> as above, I get this error:
>> Is this something I'm not allowed to do, i.e. will the two instances of
>> parl working on the same scripts.par file conflict with each other?
> 
> Let's say it's a bug in PAR::Packer. I was able to reproduce this on Linux
> (so it's not specific to Windows) with the following sequence:
> 
> $ pp -p -o foo.par -e 'print "foo!\n"'
> $ pp -p -o bar.par -e 'print "bar\n"; system "parl foo.par"'
> $ parl bar.par
> bar!
> foo!
> 
> But when I rename my installed PAR.pm os that it can't be found I get
> 
> $ parl bar.par
> bar!
> Can't locate PAR.pm in @INC (@INC contains: /etc/perl
> /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5
> /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8
> /usr/local/lib/site_perl /usr/local/lib/perl/5.8.7 .) at -e line 882.
> 
> Here's a workaround: invoke the inner parl with its full pathname, i.e. in
> my Linux environment
> 
> $ pp -p -o bar.par -e 'print "bar\n"; system "/usr/bin/parl foo.par"'
> 
> For those interested in the gory details:
> 
> - parl is the "prototypical" packed executable; it works as follows:
>  - create a cache directory /tmp/par-USER/XXXXXXXXXXXXXX
>  - copy some files (all etxtracted by obscure means from the parl
> executable itself)
>   into this cache directory
>  - these files are Perl modules (but with rather cryptical names),
> shared libraries
>   (the architecture dependent part of some of the Perl modules), the
> shared perl
>   library (libperlXXX.so) (on systems where is perl is dynamically
> linked) and
>   one executable which is a special purpose perl
>  - it then exec's this executable in an environment so that it will
> load the shared
>   perl library and the modules including their architecture dependent parts
>   (this is essentially PAR.pm plus all modules that are called by it
> directly or indirectly)
> - now we have a perl running with the PAR apparatus loaded, so we can 
> finally
>   load the .par from the original command line
> 
> - the problem is that the executable in the cache directory is also
> called parl (though
>  it isn't identical to the parl you called) and that it is run in an
> environment with
>  the cache directory *prepended to PATH*
> 
> - so when the inner parl is invoked, you actually get the parl
> executable in the cache
>  directory, which isn't prepared to do a "real" parl's job...
> 
> Note that we can't get rid of the augmentation of PATH  on Windows -
> what's actually
> necessary is to prepend the cache directory to the search path for
> shared libraries,
> e.g. LD_LIBRARY_PATH on Linux. parl does that already, but on Windows
> there is
> no separate library search path.
> 
> Cheers, Roderich

Attachment: nicetest.pl
Description: Perl program

Reply via email to