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