123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- # Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved.
- #
- # Licensed under the Apache License 2.0 (the "License"). You may not use
- # this file except in compliance with the License. You can obtain a copy
- # in the file LICENSE in the source distribution or at
- # https://www.openssl.org/source/license.html
- =head1 NAME
- OpenSSL::fallback - push directories to the end of @INC at compile time
- =cut
- package OpenSSL::fallback;
- use strict;
- use warnings;
- use Carp;
- our $VERSION = '0.01';
- =head1 SYNOPSIS
- use OpenSSL::fallback LIST;
- =head1 DESCRIPTION
- This small simple module simplifies the addition of fallback directories
- in @INC at compile time.
- It is used to add extra directories at the end of perl's search path so
- that later "use" or "require" statements will find modules which are not
- located on perl's default search path.
- This is similar to L<lib>, except the paths are I<appended> to @INC rather
- than prepended, thus allowing the use of a newer module on perl's default
- search path if there is one.
- =head1 CAVEAT
- Just like with B<lib>, this only works with Unix filepaths.
- Just like with L<lib>, this doesn't mean that it only works on Unix, but that
- non-Unix users must first translate their file paths to Unix conventions.
- # VMS users wanting to put [.my.stuff] into their @INC should write:
- use fallback 'my/stuff';
- =head1 NOTES
- If you try to add a file to @INC as follows, you will be warned, and the file
- will be ignored:
- use fallback 'file.txt';
- The sole exception is the file F<MODULES.txt>, which must contain a list of
- sub-directories relative to the location of that F<MODULES.txt> file.
- All these sub-directories will be appended to @INC.
- =cut
- # Forward declare
- sub glob;
- use constant DEBUG => 0;
- sub import {
- shift; # Skip module name
- foreach (@_) {
- my $path = $_;
- if ($path eq '') {
- carp "Empty compile time value given to use fallback";
- next;
- }
- print STDERR "DEBUG: $path\n" if DEBUG;
- unless (-e $path
- && ($path =~ m/(?:^|\/)MODULES.txt/ || -d $path)) {
- croak "Parameter to use fallback must be a directory, not a file";
- next;
- }
- my @dirs = ();
- if (-f $path) { # It's a MODULES.txt file
- (my $dir = $path) =~ s|/[^/]*$||; # quick dirname
- open my $fh, $path or die "Could not open $path: $!\n";
- while (my $l = <$fh>) {
- $l =~ s|\R$||; # Better chomp
- my $d = "$dir/$l";
- my $checked = $d;
- if ($^O eq 'VMS') {
- # Some VMS unpackers replace periods with underscores
- # We must be real careful not to convert the directories
- # '.' and '..', though.
- $checked =
- join('/',
- map { my $x = $_;
- $x =~ s|\.|_|g
- if ($x ne '..' && $x ne '.');
- $x }
- split(m|/|, $checked))
- unless -e $checked && -d $checked;
- }
- croak "All lines in $path must be a directory, not a file: $l"
- unless -e $checked && -d $checked;
- push @INC, $checked;
- }
- } else { # It's a directory
- push @INC, $path;
- }
- }
- }
- =head1 SEE ALSO
- L<FindBin> - optional module which deals with paths relative to the source
- file.
- =head1 AUTHOR
- Richard Levitte, 2019
- =cut
|