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'

Reply via email to