Idiomatic process for handling needed external language modules for which there is no port

Daniel J. Luke dluke at geeklair.net
Mon Dec 18 03:18:20 UTC 2023


On Dec 15, 2023, at 11:57 PM, Kenneth Wolcott <kennethwolcott at gmail.com> wrote:
>  Scenario A:
> 
> 1.  Install Perl from MacPorts.
> 2. Need Perl module XYZ.
> 3. Perl module XYZ does not exist on MaqcPorts.
> 4. Install (using CPAN, CPANm, or manually) the XYX module locating it
> under the MacPorts port.
> 5. MacPorts complains about things installed under /opt/local that it
> didn't put there (makes sense).

Do you have specifics here?

MacPorts installs perl modules into the vendor_perl directory, if you install manually it should default to the site_perl directory. You can examine @INC to see where perl will look for modules (and even adjust it if you want - https://perldoc.perl.org/perlvar#@INC )

% /opt/local/bin/perl -e 'print join("\n", @INC)."\n";'
/opt/local/lib/perl5/site_perl/5.34/darwin-thread-multi-2level
/opt/local/lib/perl5/site_perl/5.34
/opt/local/lib/perl5/vendor_perl/5.34/darwin-thread-multi-2level
/opt/local/lib/perl5/vendor_perl/5.34
/opt/local/lib/perl5/5.34/darwin-thread-multi-2level
/opt/local/lib/perl5/5.34

You can have conflicts for modules that install things into $prefix/bin, or similar, though. Using local::lib (https://metacpan.org/pod/local::lib) is a nice way of handling things if you want to be sure not to conflict with a perl install (or have different projects that each need conflicting sets of libraries). It's pretty rare in the perl world for there to be a situation where you'd need module version A for one project and module version B for another project (most modules do a good job of backwards compatibility). 

> Scenario B:
> 1.  Install Perl from MacPorts.
> 2. Perl script I want to use requires a more recent version of Perl
> than those found on MacPorts.
> 3. Install my own version of Perl (usually from source).
> 4. Need Perl module XYZ.
> 5. Install Perl module XYZ (trying to match it with my own install
> location, but frequently screw this up).
> 6. End up with weird path issues, Perl and/or module(s) all confused.

I don't think anything can make it so you don't have to understand which perl install and which modules you are using.

> Scenario C:
> 1.  Install Perl from MacPorts.
> 2. Install Perl from perlbrew.
> 3. Run into problems with #3-6 from Scenario B.

This is how I normally handle things - let Macports' perl be just for things in MacPorts that need perl and otherwise pretend it isn't there. Use perlbrew to select the perl install that I want to use, setup my shell to use perlbrew (so typing 'perl' gets my my perlbrew perl) and set an appropriate #! in my scripts to use that same perl. [I actually create a perlbrew alias that I put in my scripts so that I can re-point it to a newer perl if/when I upgrade]

> Scenario D:
> 1 Use a Docker container for Perl exclusively for these experiments
> that I'm trying to use Perl for (various math learning, etc);
> 2. Install Perl from source
> 3. Install all needed external Perl modules myself on the Docker container.
> 
> Looks like I end up using Scenario D for Perl and Raku.  Now
> considering this for Julia, Python, Rust, etc

containers for everything is the modern way of solving this problem. I mostly hate it (it's the new static-linking) but it can be pretty convenient

-- 
Daniel J. Luke



More information about the macports-users mailing list