Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | package lib; |
2 | ||
3 | # THIS FILE IS AUTOMATICALLY GENERATED FROM lib_pm.PL. | |
4 | # ANY CHANGES TO THIS FILE WILL BE OVERWRITTEN BY THE NEXT PERL BUILD. | |
5 | ||
6 | use Config; | |
7 | ||
8 | use strict; | |
9 | ||
10 | my $archname = $Config{archname}; | |
11 | my $version = $Config{version}; | |
12 | my @inc_version_list = reverse split / /, $Config{inc_version_list}; | |
13 | ||
14 | ||
15 | our @ORIG_INC = @INC; # take a handy copy of 'original' value | |
16 | our $VERSION = '0.5565'; | |
17 | my $Is_MacOS = $^O eq 'MacOS'; | |
18 | my $Mac_FS; | |
19 | if ($Is_MacOS) { | |
20 | require File::Spec; | |
21 | $Mac_FS = eval { require Mac::FileSpec::Unixish }; | |
22 | } | |
23 | ||
24 | sub import { | |
25 | shift; | |
26 | ||
27 | my %names; | |
28 | foreach (reverse @_) { | |
29 | my $path = $_; # we'll be modifying it, so break the alias | |
30 | if ($path eq '') { | |
31 | require Carp; | |
32 | Carp::carp("Empty compile time value given to use lib"); | |
33 | } | |
34 | ||
35 | $path = _nativize($path); | |
36 | ||
37 | if (-e $path && ! -d _) { | |
38 | require Carp; | |
39 | Carp::carp("Parameter to use lib must be directory, not file"); | |
40 | } | |
41 | unshift(@INC, $path); | |
42 | # Add any previous version directories we found at configure time | |
43 | foreach my $incver (@inc_version_list) | |
44 | { | |
45 | my $dir = $Is_MacOS | |
46 | ? File::Spec->catdir( $path, $incver ) | |
47 | : "$path/$incver"; | |
48 | unshift(@INC, $dir) if -d $dir; | |
49 | } | |
50 | # Put a corresponding archlib directory in front of $path if it | |
51 | # looks like $path has an archlib directory below it. | |
52 | my($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir) | |
53 | = _get_dirs($path); | |
54 | unshift(@INC, $arch_dir) if -d $arch_auto_dir; | |
55 | unshift(@INC, $version_dir) if -d $version_dir; | |
56 | unshift(@INC, $version_arch_dir) if -d $version_arch_dir; | |
57 | } | |
58 | ||
59 | # remove trailing duplicates | |
60 | @INC = grep { ++$names{$_} == 1 } @INC; | |
61 | return; | |
62 | } | |
63 | ||
64 | ||
65 | sub unimport { | |
66 | shift; | |
67 | ||
68 | my %names; | |
69 | foreach (@_) { | |
70 | my $path = _nativize($_); | |
71 | ||
72 | my($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir) | |
73 | = _get_dirs($path); | |
74 | ++$names{$path}; | |
75 | ++$names{$arch_dir} if -d $arch_auto_dir; | |
76 | ++$names{$version_dir} if -d $version_dir; | |
77 | ++$names{$version_arch_dir} if -d $version_arch_dir; | |
78 | } | |
79 | ||
80 | # Remove ALL instances of each named directory. | |
81 | @INC = grep { !exists $names{$_} } @INC; | |
82 | return; | |
83 | } | |
84 | ||
85 | sub _get_dirs { | |
86 | my($dir) = @_; | |
87 | my($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir); | |
88 | ||
89 | # we could use this for all platforms in the future, but leave it | |
90 | # Mac-only for now, until there is more time for testing it. | |
91 | if ($Is_MacOS) { | |
92 | $arch_auto_dir = File::Spec->catdir( $dir, $archname, 'auto' ); | |
93 | $arch_dir = File::Spec->catdir( $dir, $archname, ); | |
94 | $version_dir = File::Spec->catdir( $dir, $version ); | |
95 | $version_arch_dir = File::Spec->catdir( $dir, $version, $archname ); | |
96 | } else { | |
97 | $arch_auto_dir = "$dir/$archname/auto"; | |
98 | $arch_dir = "$dir/$archname"; | |
99 | $version_dir = "$dir/$version"; | |
100 | $version_arch_dir = "$dir/$version/$archname"; | |
101 | } | |
102 | return($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir); | |
103 | } | |
104 | ||
105 | sub _nativize { | |
106 | my($dir) = @_; | |
107 | ||
108 | if ($Is_MacOS && $Mac_FS && ! -d $dir) { | |
109 | $dir = Mac::FileSpec::Unixish::nativize($dir); | |
110 | $dir .= ":" unless $dir =~ /:$/; | |
111 | } | |
112 | ||
113 | return $dir; | |
114 | } | |
115 | ||
116 | 1; | |
117 | __END__ | |
118 | ||
119 | =head1 NAME | |
120 | ||
121 | lib - manipulate @INC at compile time | |
122 | ||
123 | =head1 SYNOPSIS | |
124 | ||
125 | use lib LIST; | |
126 | ||
127 | no lib LIST; | |
128 | ||
129 | =head1 DESCRIPTION | |
130 | ||
131 | This is a small simple module which simplifies the manipulation of @INC | |
132 | at compile time. | |
133 | ||
134 | It is typically used to add extra directories to perl's search path so | |
135 | that later C<use> or C<require> statements will find modules which are | |
136 | not located on perl's default search path. | |
137 | ||
138 | =head2 Adding directories to @INC | |
139 | ||
140 | The parameters to C<use lib> are added to the start of the perl search | |
141 | path. Saying | |
142 | ||
143 | use lib LIST; | |
144 | ||
145 | is I<almost> the same as saying | |
146 | ||
147 | BEGIN { unshift(@INC, LIST) } | |
148 | ||
149 | For each directory in LIST (called $dir here) the lib module also | |
150 | checks to see if a directory called $dir/$archname/auto exists. | |
151 | If so the $dir/$archname directory is assumed to be a corresponding | |
152 | architecture specific directory and is added to @INC in front of $dir. | |
153 | ||
154 | To avoid memory leaks, all trailing duplicate entries in @INC are | |
155 | removed. | |
156 | ||
157 | =head2 Deleting directories from @INC | |
158 | ||
159 | You should normally only add directories to @INC. If you need to | |
160 | delete directories from @INC take care to only delete those which you | |
161 | added yourself or which you are certain are not needed by other modules | |
162 | in your script. Other modules may have added directories which they | |
163 | need for correct operation. | |
164 | ||
165 | The C<no lib> statement deletes all instances of each named directory | |
166 | from @INC. | |
167 | ||
168 | For each directory in LIST (called $dir here) the lib module also | |
169 | checks to see if a directory called $dir/$archname/auto exists. | |
170 | If so the $dir/$archname directory is assumed to be a corresponding | |
171 | architecture specific directory and is also deleted from @INC. | |
172 | ||
173 | =head2 Restoring original @INC | |
174 | ||
175 | When the lib module is first loaded it records the current value of @INC | |
176 | in an array C<@lib::ORIG_INC>. To restore @INC to that value you | |
177 | can say | |
178 | ||
179 | @INC = @lib::ORIG_INC; | |
180 | ||
181 | =head1 CAVEATS | |
182 | ||
183 | In order to keep lib.pm small and simple, it only works with Unix | |
184 | filepaths. This doesn't mean it only works on Unix, but non-Unix | |
185 | users must first translate their file paths to Unix conventions. | |
186 | ||
187 | # VMS users wanting to put [.stuff.moo] into | |
188 | # their @INC would write | |
189 | use lib 'stuff/moo'; | |
190 | ||
191 | =head1 NOTES | |
192 | ||
193 | In the future, this module will likely use File::Spec for determining | |
194 | paths, as it does now for Mac OS (where Unix-style or Mac-style paths | |
195 | work, and Unix-style paths are converted properly to Mac-style paths | |
196 | before being added to @INC). | |
197 | ||
198 | =head1 SEE ALSO | |
199 | ||
200 | FindBin - optional module which deals with paths relative to the source file. | |
201 | ||
202 | =head1 AUTHOR | |
203 | ||
204 | Tim Bunce, 2nd June 1995. | |
205 | ||
206 | =cut |