Tweak @INC so that the ordering is: etc (for config files) site (5.8.1) vendor (all) core (5.8.1) site (version-indep) site (pre-5.8.1) The rationale being that an admin (via site), or module packager (vendor) can chose to shadow core modules when there is a newer version than is included in core. diff -Naur --exclude=debian perl-5.8.8.orig/perl.c perl-5.8.8/perl.c --- perl-5.8.8.orig/perl.c 2006-01-31 23:34:47.000000000 +1100 +++ perl-5.8.8/perl.c 2006-02-02 23:36:38.000000000 +1100 @@ -4776,9 +4776,14 @@ incpush(APPLLIB_EXP, TRUE, TRUE, TRUE); #endif +#if 1 + /* for configuration where /usr is mounted ro (CPAN::Config, Net::Config) */ + incpush("/etc/perl", FALSE, FALSE, FALSE); +#else #ifdef ARCHLIB_EXP incpush(ARCHLIB_EXP, FALSE, FALSE, TRUE); #endif +#endif #ifdef MACOS_TRADITIONAL { Stat_t tmpstatbuf; @@ -4803,11 +4808,13 @@ #ifndef PRIVLIB_EXP # define PRIVLIB_EXP "/usr/local/lib/perl5:/usr/local/lib/perl" #endif +#if 0 #if defined(WIN32) incpush(PRIVLIB_EXP, TRUE, FALSE, TRUE); #else incpush(PRIVLIB_EXP, FALSE, FALSE, TRUE); #endif +#endif #ifdef SITEARCH_EXP /* sitearch is always relative to sitelib on Windows for @@ -4850,6 +4857,61 @@ incpush(PERL_VENDORLIB_STEM, FALSE, TRUE, TRUE); #endif +#if 1 + incpush(ARCHLIB_EXP, FALSE, FALSE, TRUE); + incpush(PRIVLIB_EXP, FALSE, FALSE, TRUE); + + /* Non-versioned site directory for local modules and for + compatability with the previous packages' site dirs */ + incpush("/usr/local/lib/site_perl", TRUE, FALSE, FALSE); + +#ifdef PERL_INC_VERSION_LIST + { + struct stat s; + + /* add small buffer in case old versions are longer than the + current version */ + char sitearch[sizeof(SITEARCH_EXP)+16] = SITEARCH_EXP; + char sitelib[sizeof(SITELIB_EXP)+16] = SITELIB_EXP; + char const *vers[] = { PERL_INC_VERSION_LIST }; + char const **p; + + char *arch_vers = strrchr(sitearch, '/'); + char *lib_vers = strrchr(sitelib, '/'); + + if (arch_vers && isdigit(*++arch_vers)) + *arch_vers = 0; + else + arch_vers = 0; + + if (lib_vers && isdigit(*++lib_vers)) + *lib_vers = 0; + else + lib_vers = 0; + + /* there is some duplication here as incpush does something + similar internally, but required as sitearch is not a + subdirectory of sitelib */ + for (p = vers; *p; p++) + { + if (arch_vers) + { + strcpy(arch_vers, *p); + if (PerlLIO_stat(sitearch, &s) >= 0 && S_ISDIR(s.st_mode)) + incpush(sitearch, FALSE, FALSE, FALSE); + } + + if (lib_vers) + { + strcpy(lib_vers, *p); + if (PerlLIO_stat(sitelib, &s) >= 0 && S_ISDIR(s.st_mode)) + incpush(sitelib, FALSE, FALSE, FALSE); + } + } + } +#endif +#endif + #ifdef PERL_OTHERLIBDIRS incpush(PERL_OTHERLIBDIRS, TRUE, TRUE, TRUE); #endif