|
Packit |
f4e178 |
# -*- cperl -*-
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
use strict;
|
|
Packit |
f4e178 |
use warnings;
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
use Test::More;
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
use Config::AutoConf;
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
END
|
|
Packit |
f4e178 |
{
|
|
Packit |
f4e178 |
foreach my $f (<config*.*>)
|
|
Packit |
f4e178 |
{
|
|
Packit |
f4e178 |
-e $f and unlink $f;
|
|
Packit |
f4e178 |
}
|
|
Packit |
f4e178 |
}
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
## OK, we really hope people have sdtio.h around
|
|
Packit |
f4e178 |
ok(Config::AutoConf->check_header("stdio.h")) or plan skip_all => "No working compile environment";
|
|
Packit |
f4e178 |
ok(!Config::AutoConf->check_header("astupidheaderfile.h"));
|
|
Packit |
f4e178 |
is(Config::AutoConf->check_headers("astupidheaderfile.h", "stdio.h"), "stdio.h");
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
# check several headers at once
|
|
Packit |
f4e178 |
my $ac = Config::AutoConf->new(logfile => "config2.log");
|
|
Packit |
f4e178 |
eval { $ac->check_default_headers(); };
|
|
Packit |
f4e178 |
ok(!$@, "check_default_headers") or diag($@);
|
|
Packit |
f4e178 |
## we should find at least a stdio.h ...
|
|
Packit |
f4e178 |
note("Checking for cache value " . $ac->_cache_name("stdio.h"));
|
|
Packit |
f4e178 |
ok($ac->cache_val($ac->_cache_name("stdio.h")), "found stdio.h");
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
# some complex header tests for wide OS support
|
|
Packit |
f4e178 |
eval { $ac->check_dirent_header(); };
|
|
Packit |
f4e178 |
ok(!$@, "check_dirent_header") or diag($@);
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
# check predeclared symbol
|
|
Packit |
f4e178 |
# as we test a perl module, we expect perl.h available and suitable
|
|
Packit |
f4e178 |
my $include_perl = "#include <EXTERN.h>\n#include <perl.h>";
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
SKIP:
|
|
Packit |
f4e178 |
{
|
|
Packit |
f4e178 |
skip "Constants not defined on this Perl version", 2 if $] <= 5.01000;
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
ok $ac->check_decl("PERL_VERSION_STRING", {prologue => $include_perl}), "PERL_VERSION_STRING declared";
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
ok $ac->check_decls(
|
|
Packit |
f4e178 |
[qw(PERL_API_REVISION PERL_API_VERSION PERL_API_SUBVERSION)],
|
|
Packit |
f4e178 |
{prologue => $ac->_default_includes_with_perl}
|
|
Packit |
f4e178 |
),
|
|
Packit |
f4e178 |
"PERL_API_* declared";
|
|
Packit |
f4e178 |
}
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
ok $ac->check_decl("perl_parse(PerlInterpreter *, XSINIT_t , int , char** , char** )", {prologue => $include_perl}),
|
|
Packit |
f4e178 |
"perl_parse() declared";
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
SCOPE:
|
|
Packit |
f4e178 |
{
|
|
Packit |
f4e178 |
# test outside cache control
|
|
Packit |
f4e178 |
local $ENV{ac_cv_type_complete_useless_datatype} = 1;
|
|
Packit |
f4e178 |
ok $ac->check_type("complete_useless_datatype"), "External overwritten type test";
|
|
Packit |
f4e178 |
}
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
# check declared types
|
|
Packit |
f4e178 |
ok $ac->check_type("I32", {prologue => $include_perl}), "I32 is valid type";
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
ok $ac->check_types(["SV *", "AV *", "HV *"], {prologue => $include_perl}), "[SAH]V * are valid types";
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
# check size of perl types
|
|
Packit |
f4e178 |
my $typesize = $ac->check_sizeof_type("I32", {prologue => $include_perl});
|
|
Packit |
f4e178 |
ok $typesize, "I32 has size of " . ($typesize ? $typesize : "n/a") . " bytes";
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
ok $ac->check_sizeof_types(["I32", "SV *", "AV", "HV *", "SV.sv_refcnt"], {prologue => $include_perl}),
|
|
Packit |
f4e178 |
"Could determined sizes for I32, SV *, AV, HV *, SV.sv_refcnt";
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
my $compute = $ac->compute_int("-sizeof(I32)", {prologue => $include_perl});
|
|
Packit |
f4e178 |
cmp_ok($compute, "==", 0 - $typesize, "Compute (-sizeof(I32))");
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
# check perl data structure members
|
|
Packit |
f4e178 |
ok $ac->check_member("struct av.sv_any", {prologue => $include_perl}), "have struct av.sv_any member";
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
ok $ac->check_members(["struct hv.sv_any", "struct STRUCT_SV.sv_any"], {prologue => $include_perl}),
|
|
Packit |
f4e178 |
"have struct hv.sv_any and struct STRUCT_SV.sv_any members";
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
my $struct_in_struct_prlg = <
|
|
Packit |
f4e178 |
struct S1 {
|
|
Packit |
f4e178 |
int i;
|
|
Packit |
f4e178 |
int j;
|
|
Packit |
f4e178 |
};
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
struct S2 {
|
|
Packit |
f4e178 |
struct S2 *next;
|
|
Packit |
f4e178 |
struct S1 s1;
|
|
Packit |
f4e178 |
};
|
|
Packit |
f4e178 |
EOP
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
ok $ac->check_member("struct S2.s1", {prologue => $struct_in_struct_prlg}), "have struct S2.s1 member";
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
# check aligning
|
|
Packit |
f4e178 |
ok $ac->check_alignof_type("I32", {prologue => $include_perl}), "Align of I32";
|
|
Packit |
f4e178 |
ok $ac->check_alignof_type("SV.sv_refcnt", {prologue => $include_perl}), "Align of SV.sv_refcnt";
|
|
Packit |
f4e178 |
ok $ac->check_alignof_types(["I32", "U32", "AV", "HV *", "SV.sv_refcnt"], {prologue => $include_perl}),
|
|
Packit |
f4e178 |
"Could determine the sizes of I32, U32, AV, HV *, SV.sv_refcnt";
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
#
|
|
Packit |
f4e178 |
# Let's take REGEXP structure members as of perlreapi to test check_members
|
|
Packit |
f4e178 |
#
|
|
Packit |
f4e178 |
my @members =
|
|
Packit |
f4e178 |
qw/jdd jdd2 engine mother_re extflags minlen minlenret gofs substrs nparens intflags pprivate lastparen lastcloseparen swap offs subbeg saved_copy sublen suboffset subcoffset prelen precomp wrapped wraplen seen_evals paren_names refcnt/;
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
ok(
|
|
Packit |
f4e178 |
$ac->check_members(
|
|
Packit |
f4e178 |
[map { "struct regexp.$_" } @members],
|
|
Packit |
f4e178 |
{
|
|
Packit |
f4e178 |
prologue => "#include \"EXTERN.h\"
|
|
Packit |
f4e178 |
#include \"perl.h\"
|
|
Packit |
f4e178 |
#include \"XSUB.h\""
|
|
Packit |
f4e178 |
}
|
|
Packit |
f4e178 |
),
|
|
Packit |
f4e178 |
"Check struct regexp"
|
|
Packit |
f4e178 |
);
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
Config::AutoConf->write_config_h();
|
|
Packit |
f4e178 |
ok(-f "config.h", "default config.h created");
|
|
Packit |
f4e178 |
my $fsize;
|
|
Packit |
f4e178 |
ok($fsize = (stat("config.h"))[7], "config.h contains content");
|
|
Packit |
f4e178 |
$ac->write_config_h();
|
|
Packit |
f4e178 |
ok(-f "config.h", "default config.h created");
|
|
Packit |
f4e178 |
cmp_ok((stat("config.h"))[7], ">", $fsize, "2nd config.h is bigger than first (more checks made)");
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
my ($fh, $fbuf, $dbuf);
|
|
Packit |
f4e178 |
open($fh, "<", "config.h");
|
|
Packit |
f4e178 |
{ local $/; $fbuf = <$fh>; }
|
|
Packit |
f4e178 |
close($fh);
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
if ($] < 5.008)
|
|
Packit |
f4e178 |
{
|
|
Packit |
f4e178 |
require IO::String;
|
|
Packit |
f4e178 |
$fh = IO::String->new($dbuf);
|
|
Packit |
f4e178 |
}
|
|
Packit |
f4e178 |
else
|
|
Packit |
f4e178 |
{
|
|
Packit |
f4e178 |
open($fh, "+>", \$dbuf);
|
|
Packit |
f4e178 |
}
|
|
Packit |
f4e178 |
$ac->write_config_h($fh);
|
|
Packit |
f4e178 |
close($fh);
|
|
Packit |
f4e178 |
$fh = undef;
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
cmp_ok($dbuf, "eq", $fbuf, "file and direct write computes equal");
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
like($dbuf, qr/COMPLETE_USELESS_DATATYPE/, "complete_useless_datatype in config.h even if injected");
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
TODO:
|
|
Packit |
f4e178 |
{
|
|
Packit |
f4e178 |
-f "META.yml" or $ENV{AUTOMATED_TESTING} = 1;
|
|
Packit |
f4e178 |
local $TODO = "Quick fix: TODO - analyse diag later" unless $ENV{AUTOMATED_TESTING};
|
|
Packit |
f4e178 |
my @old_logfh;
|
|
Packit |
f4e178 |
$dbuf = "";
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
if ($] < 5.008)
|
|
Packit |
f4e178 |
{
|
|
Packit |
f4e178 |
$fh = IO::String->new($dbuf);
|
|
Packit |
f4e178 |
}
|
|
Packit |
f4e178 |
else
|
|
Packit |
f4e178 |
{
|
|
Packit |
f4e178 |
open($fh, "+>", \$dbuf);
|
|
Packit |
f4e178 |
}
|
|
Packit |
f4e178 |
@old_logfh = @{$ac->{logfh}};
|
|
Packit |
f4e178 |
$ac->add_log_fh($fh);
|
|
Packit |
f4e178 |
cmp_ok(scalar @{$ac->{logfh}}, "==", 2, "Successfully added 2nd loghandle");
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
ok($ac->check_compile_perlapi(), "Could compile perl extensions") or diag($dbuf);
|
|
Packit |
f4e178 |
scalar @old_logfh and $ac->delete_log_fh($fh);
|
|
Packit |
f4e178 |
scalar @old_logfh and is_deeply(\@old_logfh, $ac->{logfh}, "add_log_fh/delete_log_fh");
|
|
Packit |
f4e178 |
defined $fh and close($fh);
|
|
Packit |
f4e178 |
$fh = undef;
|
|
Packit |
f4e178 |
}
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
SCOPE:
|
|
Packit |
f4e178 |
{
|
|
Packit |
f4e178 |
local $ENV{ac_cv_insane_h} = "/usr/include/insane.h";
|
|
Packit |
f4e178 |
my $insane_h = $ac->check_header("insane.h");
|
|
Packit |
f4e178 |
is($insane_h, $ENV{ac_cv_insane_h}, "Cache override for header files work");
|
|
Packit |
f4e178 |
}
|
|
Packit |
f4e178 |
|
|
Packit |
f4e178 |
done_testing;
|