6 use 5.8.1; # probably works with earlier versions but I'm not supporting them
7 # (patches would, of course, be welcome)
14 our $VERSION = '1.000000'; # 1.0.0
17 my ($class, $path) = @_;
18 $path = $class->resolve_path($path);
19 $class->setup_local_lib_for($path);
26 my $last = pop(@methods);
29 my ($obj, @args) = @_;
30 $obj->${pipeline @methods}(
47 { package Foo; sub foo { -$_[1] } sub bar { $_[1]+2 } sub baz { $_[1]+3 } }
48 my $foo = bless({}, 'Foo');
49 Test::More::ok($foo->${pipeline qw(foo bar baz)}(10) == -15);
56 my ($class, $path) = @_;
57 $class->${pipeline qw(
64 sub resolve_empty_path {
65 my ($class, $path) = @_;
75 #:: test classmethod setup
85 is($c->resolve_empty_path, '~/perl5');
86 is($c->resolve_empty_path('foo'), 'foo');
92 sub resolve_home_path {
93 my ($class, $path) = @_;
94 return $path unless ($path =~ /^~/);
95 my ($user) = ($path =~ /^~([^\/]+)/); # can assume ^~ so undef for 'us'
96 my $tried_file_homedir;
98 if (eval { require File::HomeDir } && $File::HomeDir::VERSION >= 0.65) {
99 $tried_file_homedir = 1;
101 File::HomeDir->users_home($user);
103 File::HomeDir->my_home;
109 if (defined $ENV{HOME}) {
117 unless (defined $homedir) {
119 "Couldn't resolve homedir for "
120 .(defined $user ? $user : 'current user')
121 .($tried_file_homedir ? '' : ' - consider installing File::HomeDir')
124 $path =~ s/^~[^\/]*/$homedir/;
128 sub resolve_relative_path {
129 my ($class, $path) = @_;
130 File::Spec->rel2abs($path);
137 local *File::Spec::rel2abs = sub { shift; 'FOO'.shift; };
138 is($c->resolve_relative_path('bar'),'FOObar');
144 sub setup_local_lib_for {
145 my ($class, $path) = @_;
146 $class->ensure_dir_structure_for($path);
148 $class->print_environment_vars_for($path);
151 $class->setup_env_hash_for($path);
152 unshift(@INC, split(':', $ENV{PERL5LIB}));
156 sub modulebuildrc_path {
157 my ($class, $path) = @_;
158 File::Spec->catfile($path, '.modulebuildrc');
161 sub install_base_bin_path {
162 my ($class, $path) = @_;
163 File::Spec->catdir($path, 'bin');
166 sub install_base_perl_path {
167 my ($class, $path) = @_;
168 File::Spec->catdir($path, 'lib', 'perl5');
171 sub install_base_arch_path {
172 my ($class, $path) = @_;
173 File::Spec->catdir($class->install_base_perl_path($path), $Config{archname});
176 sub ensure_dir_structure_for {
177 my ($class, $path) = @_;
179 warn "Attempting to create directory ${path}\n";
181 File::Path::mkpath($path);
182 my $modulebuildrc_path = $class->modulebuildrc_path($path);
183 if (-e $modulebuildrc_path) {
185 Carp::croak("${modulebuildrc_path} exists but is not a plain file");
188 warn "Attempting to create file ${modulebuildrc_path}\n";
189 open MODULEBUILDRC, '>', $modulebuildrc_path
190 || Carp::croak("Couldn't open ${modulebuildrc_path} for writing: $!");
191 print MODULEBUILDRC qq{install --install_base ${path}\n}
192 || Carp::croak("Couldn't write line to ${modulebuildrc_path}: $!");
194 || Carp::croak("Couldn't close file ${modulebuildrc_path}: $@");
198 sub INTERPOLATE_PATH () { 1 }
199 sub LITERAL_PATH () { 0 }
201 sub print_environment_vars_for {
202 my ($class, $path) = @_;
203 my @envs = $class->build_environment_vars_for($path, LITERAL_PATH);
205 # rather basic csh detection, goes on the assumption that something won't
206 # call itself csh unless it really is. also, default to bourne in the
207 # pathological situation where a user doesn't have $ENV{SHELL} defined.
208 # note also that shells with funny names, like zoid, are assumed to be
211 if(defined $ENV{'SHELL'}) {
212 my @shell_bin_path_parts = File::Spec->splitpath($ENV{'SHELL'});
213 $shellbin = $shell_bin_path_parts[-1];
216 my ($name, $value) = (shift(@envs), shift(@envs));
217 $value =~ s/(\\")/\\$1/g;
219 if($shellbin =~ /csh/) {
220 $out .= qq{setenv ${name} "${value}"\n};
223 $out .= qq{export ${name}="${value}"\n};
229 sub setup_env_hash_for {
230 my ($class, $path) = @_;
231 my %envs = $class->build_environment_vars_for($path, INTERPOLATE_PATH);
232 @ENV{keys %envs} = values %envs;
235 sub build_environment_vars_for {
236 my ($class, $path, $interpolate) = @_;
238 MODULEBUILDRC => $class->modulebuildrc_path($path),
239 PERL_MM_OPT => "INSTALL_BASE=${path}",
240 PERL5LIB => join(':',
241 $class->install_base_perl_path($path),
242 $class->install_base_arch_path($path),
245 $class->install_base_bin_path($path),
246 ($interpolate == INTERPOLATE_PATH
257 File::Path::rmtree('t/var/splat');
259 $c->ensure_dir_structure_for('t/var/splat');
261 ok(-d 't/var/splat');
263 ok(-f 't/var/splat/.modulebuildrc');
269 local::lib - create and use a local lib/ for perl modules with PERL5LIB
275 use local::lib; # sets up a local lib at ~/perl5
277 use local::lib '~/foo'; # same, but ~/foo
282 export MODULEBUILDRC=/home/username/perl/.modulebuildrc
283 export PERL_MM_OPT='INSTALL_BASE=/home/username/perl'
284 export PERL5LIB='/home/username/perl/lib/perl5:/home/username/perl/lib/perl5/i386-linux'
285 export PATH="/home/username/perl/bin:$PATH"
287 To bootstrap if you don't have local::lib itself installed -
289 $ perl -MCPAN -eshell # you only need to do this if you don't have a ~/.cpan
291 <download local::lib tarball from CPAN, unpack and cd into dir>
292 $ perl Makefile.PL --bootstrap
293 $ make test && make install
294 $ echo 'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)' >>~/.bashrc
299 % perl -I$HOME/perl5/lib/perl5 -Mlocal::lib >> ~/.cshrc
301 You can also pass --boostrap=~/foo to get a different location (adjust the
302 bashrc / cshrc line appropriately)
306 This module provides a quick, convenient way of bootstrapping a user-local Perl
307 module library located within the user's home directory. It also constructs and
308 prints out for the user the list of environment variables using the syntax
309 appropriate for the user's current shell (as specified by the C<SHELL>
310 environment variable), suitable for directly adding to one's shell configuration
315 Rather basic shell detection. Right now anything with csh in its name is
316 assumed to be a C shell or something compatible, and everything else is assumed
319 Bootstrap is a hack and will use CPAN.pm for ExtUtils::MakeMaker even if you
320 have CPANPLUS installed.
322 Kills any existing PERL5LIB, PERL_MM_OPT or MODULEBUILDRC.
324 Should probably auto-fixup CPAN config if not already done.
326 Patches very much welcome for any of the above.
334 local::lib looks at the user's C<SHELL> environment variable when printing out
335 commands to add to the shell configuration file.
341 Matt S Trout <mst@shadowcat.co.uk> http://www.shadowcat.co.uk/
343 auto_install fixes kindly sponsored by http://www.takkle.com/
347 This library is free software under the same license as perl itself