6 use 5.008001; # probably works with earlier versions but I'm not supporting them
7 # (patches would, of course, be welcome)
14 our $VERSION = '1.008001'; # 1.8.1
16 our @KNOWN_FLAGS = qw(--self-contained --deactivate);
19 my ($class, @args) = @_;
21 # Remember what PERL5LIB was when we started
22 my $perl5lib = $ENV{PERL5LIB} || '';
26 # check for lethal dash first to stop processing before causing problems
29 WHOA THERE! It looks like you've got some fancy dashes in your commandline!
30 These are *not* the traditional -- dashes that software recognizes. You
31 probably got these by copy-pasting from the perldoc for this module as
32 rendered by a UTF8-capable formatter. This most typically happens on an OS X
33 terminal, but can happen elsewhere too. Please try again after replacing the
34 dashes with normal minus signs.
37 elsif(grep { $arg eq $_ } @KNOWN_FLAGS) {
38 (my $flag = $arg) =~ s/--//;
39 $arg_store{$flag} = 1;
41 elsif($arg =~ /^--/) {
42 die "Unknown import argument: $arg";
45 # assume that what's left is a path
46 $arg_store{path} = $arg;
50 if($arg_store{'self-contained'}) {
51 die "FATAL: The local::lib --self-contained flag has never worked reliably and the original author, Mark Stosberg, was unable or unwilling to maintain it. As such, this flag has been removed from the local::lib codebase in order to prevent misunderstandings and potentially broken builds. The local::lib authors recommend that you look at the lib::core::only module shipped with this distribution in order to create a more robust environment that is equivalent to what --self-contained provided (although quite possibly not what you originally thought it provided due to the poor quality of the documentation, for which we apologise).\n";
54 $arg_store{path} = $class->resolve_path($arg_store{path});
55 $class->setup_local_lib_for($arg_store{path}, $arg_store{deactivate} || 0);
57 for (@INC) { # Untaint @INC
58 next if ref; # Skip entry if it is an ARRAY, CODE, blessed, etc.
67 my $last = pop(@methods);
70 my ($obj, @args) = @_;
71 $obj->${pipeline @methods}(
88 { package Foo; sub foo { -$_[1] } sub bar { $_[1]+2 } sub baz { $_[1]+3 } }
89 my $foo = bless({}, 'Foo');
90 Test::More::ok($foo->${pipeline qw(foo bar baz)}(10) == -15);
98 grep { ! $seen{$_}++ } @_;
102 my ($class, $path) = @_;
103 $class->${pipeline qw(
104 resolve_relative_path
110 sub resolve_empty_path {
111 my ($class, $path) = @_;
121 #:: test classmethod setup
123 my $c = 'local::lib';
131 is($c->resolve_empty_path, '~/perl5');
132 is($c->resolve_empty_path('foo'), 'foo');
138 sub resolve_home_path {
139 my ($class, $path) = @_;
140 return $path unless ($path =~ /^~/);
141 my ($user) = ($path =~ /^~([^\/]+)/); # can assume ^~ so undef for 'us'
142 my $tried_file_homedir;
144 if (eval { require File::HomeDir } && $File::HomeDir::VERSION >= 0.65) {
145 $tried_file_homedir = 1;
147 File::HomeDir->users_home($user);
149 File::HomeDir->my_home;
155 if (defined $ENV{HOME}) {
163 unless (defined $homedir) {
165 "Couldn't resolve homedir for "
166 .(defined $user ? $user : 'current user')
167 .($tried_file_homedir ? '' : ' - consider installing File::HomeDir')
170 $path =~ s/^~[^\/]*/$homedir/;
174 sub resolve_relative_path {
175 my ($class, $path) = @_;
176 $path = File::Spec->rel2abs($path);
183 local *File::Spec::rel2abs = sub { shift; 'FOO'.shift; };
184 is($c->resolve_relative_path('bar'),'FOObar');
190 sub setup_local_lib_for {
191 my ($class, $path, $deactivating) = @_;
192 $path = $class->ensure_dir_structure_for($path) unless $deactivating;
194 $class->print_environment_vars_for($path, $deactivating);
197 $class->setup_env_hash_for($path, $deactivating);
198 @INC = _uniq(split($Config{path_sep}, $ENV{PERL5LIB}), @INC);
202 sub install_base_bin_path {
203 my ($class, $path) = @_;
204 File::Spec->catdir($path, 'bin');
207 sub install_base_perl_path {
208 my ($class, $path) = @_;
209 File::Spec->catdir($path, 'lib', 'perl5');
212 sub install_base_arch_path {
213 my ($class, $path) = @_;
214 File::Spec->catdir($class->install_base_perl_path($path), $Config{archname});
217 sub ensure_dir_structure_for {
218 my ($class, $path) = @_;
220 warn "Attempting to create directory ${path}\n";
222 File::Path::mkpath($path);
223 # Need to have the path exist to make a short name for it, so
224 # converting to a short name here.
225 $path = Win32::GetShortPathName($path) if $^O eq 'MSWin32';
230 sub INTERPOLATE_ENV () { 1 }
231 sub LITERAL_ENV () { 0 }
233 sub guess_shelltype {
235 if(defined $ENV{'SHELL'}) {
236 my @shell_bin_path_parts = File::Spec->splitpath($ENV{'SHELL'});
237 $shellbin = $shell_bin_path_parts[-1];
240 local $_ = $shellbin;
248 # Both Win32 and Cygwin have $ENV{COMSPEC} set.
249 if (defined $ENV{'COMSPEC'} && $^O ne 'cygwin') {
250 my @shell_bin_path_parts = File::Spec->splitpath($ENV{'COMSPEC'});
251 $shellbin = $shell_bin_path_parts[-1];
253 local $_ = $shellbin;
256 } elsif(/cmd\.exe/) {
258 } elsif(/4nt\.exe/) {
268 sub print_environment_vars_for {
269 my ($class, $path, $deactivating) = @_;
270 print $class->environment_vars_string_for($path, $deactivating);
273 sub environment_vars_string_for {
274 my ($class, $path, $deactivating) = @_;
275 my @envs = $class->build_environment_vars_for($path, $deactivating, LITERAL_ENV);
278 # rather basic csh detection, goes on the assumption that something won't
279 # call itself csh unless it really is. also, default to bourne in the
280 # pathological situation where a user doesn't have $ENV{SHELL} defined.
281 # note also that shells with funny names, like zoid, are assumed to be
284 my $shelltype = $class->guess_shelltype;
287 my ($name, $value) = (shift(@envs), shift(@envs));
288 $value =~ s/(\\")/\\$1/g if defined $value;
289 $out .= $class->${\"build_${shelltype}_env_declaration"}($name, $value);
294 # simple routines that take two arguments: an %ENV key and a value. return
295 # strings that are suitable for passing directly to the relevant shell to set
296 # said key to said value.
297 sub build_bourne_env_declaration {
299 my($name, $value) = @_;
300 return defined($value) ? qq{export ${name}="${value}";\n} : qq{unset ${name};\n};
303 sub build_csh_env_declaration {
305 my($name, $value) = @_;
306 return defined($value) ? qq{setenv ${name} "${value}"\n} : qq{unsetenv ${name}\n};
309 sub build_win32_env_declaration {
311 my($name, $value) = @_;
312 return defined($value) ? qq{set ${name}=${value}\n} : qq{set ${name}=\n};
315 sub setup_env_hash_for {
316 my ($class, $path, $deactivating) = @_;
317 my %envs = $class->build_environment_vars_for($path, $deactivating, INTERPOLATE_ENV);
318 @ENV{keys %envs} = values %envs;
321 sub build_environment_vars_for {
322 my ($class, $path, $deactivating, $interpolate) = @_;
325 return $class->build_deactivate_environment_vars_for($path, $interpolate);
327 return $class->build_activate_environment_vars_for($path, $interpolate);
331 sub build_activate_environment_vars_for {
332 my ($class, $path, $interpolate) = @_;
334 PERL_LOCAL_LIB_ROOT => join($Config{path_sep},
335 (($ENV{PERL_LOCAL_LIB_ROOT}||()) ?
336 ($interpolate == INTERPOLATE_ENV
337 ? ($ENV{PERL_LOCAL_LIB_ROOT}||())
338 : (($^O ne 'MSWin32') ? '$PERL_LOCAL_LIB_ROOT'
339 : '%PERL_LOCAL_LIB_ROOT%' ))
343 PERL_MB_OPT => "--install_base ${path}",
344 PERL_MM_OPT => "INSTALL_BASE=${path}",
345 PERL5LIB => join($Config{path_sep},
346 $class->install_base_arch_path($path),
347 $class->install_base_perl_path($path),
348 (($ENV{PERL5LIB}||()) ?
349 ($interpolate == INTERPOLATE_ENV
351 : (($^O ne 'MSWin32') ? '$PERL5LIB' : '%PERL5LIB%' ))
354 PATH => join($Config{path_sep},
355 $class->install_base_bin_path($path),
356 ($interpolate == INTERPOLATE_ENV
358 : (($^O ne 'MSWin32') ? '$PATH' : '%PATH%' ))
363 sub build_deactivate_environment_vars_for {
364 my ($class, $path, $interpolate) = @_;
366 my @active_lls = split /\Q$Config{path_sep}/, $ENV{PERL_LOCAL_LIB_ROOT} || '';
368 if (!grep { $_ eq $path } @active_lls) {
369 warn "Tried to deactivate inactive local::lib '$path'\n";
373 my @new_ll_root = grep { $_ ne $path } @active_lls;
374 my @new_perl5lib = grep {
375 $_ ne $class->install_base_arch_path($path) &&
376 $_ ne $class->install_base_perl_path($path)
377 } split /\Q$Config{path_sep}/, $ENV{PERL5LIB};
380 PERL_LOCAL_LIB_ROOT => (@new_ll_root ?
381 join($Config{path_sep}, @new_ll_root) : undef
383 PERL5LIB => (@new_perl5lib ?
384 join($Config{path_sep}, @new_perl5lib) : undef
386 PATH => join($Config{path_sep},
387 grep { $_ ne $class->install_base_bin_path($path) }
388 split /\Q$Config{path_sep}/, $ENV{PATH}
392 # If removing ourselves from the "top of the stack", set install paths to
393 # correspond with the new top of stack.
394 if ($active_lls[-1] eq $path) {
395 if (@active_lls > 1) {
396 my $new_top = $active_lls[-2];
398 PERL_MB_OPT => "--install_base ${new_top}",
399 PERL_MM_OPT => "INSTALL_BASE=${new_top}",
403 PERL_MB_OPT => undef,
404 PERL_MM_OPT => undef,
416 File::Path::rmtree('t/var/splat');
418 $c->ensure_dir_structure_for('t/var/splat');
420 ok(-d 't/var/splat');
428 local::lib - create and use a local lib/ for perl modules with PERL5LIB
434 use local::lib; # sets up a local lib at ~/perl5
436 use local::lib '~/foo'; # same, but ~/foo
440 use local::lib "$FindBin::Bin/../support"; # app-local support library
444 # Install LWP and its missing dependencies to the '~/perl5' directory
445 perl -MCPAN -Mlocal::lib -e 'CPAN::install(LWP)'
447 # Just print out useful shell commands
449 export PERL_MB_OPT='--install_base /home/username/perl5'
450 export PERL_MM_OPT='INSTALL_BASE=/home/username/perl5'
451 export PERL5LIB='/home/username/perl5/lib/perl5/i386-linux:/home/username/perl5/lib/perl5'
452 export PATH="/home/username/perl5/bin:$PATH"
454 =head2 The bootstrapping technique
456 A typical way to install local::lib is using what is known as the
457 "bootstrapping" technique. You would do this if your system administrator
458 hasn't already installed local::lib. In this case, you'll need to install
459 local::lib in your home directory.
461 If you do have administrative privileges, you will still want to set up your
462 environment variables, as discussed in step 4. Without this, you would still
463 install the modules into the system CPAN installation and also your Perl scripts
464 will not use the lib/ path you bootstrapped with local::lib.
466 By default local::lib installs itself and the CPAN modules into ~/perl5.
468 Windows users must also see L</Differences when using this module under Win32>.
470 1. Download and unpack the local::lib tarball from CPAN (search for "Download"
471 on the CPAN page about local::lib). Do this as an ordinary user, not as root
472 or administrator. Unpack the file in your home directory or in any other
477 perl Makefile.PL --bootstrap
479 If the system asks you whether it should automatically configure as much
480 as possible, you would typically answer yes.
482 In order to install local::lib into a directory other than the default, you need
483 to specify the name of the directory when you call bootstrap, as follows:
485 perl Makefile.PL --bootstrap=~/foo
487 3. Run this: (local::lib assumes you have make installed on your system)
489 make test && make install
491 4. Now we need to setup the appropriate environment variables, so that Perl
492 starts using our newly generated lib/ directory. If you are using bash or
493 any other Bourne shells, you can add this to your shell startup script this
496 echo 'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)' >>~/.bashrc
498 If you are using C shell, you can do this as follows:
503 perl -I$HOME/perl5/lib/perl5 -Mlocal::lib >> ~/.cshrc
505 If you passed to bootstrap a directory other than default, you also need to give that as
506 import parameter to the call of the local::lib module like this way:
508 echo 'eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)' >>~/.bashrc
510 After writing your shell configuration file, be sure to re-read it to get the
511 changed settings into your current shell's environment. Bourne shells use
512 C<. ~/.bashrc> for this, whereas C shells use C<source ~/.cshrc>.
514 If you're on a slower machine, or are operating under draconian disk space
515 limitations, you can disable the automatic generation of manpages from POD when
516 installing modules by using the C<--no-manpages> argument when bootstrapping:
518 perl Makefile.PL --bootstrap --no-manpages
520 To avoid doing several bootstrap for several Perl module environments on the
521 same account, for example if you use it for several different deployed
522 applications independently, you can use one bootstrapped local::lib
523 installation to install modules in different directories directly this way:
527 eval $(perl -Mlocal::lib=./) ### To set the environment for this shell alone
528 printenv ### You will see that ~/mydir1 is in the PERL5LIB
529 perl -MCPAN -e install ... ### whatever modules you want
533 For multiple environments for multiple apps you may need to include a modified
534 version of the C<< use FindBin >> instructions in the "In code" sample above.
535 If you did something like the above, you have a set of Perl modules at C<<
536 ~/mydir1/lib >>. If you have a script at C<< ~/mydir1/scripts/myscript.pl >>,
537 you need to tell it where to find the modules you installed for it at C<<
540 In C<< ~/mydir1/scripts/myscript.pl >>:
544 use local::lib "$FindBin::Bin/.."; ### points to ~/mydir1 and local::lib finds lib
545 use lib "$FindBin::Bin/../lib"; ### points to ~/mydir1/lib
547 Put this before any BEGIN { ... } blocks that require the modules you installed.
549 =head2 Differences when using this module under Win32
551 To set up the proper environment variables for your current session of
552 C<CMD.exe>, you can use this:
554 C:\>perl -Mlocal::lib
555 set PERL_MB_OPT=--install_base C:\DOCUME~1\ADMINI~1\perl5
556 set PERL_MM_OPT=INSTALL_BASE=C:\DOCUME~1\ADMINI~1\perl5
557 set PERL5LIB=C:\DOCUME~1\ADMINI~1\perl5\lib\perl5;C:\DOCUME~1\ADMINI~1\perl5\lib\perl5\MSWin32-x86-multi-thread
558 set PATH=C:\DOCUME~1\ADMINI~1\perl5\bin;%PATH%
560 ### To set the environment for this shell alone
561 C:\>perl -Mlocal::lib > %TEMP%\tmp.bat && %TEMP%\tmp.bat && del %TEMP%\temp.bat
562 ### instead of $(perl -Mlocal::lib=./)
564 If you want the environment entries to persist, you'll need to add then to the
565 Control Panel's System applet yourself or use L<App::local::lib::Win32Helper>.
567 The "~" is translated to the user's profile directory (the directory named for
568 the user under "Documents and Settings" (Windows XP or earlier) or "Users"
569 (Windows Vista or later)) unless $ENV{HOME} exists. After that, the home
570 directory is translated to a short name (which means the directory must exist)
571 and the subdirectories are created.
575 The version of a Perl package on your machine is not always the version you
576 need. Obviously, the best thing to do would be to update to the version you
577 need. However, you might be in a situation where you're prevented from doing
578 this. Perhaps you don't have system administrator privileges; or perhaps you
579 are using a package management system such as Debian, and nobody has yet gotten
580 around to packaging up the version you need.
582 local::lib solves this problem by allowing you to create your own directory of
583 Perl packages downloaded from CPAN (in a multi-user system, this would typically
584 be within your own home directory). The existing system Perl installation is
585 not affected; you simply invoke Perl with special options so that Perl uses the
586 packages in your own local package directory rather than the system packages.
587 local::lib arranges things so that your locally installed version of the Perl
588 packages takes precedence over the system installation.
590 If you are using a package management system (such as Debian), you don't need to
591 worry about Debian and CPAN stepping on each other's toes. Your local version
592 of the packages will be written to an entirely separate directory from those
597 This module provides a quick, convenient way of bootstrapping a user-local Perl
598 module library located within the user's home directory. It also constructs and
599 prints out for the user the list of environment variables using the syntax
600 appropriate for the user's current shell (as specified by the C<SHELL>
601 environment variable), suitable for directly adding to one's shell
604 More generally, local::lib allows for the bootstrapping and usage of a
605 directory containing Perl modules outside of Perl's C<@INC>. This makes it
606 easier to ship an application with an app-specific copy of a Perl module, or
607 collection of modules. Useful in cases like when an upstream maintainer hasn't
608 applied a patch to a module of theirs that you need for your application.
610 On import, local::lib sets the following environment variables to appropriate
623 PATH is appended to, rather than clobbered.
627 These values are then available for reference by any code after import.
629 =head1 CREATING A SELF-CONTAINED SET OF MODULES
631 See L<lib::core::only> for one way to do this - but note that
632 there are a number of caveats, and the best approach is always to perform a
633 build against a clean perl (i.e. site and vendor as close to empty as possible).
637 =head2 ensure_dir_structure_for
641 =item Arguments: $path
643 =item Return value: None
647 Attempts to create the given path, and all required parent directories. Throws
648 an exception on failure.
650 =head2 print_environment_vars_for
654 =item Arguments: $path
656 =item Return value: None
660 Prints to standard output the variables listed above, properly set to use the
661 given path as the base directory.
663 =head2 build_environment_vars_for
667 =item Arguments: $path, $interpolate
669 =item Return value: \%environment_vars
673 Returns a hash with the variables listed above, properly set to use the
674 given path as the base directory.
676 =head2 setup_env_hash_for
680 =item Arguments: $path
682 =item Return value: None
686 Constructs the C<%ENV> keys for the given path, by calling
687 L</build_environment_vars_for>.
689 =head2 install_base_perl_path
693 =item Arguments: $path
695 =item Return value: $install_base_perl_path
699 Returns a path describing where to install the Perl modules for this local
700 library installation. Appends the directories C<lib> and C<perl5> to the given
703 =head2 install_base_arch_path
707 =item Arguments: $path
709 =item Return value: $install_base_arch_path
713 Returns a path describing where to install the architecture-specific Perl
714 modules for this local library installation. Based on the
715 L</install_base_perl_path> method's return value, and appends the value of
716 C<$Config{archname}>.
718 =head2 install_base_bin_path
722 =item Arguments: $path
724 =item Return value: $install_base_bin_path
728 Returns a path describing where to install the executable programs for this
729 local library installation. Based on the L</install_base_perl_path> method's
730 return value, and appends the directory C<bin>.
732 =head2 resolve_empty_path
736 =item Arguments: $path
738 =item Return value: $base_path
742 Builds and returns the base path into which to set up the local module
743 installation. Defaults to C<~/perl5>.
745 =head2 resolve_home_path
749 =item Arguments: $path
751 =item Return value: $home_path
755 Attempts to find the user's home directory. If installed, uses C<File::HomeDir>
756 for this purpose. If no definite answer is available, throws an exception.
758 =head2 resolve_relative_path
762 =item Arguments: $path
764 =item Return value: $absolute_path
768 Translates the given path into an absolute path.
774 =item Arguments: $path
776 =item Return value: $absolute_path
780 Calls the following in a pipeline, passing the result from the previous to the
781 next, in an attempt to find where to configure the environment for a local
782 library installation: L</resolve_empty_path>, L</resolve_home_path>,
783 L</resolve_relative_path>. Passes the given path argument to
784 L</resolve_empty_path> which then returns a result that is passed to
785 L</resolve_home_path>, which then has its result passed to
786 L</resolve_relative_path>. The result of this final call is returned from
789 =head1 A WARNING ABOUT UNINST=1
791 Be careful about using local::lib in combination with "make install UNINST=1".
792 The idea of this feature is that will uninstall an old version of a module
793 before installing a new one. However it lacks a safety check that the old
794 version and the new version will go in the same directory. Used in combination
795 with local::lib, you can potentially delete a globally accessible version of a
796 module while installing the new version in a local place. Only combine "make
797 install UNINST=1" and local::lib if you understand these possible consequences.
801 The perl toolchain is unable to handle directory names with spaces in it,
802 so you cant put your local::lib bootstrap into a directory with spaces. What
803 you can do is moving your local::lib to a directory with spaces B<after> you
804 installed all modules inside your local::lib bootstrap. But be aware that you
805 cant update or install CPAN modules after the move.
807 Rather basic shell detection. Right now anything with csh in its name is
808 assumed to be a C shell or something compatible, and everything else is assumed
809 to be Bourne, except on Win32 systems. If the C<SHELL> environment variable is
810 not set, a Bourne-compatible shell is assumed.
812 Bootstrap is a hack and will use CPAN.pm for ExtUtils::MakeMaker even if you
813 have CPANPLUS installed.
815 Kills any existing PERL5LIB, PERL_MM_OPT or PERL_MB_OPT.
817 Should probably auto-fixup CPAN config if not already done.
819 Patches very much welcome for any of the above.
821 On Win32 systems, does not have a way to write the created environment variables
822 to the registry, so that they can persist through a reboot.
824 =head1 TROUBLESHOOTING
826 If you've configured local::lib to install CPAN modules somewhere in to your
827 home directory, and at some point later you try to install a module with C<cpan
828 -i Foo::Bar>, but it fails with an error like: C<Warning: You do not have
829 permissions to install into /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux at
830 /usr/lib64/perl5/5.8.8/Foo/Bar.pm> and buried within the install log is an
831 error saying C<'INSTALL_BASE' is not a known MakeMaker parameter name>, then
832 you've somehow lost your updated ExtUtils::MakeMaker module.
834 To remedy this situation, rerun the bootstrapping procedure documented above.
836 Then, run C<rm -r ~/.cpan/build/Foo-Bar*>
838 Finally, re-run C<cpan -i Foo::Bar> and it should install without problems.
848 local::lib looks at the user's C<SHELL> environment variable when printing out
849 commands to add to the shell configuration file.
851 On Win32 systems, C<COMSPEC> is also examined.
859 Join #local-lib on irc.perl.org.
863 Matt S Trout <mst@shadowcat.co.uk> http://www.shadowcat.co.uk/
865 auto_install fixes kindly sponsored by http://www.takkle.com/
869 Patches to correctly output commands for csh style shells, as well as some
870 documentation additions, contributed by Christopher Nehren <apeiron@cpan.org>.
872 Doc patches for a custom local::lib directory, more cleanups in the english
873 documentation and a L<german documentation|POD2::DE::local::lib> contributed by Torsten Raudssus
874 <torsten@raudssus.de>.
876 Hans Dieter Pearcey <hdp@cpan.org> sent in some additional tests for ensuring
877 things will install properly, submitted a fix for the bug causing problems with
878 writing Makefiles during bootstrapping, contributed an example program, and
879 submitted yet another fix to ensure that local::lib can install and bootstrap
880 properly. Many, many thanks!
882 pattern of Freenode IRC contributed the beginnings of the Troubleshooting
883 section. Many thanks!
885 Patch to add Win32 support contributed by Curtis Jewell <csjewell@cpan.org>.
887 Warnings for missing PATH/PERL5LIB (as when not running interactively) silenced
888 by a patch from Marco Emilio Poleggi.
890 Mark Stosberg <mark@summersault.com> provided the code for the now deleted
891 '--self-contained' option.
893 Documentation patches to make win32 usage clearer by
894 David Mertens <dcmertens.perl@gmail.com> (run4flat).
896 Brazilian L<portuguese translation|POD2::PT_BR::local::lib> and minor doc patches contributed by Breno
897 G. de Oliveira <garu@cpan.org>.
901 Copyright (c) 2007 - 2010 the local::lib L</AUTHOR> and L</CONTRIBUTORS> as
906 This library is free software and may be distributed under the same terms