http://qs321.pair.com?node_id=509067


in reply to Win32 @INC behavior

Hi
What I've managed to observe on windows for ActiveState 561 is that @INC is derived based on the invoked location of the perl.exe. Well, actually, the perl5x.dll that is loaded by perl.exe. Basically, it looks up one dir (out of bin/) for lib/ and site/lib. If you move perl.exe and perl56.dll to some remote location that doesn't follow that structure:
bin/ lib/ site/lib
you won't get @INC set. Here's little test, where I copied perl.exe and perl56.dll to a bin/ directory under my "Documents and Settings"
C:\Documents and Settings\jim> C:\Progra~1\Perl\Perl561_638\bin\perl.e +xe -V Summary of my perl5 (revision 5 version 6 subversion 1) configuration: .... Built under MSWin32 Compiled at Apr 13 2004 19:24:21 @INC: C:/Program Files/Perl/Perl561_638/lib C:/Program Files/Perl/Perl561_638/site/lib . C:\Documents and Settings\jim>mkdir bin C:\Documents and Settings\jim>cp C:\Progra~1\Perl\Perl561_638\bin\perl +.exe bin\. C:\Documents and Settings\jim>cp C:\Progra~1\Perl\Perl561_638\bin\perl +56.dll bin\. C:\Documents and Settings\jim>set PATH=C:\Documents and Settings\jim\b +in;%PATH% C:\Documents and Settings\jim>perl.exe -V Can't locate Config.pm in @INC (@INC contains: .). BEGIN failed--compilation aborted. C:\Documents and Settings\jim>mkdir lib C:\Documents and Settings\jim>mkdir site\lib C:\Documents and Settings\jim>perl.exe -V Can't locate Config.pm in @INC (@INC contains: C:/Documents and Settin +gs/jim/lib C:/Documents and Settings/jim/site/lib .). BEGIN failed--compilation aborted.
Note that only when I have a lib/ and site/lib directory does the @INC get set correctly. Also, the main functionality is driven by the location of the perl56.dll, not the perl.exe file. perl.exe loads the .dll through the PATH environment variable, and it appears @INC is set with respect to the location of the .dll. So, if I remove the .dll from my local bin/ dir, the .dll is loaded from its default location, and @INC is set with respect to that location.
C:\Documents and Settings\jim>del bin\perl56.dll C:\Documents and Settings\jim>perl -V Summary of my perl5 (revision 5 version 6 subversion 1) ... ActivePerl Build 638 Built under MSWin32 Compiled at Apr 13 2004 19:24:21 @INC: C:/Program Files/Perl/Perl561_638/lib C:/Program Files/Perl/Perl561_638/site/lib .
HTH, Jim
(Update: fix cut and paste error)

Replies are listed 'Best First'.
Re^2: Win32 @INC behavior
by jimbojones (Friar) on Nov 16, 2005 at 18:06 UTC
    As a follow-up:

    The relevant parts of the .c code appear to be in win32.c

    char *win32_get_sitelib(const char *pl) { return win32_get_xlib(pl, "sitelib", "site"); } static char *win32_get_xlib(const char *pl, const char *xlib, const ch +ar *libname) { .... sprintf(pathstr, "%s/lib", libname); (void)get_emd_part(&sv2, pathstr, ARCHNAME, "bin", pl, Nullch); /* JJ -- get_emd_part strips 'bin' if possible from the path to the .dll (found in get_emd_part by calling set_w32_module_name(); ) and then adds 'site/lib' to that path */ ... }
Re^2: Win32 @INC behavior
by richz (Beadle) on Nov 17, 2005 at 01:28 UTC
    Thanks so much. What you describe is definitely the behavior I see. I didn't realize the perl executable would make the @INC directories relative to the location of the dll and if they weren't found it wouldn't include them. It's kind of annoying that perl.exe locates the perl5x.dll via %PATH%; I'd prefer it was done through the registry, but I digress.

    Thanks for the help!