Experimental module intended to simplify core regression tests
Nicholas Clark [Wed, 29 Dec 2004 21:25:29 +0000 (21:25 +0000)]
p4raw-id: //depot/perl@23707

MANIFEST
lib/Config/Extensions.pm [new file with mode: 0644]
lib/Config/Extensions.t [new file with mode: 0644]

index 67e19f0..4232e3c 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -1196,6 +1196,8 @@ lib/Class/ISA/test.pl             See if Class::ISA works
 lib/Class/Struct.pm            Declare struct-like datatypes as Perl classes
 lib/Class/Struct.t             See if Class::Struct works
 lib/complete.pl                        A command completion subroutine
+lib/Config/Extensions.pm       Convenient hash looked for built extensions
+lib/Config/Extensions.t                See if Config::Extensions works
 lib/Config.t                   See if Config works
 lib/constant.pm                        For "use constant"
 lib/constant.t                 See if compile-time constants work
diff --git a/lib/Config/Extensions.pm b/lib/Config/Extensions.pm
new file mode 100644 (file)
index 0000000..82fb9e0
--- /dev/null
@@ -0,0 +1,63 @@
+package Config::Extensions;
+use strict;
+use vars qw(%Extensions $VERSION @ISA @EXPORT_OK);
+use Config;
+require Exporter;
+
+$VERSION = '0.01';
+@ISA = 'Exporter';
+@EXPORT_OK = '%Extensions';
+
+foreach my $type (qw(static dynamic nonxs)) {
+    foreach (split /\s+/, $Config{$type . '_ext'}) {
+       s!/!::!g;
+       $Extensions{$_} = $type;
+    }
+}
+
+1;
+__END__
+=head1 NAME
+
+Config::Extensions - hash lookup of which core extensions were built.
+
+=head1 SYNOPSIS
+
+    use Config::Extensions '%Extensions';
+    if ($Extensions{PerlIO::via}) {
+        # This perl has PerlIO::via built
+    }
+
+=head1 DESCRIPTION
+
+The Config::Extensions module provides a hash C<%Extensions> containing all
+the core extensions that were enabled for this perl. The hash is keyed by
+extension name, with each entry having one of 3 possible values:
+
+=over 4
+
+=item dynamic
+
+The extension is dynamically linked
+
+=item nonxs
+
+The extension is pure perl, so doesn't need linking to the perl executable
+
+=item static
+
+The extension is statically linked to the perl binary
+
+=back
+
+As all values evaluate to true, a simple C<if> test is good enough to determine
+whether an extension is present.
+
+All the data uses to generate the C<%Extensions> hash is already present in
+the C<Config> module, but not in such a convenient format to quickly reference.
+
+=head1 AUTHOR
+
+Nicholas Clark <nick@ccl4.org>
+
+=cut
diff --git a/lib/Config/Extensions.t b/lib/Config/Extensions.t
new file mode 100644 (file)
index 0000000..1d730b0
--- /dev/null
@@ -0,0 +1,33 @@
+#!perl -w
+BEGIN {
+    if( $ENV{PERL_CORE} ) {
+        chdir 't' if -d 't';
+        @INC = '../lib';
+    }
+}
+use strict;
+use Test::More 'no_plan';
+
+BEGIN {use_ok 'Config::Extensions', '%Extensions'};
+
+use Config;
+
+my @types = qw(dynamic static nonxs);
+my %types;
+@types{@types} = @types;
+
+ok (keys %Extensions, "There are some extensions");
+# Check only the 3 valid keys have been used.
+while (my ($key, $val) = each %Extensions) {
+    my $raw_ext = $key;
+    # Back to the format in Config
+    $raw_ext =~ s!::!/!g;
+    my $re = qr/\b\Q$raw_ext\E\b/;
+    like($Config{extensions}, $re, "$key was built");
+    unless ($types{$val}) {
+       fail("$key is $val");
+       next;
+    }
+    my $type = $val . '_ext';
+    like($Config{$type}, $re, "$key is $type");
+}