This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
lib/locale.pm: Add an assertion
[perl5.git] / lib / FindBin.pm
... / ...
CommitLineData
1# FindBin.pm
2#
3# Copyright (c) 1995 Graham Barr & Nick Ing-Simmons. All rights reserved.
4# This program is free software; you can redistribute it and/or modify it
5# under the same terms as Perl itself.
6
7=head1 NAME
8
9FindBin - Locate directory of original perl script
10
11=head1 SYNOPSIS
12
13 use FindBin;
14 use lib "$FindBin::Bin/../lib";
15
16 or
17
18 use FindBin qw($Bin);
19 use lib "$Bin/../lib";
20
21=head1 DESCRIPTION
22
23Locates the full path to the script bin directory to allow the use
24of paths relative to the bin directory.
25
26This allows a user to setup a directory tree for some software with
27directories C<< <root>/bin >> and C<< <root>/lib >>, and then the above
28example will allow the use of modules in the lib directory without knowing
29where the software tree is installed.
30
31If perl is invoked using the B<-e> option or the perl script is read from
32C<STDIN> then FindBin sets both C<$Bin> and C<$RealBin> to the current
33directory.
34
35=head1 EXPORTABLE VARIABLES
36
37 $Bin - path to bin directory from where script was invoked
38 $Script - basename of script from which perl was invoked
39 $RealBin - $Bin with all links resolved
40 $RealScript - $Script with all links resolved
41
42=head1 KNOWN ISSUES
43
44If there are two modules using C<FindBin> from different directories
45under the same interpreter, this won't work. Since C<FindBin> uses a
46C<BEGIN> block, it'll be executed only once, and only the first caller
47will get it right. This is a problem under mod_perl and other persistent
48Perl environments, where you shouldn't use this module. Which also means
49that you should avoid using C<FindBin> in modules that you plan to put
50on CPAN. To make sure that C<FindBin> will work is to call the C<again>
51function:
52
53 use FindBin;
54 FindBin::again(); # or FindBin->again;
55
56In former versions of FindBin there was no C<again> function. The
57workaround was to force the C<BEGIN> block to be executed again:
58
59 delete $INC{'FindBin.pm'};
60 require FindBin;
61
62=head1 AUTHORS
63
64FindBin is supported as part of the core perl distribution. Please send bug
65reports to E<lt>F<perlbug@perl.org>E<gt> using the perlbug program
66included with perl.
67
68Graham Barr E<lt>F<gbarr@pobox.com>E<gt>
69Nick Ing-Simmons E<lt>F<nik@tiuk.ti.com>E<gt>
70
71=head1 COPYRIGHT
72
73Copyright (c) 1995 Graham Barr & Nick Ing-Simmons. All rights reserved.
74This program is free software; you can redistribute it and/or modify it
75under the same terms as Perl itself.
76
77=cut
78
79package FindBin;
80use Carp;
81require 5.000;
82require Exporter;
83use Cwd qw(getcwd cwd abs_path);
84use File::Basename;
85use File::Spec;
86
87@EXPORT_OK = qw($Bin $Script $RealBin $RealScript $Dir $RealDir);
88%EXPORT_TAGS = (ALL => [qw($Bin $Script $RealBin $RealScript $Dir $RealDir)]);
89@ISA = qw(Exporter);
90
91$VERSION = "1.51";
92
93
94# needed for VMS-specific filename translation
95if( $^O eq 'VMS' ) {
96 require VMS::Filespec;
97 VMS::Filespec->import;
98}
99
100sub cwd2 {
101 my $cwd = getcwd();
102 # getcwd might fail if it hasn't access to the current directory.
103 # try harder.
104 defined $cwd or $cwd = cwd();
105 $cwd;
106}
107
108sub init
109{
110 *Dir = \$Bin;
111 *RealDir = \$RealBin;
112
113 if($0 eq '-e' || $0 eq '-')
114 {
115 # perl invoked with -e or script is on C<STDIN>
116 $Script = $RealScript = $0;
117 $Bin = $RealBin = cwd2();
118 $Bin = VMS::Filespec::unixify($Bin) if $^O eq 'VMS';
119 }
120 else
121 {
122 my $script = $0;
123
124 if ($^O eq 'VMS')
125 {
126 ($Bin,$Script) = VMS::Filespec::rmsexpand($0) =~ /(.*[\]>\/]+)(.*)/s;
127 # C<use disk:[dev]/lib> isn't going to work, so unixify first
128 ($Bin = VMS::Filespec::unixify($Bin)) =~ s/\/\z//;
129 ($RealBin,$RealScript) = ($Bin,$Script);
130 }
131 else
132 {
133 croak("Cannot find current script '$0'") unless(-f $script);
134
135 # Ensure $script contains the complete path in case we C<chdir>
136
137 $script = File::Spec->catfile(cwd2(), $script)
138 unless File::Spec->file_name_is_absolute($script);
139
140 ($Script,$Bin) = fileparse($script);
141
142 # Resolve $script if it is a link
143 while(1)
144 {
145 my $linktext = readlink($script);
146
147 ($RealScript,$RealBin) = fileparse($script);
148 last unless defined $linktext;
149
150 $script = (File::Spec->file_name_is_absolute($linktext))
151 ? $linktext
152 : File::Spec->catfile($RealBin, $linktext);
153 }
154
155 # Get absolute paths to directories
156 if ($Bin) {
157 my $BinOld = $Bin;
158 $Bin = abs_path($Bin);
159 defined $Bin or $Bin = File::Spec->canonpath($BinOld);
160 }
161 $RealBin = abs_path($RealBin) if($RealBin);
162 }
163 }
164}
165
166BEGIN { init }
167
168*again = \&init;
169
1701; # Keep require happy