This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Update the test on warnings/register.t.
[perl5.git] / t / lib / 1_compile.t
index 2e7bc33..1d3daa5 100644 (file)
@@ -7,223 +7,193 @@ BEGIN {
 
 use strict;
 use warnings;
+use Config;
 
-my @Core_Modules = (
-                    'AnyDBM_File',
-                    'AutoLoader',
-                    'AutoSplit',
-                    'B',           # Do all these B things compile everywhere?
-                    'B::Asmdata',
-                    'B::Assembler',
-                    'B::Bblock',
-                    'B::Bytecode',
-                    'B::C',
-                    'B::CC',
-                    'B::Concise',
-                    'B::Debug',
-                    'B::Deparse',
-                    'B::Disassembler',
-                    'B::Lint',
-                    'B::Showlex',
-                    'B::Stackobj',
-                    'B::Stash',
-                    'B::Terse',
-                    'B::Xref',
-                    'Benchmark',
-                    'ByteLoader',
-                    'CGI',
-                    'CGI::Apache',
-                    'CGI::Carp',
-                    'CGI::Cookie',
-                    # 'CGI::Fast', # won't load without FCGI
-                    'CGI::Pretty',
-                    'CGI::Push',
-                    'CGI::Switch',
-                    'CGI::Util',
-                    'CPAN',
-                    'CPAN::FirstTime',
-                    'CPAN::Nox',
-                    'Carp',
-                    'Carp::Heavy',
-                    'Class::Struct',
-                    'Config',
-                    'Cwd',
-                    'DB',
-                    #                 DB_File               # config specific
-                    'Data::Dumper',
-                    # 'Devel::DProf',  # needs to run as -d:DProf
-                    'Devel::Peek',
-                    'Devel::SelfStubber',
-                    'DirHandle',
-                    'Dumpvalue',
-                    'DynaLoader',  # config specific?
-                    'English',
-                    'Encode',
-                    'Env',
-                    'Errno',
-                    'Exporter',
-                    'Exporter::Heavy',
-                    'ExtUtils::Command',
-                    'ExtUtils::Embed',
-                    'ExtUtils::Install',
-                    'ExtUtils::Installed',
-                    'ExtUtils::Liblist',
-                    # ExtUtils::MM_Cygwin   # ExtUtils::MakeMaker takes
-                    # ExtUtils::MM_OS2      # care of testing these.
-                    # ExtUtils::MM_Unix
-                    # ExtUtils::MM_VMS
-                    # ExtUtils::MM_Win32
-                    'ExtUtils::MakeMaker',
-                    'ExtUtils::Manifest',
-                    'ExtUtils::Mkbootstrap',
-                    'ExtUtils::Mksymlists',
-                    'ExtUtils::Packlist',
-                    'ExtUtils::testlib',
-                    'Fatal',
-                    'Fcntl',       # config specific?
-                    'File::Basename',
-                    'File::CheckTree',
-                    'File::Compare',
-                    'File::Copy',
-                    'File::DosGlob',
-                    'File::Find',
-                    'File::Glob',
-                    'File::Path',
-                    'File::Spec',
-                    'File::Spec::Functions',
-                    # File::Spec::EPOC       # File::Spec will take care of
-                    # File::Spec::Mac        # testing these compile.
-                    # File::Spec::OS2
-                    # File::Spec::Unix
-                    # File::Spec::VMS
-                    # File::Spec::Win32
-                    'File::stat',
-                    'FileCache',
-                    'FileHandle',
-                    'Filter::Simple',
-                    'Filter::Util::Call',
-                    'FindBin',
-                    'Getopt::Long',
-                    'Getopt::Std',
-                    'I18N::Collate',
-                    'IO',
-                    'IO::Dir',
-                    'IO::File',
-                    'IO::Handle',
-                    'IO::Pipe',
-                    'IO::Poll',
-                    'IO::Seekable',
-                    'IO::Select',
-                    'IO::Socket',
-                    'IO::Socket::INET',
-                    # IO::Socket::UNIX      # config specific
-                    'IPC::Msg',
-                    'IPC::Open2',
-                    'IPC::Open3',
-                    'IPC::Semaphore', # config specific?
-                    'IPC::SysV',   # config specific?
-                    'Math::BigFloat',
-                    'Math::BigInt',
-                    'Math::Complex',
-                    'Math::Trig',
-                    'Net::Ping',
-                    'Net::hostent',
-                    'Net::netent',
-                    'Net::protoent',
-                    'Net::servent',
-                    'O',
-                    'Opcode',
-                    'POSIX',       # config specific?
-                    'Pod::Checker',
-                    'Pod::Find',
-                    'Pod::Functions',
-                    'Pod::Html',
-                    'Pod::InputObjects',
-                    'Pod::Man',
-                    'Pod::Overstrike',
-                    'Pod::ParseUtils',
-                    'Pod::Parser',
-                    'Pod::Plainer',
-                    'Pod::Select',
-                    'Pod::Text',
-                    'Pod::Text::Color',
-                    'Pod::Text::Termcap',
-                    'Pod::Usage',
-                    'SDBM_File',
-                    'Safe',
-                    'Search::Dict',
-                    'SelectSaver',
-                    'SelfLoader',
-                    'Shell',
-                    'Socket',
-                    'Symbol',
-                    'Sys::Hostname',
-                    'Sys::Syslog',
-                    'Term::ANSIColor',
-                    'Term::Cap',
-                    'Term::Complete',
-                    'Term::ReadLine',
-                    'Test',
-                    'Test::Harness',
-                    'Text::Abbrev',
-                    'Text::ParseWords',
-                    'Text::Soundex',
-                    'Text::Tabs',
-                    'Text::Wrap',
-                    'Tie::Array',
-                    'Tie::Hash',
-                    'Tie::RefHash',
-                    'Tie::Scalar',
-                    'Tie::SubstrHash',
-                    'Time::Local',
-                    'Time::gmtime',
-                    'Time::localtime',
-                    'Time::tm',
-                    'UNIVERSAL',
-                    'User::grent',
-                    'User::pwent',
-                    'XSLoader',
-                    'attributes',
-                    'attrs',
-                    'autouse',
-                    'blib',
-                    'bytes',
-                    'charnames',
-                    'constant',
-                    'diagnostics',
-                    'filetest',
-                    'integer',
-                    'less',
-                    'lib',
-                    'locale',
-                    'open',
-                    'ops',
-                    'overload',
-                    're',
-                    'sigtrap',
-                    'strict',
-                    'subs',
-                    'unicode::distinct',
-                    'utf8',
-                    'vars',
-                    'warnings',
-                    'warnings::register',
-                   );         
+my %Core_Modules;
+my %Test;
+
+unless (open(MANIFEST, "MANIFEST")) {
+    die "$0: failed to open 'MANIFEST': $!\n";
+}
+
+sub add_by_name {
+    $Core_Modules{$_[0]}++;
+}
+
+while (<MANIFEST>) {
+    if (m!^(lib)/(\S+?)\.pm\s!) {
+       # Collecting modules names from under ext/ would be
+       # rather painful since the mapping from filenames
+       # to module names is not 100%.
+       my ($dir, $module) = ($1, $2);
+       $module =~ s!/!::!g;
+       add_by_name($module);
+    } elsif (m!^(lib|ext)/(\S+?)(?:\.t|/test.pl)\s!) {
+       my ($dir, $test) = ($1, $2);
+       $test =~ s!(\w+)/\1$!$1! if $dir eq 'ext';
+       $test =~ s!/t/[^/]+$!!;
+       $test =~ s!/!::!g;
+       $Test{$test}++;
+    }
+}
+
+close(MANIFEST);
+
+# Delete stuff that can't be tested here.
+
+sub delete_by_name {
+    delete $Core_Modules{$_[0]};
+}
+
+sub has_extension {
+    $Config{extensions} =~ /\b$_[0]\b/i;
+}
+
+sub delete_unless_has_extension {
+    delete $Core_Modules{$_[0]} unless has_extension($_[0]);
+}
+
+foreach my $known_extension (split(' ', $Config{known_extensions})) {
+    delete_unless_has_extension($known_extension);
+}
+
+sub delete_by_prefix {
+    for my $match (grep { /^$_[0]/ } keys %Core_Modules) {
+       delete_by_name($match);
+    }
+}
+
+delete_by_name('CGI::Fast');           # won't load without FCGI
+
+delete_by_name('Devel::DProf');                # needs to be run as -d:DProf
+
+delete_by_prefix('ExtUtils::MM_');     # ExtUtils::MakeMaker's domain
+
+delete_by_prefix('File::Spec::');      # File::Spec's domain
+add_by_name('File::Spec::Functions');  # put this back
+
+delete_by_prefix('Attribute::Handlers');# we test this, and we have demos
+
+sub using_feature {
+    my $use = "use$_[0]";
+    exists $Config{$use} &&
+       defined $Config{$use} &&
+       $Config{$use} eq 'define';
+}
+
+unless (using_feature('threads') && has_extension('Thread')) {
+    delete_by_name('Thread');
+    delete_by_prefix('Thread::');
+}
+
+unless (has_extension('NDBM_File')) {
+    delete_by_name('Memoize::NDBM_File');
+}
+
+delete_by_prefix('unicode::');
+
+# Delete all modules which have their own tests.
+# This makes this test a lot faster.
+foreach my $mod (sort keys %Test) {
+    delete_by_name($mod);
+}
+foreach my $mod (<DATA>) {
+    chomp $mod;
+    print "### $mod has a test but is in DATA of $0\n" if exists $Test{$mod};
+    delete_by_name($mod);
+}
+
+# Okay, this is the list.
+
+my @Core_Modules = sort keys %Core_Modules;
 
 print "1..".@Core_Modules."\n";
 
 my $test_num = 1;
+
 foreach my $module (@Core_Modules) {
-    print "not " unless compile_module($module);
+    print "$module compile failed\nnot " unless compile_module($module);
     print "ok $test_num\n";
     $test_num++;
 }
 
-
-# We do this as a seperate process else we'll blow the hell out of our
-# namespace.
+# We do this as a separate process else we'll blow the hell
+# out of our namespace.
 sub compile_module {
-    my($module) = @_;
+    my ($module) = $_[0];
     
-    return scalar `./perl -Ilib t/lib/compmod.pl $module` =~ /^ok/;
+    my $out = scalar `$^X "-Ilib" t/lib/compmod.pl $module`;
+    print "# $out";
+    return $out =~ /^ok/;
 }
+
+# Add here modules that have their own test scripts and therefore
+# need not be test-compiled by 1_compile.t.
+__DATA__
+B::ShowLex
+CGI::Apache
+CGI::Carp
+CGI::Cookie
+CGI::Form
+CGI::Pretty
+CGI::Push
+CGI::Switch
+CGI::Util
+Carp::Heavy
+Devel::DProf
+Dumpvalue
+Exporter::Heavy
+ExtUtils::Constant
+ExtUtils::MakeMaker
+Filter::Util::Call
+GDBM_File
+I18N::LangTags::List
+IO::Dir
+IO::File
+IO::Handle
+IO::Pipe
+IO::Poll
+IO::Seekable
+IO::Select
+IO::Socket
+IO::Socket::INET
+IO::Socket::UNIX
+Locale::Constants
+Locale::Country
+Locale::Currency
+Locale::Language
+MIME::QuotedPrint
+Math::BigFloat
+Math::BigInt::Calc
+Memoize::AnyDBM_File
+Memoize::Expire
+Memoize::ExpireFile
+Memoize::ExpireTest
+Memoize::NDBM_File
+Memoize::SDBM_File
+Memoize::Storable
+NDBM_File
+ODBM_File
+Pod::Checker
+Pod::Find
+Pod::Text
+Pod::Usage
+SDBM_File
+Safe
+Scalar::Util
+Sys::Syslog
+Test::More
+Test::ParseWords
+Text::Tabs
+Text::Wrap
+Thread
+Tie::Array
+Tie::Handle
+Tie::Hash
+Tie::Scalar
+Time::tm
+UNIVERSAL
+attributes
+base
+bytes
+ops