perlactiveperlparperl-packager

Why don't my system calls work in the Perl program I wrap with pp?


I have a Perl/POE/Tk script running on Win32 ActivePerl that calls executables using system. I created an exe of the script using pp. I can unpack the exe and see the executables off the root of the "zip" file directory, but when I run the exe and try to use the functionality of the system calls I get a "file not found" type of error;

'..\cpau' is not recognized as an internal or external command, 
operable program or batch file.

cpau.exe is one of the included files.

pp is called thus:

pp -i alias3.ico -g -a add_event.job -a add_rec.job -a CPAU.exe -a del_event.job -a del_rec.job -a dnscmd.exe -a eventcreate.exe -o alias_v_3-0.exe alias_poe_V-3_0_par.pl

I am guessing that I need to adjust the path of the system calls. I currently am trying to use the default path;

system("cpau -dec -file add_rec.job -nowarn -wait");

I tried this:

system("..\cpau -dec -file ..\add_rec.job -nowarn -wait");

reasoning that pp put the script in the \scripts\ directory, but no joy. Any suggestions?


Solution

  • Update: My suggestions below do not work. However, I am going to leave them up in case someone else has a similar question. This answer shows a lot of things that may sound reasonable but do not work.

    See the discussion following the OP's repost for code using $ENV{PAR_TEMP} that solves the OP's problem

    FOR REFERENCE

    pp docs say:

    -a, --addfile=FILE|DIR ...

    By default, files are placed under / inside the package with their original names.

    By using system, you are asking cmd.exe to find the file and I now realize that probably is a losing battle unless you have a separate executable called cpau.exe. I do not have time to try this right now, but a you might have to do the fork and exec yourself instead of relying on system. As in:

    exec 'CPAU.exe', @args
    

    Previous answer:

    The string you pass to system does not contain what you think it does:

    use strict;
    use warnings;
    
    my $x= "..\cpau -dec -file ..\add_rec.job -nowarn -wait";
    
    print $x, "\n";
    __END__
    
    C:\Temp> fgh
    ..►au -dec -file ..dd_rec.job -nowarn -wait
    

    Use (edited following OP's comment below):

    system "..\\cpau -dec -file ../add_rec.job -nowarn -wait";
    

    I would also recommend using the list form of system:

    system '..\\cpau', qw(-dec -file ../add_rec.job -nowarn -wait);
    

    In addition, you might find FindBin handy if you want to specify the path to cpau relative to the current script's directory.

    For example:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    use FindBin qw($Bin);
    use File::Spec::Functions qw( catfile );
    
    my $program = catfile $Bin, '..', 'cpau';
    
    system $program, qw(-dec -file ../add_rec.job -nowarn -wait);
    
    __END__