From: Florian Ragwitz Date: Mon, 1 Oct 2012 01:05:32 +0000 (+0900) Subject: Attempt to extract the refcounted_he definition X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=f21502d1a7637db65cf3aa324df50522653d018f;p=p5sagit%2FDevel-Size.git Attempt to extract the refcounted_he definition Not all perls have this structure, so some compatibility checks will have to be added later. We can't easily reuse the definition from hv.h unless we define PERL_CORE, which will break loads of other code we currently have. --- diff --git a/.gitignore b/.gitignore index 1fbab34..eabf248 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ Makefile Makefile.old Memory.[co] Memory.bs +refcounted_he.h diff --git a/Makefile.PL b/Makefile.PL index 3ade9a8..6469edd 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -1,6 +1,7 @@ #!/usr/bin/perl -w use 5.005; use ExtUtils::MakeMaker; +use File::Spec::Functions 'catfile'; use strict; use Config; @@ -8,6 +9,11 @@ use Config; or die "Your pointer size of $Config{ptrsize} is very confusing"; my $ptr_bits = length $1; +write_header( + 'refcounted_he.h' => + extract_refcounted_he(catfile($Config{archlib}, 'CORE', 'hv.h')) +); + WriteMakefile( OPTIMIZE => "-g", NAME => 'Devel::Memory', @@ -23,6 +29,36 @@ WriteMakefile( ORLite => 0, }, EXE_FILES => [ 'bin/dmemtree.pl' ], + clean => { + FILES => 'refcounted_he.h', + }, (eval $ExtUtils::MakeMaker::VERSION >= 6.47 ? (MIN_PERL_VERSION => '5.005') : ()), (eval $ExtUtils::MakeMaker::VERSION >= 6.31 ? (LICENSE => 'perl') : ()), ); + +sub extract_refcounted_he { + my ($header) = @_; + open my $fh, '<', $header or die $!; + + my $def; + while (<$fh>) { + next unless /struct refcounted_he \{/ .. /\};/; + $def .= $_; + } + close $fh or die $!; + + return $def; +} + +sub write_header { + my ($filename, $contents) = @_; + my $guard_name = uc $filename; + $guard_name =~ tr/./_/; + + open my $fh, '>', $filename or die $!; + print { $fh } "#ifndef ${guard_name}\n"; + print { $fh } "#define ${guard_name}\n"; + print { $fh } $contents or die $!; + print { $fh } "#endif /* ${guard_name} */\n"; + close $fh or die $!; +}