The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# -*- mode: perl; coding: utf-8; tab-width: 4; -*-

use 5.008008;
use ExtUtils::MakeMaker;

use lib qw(./lib);
use Cv::Config;
my $cf = new Cv::Config;
my %with = ( QT => 0, T => 0 );

my @perl_h = qw(perl.h sv.h pp.h);
my @perl_h_patched = ();

{
	use Config;
	my $CORE = join('/', $Config{archlib}, 'CORE');
	foreach my $h (@perl_h) {
		if (open(PHI, "<$CORE/$h")) {
			my $patched = "lib/Cv/$h";
			open(PHO, ">$patched");
			while (<PHI>) {
				s/\bstruct\s+cv\b/struct STRUCT_CV/g;
				s/\bNORMAL\b/Perl_NORMAL/g;
				print PHO;
			}
			close PHO;
			close PHI;
			push(@perl_h_patched, $patched);
		}
	}
}


# make lib/Cv/Constant.pm
{
	use version;
	my $dst = "lib/Cv/Constant.pm";
	my $tmp = "a.pm";
	unless (&dumpconst('-v', '-o', $tmp, @{$cf->{include}}) == 0) {
		my $fallback = 'fallback/Constant.pm-';
		my $ver = version->parse(join('.', $cf->_version));
		my @ver = sort { $b <=> $a } grep { ref $_ && $_ <= $ver } map {
			/\d+(\.\d+)+/ && version->parse(my $v = $&) } glob("$fallback*");
		die "$0: can't make $dst\n" unless @ver;
		&cp("$fallback$ver[0]", $tmp);
	}
	if (!-f $dst || &cmp('-s', $tmp, $dst) != 0) {
		&mv($dst, "$dst.bak") if -f $dst;
		&cp($tmp, $dst);
	}
	&rm('-f', $tmp);
}


my $PREREQ_PM = {
	#Data::Dumper => 0,
	#Scalar::Util => 0,
	#File::Basename => 0,
	#List::Util => 0,
	#Time::HiRes => 0,
	ExtUtils::ParseXS => 3.07,
	#Cwd => 0,
};

if ($^O eq 'cygwin') {
	$PREREQ_PM = {
		%$PREREQ_PM,
		ExtUtils::MM_Cygwin => 6.62,
	};
}

WriteMakefile(
	NAME => 'Cv',
	VERSION_FROM => "lib/Cv.pm", # finds $VERSION
	PREREQ_PM => $PREREQ_PM,
	ABSTRACT_FROM => "lib/Cv.pm",
	AUTHOR => 'MASUDA Yuta <yuta.cpan@gmail.com>',
	LIBS => $cf->libs,
	CC => $cf->cc,
	LD => $cf->cc,
	XSOPT => '-C++ -hiertype',
	TYPEMAPS => $cf->typemaps,
	CCFLAGS => $cf->ccflags,
	DEFINE => join(' ', map { "-DWITH_$_=$with{$_}" } keys %with),
	dynamic_lib => $cf->dynamic_lib,
	clean => {
		FILES => [
			@perl_h_patched, 'lib/Cv/Constant.pm*', 'a.pm', '*.tmp',
			't/ref-*.pm', 'camera.xml', 'contours.xml', 'sample.avi',
			'_Inline', 'cover_db',
			] },
	);

sub MY::postamble {
	"
ref:
	./tools/ref2pl-all.pl |sh -x

const:
	./tools/dumpconst-all.pl |sh -x

cover:
	cover -delete
	-HARNESS_PERL_SWITCHES=-MDevel::Cover make test
	cover
	find cover_db -type d |xargs chmod +rx

";
}

sub AUTOLOAD {
	our $AUTOLOAD;
	(my $program = $AUTOLOAD) =~ s/.*:://;
	my @program = grep { -x $_ } (
		"./tools/$program.pl",
		"/usr/local/bin/$program",
		"/usr/bin/$program",
		"/bin/$program",
	);
	if (@program) {
		print STDERR join(' ', $program[0], @_), "\n";
		return system($program[0], @_);
	}
	die "$0: ?$program\n";
}