1 | # Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved.
|
---|
2 | #
|
---|
3 | # Licensed under the Apache License 2.0 (the "License"). You may not use
|
---|
4 | # this file except in compliance with the License. You can obtain a copy
|
---|
5 | # in the file LICENSE in the source distribution or at
|
---|
6 | # https://www.openssl.org/source/license.html
|
---|
7 |
|
---|
8 | =head1 NAME
|
---|
9 |
|
---|
10 | OpenSSL::fallback - push directories to the end of @INC at compile time
|
---|
11 |
|
---|
12 | =cut
|
---|
13 |
|
---|
14 | package OpenSSL::fallback;
|
---|
15 |
|
---|
16 | use strict;
|
---|
17 | use warnings;
|
---|
18 | use Carp;
|
---|
19 |
|
---|
20 | our $VERSION = '0.01';
|
---|
21 |
|
---|
22 | =head1 SYNOPSIS
|
---|
23 |
|
---|
24 | use OpenSSL::fallback LIST;
|
---|
25 |
|
---|
26 | =head1 DESCRIPTION
|
---|
27 |
|
---|
28 | This small simple module simplifies the addition of fallback directories
|
---|
29 | in @INC at compile time.
|
---|
30 |
|
---|
31 | It is used to add extra directories at the end of perl's search path so
|
---|
32 | that later "use" or "require" statements will find modules which are not
|
---|
33 | located on perl's default search path.
|
---|
34 |
|
---|
35 | This is similar to L<lib>, except the paths are I<appended> to @INC rather
|
---|
36 | than prepended, thus allowing the use of a newer module on perl's default
|
---|
37 | search path if there is one.
|
---|
38 |
|
---|
39 | =head1 CAVEAT
|
---|
40 |
|
---|
41 | Just like with B<lib>, this only works with Unix filepaths.
|
---|
42 | Just like with L<lib>, this doesn't mean that it only works on Unix, but that
|
---|
43 | non-Unix users must first translate their file paths to Unix conventions.
|
---|
44 |
|
---|
45 | # VMS users wanting to put [.my.stuff] into their @INC should write:
|
---|
46 | use fallback 'my/stuff';
|
---|
47 |
|
---|
48 | =head1 NOTES
|
---|
49 |
|
---|
50 | If you try to add a file to @INC as follows, you will be warned, and the file
|
---|
51 | will be ignored:
|
---|
52 |
|
---|
53 | use fallback 'file.txt';
|
---|
54 |
|
---|
55 | The sole exception is the file F<MODULES.txt>, which must contain a list of
|
---|
56 | sub-directories relative to the location of that F<MODULES.txt> file.
|
---|
57 | All these sub-directories will be appended to @INC.
|
---|
58 |
|
---|
59 | =cut
|
---|
60 |
|
---|
61 | # Forward declare
|
---|
62 | sub glob;
|
---|
63 |
|
---|
64 | use constant DEBUG => 0;
|
---|
65 |
|
---|
66 | sub import {
|
---|
67 | shift; # Skip module name
|
---|
68 |
|
---|
69 | foreach (@_) {
|
---|
70 | my $path = $_;
|
---|
71 |
|
---|
72 | if ($path eq '') {
|
---|
73 | carp "Empty compile time value given to use fallback";
|
---|
74 | next;
|
---|
75 | }
|
---|
76 |
|
---|
77 | print STDERR "DEBUG: $path\n" if DEBUG;
|
---|
78 |
|
---|
79 | unless (-e $path
|
---|
80 | && ($path =~ m/(?:^|\/)MODULES.txt/ || -d $path)) {
|
---|
81 | croak "Parameter to use fallback must be a directory, not a file";
|
---|
82 | next;
|
---|
83 | }
|
---|
84 |
|
---|
85 | my @dirs = ();
|
---|
86 | if (-f $path) { # It's a MODULES.txt file
|
---|
87 | (my $dir = $path) =~ s|/[^/]*$||; # quick dirname
|
---|
88 | open my $fh, $path or die "Could not open $path: $!\n";
|
---|
89 | while (my $l = <$fh>) {
|
---|
90 | $l =~ s|\R$||; # Better chomp
|
---|
91 | my $d = "$dir/$l";
|
---|
92 | my $checked = $d;
|
---|
93 |
|
---|
94 | if ($^O eq 'VMS') {
|
---|
95 | # Some VMS unpackers replace periods with underscores
|
---|
96 | # We must be real careful not to convert the directories
|
---|
97 | # '.' and '..', though.
|
---|
98 | $checked =
|
---|
99 | join('/',
|
---|
100 | map { my $x = $_;
|
---|
101 | $x =~ s|\.|_|g
|
---|
102 | if ($x ne '..' && $x ne '.');
|
---|
103 | $x }
|
---|
104 | split(m|/|, $checked))
|
---|
105 | unless -e $checked && -d $checked;
|
---|
106 | }
|
---|
107 | croak "All lines in $path must be a directory, not a file: $l"
|
---|
108 | unless -e $checked && -d $checked;
|
---|
109 | push @INC, $checked;
|
---|
110 | }
|
---|
111 | } else { # It's a directory
|
---|
112 | push @INC, $path;
|
---|
113 | }
|
---|
114 | }
|
---|
115 | }
|
---|
116 |
|
---|
117 | =head1 SEE ALSO
|
---|
118 |
|
---|
119 | L<FindBin> - optional module which deals with paths relative to the source
|
---|
120 | file.
|
---|
121 |
|
---|
122 | =head1 AUTHOR
|
---|
123 |
|
---|
124 | Richard Levitte, 2019
|
---|
125 |
|
---|
126 | =cut
|
---|
127 |
|
---|