Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Two versions of Perl in Mac OS X?

I've installed the Template module via CPAN on my MacBook Pro and it seemed to install correctly.

But, when I try to run a script that includes the Template module, I get the following:

Can't locate Template.pm in @INC (@INC contains: /Users/purinkle/Sites/rob/modules /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 .) at ./index.pl line 12.

BEGIN failed--compilation aborted at ./index.pl line 12.

I then think that something must have gone wrong during installation and try to install again via CPAN but receive the following message:

Template is up to date (2.22).

I've then ran the instmodsh command to try and find where the module is installed. instmodsh lists these directories:

/opt/local/bin

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Manual

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Namespace

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Plugin

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Stash

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Tools

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Tutorial

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/auto/Template/Stash/XS

/opt/local/share/man/man1

/opt/local/share/man/man3

It looks like I have some how got two different versions of Perl installed (5.8.9 and 5.10.0) and this is causing confusion between CPAN and other Perl scripts.

How can I verify this and how can this issue be resolved?

I've ran the commands

which perl
which cpan

and they both return /opt/local/bin

Running

find / -name perl

returns

find: /dev/fd/3: Not a directory

find: /dev/fd/4: Not a directory

/opt/local/bin/perl

/opt/local/etc/bash_completion.d/perl

/opt/local/var/macports/software/bash-completion/1.2_0/opt/local/etc/bash_completion.d/perl

/opt/local/var/macports/software/perl5.8/5.8.9_3/opt/local/bin/perl

/opt/local/var/macports/sources/rsync.macports.org/release/ports/perl

/usr/bin/perl

/usr/local/bin/perl

/usr/share/file/magic/perl

and

find / -name cpan

returns

/opt/local/bin/cpan

/opt/local/var/macports/software/perl5.8/5.8.9_3/opt/local/bin/cpan

/Users/purinkle/.cpan/build/CPAN-1.9402-KtN827/blib/script/cpan

/Users/purinkle/.cpan/build/CPAN-1.9402-KtN827/scripts/cpan

/Users/purinkle/.cpan/build/CPAN-1.9402-zb0AeX/blib/script/cpan

/Users/purinkle/.cpan/build/CPAN-1.9402-zb0AeX/scripts/cpan

/usr/bin/cpan

Running

perl -e 'print join "\n", @INC'

returns

/Users/purinkle/Sites/rob/modules

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level

/opt/local/lib/perl5/site_perl/5.8.9

/opt/local/lib/perl5/site_perl

/opt/local/lib/perl5/vendor_perl/5.8.9/darwin-2level

/opt/local/lib/perl5/vendor_perl/5.8.9

/opt/local/lib/perl5/vendor_perl

/opt/local/lib/perl5/5.8.9/darwin-2level

/opt/local/lib/perl5/5.8.9

like image 866
purinkle Avatar asked Aug 13 '10 19:08

purinkle


2 Answers

OS X ships with two versions of Perl. 5.10.0 is the default, so /usr/bin/perl and /usr/bin/cpan should all talk to 5.10.0.

The problem is you have three. /opt/local indicates a MacPorts installation which probably installed Perl as a dependency when you weren't looking. That's /opt/local/bin/perl and its probably the default perl in your path. Check with which perl. That also means you're probably using MacPorts' cpan, check with which cpan, and thus installed Template Toolkit into the MacPorts version.

I'm going to guess either you're running a program with #!/usr/bin/perl at the top or you're using the built in mod_perl or you're running it as a user who is not you. All of which will reference OS X's default Perl and not your MacPorts install.

Macports has a 5.10 as well as 5.12, but "perl" in Macports is still 5.8. You can install 5.10 in Macports.

As to how to resolve this... if you're using using mod_perl on that machine, use Macports' Perl. It will be easier to install modules and it will be kept up to date better than the OS version.

To shield yourself from future confusion, you can add aliases into /usr/local/bin or ~/bin to perl, perldoc and cpan to the Perl of your choice. That will prevent something else from installing perl in your path and hijacking.

like image 128
Schwern Avatar answered Oct 20 '22 18:10

Schwern


I went through this process about a month and a half ago when setting up a new MacBook Pro. Getting the MacPorts perl installed, switching to /usr/bin/env perl, and updating my PATH (which, from comments on Schwern's answer, sounds like it's about where you are now) was straightforward and reasonably well-documented.

Figuring out how to get the right perl to show up first in apache's PATH, on the other hand, was hellish and involved way too much googling interspersed with periods of beating my head against the wall for relief.

So, to spare you that, the answer I eventually found was that you need to add a PATH key to /System/Library/LaunchDaemons/org.apache.httpd.plist with the PATH that you want apache to use. Assuming that you're just as unfamiliar with the .plist format as I was at the time, here's my complete current org.apache.httpd.plist, which has been working great for me:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Disabled</key>
        <true/>
        <key>Label</key>
        <string>org.apache.httpd</string>
        <key>ProgramArguments</key>
        <array>
                <string>/usr/sbin/httpd</string>
                <string>-D</string>
                <string>FOREGROUND</string>
        </array>
        <key>OnDemand</key>
        <false/>
        <key>SHAuthorizationRight</key>
        <string>system.preferences</string>
        <key>EnvironmentVariables</key>
        <dict>
                <key>PATH</key>
                <string>/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin</string>
        </dict>
</dict>
</plist>

Copy/paste that to your system (or just add the EnvironmentVariables key and its accompanying dict to your existing file), restart apache, and you should be set. (Unless I misremembered and it was something else that actually got it working for me, but I'm pretty sure this was it.)

like image 31
Dave Sherohman Avatar answered Oct 20 '22 17:10

Dave Sherohman