The patch over in ports that was blocking this has been in for a while:
https://github.com/openbsd/ports/commit/bd756bd601bfcfa9ee7fc265d6c90c3536e51727

Although I haven't committed any of the port fixes to tell the ones that
don't pick it up automatically to install into the vendor lib, the
patches are over in that thread.  There will likely be other ports that
need some sort of fix:
https://marc.info/?l=openbsd-ports&m=162769529204194&w=2

In any case, I'd like to get this in to hopefully lower the number of
broken systems when folks install modules with CPAN clients in the
future.

I am considering removing the installperl patch and creating the
directory in Makefile.bsd-wraapper for fewer local patches to maintain.

Comments, test results, OK?


On Fri, Jul 30, 2021 at 05:34:40PM -0700, Andrew Hewus Fresh wrote:
> 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')

Reply via email to