line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
######################################################################## |
2
|
|
|
|
|
|
|
# housekeeping |
3
|
|
|
|
|
|
|
######################################################################## |
4
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
use v5.14; |
6
|
10
|
|
|
10
|
|
219020
|
use strict; |
|
10
|
|
|
|
|
82
|
|
7
|
10
|
|
|
10
|
|
54
|
|
|
10
|
|
|
|
|
19
|
|
|
10
|
|
|
|
|
213
|
|
8
|
|
|
|
|
|
|
use FindBin; |
9
|
10
|
|
|
10
|
|
4083
|
|
|
10
|
|
|
|
|
9636
|
|
|
10
|
|
|
|
|
441
|
|
10
|
|
|
|
|
|
|
use File::Basename; |
11
|
10
|
|
|
10
|
|
66
|
|
|
10
|
|
|
|
|
18
|
|
|
10
|
|
|
|
|
511
|
|
12
|
|
|
|
|
|
|
use Carp qw( croak ); |
13
|
10
|
|
|
10
|
|
55
|
use Symbol qw( qualify qualify_to_ref ); |
|
10
|
|
|
|
|
20
|
|
|
10
|
|
|
|
|
401
|
|
14
|
10
|
|
|
10
|
|
2310
|
|
|
10
|
|
|
|
|
4204
|
|
|
10
|
|
|
|
|
651
|
|
15
|
|
|
|
|
|
|
use File::Spec::Functions |
16
|
|
|
|
|
|
|
qw |
17
|
|
|
|
|
|
|
( |
18
|
10
|
|
|
|
|
1493
|
&splitpath |
19
|
|
|
|
|
|
|
&splitdir |
20
|
|
|
|
|
|
|
&catpath |
21
|
|
|
|
|
|
|
&catdir |
22
|
|
|
|
|
|
|
); |
23
|
10
|
|
|
10
|
|
3170
|
|
|
10
|
|
|
|
|
5860
|
|
24
|
|
|
|
|
|
|
BEGIN |
25
|
|
|
|
|
|
|
{ |
26
|
|
|
|
|
|
|
# however... there have been complaints of |
27
|
|
|
|
|
|
|
# places where abs_path does not work. |
28
|
|
|
|
|
|
|
# |
29
|
|
|
|
|
|
|
# if abs_path fails on the working directory |
30
|
|
|
|
|
|
|
# then replace it with rel2abs and live with |
31
|
|
|
|
|
|
|
# possibly slower, redundant directories. |
32
|
|
|
|
|
|
|
# |
33
|
|
|
|
|
|
|
# the abs_path '//' hack allows for testing |
34
|
|
|
|
|
|
|
# broken abs_path on primitive systems that |
35
|
|
|
|
|
|
|
# cannot handle the rooted system being linked |
36
|
|
|
|
|
|
|
# back to itself. |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
use Cwd qw( &abs_path &cwd ); |
39
|
10
|
|
|
10
|
|
75
|
|
|
10
|
|
|
|
|
21
|
|
|
10
|
|
|
|
|
1668
|
|
40
|
|
|
|
|
|
|
if |
41
|
10
|
50
|
|
10
|
|
39
|
( |
42
|
|
|
|
|
|
|
# abs_path has a fixed bug dealing with infinite |
43
|
|
|
|
|
|
|
# recursion. if upping the version of Cwd does |
44
|
|
|
|
|
|
|
# not fix this then the only other test I can |
45
|
|
|
|
|
|
|
# think of is ( -e '/.' && -e '/..' && -e '/../.' ) |
46
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
eval |
48
|
|
|
|
|
|
|
{ |
49
|
|
|
|
|
|
|
abs_path '//'; |
50
|
10
|
|
|
|
|
70
|
abs_path cwd |
51
|
10
|
|
|
|
|
47171
|
} |
52
|
|
|
|
|
|
|
) |
53
|
|
|
|
|
|
|
{ |
54
|
|
|
|
|
|
|
# abs_path seems clean on this platform. |
55
|
|
|
|
|
|
|
} |
56
|
|
|
|
|
|
|
else |
57
|
|
|
|
|
|
|
{ |
58
|
|
|
|
|
|
|
# abs_path seems to be having problems, |
59
|
|
|
|
|
|
|
# fix is to stub it out. |
60
|
|
|
|
|
|
|
# |
61
|
|
|
|
|
|
|
# undef avoids nastygram. |
62
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
my $ref = qualify_to_ref 'abs_path', __PACKAGE__; |
64
|
0
|
|
|
|
|
0
|
|
65
|
|
|
|
|
|
|
my $sub = File::Spec::Functions->can( 'rel2abs' ); |
66
|
0
|
|
|
|
|
0
|
|
67
|
|
|
|
|
|
|
undef &{ $ref }; |
68
|
0
|
|
|
|
|
0
|
|
|
0
|
|
|
|
|
0
|
|
69
|
|
|
|
|
|
|
*$ref = $sub |
70
|
0
|
|
|
|
|
0
|
}; |
71
|
|
|
|
|
|
|
} |
72
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
######################################################################## |
74
|
|
|
|
|
|
|
# package variables |
75
|
|
|
|
|
|
|
######################################################################## |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
my %defaultz = |
78
|
|
|
|
|
|
|
( |
79
|
|
|
|
|
|
|
base => 'lib', |
80
|
|
|
|
|
|
|
use => undef, |
81
|
|
|
|
|
|
|
blib => undef, # prefer ./blib at the first level |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
subdir => '', # add this subdir also if found. |
84
|
|
|
|
|
|
|
subonly => undef, # leave out lib's, use only subdir. |
85
|
|
|
|
|
|
|
export => undef, # push variable into caller's space. |
86
|
|
|
|
|
|
|
append => undef, # push onto existing array (vs. overwrite) |
87
|
|
|
|
|
|
|
verbose => undef, # boolean: print inputs, results. |
88
|
|
|
|
|
|
|
debug => undef, # boolean: set internal breakpoints. |
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
print => 1, # display the results |
91
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
p5lib => undef, # prefix PERL5LIB with the results |
93
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
ignore => '/,/usr', # dir's to skip looking for ./lib |
95
|
|
|
|
|
|
|
); |
96
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
# only new directories are used, ignore pre-loads |
98
|
|
|
|
|
|
|
# this with unwanted values. |
99
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
my %found = (); |
101
|
|
|
|
|
|
|
|
102
|
|
|
|
|
|
|
# saves passing this between import and $handle_args. |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
my %argz = (); |
105
|
|
|
|
|
|
|
my $verbose = ''; |
106
|
|
|
|
|
|
|
my $empty = q{}; |
107
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
######################################################################## |
109
|
|
|
|
|
|
|
# subroutines |
110
|
|
|
|
|
|
|
######################################################################## |
111
|
|
|
|
|
|
|
|
112
|
|
|
|
|
|
|
# HAK ALERT: $Bin is an absolute path, there are cases |
113
|
|
|
|
|
|
|
# where splitdir does not add the leading '' onto the |
114
|
|
|
|
|
|
|
# directory path for it on VMS. Fix is to unshift a leading |
115
|
|
|
|
|
|
|
# '' into @dirpath where the leading entry is true. |
116
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
my $find_libs |
118
|
|
|
|
|
|
|
= sub |
119
|
|
|
|
|
|
|
{ |
120
|
|
|
|
|
|
|
my $base = basename ( shift || $argz{ base } ); |
121
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
my $subdir = $argz{ subdir } || ''; |
123
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
my $subonly = defined $argz{ subonly }; |
125
|
|
|
|
|
|
|
|
126
|
|
|
|
|
|
|
# for some reason, RH Enterprise V/4 has a |
127
|
|
|
|
|
|
|
# trailing '/'; I havn't seen another copy of |
128
|
|
|
|
|
|
|
# FindBin that does this. fix is quick enough: |
129
|
|
|
|
|
|
|
# strip the trailing '/'. |
130
|
|
|
|
|
|
|
# |
131
|
|
|
|
|
|
|
# using a regex to extract the value untaints it |
132
|
|
|
|
|
|
|
# (not useful for anything much, just helps the |
133
|
|
|
|
|
|
|
# poor slobs stuck in taint mode). |
134
|
|
|
|
|
|
|
# |
135
|
|
|
|
|
|
|
# after that splitpath can grab the directory |
136
|
|
|
|
|
|
|
# portion for future use. |
137
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
my ( $Bin ) = ( $argz{ Bin } =~ m{^ (.+) }xs ); |
139
|
|
|
|
|
|
|
|
140
|
|
|
|
|
|
|
print STDERR "\nSearching $Bin for '$base'...\n" |
141
|
|
|
|
|
|
|
if $verbose; |
142
|
|
|
|
|
|
|
|
143
|
|
|
|
|
|
|
my( $vol, $dir ) = splitpath $Bin, 1; |
144
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
my @dirpath = splitdir $dir; |
146
|
|
|
|
|
|
|
|
147
|
|
|
|
|
|
|
# fix for File::Spec::VMS missing the leading empty |
148
|
|
|
|
|
|
|
# string on a split. this can be removed once File::Spec |
149
|
|
|
|
|
|
|
# is fixed. |
150
|
|
|
|
|
|
|
|
151
|
|
|
|
|
|
|
unshift @dirpath, '' if $dirpath[ 0 ]; |
152
|
|
|
|
|
|
|
|
153
|
|
|
|
|
|
|
my @libz = (); |
154
|
|
|
|
|
|
|
|
155
|
|
|
|
|
|
|
PATH: |
156
|
|
|
|
|
|
|
for( 1 .. @dirpath ) |
157
|
|
|
|
|
|
|
{ |
158
|
|
|
|
|
|
|
# note that catpath is extraneous on *NIX; the |
159
|
|
|
|
|
|
|
# volume only means something on DOS- & VMS-based |
160
|
|
|
|
|
|
|
# filesystems, and adding an empty basename on |
161
|
|
|
|
|
|
|
# *nix is unnecessary. |
162
|
|
|
|
|
|
|
# |
163
|
|
|
|
|
|
|
# HAK ALERT: the poor slobs stuck on windog have an |
164
|
|
|
|
|
|
|
# abs_path that croaks on missing directories. have |
165
|
|
|
|
|
|
|
# to eval the check for subdir's. |
166
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
my $abs |
168
|
|
|
|
|
|
|
= eval |
169
|
|
|
|
|
|
|
{ |
170
|
|
|
|
|
|
|
abs_path |
171
|
|
|
|
|
|
|
catpath $vol, ( catdir @dirpath, $base ), $empty |
172
|
|
|
|
|
|
|
} |
173
|
|
|
|
|
|
|
|| ''; |
174
|
|
|
|
|
|
|
|
175
|
|
|
|
|
|
|
my $sub |
176
|
|
|
|
|
|
|
= $subdir |
177
|
|
|
|
|
|
|
? eval { abs_path ( catpath '', $abs, $subdir ) } || '' |
178
|
|
|
|
|
|
|
: '' |
179
|
|
|
|
|
|
|
; |
180
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
my @search = $subonly ? ( $sub ) : ( $abs, $sub ); |
182
|
|
|
|
|
|
|
|
183
|
|
|
|
|
|
|
for my $dir ( @search ) |
184
|
|
|
|
|
|
|
{ |
185
|
|
|
|
|
|
|
if( $dir && -d $dir && ! exists $found{ $dir } ) |
186
|
|
|
|
|
|
|
{ |
187
|
|
|
|
|
|
|
$found{ $dir } = (); |
188
|
|
|
|
|
|
|
|
189
|
|
|
|
|
|
|
push @libz, $dir; |
190
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
last if $argz{ scalar }; |
192
|
|
|
|
|
|
|
} |
193
|
|
|
|
|
|
|
} |
194
|
|
|
|
|
|
|
|
195
|
|
|
|
|
|
|
pop @dirpath |
196
|
|
|
|
|
|
|
} |
197
|
|
|
|
|
|
|
|
198
|
|
|
|
|
|
|
# caller gets back the existing lib paths |
199
|
|
|
|
|
|
|
# (including volume) walking up the path |
200
|
|
|
|
|
|
|
# from $FindBin::Bin -> root. |
201
|
|
|
|
|
|
|
# |
202
|
|
|
|
|
|
|
# no libs found is empty list or undef for |
203
|
|
|
|
|
|
|
# scalar. |
204
|
|
|
|
|
|
|
# |
205
|
|
|
|
|
|
|
# passing it back as a list isn't all that |
206
|
|
|
|
|
|
|
# painful for a few paths. |
207
|
|
|
|
|
|
|
|
208
|
|
|
|
|
|
|
wantarray ? @libz : \@libz |
209
|
|
|
|
|
|
|
}; |
210
|
|
|
|
|
|
|
|
211
|
|
|
|
|
|
|
# break out the messy part into a separate block. |
212
|
|
|
|
|
|
|
|
213
|
|
|
|
|
|
|
my $handle_args |
214
|
|
|
|
|
|
|
= sub |
215
|
|
|
|
|
|
|
{ |
216
|
|
|
|
|
|
|
# discard the module, rest are arguments. |
217
|
|
|
|
|
|
|
|
218
|
|
|
|
|
|
|
shift; |
219
|
|
|
|
|
|
|
|
220
|
|
|
|
|
|
|
# anything after the module are options with arguments |
221
|
|
|
|
|
|
|
# assigned via '='. |
222
|
|
|
|
|
|
|
|
223
|
|
|
|
|
|
|
%argz |
224
|
|
|
|
|
|
|
= map |
225
|
|
|
|
|
|
|
{ |
226
|
|
|
|
|
|
|
my $use_undef |
227
|
|
|
|
|
|
|
= do |
228
|
|
|
|
|
|
|
{ |
229
|
|
|
|
|
|
|
my %a = (); |
230
|
|
|
|
|
|
|
@a{ qw( export ignore ) } = (); |
231
|
|
|
|
|
|
|
\%a |
232
|
|
|
|
|
|
|
}; |
233
|
|
|
|
|
|
|
|
234
|
|
|
|
|
|
|
my ( $k, $v ) = split '=', $_, 2; |
235
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
exists $use_undef->{ $k } |
237
|
|
|
|
|
|
|
or $v //= 1; |
238
|
|
|
|
|
|
|
|
239
|
|
|
|
|
|
|
# "no" inverts the sense of the test. |
240
|
|
|
|
|
|
|
|
241
|
|
|
|
|
|
|
$k =~ s{^no}{} |
242
|
|
|
|
|
|
|
and $v = ! $v; |
243
|
|
|
|
|
|
|
|
244
|
|
|
|
|
|
|
( $k => $v ) |
245
|
|
|
|
|
|
|
} |
246
|
|
|
|
|
|
|
@_; |
247
|
|
|
|
|
|
|
|
248
|
|
|
|
|
|
|
# stuff "debug=1" into your arguments and perl -d will stop here. |
249
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
$DB::single = 1 if defined $argz{ debug }; |
251
|
|
|
|
|
|
|
|
252
|
|
|
|
|
|
|
# default if nothing is supplied is to use the result; |
253
|
|
|
|
|
|
|
# otherwise, without use supplied either of export or |
254
|
|
|
|
|
|
|
# p5lib will turn off use. |
255
|
|
|
|
|
|
|
|
256
|
|
|
|
|
|
|
if( exists $argz{ use } ) |
257
|
|
|
|
|
|
|
{ |
258
|
|
|
|
|
|
|
# nothing further to do |
259
|
|
|
|
|
|
|
} |
260
|
|
|
|
|
|
|
elsif( defined $argz{ export } || defined $argz{ p5lib } ) |
261
|
|
|
|
|
|
|
{ |
262
|
|
|
|
|
|
|
$argz{ use } = undef; |
263
|
|
|
|
|
|
|
} |
264
|
|
|
|
|
|
|
else |
265
|
|
|
|
|
|
|
{ |
266
|
|
|
|
|
|
|
$argz{ use } = 1; |
267
|
|
|
|
|
|
|
} |
268
|
|
|
|
|
|
|
|
269
|
|
|
|
|
|
|
local $defaultz{ Bin } |
270
|
|
|
|
|
|
|
= do |
271
|
|
|
|
|
|
|
{ |
272
|
|
|
|
|
|
|
if( my $bin = $argz{ Bin } ) |
273
|
|
|
|
|
|
|
{ |
274
|
|
|
|
|
|
|
-d $bin |
275
|
|
|
|
|
|
|
? $bin |
276
|
|
|
|
|
|
|
: -f $bin |
277
|
|
|
|
|
|
|
? dirname $bin |
278
|
|
|
|
|
|
|
: die "Botched Bin: '$bin' neither file nor dir.\n"; |
279
|
|
|
|
|
|
|
} |
280
|
|
|
|
|
|
|
else |
281
|
|
|
|
|
|
|
{ |
282
|
|
|
|
|
|
|
exists $argz{ realbin } |
283
|
|
|
|
|
|
|
? $FindBin::RealBin |
284
|
|
|
|
|
|
|
: $FindBin::Bin |
285
|
|
|
|
|
|
|
} |
286
|
|
|
|
|
|
|
}; |
287
|
|
|
|
|
|
|
|
288
|
|
|
|
|
|
|
# now apply the defaults, then sanity check the result. |
289
|
|
|
|
|
|
|
# base is a special case since it always has to exist. |
290
|
|
|
|
|
|
|
# |
291
|
|
|
|
|
|
|
# if $argz{ export } is defined but false then it takes |
292
|
|
|
|
|
|
|
# its default from $argz{ base }. |
293
|
|
|
|
|
|
|
|
294
|
|
|
|
|
|
|
while( my($k,$v) = each %defaultz ) |
295
|
|
|
|
|
|
|
{ |
296
|
|
|
|
|
|
|
# //= doesn't work here since undef may be a |
297
|
|
|
|
|
|
|
# legit default. |
298
|
|
|
|
|
|
|
|
299
|
|
|
|
|
|
|
exists $argz{ $k } |
300
|
|
|
|
|
|
|
or |
301
|
|
|
|
|
|
|
$argz{ $k } = $v; |
302
|
|
|
|
|
|
|
} |
303
|
|
|
|
|
|
|
|
304
|
|
|
|
|
|
|
exists $argz{ base } && $argz{ base } |
305
|
|
|
|
|
|
|
or croak "Bogus FindBin::libs: missing/false base argument, should be 'base=NAME'"; |
306
|
|
|
|
|
|
|
|
307
|
|
|
|
|
|
|
exists $argz{ export } |
308
|
|
|
|
|
|
|
and |
309
|
|
|
|
|
|
|
$argz{ export } //= $argz{ base }; |
310
|
|
|
|
|
|
|
|
311
|
|
|
|
|
|
|
$argz{ ignore } = |
312
|
|
|
|
|
|
|
[ |
313
|
|
|
|
|
|
|
grep { $_ } split /\s*,\s*/, $argz{ ignore } |
314
|
|
|
|
|
|
|
]; |
315
|
|
|
|
|
|
|
|
316
|
|
|
|
|
|
|
$verbose = defined $argz{ verbose }; |
317
|
|
|
|
|
|
|
|
318
|
|
|
|
|
|
|
my $base = $argz{ base }; |
319
|
|
|
|
|
|
|
|
320
|
|
|
|
|
|
|
# now locate the libraries. |
321
|
|
|
|
|
|
|
# |
322
|
|
|
|
|
|
|
# %found contains the abs_path results for each directory to |
323
|
|
|
|
|
|
|
# avoid double-including directories. |
324
|
|
|
|
|
|
|
# |
325
|
|
|
|
|
|
|
# note: loop short-curcuts for the (usually) list. |
326
|
|
|
|
|
|
|
|
327
|
|
|
|
|
|
|
%found = (); |
328
|
|
|
|
|
|
|
|
329
|
|
|
|
|
|
|
for( @{ $argz{ ignore } } ) |
330
|
|
|
|
|
|
|
{ |
331
|
|
|
|
|
|
|
if( my $dir = eval { abs_path catdir $_, $base } ) |
332
|
|
|
|
|
|
|
{ |
333
|
|
|
|
|
|
|
if( -d $dir ) |
334
|
|
|
|
|
|
|
{ |
335
|
|
|
|
|
|
|
$found{ $dir } = 1; |
336
|
|
|
|
|
|
|
} |
337
|
|
|
|
|
|
|
} |
338
|
|
|
|
|
|
|
} |
339
|
|
|
|
|
|
|
}; |
340
|
|
|
|
|
|
|
|
341
|
|
|
|
|
|
|
{ |
342
|
|
|
|
|
|
|
&$handle_args; |
343
|
|
|
|
|
|
|
|
344
|
14
|
|
|
14
|
|
14548
|
my @libz = $find_libs->(); |
345
|
|
|
|
|
|
|
|
346
|
14
|
|
|
|
|
40
|
# HAK ALERT: the regex does nothing for security, |
347
|
|
|
|
|
|
|
# just dodges -T. putting this down here instead |
348
|
|
|
|
|
|
|
# of inside find_libs allows people to use saner |
349
|
|
|
|
|
|
|
# untainting plans via find_libs. |
350
|
|
|
|
|
|
|
|
351
|
|
|
|
|
|
|
@libz = map { m{ (.+) }xs } @libz; |
352
|
|
|
|
|
|
|
|
353
|
14
|
|
|
|
|
31
|
my $caller = caller; |
|
14
|
|
|
|
|
81
|
|
354
|
|
|
|
|
|
|
|
355
|
14
|
|
|
|
|
35
|
if( $verbose || defined $argz{ print } ) |
356
|
|
|
|
|
|
|
{ |
357
|
14
|
50
|
33
|
|
|
78
|
local $\ = "\n"; |
358
|
|
|
|
|
|
|
local $, = "\n\t"; |
359
|
14
|
|
|
|
|
118
|
|
360
|
14
|
|
|
|
|
30
|
print STDERR "Found */$argz{ base }:", @libz |
361
|
|
|
|
|
|
|
if $verbose; |
362
|
14
|
50
|
|
|
|
69
|
} |
363
|
|
|
|
|
|
|
|
364
|
|
|
|
|
|
|
if( $argz{ export } ) |
365
|
|
|
|
|
|
|
{ |
366
|
14
|
50
|
|
|
|
51
|
# this has to run in order to install variables that |
367
|
|
|
|
|
|
|
# the caller is expecting to exist at runtime -- even |
368
|
|
|
|
|
|
|
# if they are empty/undef at the end of it. |
369
|
|
|
|
|
|
|
|
370
|
|
|
|
|
|
|
my $ref = qualify_to_ref $argz{ export }, $caller; |
371
|
|
|
|
|
|
|
|
372
|
14
|
|
|
|
|
92
|
if( $verbose ) |
373
|
|
|
|
|
|
|
{ |
374
|
14
|
50
|
|
|
|
577
|
my $dest = qualify $argz{ export }, $caller; |
375
|
|
|
|
|
|
|
|
376
|
0
|
|
|
|
|
0
|
$argz{ scalar } |
377
|
|
|
|
|
|
|
? print STDERR "\nExporting: \$$dest\n" |
378
|
|
|
|
|
|
|
: print STDERR "\nExporting: \@$dest\n" |
379
|
0
|
0
|
|
|
|
0
|
; |
380
|
|
|
|
|
|
|
} |
381
|
|
|
|
|
|
|
|
382
|
|
|
|
|
|
|
if( $argz{ scalar } ) |
383
|
|
|
|
|
|
|
{ |
384
|
14
|
50
|
50
|
|
|
97
|
*$ref |
|
|
50
|
|
|
|
|
|
385
|
|
|
|
|
|
|
= @libz |
386
|
0
|
0
|
|
|
|
0
|
? \$libz[0] |
387
|
|
|
|
|
|
|
: \( my $a = '' ) |
388
|
|
|
|
|
|
|
; |
389
|
|
|
|
|
|
|
} |
390
|
|
|
|
|
|
|
elsif |
391
|
|
|
|
|
|
|
( |
392
|
|
|
|
|
|
|
$argz{ append } |
393
|
|
|
|
|
|
|
and |
394
|
|
|
|
|
|
|
my $ary = *{ $ref }{ ARRAY } |
395
|
|
|
|
|
|
|
) |
396
|
0
|
|
|
|
|
0
|
{ |
397
|
|
|
|
|
|
|
push @$ary, @libz; |
398
|
|
|
|
|
|
|
} |
399
|
0
|
|
|
|
|
0
|
else |
400
|
|
|
|
|
|
|
{ |
401
|
|
|
|
|
|
|
*$ref = \@libz |
402
|
|
|
|
|
|
|
} |
403
|
14
|
|
|
|
|
44
|
} |
404
|
|
|
|
|
|
|
|
405
|
|
|
|
|
|
|
# no 'else', these are not exclusive |
406
|
|
|
|
|
|
|
|
407
|
|
|
|
|
|
|
if( @libz ) |
408
|
|
|
|
|
|
|
{ |
409
|
14
|
100
|
|
|
|
40
|
if( defined $argz{ p5lib } ) |
410
|
|
|
|
|
|
|
{ |
411
|
12
|
50
|
|
|
|
32
|
# stuff the lib's found at the front of $ENV{ PERL5LIB } |
412
|
|
|
|
|
|
|
# yes, virginia, substr is an lvalue -- and saner than |
413
|
|
|
|
|
|
|
# dealing with \Q and a regex on arbitrary paths. |
414
|
|
|
|
|
|
|
|
415
|
|
|
|
|
|
|
( substr $ENV{ PERL5LIB }, 0, 0 ) = join ':', @libz, ''; |
416
|
|
|
|
|
|
|
|
417
|
0
|
|
|
|
|
0
|
print STDERR "\nUpdated PERL5LIB:\t$ENV{ PERL5LIB }\n" |
418
|
|
|
|
|
|
|
if $verbose; |
419
|
0
|
0
|
|
|
|
0
|
} |
420
|
|
|
|
|
|
|
|
421
|
|
|
|
|
|
|
if( $argz{ use } ) |
422
|
|
|
|
|
|
|
{ |
423
|
12
|
100
|
|
|
|
45
|
# this obviously won't work if lib ever depends |
424
|
|
|
|
|
|
|
# on the caller's package. |
425
|
|
|
|
|
|
|
# |
426
|
|
|
|
|
|
|
# it does avoids issues with -T blowing up on the |
427
|
|
|
|
|
|
|
# old eval technique. |
428
|
|
|
|
|
|
|
|
429
|
|
|
|
|
|
|
require lib; |
430
|
|
|
|
|
|
|
|
431
|
7
|
|
|
|
|
4050
|
lib->import( @libz ); |
432
|
|
|
|
|
|
|
} |
433
|
7
|
|
|
|
|
4725
|
} |
434
|
|
|
|
|
|
|
|
435
|
|
|
|
|
|
|
0 |
436
|
|
|
|
|
|
|
} |
437
|
|
|
|
|
|
|
|
438
|
14
|
|
|
|
|
6662
|
# keep require happy |
439
|
|
|
|
|
|
|
|
440
|
|
|
|
|
|
|
1 |
441
|
|
|
|
|
|
|
|
442
|
|
|
|
|
|
|
|
443
|
|
|
|
|
|
|
=head1 NAME |
444
|
|
|
|
|
|
|
|
445
|
|
|
|
|
|
|
FindBin::libs - locate and a 'use lib' or export |
446
|
|
|
|
|
|
|
directories based on $FindBin::Bin. |
447
|
|
|
|
|
|
|
|
448
|
|
|
|
|
|
|
=head1 SYNOPSIS |
449
|
|
|
|
|
|
|
|
450
|
|
|
|
|
|
|
# search up $FindBin::Bin looking for ./lib directories |
451
|
|
|
|
|
|
|
# and "use lib" them. |
452
|
|
|
|
|
|
|
|
453
|
|
|
|
|
|
|
use FindBin::libs; |
454
|
|
|
|
|
|
|
|
455
|
|
|
|
|
|
|
# same as above with explicit defaults. |
456
|
|
|
|
|
|
|
|
457
|
|
|
|
|
|
|
use FindBin::libs qw( base=lib use=1 noexport noprint ); |
458
|
|
|
|
|
|
|
|
459
|
|
|
|
|
|
|
# print the lib dir's before using them. |
460
|
|
|
|
|
|
|
|
461
|
|
|
|
|
|
|
use FindBin::libs qw( print ); |
462
|
|
|
|
|
|
|
|
463
|
|
|
|
|
|
|
# find and use lib "altlib" dir's |
464
|
|
|
|
|
|
|
|
465
|
|
|
|
|
|
|
use FindBin::libs qw( base=altlib ); |
466
|
|
|
|
|
|
|
|
467
|
|
|
|
|
|
|
# move starting point from $FindBin::Bin to '/tmp' |
468
|
|
|
|
|
|
|
|
469
|
|
|
|
|
|
|
use FindBin::libs qw( Bin=/tmp base=altlib ); |
470
|
|
|
|
|
|
|
|
471
|
|
|
|
|
|
|
# if Bin is a file then it's dirname will be used. |
472
|
|
|
|
|
|
|
# useful for ./t files living above files being |
473
|
|
|
|
|
|
|
# tested. __FILE__ is a token, doesn't work with |
474
|
|
|
|
|
|
|
# qw(). |
475
|
|
|
|
|
|
|
|
476
|
|
|
|
|
|
|
use FindBin::libs ( 'Bin=' . __FILE__ ); |
477
|
|
|
|
|
|
|
use FindBin::libs ( 'Bin=' . __FILE__, 'base=config' ); |
478
|
|
|
|
|
|
|
|
479
|
|
|
|
|
|
|
# skip "use lib", export "@altlib" instead. |
480
|
|
|
|
|
|
|
|
481
|
|
|
|
|
|
|
use FindBin::libs qw( base=altlib export ); |
482
|
|
|
|
|
|
|
|
483
|
|
|
|
|
|
|
# find altlib directories, use lib them and export @mylibs |
484
|
|
|
|
|
|
|
|
485
|
|
|
|
|
|
|
use FindBin::libs qw( base=altlib export=mylibs use ); |
486
|
|
|
|
|
|
|
|
487
|
|
|
|
|
|
|
# "export" defaults to "nouse", these two are identical: |
488
|
|
|
|
|
|
|
|
489
|
|
|
|
|
|
|
use FindBin::libs qw( export nouse ); |
490
|
|
|
|
|
|
|
use FindBin::libs qw( export ); |
491
|
|
|
|
|
|
|
|
492
|
|
|
|
|
|
|
# use and export are not exclusive: |
493
|
|
|
|
|
|
|
|
494
|
|
|
|
|
|
|
use FindBin::libs qw( use export ); # do both |
495
|
|
|
|
|
|
|
use FindBin::libs qw( nouse noexport print ); # print only |
496
|
|
|
|
|
|
|
use FindBin::libs qw( nouse noexport ); # do nothting at all |
497
|
|
|
|
|
|
|
|
498
|
|
|
|
|
|
|
# print a few interesting messages about the |
499
|
|
|
|
|
|
|
# items found. |
500
|
|
|
|
|
|
|
|
501
|
|
|
|
|
|
|
use FindBinlibs qw( verbose ); |
502
|
|
|
|
|
|
|
|
503
|
|
|
|
|
|
|
# turn on a breakpoint after the args are prcoessed, before |
504
|
|
|
|
|
|
|
# any search/export/use lib is handled. |
505
|
|
|
|
|
|
|
|
506
|
|
|
|
|
|
|
use FindBin::libs qw( debug ); |
507
|
|
|
|
|
|
|
|
508
|
|
|
|
|
|
|
# prefix PERL5LIB with the lib's found. |
509
|
|
|
|
|
|
|
|
510
|
|
|
|
|
|
|
use FindBin::libs qw( perl5lib ); |
511
|
|
|
|
|
|
|
|
512
|
|
|
|
|
|
|
# find a subdir of the lib's looked for. |
513
|
|
|
|
|
|
|
# the first example will use both ../lib and |
514
|
|
|
|
|
|
|
# ../lib/perl5; the second ../lib/perl5/frobnicate |
515
|
|
|
|
|
|
|
# (if they exist). it can also be used with export |
516
|
|
|
|
|
|
|
# and base to locate special configuration dir's. |
517
|
|
|
|
|
|
|
# |
518
|
|
|
|
|
|
|
# subonly with a base is useful for locating config |
519
|
|
|
|
|
|
|
# files. this finds any "./config/mypackage" dir's |
520
|
|
|
|
|
|
|
# without including any ./config dir's. the result |
521
|
|
|
|
|
|
|
# ends up in @config (see also "export=", above). |
522
|
|
|
|
|
|
|
|
523
|
|
|
|
|
|
|
use FindBin::libs qw( subdir=perl5 ); |
524
|
|
|
|
|
|
|
|
525
|
|
|
|
|
|
|
use FindBin::libs qw( subdir=perl5/frobnicate ); |
526
|
|
|
|
|
|
|
|
527
|
|
|
|
|
|
|
use FindBin::libs qw( base=config subdir=mypackage subonly export ); |
528
|
|
|
|
|
|
|
|
529
|
|
|
|
|
|
|
# base and subonly are also useful if your |
530
|
|
|
|
|
|
|
# project is stored in multiple git |
531
|
|
|
|
|
|
|
# repositories. |
532
|
|
|
|
|
|
|
# |
533
|
|
|
|
|
|
|
# say you need libs under api_foo/lib from api_bar: a |
534
|
|
|
|
|
|
|
# base of the git repository directory with subdir of |
535
|
|
|
|
|
|
|
# lib and subonly will pull in those lib dirs. |
536
|
|
|
|
|
|
|
|
537
|
|
|
|
|
|
|
use FindBin::libs qw( base=api_foo subdir=lib subonly ); |
538
|
|
|
|
|
|
|
|
539
|
|
|
|
|
|
|
# no harm in using this multiple times to use |
540
|
|
|
|
|
|
|
# or export multple layers of libs. |
541
|
|
|
|
|
|
|
|
542
|
|
|
|
|
|
|
use FindBin::libs qw( export ); |
543
|
|
|
|
|
|
|
use FindBin::libs qw( export=found base=lib ); |
544
|
|
|
|
|
|
|
use FindBin::libs qw( export=binz base=bin ignore=/foo,/bar ); |
545
|
|
|
|
|
|
|
use FindBin::libs qw( export=junk base=frobnicatorium ); |
546
|
|
|
|
|
|
|
use FindBin::libs qw( export base=foobar ); |
547
|
|
|
|
|
|
|
|
548
|
|
|
|
|
|
|
=head1 DESCRIPTION |
549
|
|
|
|
|
|
|
|
550
|
|
|
|
|
|
|
=head2 General Use |
551
|
|
|
|
|
|
|
|
552
|
|
|
|
|
|
|
This module will locate directories along the path to $FindBin::Bin |
553
|
|
|
|
|
|
|
and "use lib" or export an array of the directories found. The default |
554
|
|
|
|
|
|
|
is to locate "lib" directories and "use lib" them without printing |
555
|
|
|
|
|
|
|
the list. |
556
|
|
|
|
|
|
|
|
557
|
|
|
|
|
|
|
Options controll whether the lib's found are exported into the caller's |
558
|
|
|
|
|
|
|
space, exported to PERL5LIB, or printed. Exporting or setting perl5lib |
559
|
|
|
|
|
|
|
will turn off the default of "use lib" so that: |
560
|
|
|
|
|
|
|
|
561
|
|
|
|
|
|
|
use FindBin::libs qw( export ); |
562
|
|
|
|
|
|
|
use FindBin::libs qw( p5lib ); |
563
|
|
|
|
|
|
|
|
564
|
|
|
|
|
|
|
are equivalent to |
565
|
|
|
|
|
|
|
|
566
|
|
|
|
|
|
|
use FindBin::libs qw( export nouse ); |
567
|
|
|
|
|
|
|
use FindBin::libs qw( p5lib nouse ); |
568
|
|
|
|
|
|
|
|
569
|
|
|
|
|
|
|
Combining export with use or p5lib may be useful, p5lib and |
570
|
|
|
|
|
|
|
use are probably not all that useful together. |
571
|
|
|
|
|
|
|
|
572
|
|
|
|
|
|
|
=head3 Alternate directory name: 'base' |
573
|
|
|
|
|
|
|
|
574
|
|
|
|
|
|
|
The basename searched for can be changed via 'base=name' so |
575
|
|
|
|
|
|
|
that |
576
|
|
|
|
|
|
|
|
577
|
|
|
|
|
|
|
use FindBin::libs qw( base=altlib ); |
578
|
|
|
|
|
|
|
|
579
|
|
|
|
|
|
|
will search for directories named "altlib" and "use lib" them. |
580
|
|
|
|
|
|
|
|
581
|
|
|
|
|
|
|
=head3 Exporting a variable: "export", "scalar", "append" |
582
|
|
|
|
|
|
|
|
583
|
|
|
|
|
|
|
=over 4 |
584
|
|
|
|
|
|
|
|
585
|
|
|
|
|
|
|
=item "export" |
586
|
|
|
|
|
|
|
|
587
|
|
|
|
|
|
|
This installs the results of locating directories into the caller's |
588
|
|
|
|
|
|
|
space. Without any argument, export pushes out a variable named after |
589
|
|
|
|
|
|
|
the located [sub]dir; an argument can be supplied to give the variable |
590
|
|
|
|
|
|
|
name. Without the "scalar" option, the exported variable will be an |
591
|
|
|
|
|
|
|
array in increasing order of "distance" (i.e., "up" the file tree); |
592
|
|
|
|
|
|
|
with the "scalar" option only the first (i.e., "nearest") path is |
593
|
|
|
|
|
|
|
exported. |
594
|
|
|
|
|
|
|
|
595
|
|
|
|
|
|
|
If "export" is given then "nouse" is assumed; using both leaves the |
596
|
|
|
|
|
|
|
variable exported and its contents handed to "use lib". |
597
|
|
|
|
|
|
|
|
598
|
|
|
|
|
|
|
For example: |
599
|
|
|
|
|
|
|
|
600
|
|
|
|
|
|
|
use FindBin::libs qw( export ); |
601
|
|
|
|
|
|
|
|
602
|
|
|
|
|
|
|
will find "lib" directories and export @lib with the |
603
|
|
|
|
|
|
|
list of directories found. |
604
|
|
|
|
|
|
|
|
605
|
|
|
|
|
|
|
use FindBin::libs qw( export=mylibs ); |
606
|
|
|
|
|
|
|
|
607
|
|
|
|
|
|
|
will find "lib" directories and export them as "@mylibs" to |
608
|
|
|
|
|
|
|
the caller. |
609
|
|
|
|
|
|
|
|
610
|
|
|
|
|
|
|
If "export" only is given then the "use" option defaults to |
611
|
|
|
|
|
|
|
false. So: |
612
|
|
|
|
|
|
|
|
613
|
|
|
|
|
|
|
use FindBin::libs qw( export ); |
614
|
|
|
|
|
|
|
use FindBin::libs qw( export nouse ); |
615
|
|
|
|
|
|
|
|
616
|
|
|
|
|
|
|
are equivalent. This is mainly for use when looking for data |
617
|
|
|
|
|
|
|
directories with the "base=" argument. |
618
|
|
|
|
|
|
|
|
619
|
|
|
|
|
|
|
If base is used with export the default array name is the base |
620
|
|
|
|
|
|
|
directory value: |
621
|
|
|
|
|
|
|
|
622
|
|
|
|
|
|
|
use FindBin::libs qw( export base=meta ); |
623
|
|
|
|
|
|
|
|
624
|
|
|
|
|
|
|
exports @meta while |
625
|
|
|
|
|
|
|
|
626
|
|
|
|
|
|
|
use FindBin::libs qw( export=metadirs base=meta ); |
627
|
|
|
|
|
|
|
|
628
|
|
|
|
|
|
|
exports @metadirs as a list of paths ending in "/meta". |
629
|
|
|
|
|
|
|
|
630
|
|
|
|
|
|
|
The use and export switches are not exclusive: |
631
|
|
|
|
|
|
|
|
632
|
|
|
|
|
|
|
use FindBin::libs qw( use export=mylibs ); |
633
|
|
|
|
|
|
|
|
634
|
|
|
|
|
|
|
will locate "lib" directories, use lib them, and export |
635
|
|
|
|
|
|
|
@mylibs into the caller's package. |
636
|
|
|
|
|
|
|
|
637
|
|
|
|
|
|
|
=item "scalar" |
638
|
|
|
|
|
|
|
|
639
|
|
|
|
|
|
|
Only searches for the first directory, which is exported (or |
640
|
|
|
|
|
|
|
overwritten) as a scalar rather than array. For example, if |
641
|
|
|
|
|
|
|
a project directory has ./bin and ./etc dir's then #! code in |
642
|
|
|
|
|
|
|
bin with |
643
|
|
|
|
|
|
|
|
644
|
|
|
|
|
|
|
use FindBin::libs qw( export scalar base=etc ); |
645
|
|
|
|
|
|
|
|
646
|
|
|
|
|
|
|
will have an $etc variable with the absolute path to ./bin/../etc. |
647
|
|
|
|
|
|
|
For configuration varibles this is usually what you want and allows |
648
|
|
|
|
|
|
|
for "$etc/Foo.conf" rather than "$etc[0]/Foo.conf". |
649
|
|
|
|
|
|
|
|
650
|
|
|
|
|
|
|
=item "append" |
651
|
|
|
|
|
|
|
|
652
|
|
|
|
|
|
|
Sometimes it's simpler to accumulate multiple searches into a |
653
|
|
|
|
|
|
|
single array. Say for ./etc dir's in collection of standard |
654
|
|
|
|
|
|
|
locations. |
655
|
|
|
|
|
|
|
|
656
|
|
|
|
|
|
|
In that case: |
657
|
|
|
|
|
|
|
|
658
|
|
|
|
|
|
|
use FindBin::libs qw( export=etc base=foo subdir=etc ); |
659
|
|
|
|
|
|
|
use FindBin::libs qw( export=etc base=bar subdir=etc append ); |
660
|
|
|
|
|
|
|
|
661
|
|
|
|
|
|
|
produces something like |
662
|
|
|
|
|
|
|
|
663
|
|
|
|
|
|
|
( |
664
|
|
|
|
|
|
|
/path/to/foo/etc |
665
|
|
|
|
|
|
|
/path/to/bar/etc |
666
|
|
|
|
|
|
|
) |
667
|
|
|
|
|
|
|
|
668
|
|
|
|
|
|
|
without append @etc will have only ./bar/etc since the array would |
669
|
|
|
|
|
|
|
be overwritten with each call to import. |
670
|
|
|
|
|
|
|
|
671
|
|
|
|
|
|
|
=back |
672
|
|
|
|
|
|
|
|
673
|
|
|
|
|
|
|
=head3 Subdirectories |
674
|
|
|
|
|
|
|
|
675
|
|
|
|
|
|
|
The "subdir" and "subonly" settings will add or |
676
|
|
|
|
|
|
|
exclusively use subdir's. This is useful if some |
677
|
|
|
|
|
|
|
of your lib's are in ../lib/perl5 along with |
678
|
|
|
|
|
|
|
../lib or all of the lib's are in ../lib/perl5. |
679
|
|
|
|
|
|
|
|
680
|
|
|
|
|
|
|
These could be handled with: |
681
|
|
|
|
|
|
|
|
682
|
|
|
|
|
|
|
use FindBin::libs; |
683
|
|
|
|
|
|
|
use FindBin::libs qw( subdir=perl5 subonly ); |
684
|
|
|
|
|
|
|
|
685
|
|
|
|
|
|
|
which uses the "lib" dir's along with any lib/perl5 dirs. |
686
|
|
|
|
|
|
|
|
687
|
|
|
|
|
|
|
This can also be handy for locating subdir's used |
688
|
|
|
|
|
|
|
for configuring packages: |
689
|
|
|
|
|
|
|
|
690
|
|
|
|
|
|
|
use FindBin::libs qw( export base=config subonly=mypackage ); |
691
|
|
|
|
|
|
|
|
692
|
|
|
|
|
|
|
Will leave @config containing any mypackage dir's found up |
693
|
|
|
|
|
|
|
the tree, nearest to closest. |
694
|
|
|
|
|
|
|
|
695
|
|
|
|
|
|
|
The array format is convienent for locating configuration files |
696
|
|
|
|
|
|
|
shared between projects in separate, sibling directories. For |
697
|
|
|
|
|
|
|
example given: |
698
|
|
|
|
|
|
|
|
699
|
|
|
|
|
|
|
./proj/Foo/etc |
700
|
|
|
|
|
|
|
./proj/etc |
701
|
|
|
|
|
|
|
|
702
|
|
|
|
|
|
|
with |
703
|
|
|
|
|
|
|
|
704
|
|
|
|
|
|
|
use FindBin::libs qw( export subdir=etc subonly ) |
705
|
|
|
|
|
|
|
|
706
|
|
|
|
|
|
|
will export @etc with qw( ../proj/Foo/etc ../proj/etc ) in lexical |
707
|
|
|
|
|
|
|
order by distance from the #! code. At that point |
708
|
|
|
|
|
|
|
|
709
|
|
|
|
|
|
|
use List::Util qw( first ); |
710
|
|
|
|
|
|
|
|
711
|
|
|
|
|
|
|
my $path = first { -e "$_/Global.config" } @etc; |
712
|
|
|
|
|
|
|
|
713
|
|
|
|
|
|
|
will locate the nearest "Global.confg" file. Note that this is |
714
|
|
|
|
|
|
|
not the same as using "scalar" since that will export |
715
|
|
|
|
|
|
|
$etc with only ./Foo/etc. |
716
|
|
|
|
|
|
|
|
717
|
|
|
|
|
|
|
=head3 Setting PERL5LIB: p5lib |
718
|
|
|
|
|
|
|
|
719
|
|
|
|
|
|
|
For cases where the environment is more useful for setting |
720
|
|
|
|
|
|
|
up library paths "p5lib" can be used to preload this variable. |
721
|
|
|
|
|
|
|
This is mainly useful for automatically including directories |
722
|
|
|
|
|
|
|
outside of the parent tree of $FindBin::bin. |
723
|
|
|
|
|
|
|
|
724
|
|
|
|
|
|
|
For example, using: |
725
|
|
|
|
|
|
|
|
726
|
|
|
|
|
|
|
$ export PERL5LIB="/usr/local/foo:/usr/local/bar"; |
727
|
|
|
|
|
|
|
|
728
|
|
|
|
|
|
|
$ myprog; |
729
|
|
|
|
|
|
|
|
730
|
|
|
|
|
|
|
or simply |
731
|
|
|
|
|
|
|
|
732
|
|
|
|
|
|
|
$ PERL5LIB="/usr/local/lib/foo:/usr/lib/bar" myprog; |
733
|
|
|
|
|
|
|
|
734
|
|
|
|
|
|
|
(depending on your shell) with #! code including: |
735
|
|
|
|
|
|
|
|
736
|
|
|
|
|
|
|
use FindBin::libs qw( p5lib ); |
737
|
|
|
|
|
|
|
|
738
|
|
|
|
|
|
|
will not "use lib" any dir's found but will update PERL5LIB |
739
|
|
|
|
|
|
|
to something like: |
740
|
|
|
|
|
|
|
|
741
|
|
|
|
|
|
|
/home/me/sandbox/branches/lib:/usr/local/lib/foo:/usr/lib/bar |
742
|
|
|
|
|
|
|
|
743
|
|
|
|
|
|
|
This can make controlling the paths used simpler and avoid |
744
|
|
|
|
|
|
|
the use of symlinks for some testing (see examples below). |
745
|
|
|
|
|
|
|
|
746
|
|
|
|
|
|
|
=head2 Skipping directories |
747
|
|
|
|
|
|
|
|
748
|
|
|
|
|
|
|
By default, lib directories under / and /usr are |
749
|
|
|
|
|
|
|
sliently ignored. This normally means that /lib, /usr/lib, and |
750
|
|
|
|
|
|
|
'/usr/local/lib' are skipped. The "ignore" parameter provides |
751
|
|
|
|
|
|
|
a comma-separated list of directories to ignore: |
752
|
|
|
|
|
|
|
|
753
|
|
|
|
|
|
|
use FindBin::libs qw( ignore=/skip/this,/and/this/also ); |
754
|
|
|
|
|
|
|
|
755
|
|
|
|
|
|
|
will replace the standard list and thus skip "/skip/this/lib" |
756
|
|
|
|
|
|
|
and "/and/this/also/lib". It will search "/lib" and "/usr/lib" |
757
|
|
|
|
|
|
|
since the argument ignore list replaces the original one. |
758
|
|
|
|
|
|
|
|
759
|
|
|
|
|
|
|
=head2 Homegrown Library Management |
760
|
|
|
|
|
|
|
|
761
|
|
|
|
|
|
|
An all-too-common occurrance managing perly projects is |
762
|
|
|
|
|
|
|
being unable to install new modules becuse "it might |
763
|
|
|
|
|
|
|
break things", and being unable to test them because |
764
|
|
|
|
|
|
|
you can't install them. The usual outcome of this is a |
765
|
|
|
|
|
|
|
collection of hard-coded |
766
|
|
|
|
|
|
|
|
767
|
|
|
|
|
|
|
use lib qw( /usr/local/projectX ... ) |
768
|
|
|
|
|
|
|
|
769
|
|
|
|
|
|
|
code at the top of each #! file that has to be updated by |
770
|
|
|
|
|
|
|
hand for each new project. |
771
|
|
|
|
|
|
|
|
772
|
|
|
|
|
|
|
To get away from this you'll often see relative paths |
773
|
|
|
|
|
|
|
for the lib's, which require running the code from one |
774
|
|
|
|
|
|
|
specific place. All this does is push the hard-coding |
775
|
|
|
|
|
|
|
into cron, shell wrappers, and begin blocks. |
776
|
|
|
|
|
|
|
|
777
|
|
|
|
|
|
|
With FindBin::libs you need suffer no more. |
778
|
|
|
|
|
|
|
|
779
|
|
|
|
|
|
|
Automatically finding libraries in and above the executable |
780
|
|
|
|
|
|
|
means you can put your modules into cvs/svn and check them |
781
|
|
|
|
|
|
|
out with the project, have multiple copies shared by developers, |
782
|
|
|
|
|
|
|
or easily move a module up the directory tree in a testbed |
783
|
|
|
|
|
|
|
to regression test the module with existing code. All without |
784
|
|
|
|
|
|
|
having to modify a single line of code. |
785
|
|
|
|
|
|
|
|
786
|
|
|
|
|
|
|
=over 4 |
787
|
|
|
|
|
|
|
|
788
|
|
|
|
|
|
|
=item Code-speicfic modules. |
789
|
|
|
|
|
|
|
|
790
|
|
|
|
|
|
|
Say your sandbox is in ./sandbox and you are currently |
791
|
|
|
|
|
|
|
working in ./sandbox/projects/package/bin on a perl |
792
|
|
|
|
|
|
|
executable. You may have some number of modules that |
793
|
|
|
|
|
|
|
are specific -- or customized -- for this pacakge, |
794
|
|
|
|
|
|
|
share some modules within the project, and may want |
795
|
|
|
|
|
|
|
to use company-wide modules that are managed out of |
796
|
|
|
|
|
|
|
./sandbox in development. All of this lives under a |
797
|
|
|
|
|
|
|
./qc tree on the test boxes and under ./production |
798
|
|
|
|
|
|
|
on production servers. |
799
|
|
|
|
|
|
|
|
800
|
|
|
|
|
|
|
For simplicity, say that your sandbox lives in your |
801
|
|
|
|
|
|
|
home direcotry, /home/jowbloe, as a directory or a |
802
|
|
|
|
|
|
|
symlink. |
803
|
|
|
|
|
|
|
|
804
|
|
|
|
|
|
|
If your #! uses FindBin::libs in it then it will |
805
|
|
|
|
|
|
|
effectively |
806
|
|
|
|
|
|
|
|
807
|
|
|
|
|
|
|
use lib |
808
|
|
|
|
|
|
|
qw( |
809
|
|
|
|
|
|
|
/home/jowbloe/sandbox/lib |
810
|
|
|
|
|
|
|
/home/jowbloe/sandbox/project/lib |
811
|
|
|
|
|
|
|
/home/jowbloe/sandbox/project/package/lib |
812
|
|
|
|
|
|
|
); |
813
|
|
|
|
|
|
|
|
814
|
|
|
|
|
|
|
if you run /home/jowbloe/sandbox/project/package/bin/foobar. |
815
|
|
|
|
|
|
|
This will happen the same way if you use a relative or |
816
|
|
|
|
|
|
|
absolute path, perl -d the thing, or if any of the lib |
817
|
|
|
|
|
|
|
directories are symlinks outside of your sandbox. |
818
|
|
|
|
|
|
|
|
819
|
|
|
|
|
|
|
This means that the most specific module directories |
820
|
|
|
|
|
|
|
("closest" to your executable) will be picked up first. |
821
|
|
|
|
|
|
|
|
822
|
|
|
|
|
|
|
If you have a version of Frobnicate.pm in your ./package/lib |
823
|
|
|
|
|
|
|
for modifications fine: you'll use it before the one in |
824
|
|
|
|
|
|
|
./project or ./sandbox. |
825
|
|
|
|
|
|
|
|
826
|
|
|
|
|
|
|
Using the "p5lib" argument can help in case where some of |
827
|
|
|
|
|
|
|
the code lives outside of the sandbox. To test a sandbox |
828
|
|
|
|
|
|
|
version of some other module: |
829
|
|
|
|
|
|
|
|
830
|
|
|
|
|
|
|
use FindBin::libs qw( p5lib ); |
831
|
|
|
|
|
|
|
|
832
|
|
|
|
|
|
|
and |
833
|
|
|
|
|
|
|
|
834
|
|
|
|
|
|
|
$ PERL5LIB=/other/sandbox/module foobar; |
835
|
|
|
|
|
|
|
|
836
|
|
|
|
|
|
|
=item Regression Testing |
837
|
|
|
|
|
|
|
|
838
|
|
|
|
|
|
|
Everntually, however, you'll need to regression test |
839
|
|
|
|
|
|
|
Frobnicate.pm with other modules. |
840
|
|
|
|
|
|
|
|
841
|
|
|
|
|
|
|
Fine: move, copy, or symlink it into ./project/lib and |
842
|
|
|
|
|
|
|
you can merrily run ./project/*/bin/* with it and see |
843
|
|
|
|
|
|
|
if there are any problems. In fact, so can the nice |
844
|
|
|
|
|
|
|
folks in QC. |
845
|
|
|
|
|
|
|
|
846
|
|
|
|
|
|
|
If you want to install and test a new module just |
847
|
|
|
|
|
|
|
prefix it into, say, ./sandbox/lib and all the code |
848
|
|
|
|
|
|
|
that has FindBin::libs will simply use it first. |
849
|
|
|
|
|
|
|
|
850
|
|
|
|
|
|
|
=item Testing with Symlinks |
851
|
|
|
|
|
|
|
|
852
|
|
|
|
|
|
|
$FindBin::Bin is relative to where an executable is started from. |
853
|
|
|
|
|
|
|
This allows a symlink to change the location of directories used |
854
|
|
|
|
|
|
|
by FindBin::libs. Full regression testing of an executable can be |
855
|
|
|
|
|
|
|
accomplished with a symlink: |
856
|
|
|
|
|
|
|
|
857
|
|
|
|
|
|
|
./sandbox |
858
|
|
|
|
|
|
|
./lib -> /homegrown/dir/lib |
859
|
|
|
|
|
|
|
./lib/What/Ever.pm |
860
|
|
|
|
|
|
|
|
861
|
|
|
|
|
|
|
./pre-change |
862
|
|
|
|
|
|
|
./bin/foobar |
863
|
|
|
|
|
|
|
|
864
|
|
|
|
|
|
|
./post-change |
865
|
|
|
|
|
|
|
./lib/What/Ever.pm |
866
|
|
|
|
|
|
|
./bin/foobar -> ../../pre-last-change/bin/foobar |
867
|
|
|
|
|
|
|
|
868
|
|
|
|
|
|
|
Running foobar symlinked into the post-change directory will |
869
|
|
|
|
|
|
|
test it with whatever collection of modules is in the post-change |
870
|
|
|
|
|
|
|
directory. A large regression test on some collection of |
871
|
|
|
|
|
|
|
changed modules can be performed with a few symlinks into a |
872
|
|
|
|
|
|
|
sandbox area. |
873
|
|
|
|
|
|
|
|
874
|
|
|
|
|
|
|
=item Managing Configuration and Meta-data Files |
875
|
|
|
|
|
|
|
|
876
|
|
|
|
|
|
|
The "base" option alters FindBin::libs standard base directory. |
877
|
|
|
|
|
|
|
This allows for a heirarchical set of metadata directories: |
878
|
|
|
|
|
|
|
|
879
|
|
|
|
|
|
|
./sandbox |
880
|
|
|
|
|
|
|
./meta |
881
|
|
|
|
|
|
|
./project/ |
882
|
|
|
|
|
|
|
./meta |
883
|
|
|
|
|
|
|
|
884
|
|
|
|
|
|
|
./project/package |
885
|
|
|
|
|
|
|
./bin |
886
|
|
|
|
|
|
|
./meta |
887
|
|
|
|
|
|
|
|
888
|
|
|
|
|
|
|
with |
889
|
|
|
|
|
|
|
|
890
|
|
|
|
|
|
|
use FindBin::libs qw( base=meta export ); |
891
|
|
|
|
|
|
|
|
892
|
|
|
|
|
|
|
sub read_meta |
893
|
|
|
|
|
|
|
{ |
894
|
|
|
|
|
|
|
my $base = shift; |
895
|
|
|
|
|
|
|
|
896
|
|
|
|
|
|
|
for my $dir ( @meta ) |
897
|
|
|
|
|
|
|
{ |
898
|
|
|
|
|
|
|
# open the first one and return |
899
|
|
|
|
|
|
|
... |
900
|
|
|
|
|
|
|
} |
901
|
|
|
|
|
|
|
|
902
|
|
|
|
|
|
|
# caller gets back empty list if nothing was read. |
903
|
|
|
|
|
|
|
|
904
|
|
|
|
|
|
|
() |
905
|
|
|
|
|
|
|
} |
906
|
|
|
|
|
|
|
|
907
|
|
|
|
|
|
|
=item using "prove" with local modules. |
908
|
|
|
|
|
|
|
|
909
|
|
|
|
|
|
|
Modules that are not intended for CPAN will not usually have |
910
|
|
|
|
|
|
|
a Makefile.PL or Build setup. This makes it harder to check |
911
|
|
|
|
|
|
|
the code via "make test". Instead of hacking a one-time |
912
|
|
|
|
|
|
|
Makefile, FindBin::libs can be used to locate modules in |
913
|
|
|
|
|
|
|
a "lib" directory adjacent to the "t: directory. The setup |
914
|
|
|
|
|
|
|
for this module would look like: |
915
|
|
|
|
|
|
|
|
916
|
|
|
|
|
|
|
|
917
|
|
|
|
|
|
|
./t/01.t |
918
|
|
|
|
|
|
|
./t/02.t |
919
|
|
|
|
|
|
|
... |
920
|
|
|
|
|
|
|
|
921
|
|
|
|
|
|
|
./lib/FindBin/libs.pm |
922
|
|
|
|
|
|
|
|
923
|
|
|
|
|
|
|
since the *.t files use FindBin::libs they can locate the |
924
|
|
|
|
|
|
|
most recent version of code without it having to be copied |
925
|
|
|
|
|
|
|
into a ./blib directory (usually via make) before being |
926
|
|
|
|
|
|
|
processed. If the module did not have a Makefile this would |
927
|
|
|
|
|
|
|
allow: |
928
|
|
|
|
|
|
|
|
929
|
|
|
|
|
|
|
prove t/*.t; |
930
|
|
|
|
|
|
|
|
931
|
|
|
|
|
|
|
to check the code. |
932
|
|
|
|
|
|
|
|
933
|
|
|
|
|
|
|
=back |
934
|
|
|
|
|
|
|
|
935
|
|
|
|
|
|
|
=head1 Notes |
936
|
|
|
|
|
|
|
|
937
|
|
|
|
|
|
|
=head2 Alternatives |
938
|
|
|
|
|
|
|
|
939
|
|
|
|
|
|
|
FindBin::libs was developed to avoid pitfalls with |
940
|
|
|
|
|
|
|
the items listed below. As of FindBin::libs-1.20, |
941
|
|
|
|
|
|
|
this is also mutli-platform, where other techniques |
942
|
|
|
|
|
|
|
may be limited to *NIX or at least less portable. |
943
|
|
|
|
|
|
|
|
944
|
|
|
|
|
|
|
=over 4 |
945
|
|
|
|
|
|
|
|
946
|
|
|
|
|
|
|
=item PERL5LIBS |
947
|
|
|
|
|
|
|
|
948
|
|
|
|
|
|
|
PERL5LIB can be used to accomplish the same directory |
949
|
|
|
|
|
|
|
lookups as FindBin::libs. The problem is PERL5LIB often |
950
|
|
|
|
|
|
|
contains absolte paths and does not automatically change |
951
|
|
|
|
|
|
|
depending on where tests are run. This can leave you |
952
|
|
|
|
|
|
|
modifying a file, changing directory to see if it works |
953
|
|
|
|
|
|
|
with some other code and testing an unmodified version of |
954
|
|
|
|
|
|
|
the code via PERL5LIB. FindBin::libs avoids this by using |
955
|
|
|
|
|
|
|
$FindBin::bin to reference where the code is running from. |
956
|
|
|
|
|
|
|
|
957
|
|
|
|
|
|
|
The same is true of trying to use almost any environmental |
958
|
|
|
|
|
|
|
solution, with Perl's built in mechanism or one based on |
959
|
|
|
|
|
|
|
$ENV{ PWD } or qx( pwd ). |
960
|
|
|
|
|
|
|
|
961
|
|
|
|
|
|
|
Aside: Combining an existing PERL5LIB for |
962
|
|
|
|
|
|
|
out-of-tree lookups with the "p5lib" option |
963
|
|
|
|
|
|
|
works well for most development situations. |
964
|
|
|
|
|
|
|
|
965
|
|
|
|
|
|
|
=item use lib qw( ../../../../Lib ); |
966
|
|
|
|
|
|
|
|
967
|
|
|
|
|
|
|
This works, but how many dots do you need to get all |
968
|
|
|
|
|
|
|
the working lib's into a module or #! code? Class |
969
|
|
|
|
|
|
|
distrubuted among several levels subdirectories may |
970
|
|
|
|
|
|
|
have qw( ../../../lib ) vs. qw( ../../../../lib ) |
971
|
|
|
|
|
|
|
or various combinations of them. Validating these by |
972
|
|
|
|
|
|
|
hand (let alone correcting them) leaves me crosseyed |
973
|
|
|
|
|
|
|
after only a short session. |
974
|
|
|
|
|
|
|
|
975
|
|
|
|
|
|
|
=item Anchor on a fixed lib directory. |
976
|
|
|
|
|
|
|
|
977
|
|
|
|
|
|
|
Given a standard directory, it is possible to use |
978
|
|
|
|
|
|
|
something like: |
979
|
|
|
|
|
|
|
|
980
|
|
|
|
|
|
|
BEGIN |
981
|
|
|
|
|
|
|
{ |
982
|
|
|
|
|
|
|
my ( $libdir ) = $0 =~ m{ ^( .+? )/SOMEDIR/ }x; |
983
|
|
|
|
|
|
|
|
984
|
|
|
|
|
|
|
eval "use lib qw( $libdir )"; |
985
|
|
|
|
|
|
|
} |
986
|
|
|
|
|
|
|
|
987
|
|
|
|
|
|
|
This looks for a standard location (e.g., /path/to/Mylib) |
988
|
|
|
|
|
|
|
in the executable path (or cwd) and uses that. |
989
|
|
|
|
|
|
|
|
990
|
|
|
|
|
|
|
The main problem here is that if the anchor ever changes |
991
|
|
|
|
|
|
|
(e.g., when moving code between projects or relocating |
992
|
|
|
|
|
|
|
directories now that SVN supports it) the path often has |
993
|
|
|
|
|
|
|
to change in multiple files. The regex also may have to |
994
|
|
|
|
|
|
|
support multiple platforms, or be broken into more complicated |
995
|
|
|
|
|
|
|
File::Spec code that probably looks pretty much like what |
996
|
|
|
|
|
|
|
|
997
|
|
|
|
|
|
|
use FindBin::libs qw( base=Mylib ) |
998
|
|
|
|
|
|
|
|
999
|
|
|
|
|
|
|
does anyway. |
1000
|
|
|
|
|
|
|
|
1001
|
|
|
|
|
|
|
=back |
1002
|
|
|
|
|
|
|
|
1003
|
|
|
|
|
|
|
=head2 FindBin::libs-1.2+ uses File::Spec |
1004
|
|
|
|
|
|
|
|
1005
|
|
|
|
|
|
|
In order to accmodate a wider range of filesystems, |
1006
|
|
|
|
|
|
|
the code has been re-written to use File::Spec for |
1007
|
|
|
|
|
|
|
all directory and volume manglement. |
1008
|
|
|
|
|
|
|
|
1009
|
|
|
|
|
|
|
There is one thing that File::Spec does not handle, |
1010
|
|
|
|
|
|
|
hoever, which is fully reolving absolute paths. That |
1011
|
|
|
|
|
|
|
still has to be handled via abs_path, when it works. |
1012
|
|
|
|
|
|
|
|
1013
|
|
|
|
|
|
|
The issue is that File::Spec::rel2abs and |
1014
|
|
|
|
|
|
|
Cwd::abs_path work differently: abs_path only |
1015
|
|
|
|
|
|
|
returns true for existing directories and |
1016
|
|
|
|
|
|
|
resolves symlinks; rel2abs simply prepends cwd() |
1017
|
|
|
|
|
|
|
to any non-absolute paths. |
1018
|
|
|
|
|
|
|
|
1019
|
|
|
|
|
|
|
The difference for FinBin::libs is that |
1020
|
|
|
|
|
|
|
including redundant directories can lead to |
1021
|
|
|
|
|
|
|
unexpected results in what gets included; |
1022
|
|
|
|
|
|
|
looking up the contents of heavily-symlinked |
1023
|
|
|
|
|
|
|
paths is slow (and has some -- admittedly |
1024
|
|
|
|
|
|
|
unlikely -- failures at runtime). So, abs_path() |
1025
|
|
|
|
|
|
|
is the preferred way to find where the lib's |
1026
|
|
|
|
|
|
|
really live after they are found looking up the |
1027
|
|
|
|
|
|
|
tree. Using abs_path() also avoids problems |
1028
|
|
|
|
|
|
|
where the same directory is included twice in a |
1029
|
|
|
|
|
|
|
sandbox' tree via symlinks. |
1030
|
|
|
|
|
|
|
|
1031
|
|
|
|
|
|
|
Due to previous complaints that abs_path did not |
1032
|
|
|
|
|
|
|
work properly on all systems, the current |
1033
|
|
|
|
|
|
|
version of FindBin::libs uses File::Spec to |
1034
|
|
|
|
|
|
|
break apart and re-assemble directories, with |
1035
|
|
|
|
|
|
|
abs_path used optinally. If "abs_path cwd" works |
1036
|
|
|
|
|
|
|
then abs_path is used on the directory paths |
1037
|
|
|
|
|
|
|
handed by File::Spec::catpath(); otherwise the |
1038
|
|
|
|
|
|
|
paths are used as-is. This may leave users on |
1039
|
|
|
|
|
|
|
systms with non-working abs_path() having extra |
1040
|
|
|
|
|
|
|
copies of external library directories in @INC. |
1041
|
|
|
|
|
|
|
|
1042
|
|
|
|
|
|
|
Another issue is that I've heard reports of |
1043
|
|
|
|
|
|
|
some systems failing the '-d' test on symlinks, |
1044
|
|
|
|
|
|
|
where '-e' would have succeded. |
1045
|
|
|
|
|
|
|
|
1046
|
|
|
|
|
|
|
=head1 See Also |
1047
|
|
|
|
|
|
|
|
1048
|
|
|
|
|
|
|
=over 4 |
1049
|
|
|
|
|
|
|
|
1050
|
|
|
|
|
|
|
=item File::Spec |
1051
|
|
|
|
|
|
|
|
1052
|
|
|
|
|
|
|
This is used for portability in dis- and re-assembling |
1053
|
|
|
|
|
|
|
directory paths based on $FindBin::Bin. |
1054
|
|
|
|
|
|
|
|
1055
|
|
|
|
|
|
|
=item Older code. |
1056
|
|
|
|
|
|
|
|
1057
|
|
|
|
|
|
|
FindBin::libs_5_8.pm is installed if $^V indicates |
1058
|
|
|
|
|
|
|
that the running perl is prior to v5.10. |
1059
|
|
|
|
|
|
|
|
1060
|
|
|
|
|
|
|
=back |
1061
|
|
|
|
|
|
|
|
1062
|
|
|
|
|
|
|
=head1 BUGS |
1063
|
|
|
|
|
|
|
|
1064
|
|
|
|
|
|
|
=over 4 |
1065
|
|
|
|
|
|
|
|
1066
|
|
|
|
|
|
|
=item |
1067
|
|
|
|
|
|
|
|
1068
|
|
|
|
|
|
|
In order to avoid including junk, FindBin::libs |
1069
|
|
|
|
|
|
|
uses '-d' to test the items before including |
1070
|
|
|
|
|
|
|
them on the library list. This works fine so |
1071
|
|
|
|
|
|
|
long as abs_path() is used to disambiguate any |
1072
|
|
|
|
|
|
|
symlinks first. If abs_path() is turned off |
1073
|
|
|
|
|
|
|
then legitimate directories may be left off in |
1074
|
|
|
|
|
|
|
whatever local conditions might cause a valid |
1075
|
|
|
|
|
|
|
symlink to fail the '-d' test." |
1076
|
|
|
|
|
|
|
|
1077
|
|
|
|
|
|
|
=item |
1078
|
|
|
|
|
|
|
|
1079
|
|
|
|
|
|
|
File::Spec 3.16 and prior have a bug in VMS of |
1080
|
|
|
|
|
|
|
not returning an absolute paths in splitdir for |
1081
|
|
|
|
|
|
|
dir's without a leading '.'. Fix for this is to |
1082
|
|
|
|
|
|
|
unshift '', @dirpath if $dirpath[0]. While not a |
1083
|
|
|
|
|
|
|
bug, this is obviously a somewhat kludgy workaround |
1084
|
|
|
|
|
|
|
and should be removed (with an added test for a |
1085
|
|
|
|
|
|
|
working version) once the File::Spec is fixed. |
1086
|
|
|
|
|
|
|
|
1087
|
|
|
|
|
|
|
=item |
1088
|
|
|
|
|
|
|
|
1089
|
|
|
|
|
|
|
The hack for prior-to-5.12 versions of perl is |
1090
|
|
|
|
|
|
|
messy, but is the only I've found that works for |
1091
|
|
|
|
|
|
|
the moment on *NIX, VMS, and MSW. I am not sure |
1092
|
|
|
|
|
|
|
whether any of these systems are normally configured |
1093
|
|
|
|
|
|
|
to share perl modules between versions. If the |
1094
|
|
|
|
|
|
|
moduels are not shared on multiple platforms then |
1095
|
|
|
|
|
|
|
I can make this work by managing the installation |
1096
|
|
|
|
|
|
|
rather than checking this every time at startup. |
1097
|
|
|
|
|
|
|
|
1098
|
|
|
|
|
|
|
For the moment, at least, this seems to work. |
1099
|
|
|
|
|
|
|
|
1100
|
|
|
|
|
|
|
=back |
1101
|
|
|
|
|
|
|
|
1102
|
|
|
|
|
|
|
=head1 SEE ALSO |
1103
|
|
|
|
|
|
|
|
1104
|
|
|
|
|
|
|
=over 4 |
1105
|
|
|
|
|
|
|
|
1106
|
|
|
|
|
|
|
=item Module::FromPerlVer |
1107
|
|
|
|
|
|
|
|
1108
|
|
|
|
|
|
|
Explains where the installed version comes from. |
1109
|
|
|
|
|
|
|
|
1110
|
|
|
|
|
|
|
=item File::Copy::Recursive |
1111
|
|
|
|
|
|
|
|
1112
|
|
|
|
|
|
|
Note: Due to issues with File::Copy::Recusive, this is |
1113
|
|
|
|
|
|
|
using File::Copy::Recursive::Reduced and a version directory |
1114
|
|
|
|
|
|
|
for the moment. Once the Recursive module has been dealt with |
1115
|
|
|
|
|
|
|
Module::FromPerlVer shoud Just Work. |
1116
|
|
|
|
|
|
|
|
1117
|
|
|
|
|
|
|
=back |
1118
|
|
|
|
|
|
|
|
1119
|
|
|
|
|
|
|
=head2 Cwd |
1120
|
|
|
|
|
|
|
|
1121
|
|
|
|
|
|
|
A bug in Cwd was fixed with 3.73. That should, hopefully, |
1122
|
|
|
|
|
|
|
fix the issue with FB::l croaking perl during testing. |
1123
|
|
|
|
|
|
|
If it does not then I will have to modify the sanity check |
1124
|
|
|
|
|
|
|
for using abs_path vs. rel2abs. |
1125
|
|
|
|
|
|
|
|
1126
|
|
|
|
|
|
|
=head1 AUTHOR |
1127
|
|
|
|
|
|
|
|
1128
|
|
|
|
|
|
|
Steven Lembark, Workhorse Computing <lembark@wrkhors.com> |
1129
|
|
|
|
|
|
|
|
1130
|
|
|
|
|
|
|
=head1 COPYRIGHT |
1131
|
|
|
|
|
|
|
|
1132
|
|
|
|
|
|
|
Copyright (C) 2003-2022, Steven Lembark, Workhorse Computing. |
1133
|
|
|
|
|
|
|
This code is released under the same terms as Perl-5.24 |
1134
|
|
|
|
|
|
|
or any later version of Perl. |
1135
|
|
|
|
|
|
|
|
1136
|
|
|
|
|
|
|
=head1 LICENSE |
1137
|
|
|
|
|
|
|
|
1138
|
|
|
|
|
|
|
This code is released under the same terms as Perl-5.24 |
1139
|
|
|
|
|
|
|
or any later version of Perl. |