Installing mod_perl without superuser privileges
by Stas Bekman
|
Pages: 1, 2, 3
Now, let's assume the following scenario. I have installed the LWP
package in my local repository. Now I want to install another module
(e.g. mod_perl) that has LWP listed in its prerequisites list. I
know that I have LWP installed, but when I run perl Makefile.PL
for the module I'm about to install I'm told that I don't have LWP
installed.
There is no way for Perl to know that we have some locally installed
modules. All it does is search the directories listed in @INC, and
since the latter contains only the default four directories (plus the
. directory), it cannot find the locally installed LWP package.
We cannot solve this problem by adding code to modify @INC, but
changing the PERL5LIB environment variable will do the trick. If
you are using t?csh for interactive work, then do this:
setenv PERL5LIB /home/stas/lib/perl5/5.00503:
/home/stas/lib/perl5/site_perl/5.005
It should be a single line with directories separated by colons (:)
and no spaces. If you are a (ba)?sh user, then do this:
export PERL5LIB=/home/stas/lib/perl5/5.00503:
/home/stas/lib/perl5/site_perl/5.005
Again, make it a single line. If you use bash, then you can use multi-line
commands by terminating split lines with a backslash (\), like this:
export PERL5LIB=/home/stas/lib/perl5/5.00503:\
/home/stas/lib/perl5/site_perl/5.005
As with use lib, Perl automatically prepends the architecture
specific directories to @INC if those exist.
When you have done this, verify the value of the newly configured
@INC by executing perl -V as before. You should see the
modified value of @INC:
% perl -V
Characteristics of this binary (from libperl):
Built under linux
Compiled at Apr 6 1999 23:34:07
%ENV:
PERL5LIB="/home/stas/lib/perl5/5.00503:
/home/stas/lib/perl5/site_perl/5.005"
@INC:
/home/stas/lib/perl5/5.00503/i386-linux
/home/stas/lib/perl5/5.00503
/home/stas/lib/perl5/site_perl/5.005/i386-linux
/home/stas/lib/perl5/site_perl/5.005
/usr/lib/perl5/5.00503/i386-linux
/usr/lib/perl5/5.00503
/usr/lib/perl5/site_perl/5.005/i386-linux
/usr/lib/perl5/site_perl/5.005
.
When everything works as you want it to, add these commands to your .tcshrc or .bashrc file. The next time you start a shell, the environment will be ready for you to work with the new Perl.
Note that if you have a PERL5LIB setting, then you don't need to alter
the @INC value in your scripts. But if, for example, someone else
(who doesn't have this setting in the shell) tries to execute your
scripts, then Perl will fail to find your locally installed modules. The
best example is a crontab script that might use a different SHELL
environment and, therefore, the PERL5LIB setting won't be available
to it.
So the best approach is to have both the PERL5LIB environment
variable and the explicit @INC extension code at the beginning of
the scripts as described above.
The CPAN.pm Shell and Locally Installed Modules
The CPAN.pm shell saves a great deal of time when dealing
with the installation of Perl modules and keeping them up to date. It does
the job for us, even detecting the missing modules listed in
prerequisites, fetching and installing them. So you may wonder
whether you can use CPAN.pm to maintain your local repository as
well.
When you start the CPAN interactive shell, it searches first for
the user's private configuration file and then for the system-wide
one. When I'm logged as user stas, the two files on my setup are:
/home/stas/.cpan/CPAN/MyConfig.pm
/usr/lib/perl5/5.00503/CPAN/Config.pm
If there is no CPAN shell configured on your system, then when you start
the shell for the first time it will ask you a dozen configuration
questions and then create the Config.pm file for you.
If you already have it system-wide configured, then you should have a
/usr/lib/perl5/5.00503/CPAN/Config.pm. If you have a different
Perl version, then alter the path to use your Perl's version number when
looking up the file. Create the directory (mkdir -p creates the
whole path at once) where the local configuration file will go:
% mkdir -p /home/stas/.cpan/CPAN
Now copy the system wide configuration file to your local one.
% cp /usr/lib/perl5/5.00503/CPAN/Config.pm \
/home/stas/.cpan/CPAN/MyConfig.pm
The only thing left is to change the base directory of .cpan in
your local file to the one under your home directory. On my machine, I
replace /usr/src/.cpan (that's where my system's .cpan directory
resides) with /home/stas. I use Perl, of course!
% perl -pi -e 's|/usr/src|/home/stas|' \
/home/stas/.cpan/CPAN/MyConfig.pm
Now you have the local configuration file ready, you have to tell it
what special parameters you need to pass when executing the perl
Makefile.PL stage.
Open the file in your favorite editor and replace line:
'makepl_arg' => q[],
with:
'makepl_arg' => q[PREFIX=/home/stas],
Now you've finished the configuration. Assuming that you are logged in as the same user you have prepared the local installation for (stas in our example), start it like this:
% perl -MCPAN -e shell
From now on, any module you try to install will be installed locally. If you need to install some system modules, then just become the superuser and install them in the same way. When you are logged in as the superuser, the system-wide configuration file will be used instead of your local one.
If you have used more than just the PREFIX variable, then modify
MyConfig.pm to use them. For example, if you have used these
variables:
perl Makefile.PL PREFIX=/home/stas \
INSTALLPRIVLIB=/home/stas/lib/perl5 \
INSTALLSCRIPT=/home/stas/bin \
INSTALLSITELIB=/home/stas/lib/perl5/site_perl \
INSTALLBIN=/home/stas/bin \
INSTALLMAN1DIR=/home/stas/lib/perl5/man \
INSTALLMAN3DIR=/home/stas/lib/perl5/man3
then replace PREFIX=/home/stas in the line:
'makepl_arg' => q[PREFIX=/home/stas],
with all the variables from above, so that the line becomes:
'makepl_arg' => q[PREFIX=/home/stas \
INSTALLPRIVLIB=/home/stas/lib/perl5 \
INSTALLSCRIPT=/home/stas/bin \
INSTALLSITELIB=/home/stas/lib/perl5/site_perl \
INSTALLBIN=/home/stas/bin \
INSTALLMAN1DIR=/home/stas/lib/perl5/man \
INSTALLMAN3DIR=/home/stas/lib/perl5/man3],
If you arrange all the above parameters in one line, then you can remove
the backslashes (\).

