This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
7a9536c88a86500061535d4d67d2caeaba8d8572
[perl5.git] / t / lib / 1_compile.t
1 #!./perl
2
3 BEGIN {
4     chdir '..' if -d '../pod' && -d '../t';
5     @INC = 'lib';
6 }
7
8 use strict;
9 use warnings;
10 use Config;
11
12 my %Core_Modules;
13 my %Test;
14
15 unless (open(MANIFEST, "MANIFEST")) {
16     die "$0: failed to open 'MANIFEST': $!\n";
17 }
18
19 sub add_by_name {
20     $Core_Modules{$_[0]}++;
21 }
22
23 while (<MANIFEST>) {
24     if (m!^(lib)/(\S+?)\.pm\s!) {
25         # Collecting modules names from under ext/ would be
26         # rather painful since the mapping from filenames
27         # to module names is not 100%.
28         my ($dir, $module) = ($1, $2);
29         $module =~ s!/!::!g;
30         add_by_name($module);
31     } elsif (m!^(lib|ext)/(\S+?)(?:\.t|/test.pl)\s!) {
32         my ($dir, $test) = ($1, $2);
33         $test =~ s!(\w+)/\1$!$1! if $dir eq 'ext';
34         $test =~ s!/t/[^/]+$!!;
35         $test =~ s!/!::!g;
36         $Test{$test}++;
37     }
38 }
39
40 close(MANIFEST);
41
42 # Delete stuff that can't be tested here.
43
44 sub delete_by_name {
45     delete $Core_Modules{$_[0]};
46 }
47
48 sub has_extension {
49     $Config{extensions} =~ /\b$_[0]\b/i;
50 }
51
52 sub delete_unless_has_extension {
53     delete $Core_Modules{$_[0]} unless has_extension($_[0]);
54 }
55
56 foreach my $known_extension (split(' ', $Config{known_extensions})) {
57     delete_unless_has_extension($known_extension);
58 }
59
60 sub delete_by_prefix {
61     for my $match (grep { /^$_[0]/ } keys %Core_Modules) {
62         delete_by_name($match);
63     }
64 }
65
66 delete_by_name('CGI::Fast');            # won't load without FCGI
67
68 delete_by_name('Devel::DProf');         # needs to be run as -d:DProf
69
70 delete_by_prefix('ExtUtils::MM_');      # ExtUtils::MakeMaker's domain
71
72 delete_by_prefix('File::Spec::');       # File::Spec's domain
73 add_by_name('File::Spec::Functions');   # put this back
74
75 delete_by_prefix('Attribute::Handlers');# we test this, and we have demos
76
77 sub using_feature {
78     my $use = "use$_[0]";
79     exists $Config{$use} &&
80         defined $Config{$use} &&
81         $Config{$use} eq 'define';
82 }
83
84 unless (using_feature('threads') && has_extension('Thread')) {
85     delete_by_name('Thread');
86     delete_by_prefix('Thread::');
87 }
88
89 unless (has_extension('NDBM_File')) {
90     delete_by_name('Memoize::NDBM_File');
91 }
92
93 delete_by_prefix('unicode::');
94
95 # Delete all modules which have their own tests.
96 # This makes this test a lot faster.
97 foreach my $mod (sort keys %Test) {
98     delete_by_name($mod);
99 }
100 foreach my $mod (<DATA>) {
101     chomp $mod;
102     print "### $mod has a test but is in DATA of $0\n" if exists $Test{$mod};
103     delete_by_name($mod);
104 }
105
106 # Okay, this is the list.
107
108 my @Core_Modules = sort keys %Core_Modules;
109
110 print "1..".@Core_Modules."\n";
111
112 my $test_num = 1;
113
114 foreach my $module (@Core_Modules) {
115     print "$module compile failed\nnot " unless compile_module($module);
116     print "ok $test_num\n";
117     $test_num++;
118 }
119
120 # We do this as a separate process else we'll blow the hell
121 # out of our namespace.
122 sub compile_module {
123     my ($module) = $_[0];
124     
125     my $out = scalar `$^X "-Ilib" t/lib/compmod.pl $module`;
126     print "# $out";
127     return $out =~ /^ok/;
128 }
129
130 # Add here modules that have their own test scripts and therefore
131 # need not be test-compiled by 1_compile.t.
132 __DATA__
133 B::ShowLex
134 CGI::Apache
135 CGI::Carp
136 CGI::Cookie
137 CGI::Form
138 CGI::Pretty
139 CGI::Push
140 CGI::Switch
141 CGI::Util
142 Carp::Heavy
143 Devel::DProf
144 Exporter::Heavy
145 ExtUtils::Constant
146 ExtUtils::MakeMaker
147 Filter::Util::Call
148 GDBM_File
149 I18N::LangTags::List
150 IO::Dir
151 IO::File
152 IO::Handle
153 IO::Pipe
154 IO::Poll
155 IO::Seekable
156 IO::Select
157 IO::Socket
158 IO::Socket::INET
159 IO::Socket::UNIX
160 Locale::Constants
161 Locale::Country
162 Locale::Currency
163 Locale::Language
164 MIME::QuotedPrint
165 Math::BigFloat
166 Math::BigInt::Calc
167 Memoize::AnyDBM_File
168 Memoize::Expire
169 Memoize::ExpireFile
170 Memoize::ExpireTest
171 Memoize::NDBM_File
172 Memoize::SDBM_File
173 Memoize::Storable
174 NDBM_File
175 ODBM_File
176 Pod::Checker
177 Pod::Find
178 Pod::Text
179 Pod::Usage
180 SDBM_File
181 Safe
182 Scalar::Util
183 Sys::Syslog
184 Test::More
185 Test::ParseWords
186 Text::Tabs
187 Text::Wrap
188 Thread
189 Tie::Array
190 Tie::Handle
191 Tie::Hash
192 Tie::Scalar
193 Time::tm
194 UNIVERSAL
195 attributes
196 base
197 bytes
198 ops