This patch is should make it easier to recover from problems that happen when installing perl modules outside of the package system. You might recognize the "loadable library and perl binaries are mismatched" error.
Adding a versioned subdirectory for cpan modules means that when the perl version changes it will no longer find those old modules and it will be easy to remove them without disturbing things from packages. Only slightly related, but we can avoid breaking base tools like pkg_add and friend by using "no lib '/usr/local/libdata/perl5/site_perl';" to avoid looking in those directories at all. The new @INC looks like this. The first "5.32.1" sitelib is where external things, like cpan(1), will install. The current "site_perl" directory (now vendorlib) will continue to be where ports/packages go. Finally, "/usr/libdata" privlib is for things that ship with the base system. $ perl -V | perl -ne 'print if /INC/..eof' @INC: /usr/local/libdata/perl5/site_perl/5.32.1/sparc64-openbsd /usr/local/libdata/perl5/site_perl/5.32.1 /usr/local/libdata/perl5/site_perl/sparc64-openbsd /usr/local/libdata/perl5/site_perl /usr/libdata/perl5/sparc64-openbsd /usr/libdata/perl5 One place this might cause temporary issues in the ports tree is anything that doesn't use the overrides in perl.port.mk and looks up sitelib itself. It should be fairly obvious as it should fail to package because the files in the PLIST will not exist (they'll be in the versioned subdir). I didn't run into that in my testing, but I didn't complete a full bulk build. There do appear to be some annoyances with still shared directories for man pages, in that if you install a CPAN module and then attempt to pkg_add it, it complains because "files already exist" in the man directory. We could separate the cpan man pages, or I think un-setting the site_lib man*dir will mean cpan won't instal them. I haven't yet tested that, but I'm not sure what would be best there. Unfortunately I did do a bunch of testing of different ways to add things to @INC which meant this patch also does some reorganization of the contents, I can turn it into a smaller patch if requested and do the cleanup separately. Comments, OK? Should I see if sthen@ will do a full bulk build first? Index: gnu/usr.bin/perl/config.over =================================================================== RCS file: /cvs/src/gnu/usr.bin/perl/config.over,v retrieving revision 1.22 diff -u -p -r1.22 config.over --- gnu/usr.bin/perl/config.over 5 Feb 2017 00:33:38 -0000 1.22 +++ gnu/usr.bin/perl/config.over 16 May 2021 20:43:16 -0000 @@ -9,49 +9,85 @@ archname="`arch -s`-${osname}" myarchname="$archname" # Use correct paths for a distribution -prefix='/usr' +# site is where cpan clients install files +# vendor is where the ports tree puts packages +# priv is where the system installs files + +# We set up vendor paths for ports/packages +usevendorprefix="${define}" +d_vendorbin="${define}" +d_vendorlib="${define}" +d_vendorarch="${define}" +#d_vendorscript="${define}" + +# Things from base go into /usr prefixexp='/usr' +prefix="${prefixexp}" -# But site binaries go in /usr/local/bin for ports -siteprefix='/usr/local' +# But vendor and site files go in /usr/local for ports and cpan siteprefixexp='/usr/local' -installsitebin='/usr/local/bin' +siteprefix="${siteprefixexp}" +installsitebin='${siteprefix}/bin' + +vendorprefixexp='/usr/local' +vendorprefix="${vendorprefixexp}" +installvendorbin='${vendorprefix}/bin' -installarchlib="/usr/libdata/perl5/${archname}" +installprivlib="${prefix}/libdata/perl5" +privlib="${installprivlib}" +privlibexp="${privlib}" +installarchlib="${installprivlib}/${archname}" archlib="${installarchlib}" archlibexp="${archlib}" test $useshrplib = "true" && ccdlflags="-Wl,-R${installarchlib}/CORE" -installprivlib="/usr/libdata/perl5" -privlib="${installprivlib}" -privlibexp="${privlib}" - -installsitearch="/usr/local/libdata/perl5/site_perl/${archname}" -sitearch="${installsitearch}" -sitearchexp="${sitearch}" -installsitelib="/usr/local/libdata/perl5/site_perl" +# We keep vendor in site_perl so we don't have to bump every perl port +# otherwise this would be pkg_perl +# Not versioned here because pkg tools handle that for us. +installvendorlib="${vendorprefix}/libdata/perl5/site_perl" +vendorlib="${installvendorlib}" +vendorlibexp="${vendorlib}" +installvendorarch="${installvendorlib}/${archname}" +vendorarch="${installvendorarch}" +vendorarchexp="${vendorarch}" + +# cpan(1) and similar tools install in a $version dir that's easy +# to remove after upgrade and won't cause issues for packages when +# perl versions change. +installsitelib="${siteprefix}/libdata/perl5/site_perl/${version}" sitelib="${installsitelib}" sitelibexp="${sitelib}" +installsitearch="${installsitelib}/${archname}" +sitearch="${installsitearch}" +sitearchexp="${sitearch}" installstyle="${privlib}" -# We install the man pages ourselves until installman gets smarter -man1dir='/usr/share/man/man1' -man1direxp='/usr/share/man/man1' -installman1dir='/usr/share/man/man1' man1ext='1' -man3dir='/usr/share/man/man3p' -man3direxp='/usr/share/man/man3p' -installman3dir='/usr/share/man/man3p' man3ext='3p' -siteman1dir='/usr/local/man/man1' -siteman1direxp='/usr/local/man/man1' -installsiteman1dir='/usr/local/man/man1' -siteman3dir='/usr/local/man/man3p' -siteman3direxp='/usr/local/man/man3p' -installsiteman3dir='/usr/local/man/man3p' + +installman1dir="${prefix}/share/man/man1" +man1dir="${installman1dir}" +man1direxp="${man1dir}" +installman3dir="${prefix}/share/man/man3p" +man3dir="${installman3dir}" +man3direxp="${man3dir}" + +installvendorman1dir="${vendorprefix}/man/man1" +vendorman1dir="${installvendorman1dir}" +vendorman1direxp="${vendorman1dir}" +installvendorman3dir='${vendorprefix}/man/man3p" +vendorman3dir="${installvendorman3dir}" +vendorman3direxp="${vendorman3dir}" + +installsiteman1dir="${siteprefix}/man/man1" +siteman1dir="${installsiteman1dir}" +siteman1direxp="${siteman1dir}" +installsiteman3dir="${siteprefix}/man/man3p" +siteman3dir="${installsiteman3dir}" +siteman3direxp="${siteman3dir}" # Never hardcode developer info into a distribution cf_by='root'