I created a perl script parseDealerFiles.exe with pp:
pp -o parseDealerFiles.exe -c read_agency.pl
The resulting package runs fine on the build system. On other platforms,
however, it fails. On a clean XP box (no cygwin or perl installed), it fails
with
> parseDealerFiles.exe
/cygdrive/c/DOCUME~1/OCHEYE~1/LOCALS~1/Temp/par-OCheyette/cache-f3bb3a3b5cf33a95f9828a5031438146c41d2801/parseDealerFiles:
error while loading shared libraries:
cygperl5_10.dll: cannot open shared object file: No such file or directory
This failure happens even though the dll does in fact exist in the cache:
>dir "C:\Documents and Settings\OCheyette\Local
>Settings\Temp\par-OCheyette\cache-f3bb3a3b5cf33a95f9828a5031438146c41d2801\cygperl5_10.dll"
>
Directory of C:\Documents and Settings\OCheyette\Local
Settings\Temp\par-OCheyette\cache-f3bb3a3b5cf33a95f9828a5031438146c41d2801
02/07/2011 07:43 AM 1,665,958 cygperl5_10.dll
1 File(s) 1,665,958 bytes
0 Dir(s) 65,451,020,288 bytes free
I attempted to fix this problem by installing a minimal version of cygwin+perl
on the clean system. That didn't work either - I hit some problem with the POSIX
module:
Can't locate
./C:/TEMP/par-OCheyette/cache-f3bb3a3b5cf33a95f9828a5031438146c41d2801/inc/lib/auto/POSIX/load_import.al
in @INC (@INC contains: CODE(0x10a8a680)
C:/TEMP/par-OCheyette/cache-f3bb3a3b5cf33a95f9828a5031438146c41d2801/inc/lib
C:/TEMP/par-OCheyette/cache-f3bb3a3b5cf33a95f9828a5031438146c41d2801/inc
CODE(0x108034a0) CODE(0x108039b0) /sfcore/Portfolio/Scripts) at POSIX.pm line 25
Version information:
> perl --version
This is perl, v5.10.1 (*) built for i686-cygwin-thread-multi-64int
(with 13 registered patches, see perl -V for more detail)
...
> pp --version
PAR Packager, version 1.008 (PAR version 1.002)
Copyright 2002-2009 by Audrey Tang <cp...@audreyt.org>
...
Also, uname returns
CYGWIN_NT-5.1
On 2011-02-07 11:25:16, oche...@gmail.com wrote:
> I created a perl script parseDealerFiles.exe with pp:
> pp -o parseDealerFiles.exe -c read_agency.pl
>
> The resulting package runs fine on the build system. On other
> platforms, however, it fails.
That's to be expected. The resulting executable still "lives"
in the Cygwin universe, hence needs a minimal Cygwin runtime.
If you want a real standalone executable, I suggest you use
a "native" Perl distribution, e.g. ActiveState or Strawberry.
Back to Cygwin: I just tried a minimal example (note that I
have gcc-4 installed and built my PAR::Packer with it).
$ pp -o hello.exe -e 'print "hello cygwin\n"'
The resulting hello.exe is linked with (in addition to
the Windows kernel32.dll)
DLL contained in Cygwin package
cygwin1.dll cygwin-1.7.7-1
cyggcc_s-1.dll cyggcc_s-1.dll
cygssp-0.dll libssp0-4.3.4-3
If you look into the cache area, C:/temp/par-USER/SHA1CHECKSUM
or similar, you'll see an executable called "hello" (it's
different from hello.exe - it's actually a special purpose
Perl interpreter). "hello" is also linked against the above
DLLs plus cygperl5_10.dll (which can also be found in the
cache area). The latter is in turn linked with
cygcrypt-0.dll (contained in crypt-1.1-1)
cygwin1.dll
cyggcc_s-1.dll
cygssp-0.dll
So all Cygwin packages mentioned above need to be installed
whereever you want to run the executable. (Package "perl" should NOT
be needed, as cygperl5_10.dll has been packed in.)
> I attempted to fix this problem by installing a minimal version of
> cygwin+perl on the clean system. That didn't work either - I hit
> some problem with the POSIX module:
> Can't locate
./C:/TEMP/par-OCheyette/cache-f3bb3a3b5cf33a95f9828a5031438146c41d2801/inc/lib/auto/POSIX/load_import.al
Different problem. Strange path name:
- note ".C/:" at the beginning
- the file is actually called load_imports.al (note the "s")
Cheers, Roderich
I actually did the cygwin install. Hence the mention in the bug report of doing
a minimal install of cygwin and perl to try to fix the issue.
Any thoughts on what's causing the POSIX load_import error? The error message is
EXACTLY what appeared on the screen - no "s" at the end of load_import. And it
was PAR (pp) that did all the relocation and renaming, so I have no idea what
caused the screwy ./C: at the beginning.
Thanks for the help.
________________________________
From: Roderich Schupp via RT <bug...@rt.cpan.org>
To: oche...@gmail.com
Sent: Tue, February 8, 2011 2:46:39 AM
Subject: [rt.cpan.org #65535] Unable to run perl script packaged with pp under
cygwin on another Windows XP installation
On 2011-02-08 09:50:28, oche...@gmail.com wrote:
> I actually did the cygwin install. Hence the mention in the bug report
> of doing
> a minimal install of cygwin and perl to try to fix the issue.
Please try my previous hello example on the machine with
the minimal Cygwin install. Does it work?
If not: you can find out about the DLLs needed with
$ objdump -ax hello.exe | grep 'DLL Name'
DLL Name: cygwin1.dll
DLL Name: cyggcc_s-1.dll
DLL Name: cygssp-0.dll
DLL Name: KERNEL32.dll
and then
$ cygcheck -f /usr/bin/cygwin1.dll
cygwin-1.7.7-1
etc to find the Cygwin package that contains these DLLs.
Repeat for the executable named "hello" in the cache area
and cygperl5_10.dll.
> Any thoughts on what's causing the POSIX load_import error? The error
> message is
> EXACTLY what appeared on the screen - no "s" at the end of
> load_import.
Yeah, I can reproduce that here with a minimal
$ pp -o posix.exe -e 'use POSIX; print "OK"'
Stay tuned.
Cheers, Roderich
On 2011-02-08 10:35:14, RSCHUPP wrote:
> Stay tuned.
OK, nailed it. Some weird heuristic in AutoBuilder.pm
(a Perl core module) got the wrong idea when presented "C:\TEMP\...".
So don't do that (at least for Cygwin).
Can you please apply the following patch to PAR::Packer,
then rebuild and re-install PAR::Packer. Finally re-pack your script
and try it out.
Cheers, Roderich
Index: myldr/mktmpdir.c
===================================================================
--- myldr/mktmpdir.c (revision 1233)
+++ myldr/mktmpdir.c (working copy)
@@ -58,7 +58,12 @@
char *c;
const char *tmpdir = NULL;
const char *key = NULL , *val = NULL;
- const char *temp_dirs[4] = { "C:\\TEMP", P_tmpdir, ".", "" };
+ const char *temp_dirs[4] = {
+ P_tmpdir,
+#ifdef WIN32
+ "C:\\TEMP",
+#endif
+ ".", "" };
const char *temp_keys[6] = { "PAR_TMPDIR", "TMPDIR", "TEMPDIR",
"TEMP", "TMP", "" };
const char *user_keys[3] = { "USER", "USERNAME", "" };
Seems to work, though it surfaced some other cygwin related problem, but it
doesn't seem to have anything to do with PAR.
Thanks.
________________________________
From: Roderich Schupp via RT <bug...@rt.cpan.org>
To: oche...@gmail.com
Sent: Tue, February 8, 2011 1:15:26 PM
Subject: [rt.cpan.org #65535] Unable to run perl script packaged with pp under
cygwin on another Windows XP installation
BTW, the attached fix only solves the problem in a special case.
I've just comitted a more general fix, will be in the next release.
On 2011-02-08 18:45:29, oche...@gmail.com wrote:
> Seems to work, though it surfaced some other cygwin related problem,
> but it
> doesn't seem to have anything to do with PAR.
Closing this bug now. Feel free to open a new one if
you encounter other problems with PAR::Packer on Cygwin.
Cheers, Roderich