/usr/local
, instead of in /Library/Perl
, the MacOS X way. Otherwise, maybe not so much! (The error I had stumbled on, which made me think cpan didn't just work was, apparently, that I at some point had used sudo cpan, and gotten permissions on things out of whack. If cpan was a little bit more helpful, chances are I would have figured it out sooner -- but let's not toss a blog post that was fun to write and still has a few useful nuggets, despite being built on an otherwise shoddy fundament. :-)First up: this isn't any more Homebrew specific than that I use the perl Apple ships with Snow Leopard (5.10 at this time of writing, for 10.6.7 - I'm on a Macbook Air myself), with all its built-in DTrace and MacOS integration goodness. Read that fine page for authoritative data; I neither am not pretend to be a perl savant.
Using the system perl is how Homebrew prefers it – unlike some other packaging systems I shall not mention here, as a service to other fine people trying to google for "perl mac snow leopard -this -that". Should you for any reason wish to mention those in comments on this post, you may call them "Funk" and "Warts" (or "MacWarts"). I may delete your comment if you don't. (Nothing personal; just sayin'. And you might as well not, anyway, I am unlikely to be able to help you.)
Anyway, so I want my perl modules installed in
/usr/local
, and I want them in my @INC
when I run /usr/bin/perl
and it's a shame that the system perl only looks in any of these, right?/Library/Perl/Updates/5.10.0/darwin-thread-multi-2level /Library/Perl/Updates/5.10.0 /System/Library/Perl/5.10.0/darwin-thread-multi-2level /System/Library/Perl/5.10.0 /Library/Perl/5.10.0/darwin-thread-multi-2level /Library/Perl/5.10.0 /Network/Library/Perl/5.10.0/darwin-thread-multi-2level /Network/Library/Perl/5.10.0 /Network/Library/Perl /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level /System/Library/Perl/Extras/5.10.0
Wrong! (I told you: read this fine manual written by knowledgeable people!) Still, a neat thing they describe is that the MacOS X perl installation will happily read
/Library/Perl/5.10.0/AppendToPath
and /Library/Perl/5.10.0/PrependToPath
and append / prepend any directories they list (one line per path, normal unix style) to @INC
. Or, of course, any other version than 5.10.0 – perl -v
will tell you what you've got installed. So, as root, I appended /usr/local/lib/perl5/site_perl/
to my AppendToPath
.Next up, assuming you've already made a mess trying to install stuff with cpan (I had), you may want to do what I did, which is
rm -rf ~/.cpan
(which permanently nukes it; should you want to be able to undo that, you of course instead move it aside somewhere – you're solely responsible for your actions here, as always). Then run cpan
. It'll ask you tons of questions you might not know the answer to any better than I did if you say no, or give slightly okay defaults if you say yes. Some frustrating experimentation later, I came down with this recipe, which worked for me; first yes it, and then when you get the prompt, type o conf
. It'll probably look a bit like this, if the defaults remain about the same:cpan[1]> o conf $CPAN::Config options from '/Users/jhs/.cpan/CPAN/MyConfig.pm': commit [Commit changes to disk] defaults [Reload defaults from disk] help [Short help about 'o conf' usage] init [Interactive setting of all options] applypatch [] auto_commit [0] build_cache [100] build_dir [/Users/jhs/.cpan/build] build_dir_reuse [1] build_requires_install_policy [ask/yes] bzip2 [/usr/bin/bzip2] cache_metadata [1] check_sigs [0] colorize_debug undef colorize_output undef colorize_print undef colorize_warn undef commandnumber_in_prompt [1] commands_quote undef cpan_home [/Users/jhs/.cpan] curl [/usr/bin/curl] dontload_hash undef dontload_list undef ftp [/usr/bin/ftp] ftp_passive [1] ftp_proxy [] getcwd [cwd] gpg [] gzip [/usr/bin/gzip] histfile [/Users/jhs/.cpan/histfile] histsize [100] http_proxy [] inactivity_timeout [0] index_expire [1] inhibit_startup_message [0] keep_source_where [/Users/jhs/.cpan/sources] load_module_verbosity [v] lynx [] make [/usr/bin/make] make_arg [] make_install_arg [] make_install_make_command [/usr/bin/make] makepl_arg [] mbuild_arg [] mbuild_install_arg [] mbuild_install_build_command [./Build] mbuildpl_arg [] ncftp [] ncftpget [] no_proxy [] pager [/usr/bin/less] password undef patch [/usr/bin/patch] prefer_installer [MB] prefs_dir [/Users/jhs/.cpan/prefs] prerequisites_policy [ask] proxy_pass undef proxy_user undef randomize_urllist undef scan_cache [atstart] shell [/bin/zsh] show_unparsable_versions [0] show_upload_date [0] show_zero_versions [0] tar [/usr/bin/tar] tar_verbosity [v] term_is_latin [1] term_ornaments [1] test_report [0] unzip [/usr/bin/unzip] urllist use_sqlite [0] username undef wait_list undef wget [/usr/local/bin/wget] yaml_load_code [0] yaml_module [YAML] cpan[2]>
Then paste this little snippet, which sets most things right (it's a good decade to use a UTF-8 terminal):
o conf term_is_latin 0 o conf check_sigs 1 o conf make_arg -j3 o conf make_install_arg -j3 o conf makepl_arg PREFIX=/usr/local o conf mbuildpl_arg --install_base /usr/local o conf commit
This will have perl use two cores when compiling modules, and use
Module::Signature
if you install it, which seemed like a nice enough idea (at least if you have gpg installed; you may want to skip the check_sigs part, or install it first, if not -- via brew install gpgme
for instance). And, most importantly, it'll put stuff in /usr/local
at installation time, so perl will find it at invocation time. (Some day, that might just work right out of the box, in MacOS too.)And that's it. Try it with
cpan Module::Signature
for instance, if you enabled that and you'll eventually end up with a fatter /usr/local/lib/perl5/site_perl
. You are encouraged to drop other helpful tips here, especially if you know a thing or two about perl or cpan that I totally should have mentioned. Happy hacking! :-)