CPAN on Mac OS X

Upgrade System Perl? | Case Folding Filesystem | Panther (10.3) and /man

The Comprehensive Perl Archive Network (CPAN) is a collection of Perl modules and scripts distributed among a large number of mirror sites. CPAN is also the name of a perl module which provides an interface to install modules from CPAN. These notes document problems with CPAN on Mac OS X. See also the main Life with CPAN documentation.

Xcode (via Developer Tools must be installed (installing Xcode also installs the Perl documentation on Mac OS X). Another option is to run another Unix, such as Debian, under a virtual machine, and install whatever modules are required for development into the sandbox system.

Upgrade System Perl?

I advise against upgrading the system perl, and against installing Perl modules into the system @INC directories. If a different version of perl is required, install it from MacPorts (App::perlbrew is another option, though does not support the installation of C libraries like MacPorts does). Changing the system perl may break any scripts that rely on a particular version of software installed; Apple updates could also break the perl or new modules improperly installed into the system area. Keep the vendor space separate from any local or site changes where possible. Administrative access is not necessary to install modules, as these can be installed into local directories via local::lib. An administrator would need to install Xcode, if that is not available. Perl Software Depots goes into more detail on the management of software installs.

As of Mac OS X 10.6, the OS ships with multiple versions of perl installed. Peruse the perl(1) manual page on Mac OS X for more details on how to switch between the two, if necessary.

$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.6.3
BuildVersion: 10D573
$ perl -e 'system "ls $_/perl5*" for split /:/, $ENV{PATH}' 2>/dev/null
/usr/bin/perl5.10.0 /usr/bin/perl5.8.9

If a custom version of Perl is installed, either the PATH environment variable must list that perl first, or the shebang line must be updated to always use the custom perl. I strongly advise against using symlinks to overwrite vendor versions of perl, as this again could cause unexpected problems should Apple release a patch that changes something; also, perl is just one of many commands associated with Perl, so a symlink of just /opt/local/bin/perl to /usr/bin/perl will still cause /usr/bin/cpan to be used, resulting in modules installed for who knows what Perl.

$ which perl
$ type -a perl
perl is /opt/local/bin/perl
perl is /usr/bin/perl
$ head -1 ~/bin/xmltidy

Consult the documentation for the shell used on how to configure the PATH environment variable. Note that the PATH and other environment variables may need to be set in the environment.plist file for non-terminal programs such as BBEdit.

Case Folding Filesystem

The default filesystem on Mac OS X (HFS+) folds case, unlike traditional Unix filesystems. Unix software that assumes HEAD and head are two different things on Mac OS X will end badly. For example, the LWP::UserAgent module installs /usr/bin/HEAD, which clobbers the existing /usr/bin/head utility. Solutions to this include not installing the HEAD and similar shortcuts, or ensuring these utilities are installed under /usr/local/bin instead. One way is to update the perl Makefile.PL arguments to install third-party utilities into a different directory than /usr/bin.

cpan> o conf makepl_arg "INSTALLBIN=/usr/local/bin INSTALLSCRIPT=/usr/local/bin"
cpan> o conf commit

Due to the rise in popularity of Mac OS X, most of these issues have been worked around in popular modules, such as LWP::UserAgent. However, older, or less frequently used modules may still contain code that assumes filesystem case sensitivity.

Panther (10.3) and /man

Perl 5.8.1 on Mac OS X 10.3 shipped with broken settings that cause some modules installed from CPAN to install their manuals under the /man directory. This directory pollutes the root namespace, and is outside the places manuals are searched for by man(1).

To fix this problem, update the makepl_arg to set INSTALLSITEMAN1DIR and INSTALLSITEMAN3DIR manually.

$ grep makepl_arg /System/Library/Perl/5.8.1/CPAN/
'makepl_arg' => q[INSTALLSITEMAN1DIR=/usr/share/man/man1 ?