/usr/local/CPAN/IPA/Makefile.PL


# $Id$
package MY;
use ExtUtils::MakeMaker;
use Config;

my ( $gencls, $i, $d, $l, $co) = ('gencls', '','','','');
my $severe = grep { $_ eq '--severe' } @ARGV;
@ARGV      = grep { $_ ne '--severe' } @ARGV;
eval { 
	require Prima::Config;
	$d  = $Prima::Config::Config{define};
	$i  = "$Prima::Config::Config{inc} -Iinclude -Iinclude/generic";
	$l  = $Prima::Config::Config{libs};
	$co = $Prima::Config::Config{cobjflag};
	$gencls = $Prima::Config::Config{gencls};
};
if ( $@) {
	warn "** Prima is required for build\n";
	if ( $severe) {
		unlink 'Makefile';
		exit 1;
	}
	$prima_failed = 1;
}

$prima_failed = 1 if @ARGV;

my @files = map {
	s/\.c$//;
	m/([^\\\/]*)$/;
	{ src => $_, name => $1 }
} <*.c>, <*/*.c>;

$_-> {is_class} = 1 for grep { -f $_-> {src} . '.cls' } @files;

# non-class c files may require h/inc from gencls build
@files = (
	(grep { $_-> {is_class}     } @files),
	(grep { not $_-> {is_class} } @files),
);

my $o = $Config{obj_ext};

sub post_initialize
{
	my $self = shift;
	my $t = $self->SUPER::post_initialize(@_);
	$t = <<PRE if $prima_failed;

ipa_init_state:
	$^X Makefile.PL --severe
	$Config{make}

PRE
	return $t;
}

sub postamble
{
	my $self = shift;
	my $t = $self->SUPER::postamble(@_);
	
	for ( @files) {
		next unless $_-> {is_class};
		my ( $n, $c) = ( $_-> {name}, $_-> {src});
	  	$t .= <<H

include/generic/$n.h: Makefile $c.cls
\t$gencls --inc --h $c.cls include/generic

$c$o: Makefile $c.c include/IPAsupp.h include/generic/$n.h include/generic/$n.inc

H
	}

	return $t;
}

sub c_o
{
	my $t = shift-> SUPER::c_o(@_);
	unless ( $t =~ /.c\$\(OBJ_EXT\):\n\t.*\$\*\$\(OBJ_EXT\)/ ) {
		$t =~ s/(\.c\$\(OBJ_EXT\):\n\t.*)/$1 $co\$*\$(OBJ_EXT)/;
	}
	return $t;
}

sub clean
{
	my $self = shift;
	my $t = $self->SUPER::clean(@_);
	$t .= "\t\$(RM_F) " . join( ' ', 
		map  { "include/generic/$_" } 
		map  { $_-> {name} . '.h', $_-> {name} . '.inc' } 
		grep { $_-> {is_class} }
		@files) .
		"\n";
	$t .= "\t\$(RM_F) " . join( ' ', 
		map { $_-> {src} . $o }
		@files);
	return $t;
}


WriteMakefile(
	NAME              => 'IPA',
	VERSION_FROM      => 'IPA.pm',
	PREREQ_PM         => {
		'Prima'		=> 1.24,
	},
	ABSTRACT_FROM     => 'IPA.pm',
	AUTHOR            => 'Dmitry Karasik <dmitry@karasik.eu.org>',
	LIBS              => [ $l ],
	DEFINE            => $d,
	INC               => $i,
	OBJECT            => join(' ', map { $_->{src} . '$(OBJ_EXT)' } @files),
	PM                => {
		# PM
		'IPA.pm'  	                          => '$(INST_LIBDIR)/IPA.pm',
		'Global/Region.pm'  	                  => '$(INST_LIBDIR)/IPA/Region.pm',
		( map  { ( "$_->{src}.pm"                 => "\$(INST_LIBDIR)/IPA/$_->{name}.pm" ) }
		grep { $_-> {is_class} }
		@files),
		# IPA HEADERS
		'include/IPAsupp.h'  	                  => '$(INST_LIBDIR)/IPA/CORE/IPAsupp.h',
		( map  { ( "include/generic/$_->{name}.h" => "\$(INST_LIBDIR)/IPA/CORE/generic/$_->{name}.h" ) }
		grep { $_-> {is_class} }
		@files),
		# CLASS HEADERS
		( map { ( $_                              => '$(INST_LIBDIR)/IPA/' . $_ ) }
		map  { glob "$_->{name}/*.h" }
		grep { $_-> {is_class} }
		@files),
	},
	EXE_FILES         => ['bin/iterm'],
	MAN3PODS          => {
		'IPA.pm'                                  => '$(INST_MAN3DIR)/IPA.$(MAN3EXT)',
		'Global/Region.pm'                        => '$(INST_MAN3DIR)/IPA::Region.$(MAN3EXT)',
		# MANPAGES
		( map { ( "$_->{src}.pm"                  => "\$(INST_MAN3DIR)/IPA::$_->{name}.\$(MAN3EXT)") } 
		grep { $_-> {is_class} }
		@files),
	},
);