modules.t 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554
  1. # -*- cperl -*-
  2. # t/modules.t [OPTIONS] [t/mymodules]
  3. # check if some common CPAN modules exist and
  4. # can be compiled successfully. Only B::C is fatal,
  5. # CC and Bytecode optional. Use -all for all three (optional), and
  6. # -log for the reports (now default).
  7. #
  8. # OPTIONS:
  9. # -all - run also B::CC and B::Bytecode
  10. # -subset - run only random 10 of all modules. default if ! -d .svn
  11. # -no-subset - all 100 modules
  12. # -no-date - no date added at the logfile
  13. # -t - run also tests
  14. # -log - save log file. default on test10 and without subset
  15. # -keep - keep the source, perlcc -S
  16. #
  17. # The list in t/mymodules comes from two bigger projects.
  18. # Recommended general lists are Task::Kensho and http://ali.as/top100/
  19. # We are using 10 problematic modules from the latter.
  20. # We are NOT running the full module testsuite yet with -t, we can do that
  21. # in another author test to burn CPU for a few hours resp. days.
  22. #
  23. # Reports:
  24. # for p in 5.6.2 5.8.9 5.10.1 5.12.2; do make -S clean; perl$p Makefile.PL; make; perl$p -Mblib t/modules.t -log; done
  25. #
  26. # How to installed skip modules:
  27. # grep ^skip log.modules-bla|perl -lane'print $F[1]'| xargs perlbla -S cpan
  28. # or t/testm.sh -s
  29. BEGIN {
  30. if ($ENV{PERL_CORE}) {
  31. unshift @INC, ('t', '../../lib');
  32. } else {
  33. unshift @INC, 't';
  34. }
  35. require TestBC;
  36. }
  37. use strict;
  38. use Test::More;
  39. use File::Temp;
  40. use Config;
  41. require Carp;
  42. my $ccopts;
  43. BEGIN {
  44. plan skip_all => "Overlong tests, timeout on Appveyor CI"
  45. if $^O eq 'MSWin32' and $ENV{APPVEYOR};
  46. plan skip_all => "Overlong tests, timeout on CI"
  47. if is_CI() and $ENV{PERL_CORE};
  48. plan skip_all => "SKIP_SLOW_TESTS, timeout on CI"
  49. if $ENV{SKIP_SLOW_TESTS};
  50. plan skip_all => "Unsupported Carp version $Carp::VERSION >= 1.42"
  51. if $] >= 5.025004 and !$Config{usecperl} and $Carp::VERSION ge '1.42' and is_CI();
  52. if ($^O eq 'MSWin32' and $Config{cc} eq 'cl') {
  53. # MSVC takes an hour to compile each binary unless -Od
  54. $ccopts = '"--Wc=-Od"';
  55. } elsif ($^O eq 'MSWin32' and $Config{cc} eq 'gcc') {
  56. # mingw is much better but still insane with <= 4GB RAM
  57. $ccopts = '"--Wc=-O0"';
  58. } elsif ($Config{ccflags} =~ /-flto/) { # too big
  59. $ccopts = '"--Wc=-O1"';
  60. } else {
  61. $ccopts = '';
  62. }
  63. }
  64. # Try some simple XS module which exists in 5.6.2 and blead
  65. # otherwise we'll get a bogus 40% failure rate
  66. my $staticxs = '';
  67. BEGIN {
  68. $staticxs = '--staticxs';
  69. # check whether linking with xs works at all. Try with and without --staticxs
  70. if ($^O eq 'darwin') { $staticxs = ''; goto BEGIN_END; }
  71. my $X = $^X =~ m/\s/ ? qq{"$^X"} : $^X;
  72. my $tmp = File::Temp->new(TEMPLATE => 'pccXXXXX');
  73. my $out = $tmp->filename;
  74. my $Mblib = Mblib();
  75. my $perlcc = perlcc();
  76. my $result = `$X $Mblib $perlcc -O3 $ccopts --staticxs -o$out -e"use Data::Dumper;"`;
  77. my $exe = $^O eq 'MSWin32' ? "$out.exe" : $out;
  78. unless (-e $exe or -e 'a.out') {
  79. my $cmd = qq($X $Mblib $perlcc -O3 $ccopts -o$out -e"use Data::Dumper;");
  80. warn $cmd."\n" if $ENV{TEST_VERBOSE};
  81. my $result = `$cmd`;
  82. unless (-e $out or -e 'a.out') {
  83. plan skip_all => "perlcc cannot link XS module Data::Dumper. Most likely wrong ldopts.";
  84. unlink $out;
  85. exit;
  86. } else {
  87. $staticxs = '';
  88. }
  89. } else {
  90. diag "-O3 --staticxs ok";
  91. }
  92. BEGIN_END:
  93. unshift @INC, 't';
  94. }
  95. our %modules;
  96. our $log = 0;
  97. use modules;
  98. my $opts_to_test = 1;
  99. my $do_test;
  100. $opts_to_test = 3 if grep /^-all$/, @ARGV;
  101. $do_test = 1 if grep /^-t$/, @ARGV;
  102. # Determine list of modules to action.
  103. our @modules = get_module_list();
  104. my $test_count = scalar @modules * $opts_to_test * ($do_test ? 5 : 4);
  105. # $test_count -= 4 * $opts_to_test * (scalar @modules - scalar(keys %modules));
  106. plan tests => $test_count;
  107. use B::C;
  108. use POSIX qw(strftime);
  109. if ($] >= 5.025004 and !$Config{usecperl} and $Carp::VERSION ge '1.42') {
  110. warn "# Unsupported Carp version $Carp::VERSION >= 1.42\n";
  111. }
  112. eval { require IPC::Run; };
  113. my $have_IPC_Run = defined $IPC::Run::VERSION;
  114. log_diag("Warning: IPC::Run is not available. Error trapping will be ".
  115. "limited, no timeouts.")
  116. if !$have_IPC_Run and !$ENV{PERL_CORE};
  117. my @opts = ("-O3"); # only B::C
  118. @opts = ("-O3", "-O", "-B") if grep /-all/, @ARGV; # all 3 compilers
  119. my $perlversion = perlversion();
  120. $log = 0 if @ARGV;
  121. $log = 1 if grep /top100$/, @ARGV;
  122. $log = 1 if grep /-log/, @ARGV or $ENV{TEST_LOG};
  123. my $nodate = 1 if grep /-no-date/, @ARGV;
  124. my $keep = 1 if grep /-keep/, @ARGV;
  125. if ($log) {
  126. $log = (@ARGV and !$nodate)
  127. ? "log.modules-$perlversion-".strftime("%Y%m%d-%H%M%S",localtime)
  128. : "log.modules-$perlversion";
  129. if (-e $log) {
  130. use File::Copy;
  131. copy $log, "$log.bak";
  132. }
  133. open(LOG, ">", "$log");
  134. close LOG;
  135. }
  136. unless (is_subset) {
  137. my $svnrev = "";
  138. if (-d '.svn') {
  139. local $ENV{LC_MESSAGES} = "C";
  140. $svnrev = `svn info|grep Revision:`;
  141. chomp $svnrev;
  142. $svnrev =~ s/Revision:\s+/r/;
  143. my $svnstat = `svn status lib/B/C.pm t/TestBC.pm t/*.t`;
  144. chomp $svnstat;
  145. $svnrev .= " M" if $svnstat;
  146. } elsif (-d '.git') {
  147. local $ENV{LC_MESSAGES} = "C";
  148. $svnrev = `git log -1 --pretty=format:"%h %ad | %s" --date=short`;
  149. chomp $svnrev;
  150. my $gitdiff = `git diff lib/B/C.pm t/TestBC.pm t/*.t`;
  151. chomp $gitdiff;
  152. $svnrev .= " M" if $gitdiff;
  153. }
  154. log_diag("B::C::VERSION = $B::C::VERSION $svnrev");
  155. log_diag("perlversion = $perlversion");
  156. log_diag("path = $^X");
  157. my $bits = 8 * $Config{ptrsize};
  158. log_diag("platform = $^O $bits"."bit ".(
  159. $Config{'useithreads'} ? "threaded"
  160. : $Config{'usemultiplicity'} ? "multi"
  161. : "non-threaded").
  162. ($Config{ccflags} =~ m/-DDEBUGGING/ ? " debug" : ""));
  163. }
  164. my $module_count = 0;
  165. my ($skip, $pass, $fail, $todo) = (0,0,0,0);
  166. my $Mblib = Mblib();
  167. my $perlcc = perlcc();
  168. MODULE:
  169. for my $module (@modules) {
  170. $module_count++;
  171. local($\, $,); # guard against -l and other things that screw with
  172. # print
  173. # Possible binary files.
  174. my $name = $module;
  175. $name =~ s/::/_/g;
  176. $name =~ s{(install|setup|update)}{substr($1,0,4)}ie;
  177. my $out = 'pcc'.$name;
  178. my $out_c = "$out.c";
  179. my $out_pl = "$out.pl";
  180. $out = "$out.exe" if $^O eq 'MSWin32';
  181. SKIP: {
  182. # if is a special module that can't be required like others
  183. unless ($modules{$module}) {
  184. $skip++;
  185. log_pass("skip", "$module", 0);
  186. skip("$module not installed", int(4 * scalar @opts));
  187. next MODULE;
  188. }
  189. if (is_skip($module)) { # !$have_IPC_Run is not really helpful here
  190. my $why = is_skip($module);
  191. $skip++;
  192. log_pass("skip", "$module #$why", 0);
  193. skip("$module $why", int(4 * scalar @opts));
  194. next MODULE;
  195. }
  196. $module = 'if(1) => "Sys::Hostname"' if $module eq 'if';
  197. TODO: {
  198. my $s = is_todo($module);
  199. local $TODO = $s if $s;
  200. $todo++ if $TODO;
  201. open F, ">", $out_pl or die;
  202. print F "use $module;\nprint 'ok';\n" or die;
  203. close F or die;
  204. my ($result, $stdout, $err);
  205. my $module_passed = 1;
  206. my $runperl = $^X =~ m/\s/ ? qq{"$^X"} : $^X;
  207. foreach (0..$#opts) {
  208. my $opt = $opts[$_];
  209. $opt .= " --testsuite --no-spawn" if $module =~ /^Test::/ and $opt !~ / --testsuite/;
  210. $opt .= " -S" if $keep and $opt !~ / -S\b/;
  211. # TODO ./a often hangs but perlcc not
  212. my @cmd = grep {!/^$/}
  213. $runperl,split(/ /,$Mblib),split(/ /,$perlcc),split(/ /,$opt),$ccopts,$staticxs,"-o$out","-r",$out_pl;
  214. my $cmd = join(" ", @cmd);
  215. #warn $cmd."\n" if $ENV{TEST_VERBOSE};
  216. # Esp. darwin-2level has insane link times
  217. my $timeout = 60; # in secs.
  218. if ($Config{ccflags} =~ /-flto/ or
  219. ($^O eq 'MSWin32' and $Config{cc} eq 'cl')) {
  220. $timeout = 720;
  221. }
  222. # to bypass CI timeouts (no output has been received in the last 10m0s)
  223. warn "# $module\n" if is_CI();
  224. ($result, $stdout, $err) = run_cmd(\@cmd, $timeout);
  225. ok(-s $out,
  226. "$module_count: use $module generates non-zero binary")
  227. or $module_passed = 0;
  228. is($result, 0, "$module_count: use $module $opt exits with 0")
  229. or $module_passed = 0;
  230. $err =~ s/^Using .+blib\n//m if $] < 5.007;
  231. like($stdout, qr/ok$/ms, "$module_count: use $module $opt gives expected 'ok' output");
  232. #warn $stdout."\n" if $ENV{TEST_VERBOSE};
  233. #warn $err."\n" if $ENV{TEST_VERBOSE};
  234. unless ($stdout =~ /ok$/ms) { # crosscheck for a perlcc problem (XXX not needed anymore)
  235. warn "crosscheck without perlcc\n" if $ENV{TEST_VERBOSE};
  236. my ($r, $err1);
  237. $module_passed = 0;
  238. my $c_opt = $opts[$_];
  239. @cmd = ($runperl,split(/ /,$Mblib),"-MO=C,$c_opt,-o$out_c",$out_pl);
  240. #warn join(" ",@cmd."\n") if $ENV{TEST_VERBOSE};
  241. ($r, $stdout, $err1) = run_cmd(\@cmd, 60); # in secs
  242. my $cc_harness = cc_harness();
  243. @cmd = ($runperl,split(/ /,$Mblib." ".$cc_harness),,"-o$out",$out_c);
  244. #warn join(" ",@cmd."\n") if $ENV{TEST_VERBOSE};
  245. ($r, $stdout, $err1) = run_cmd(\@cmd, 360); # in secs
  246. @cmd = ($^O eq 'MSWin32' ? "$out" : "./$out");
  247. #warn join(" ",@cmd."\n") if $ENV{TEST_VERBOSE};
  248. ($r, $stdout, $err1) = run_cmd(\@cmd, 20); # in secs
  249. if ($stdout =~ /ok$/ms) {
  250. $module_passed = 1;
  251. diag "crosscheck that only perlcc $staticxs failed. With -MO=C + cc_harness => ok";
  252. }
  253. }
  254. log_pass($module_passed ? "pass" : "fail", $module, $TODO);
  255. if ($module_passed) {
  256. $pass++;
  257. } else {
  258. diag "Failed: $cmd -e 'use $module; print \"ok\"'";
  259. $fail++;
  260. }
  261. TODO: {
  262. local $TODO = 'STDERR from compiler warnings in work' if $err;
  263. is($err, '', "$module_count: use $module no error output compiling")
  264. && ($module_passed)
  265. or log_err($module, $stdout, $err)
  266. }
  267. }
  268. if ($do_test) {
  269. TODO: {
  270. local $TODO = 'all module tests';
  271. `$runperl $Mblib -It -MCPAN -Mmodules -e "CPAN::Shell->testcc("$module")"`;
  272. }
  273. }
  274. for ($out_pl, $out, $out_c, $out_c.".lst") {
  275. unlink $_ if -f $_ ;
  276. }
  277. }}
  278. }
  279. if (!$ENV{PERL_CORE}) {
  280. my $count = scalar @modules - $skip;
  281. log_diag("$count / $module_count modules tested with B-C-${B::C::VERSION} - "
  282. .$Config{usecperl}?"c":""."perl-$perlversion");
  283. log_diag(sprintf("pass %3d / %3d (%s)", $pass, $count, percent($pass,$count)));
  284. log_diag(sprintf("fail %3d / %3d (%s)", $fail, $count, percent($fail,$count)));
  285. log_diag(sprintf("todo %3d / %3d (%s)", $todo, $fail, percent($todo,$fail)));
  286. log_diag(sprintf("skip %3d / %3d (%s not installed)\n",
  287. $skip, $module_count, percent($skip,$module_count)));
  288. }
  289. exit;
  290. # t/todomod.pl
  291. # for t in $(cat t/top100); do perl -ne"\$ARGV=~s/log.modules-//;print \$ARGV,': ',\$_ if / $t\s/" t/modules.t `ls log.modules-5.0*|grep -v .err`; read; done
  292. # Moose was compilable with pre-ETHER releases, but then they forgot how phases
  293. # should work in modules.
  294. sub is_todo {
  295. my $module = shift or die;
  296. my $DEBUGGING = ($Config{ccflags} =~ m/-DDEBUGGING/);
  297. # ---------------------------------------
  298. #foreach(qw(
  299. # ExtUtils::CBuilder
  300. #)) { return 'overlong linking time' if $_ eq $module; }
  301. if ($] < 5.007) { foreach(qw(
  302. Sub::Name
  303. Test::Simple
  304. Test::Exception
  305. Storable
  306. Test::Tester
  307. Test::NoWarnings
  308. Moose
  309. Test::Warn
  310. Test::Pod
  311. Test::Deep
  312. FCGI
  313. MooseX::Types
  314. DateTime::TimeZone
  315. DateTime
  316. )) { return '5.6' if $_ eq $module; }}
  317. if ($] >= 5.008004 and $] < 5.0080006) { foreach(qw(
  318. Module::Pluggable
  319. )) { return '5.8.5 CopFILE_set' if $_ eq $module; }}
  320. if ($] <= 5.0080009) { foreach(qw(
  321. IO::Socket
  322. )) { return '5.8.9 empty Socket::AF_UNIX' if $_ eq $module; }}
  323. # PMOP quoting fixed with 1.45_14
  324. #if ($] < 5.010) { foreach(qw(
  325. # DateTime
  326. #)) { return '<5.10' if $_ eq $module; }}
  327. # restricted v_string hash?
  328. if ($] eq '5.010000') { foreach(qw(
  329. IO
  330. Path::Class
  331. DateTime::TimeZone
  332. )) { return '5.10.0 restricted hash/...' if $_ eq $module; }}
  333. # fixed between v5.15.6-210-g5343a61 and v5.15.6-233-gfb7aafe
  334. #if ($] > 5.015 and $] < 5.015006) { foreach(qw(
  335. # B::Hooks::EndOfScope
  336. #)) { return '> 5.15' if $_ eq $module; }}
  337. #if ($] >= 5.018) { foreach(qw(
  338. # ExtUtils::ParseXS
  339. #)) { return '>= 5.18 #137 Eval-group not allowed at runtime' if $_ eq $module; }}
  340. # DateTime fixed with 1.52_13
  341. # stringify fixed with 1.52_18
  342. if ($] >= 5.018) { foreach(qw(
  343. Path::Class
  344. )) { return '>= 5.18 #219 overload stringify regression' if $_ eq $module; }}
  345. # invalid free
  346. if ($] >= 5.022 and $] < 5.026 and !$Config{usecperl}) { foreach(qw(
  347. Test::Simple
  348. Test::Deep
  349. Test::Tester
  350. Test::NoWarnings
  351. Test::Pod
  352. )) { return '5.22-5.26 !cperl invalid free' if $_ eq $module; }}
  353. if ($] >= 5.022 and $] < 5.028 and !$Config{usecperl}) { foreach(qw(
  354. Test::Simple
  355. Test::Exception
  356. Test::Deep
  357. Test::Tester
  358. Test::NoWarnings
  359. Test::Pod
  360. )) { return '5.22-5.28 !cperl invalid free' if $_ eq $module; }}
  361. # old C-1.52_15
  362. #if ($] >= 5.022 and $] < 5.024 and $Config{usecperl}) { foreach(qw(
  363. # Class::Inspector
  364. # Data::OptList
  365. # File::Spec
  366. # File::Temp
  367. # ExtUtils::CBuilder
  368. # Params::Util
  369. # Tree::DAG_Node
  370. #)) { return '5.22 cperl' if $_ eq $module; }}
  371. # 1.53_08, 1.52_15
  372. if ($] >= 5.022 and $] < 5.024) { foreach(qw(
  373. ExtUtils::CBuilder
  374. )) { return '5.22' if $_ eq $module; }}
  375. # fixed with 1.56
  376. #if ($] >= 5.023005) { foreach(qw(
  377. # Attribute::Handlers
  378. # MooseX::Types
  379. #)) { return '>= 5.23.5 SEGV' if $_ eq $module; }}
  380. # Carp-like recursion on dynaload error
  381. if ($] >= 5.024 and $] < 5.026 and !$Config{usecperl}) { foreach(qw(
  382. List::MoreUtils
  383. DateTime::Locale
  384. )) { return '5.24 !cperl' if $_ eq $module; }}
  385. if ($] >= 5.024 and $Config{usecperl}) { foreach(qw(
  386. DateTime
  387. DateTime::Locale
  388. DateTime::TimeZone
  389. Moose
  390. Path::Class
  391. )) { return '>= 5.24 cperl (stringify overload #219?)' if $_ eq $module; }}
  392. # ---------------------------------------
  393. if ($Config{useithreads}) {
  394. if ($^O eq 'MSWin32') { foreach(qw(
  395. Test::Harness
  396. )) { return 'MSWin32 with threads' if $_ eq $module; }}
  397. if ($] >= 5.008008 and $] < 5.008009) { foreach(qw(
  398. Test::Tester
  399. )) { return '5.8.8 with threads' if $_ eq $module; }}
  400. if ($] >= 5.010 and $] < 5.011 and $DEBUGGING) { foreach(qw(
  401. Attribute::Handlers
  402. )) { return '5.10.1d with threads' if $_ eq $module; }}
  403. #if ($] >= 5.012 and $] < 5.014) { foreach(qw(
  404. # ExtUtils::CBuilder
  405. #)) { return '5.12 with threads' if $_ eq $module; }}
  406. if ($] >= 5.016 and $] < 5.018) { foreach(qw(
  407. Module::Build
  408. )) { return '5.16 threaded (out of memory)' if $_ eq $module; }}
  409. #if ($] >= 5.022) { foreach(qw(
  410. #)) { return '>= 5.22 with threads SEGV' if $_ eq $module; }}
  411. #if ($] >= 5.022) { foreach(qw(
  412. #)) { return '>= 5.22 with threads, no ok' if $_ eq $module; }}
  413. # but works with msvc
  414. if ($^O eq 'MSWin32' and $Config{cc} eq 'gcc') { foreach(qw(
  415. Pod::Usage
  416. )) { return 'mingw' if $_ eq $module; }}
  417. } else { #no threads --------------------------------
  418. #if ($] > 5.008008 and $] <= 5.009) { foreach(qw(
  419. # ExtUtils::CBuilder
  420. #)) { return '5.8.9 without threads' if $_ eq $module; }}
  421. # invalid free, fixed with 1.56
  422. #if ($] >= 5.016 and $] < 5.018) { foreach(qw(
  423. # Module::Build
  424. #)) { return '5.16 without threads (invalid free)' if $_ eq $module; }}
  425. if ($] >= 5.022 and $] < 5.026) { foreach(qw(
  426. Test::Pod
  427. )) { return '5.22 invalid free' if $_ eq $module; }}
  428. # This is a flapping test
  429. if ($] >= 5.017 and $] < 5.020) { foreach(qw(
  430. Moose
  431. )) { return '5.18 without threads' if $_ eq $module; }}
  432. #if ($] > 5.019) { foreach(qw(
  433. # MooseX::Types
  434. #)) { return '5.19 without threads' if $_ eq $module; }}
  435. }
  436. # ---------------------------------------
  437. }
  438. sub is_skip {
  439. my $module = shift or die;
  440. if ($] >= 5.011004) {
  441. #foreach (qw(Attribute::Handlers)) {
  442. # return 'fails $] >= 5.011004' if $_ eq $module;
  443. #}
  444. if ($Config{useithreads}) { # hangs and crashes threaded since 5.12
  445. foreach (qw( )) {
  446. # Old: Recursive inheritance detected in package 'Moose::Object' at /usr/lib/perl5/5.13.10/i686-debug-cygwin/DynaLoader.pm line 103
  447. # Update: Moose works ok with r1013
  448. return 'hangs threaded, $] >= 5.011004' if $_ eq $module;
  449. }
  450. }
  451. }
  452. #if ($ENV{PERL_CORE} and $] > 5.023
  453. # and ($Config{cc} =~ / -m32/ or $Config{ccflags} =~ / -m32/)) {
  454. # return 'hangs in CORE with -m32' if $module =~ /^Pod::/;
  455. #}
  456. # recursion stack SEGV on die (Carp <= DynaLoader)
  457. if ($] >= 5.026 and !$Config{usecperl} and $Carp::VERSION ge '1.42') { foreach(qw(
  458. Attribute::Handlers
  459. B::Hooks::EndOfScope
  460. Class::Accessor
  461. Class::C3
  462. Class::Inspector
  463. Class::MOP
  464. Clone
  465. Compress::Raw::Bzip2
  466. Compress::Raw::Zlib
  467. DBI
  468. Data::Dumper
  469. Data::OptList
  470. DateTime
  471. DateTime::Locale
  472. DateTime::TimeZone
  473. Digest::MD5
  474. Digest::SHA1
  475. Encode
  476. ExtUtils::CBuilder
  477. ExtUtils::Install
  478. ExtUtils::MakeMaker
  479. ExtUtils::Manifest
  480. ExtUtils::ParseXS
  481. FCGI
  482. File::Path
  483. File::Spec
  484. File::Temp
  485. Filter::Util::Call
  486. HTML::Parser
  487. if
  488. IO
  489. IO::Compress::Base
  490. IO::Scalar
  491. IO::String
  492. LWP
  493. MIME::Base64
  494. MRO::Compat
  495. Module::Build
  496. Module::Pluggable
  497. Moose
  498. MooseX::Types
  499. namespace::clean
  500. Params::Validate
  501. Pod::Text
  502. Scalar::Util
  503. Storable
  504. Sub::Exporter
  505. Sub::Identify
  506. Sub::Install
  507. Sub::Name
  508. Template::Stash
  509. Test::Deep
  510. Test::Harness
  511. Test::NoWarnings
  512. Test::Simple
  513. Text::Wrap
  514. Time::HiRes
  515. Tree::DAG_Node
  516. Try::Tiny
  517. Variable::Magic
  518. version
  519. XML::SAX
  520. YAML
  521. )) { return '>= 5.26 !cperl (Carp)' if $_ eq $module; }}
  522. }