Below is the corrected patch for this, but it's not quite ready yet. See the email over on ports@ with some adjustments to perl.port.mk and other patches to fix some ports fallout that sthen@ was super helpful in tracking down.
The main issue was that somehow I lost a quote in the patch and so it didn't work right. But, this should apply and let you play with it if you like. Once we have a path forward with the ports fallout, I'll be looking for more comments and maybe OKs. On Sun, May 16, 2021 at 03:30:39PM -0700, Andrew Hewus Fresh wrote: > 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 31 Jul 2021 00:02:14 -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' Index: gnu/usr.bin/perl/installperl =================================================================== RCS file: /cvs/src/gnu/usr.bin/perl/installperl,v retrieving revision 1.52 diff -u -p -r1.52 installperl --- gnu/usr.bin/perl/installperl 1 Mar 2021 23:21:24 -0000 1.52 +++ gnu/usr.bin/perl/installperl 31 Jul 2021 00:02:14 -0000 @@ -203,6 +203,8 @@ my $installprivlib = "$opts{destdir}$Con my $installarchlib = "$opts{destdir}$Config{installarchlib}"; my $installsitelib = "$opts{destdir}$Config{installsitelib}"; my $installsitearch = "$opts{destdir}$Config{installsitearch}"; +my $installvendorlib = "$opts{destdir}$Config{installvendorlib}"; +my $installvendorarch = "$opts{destdir}$Config{installvendorarch}"; my $installman1dir = "none"; my $man1ext = $Config{man1ext}; my $libperl = $Config{libperl}; @@ -340,6 +342,8 @@ mkpath($installprivlib); mkpath($installarchlib); mkpath($installsitelib, $opts{verbose}, 0777) if ($installsitelib); mkpath($installsitearch, $opts{verbose}, 0777) if ($installsitearch); +mkpath($installvendorlib, $opts{verbose}, 0777) if ($installvendorlib); +mkpath($installvendorarch, $opts{verbose}, 0777) if ($installvendorarch); if (-d 'lib') { find({no_chdir => 1, wanted => \&installlib}, 'lib')