1# $Id$
2package MY;
3use ExtUtils::MakeMaker;
4use Config;
5
6my ( $gencls, $i, $d, $l, $co) = ('gencls', '','','','');
7my $severe = grep { $_ eq '--severe' } @ARGV;
8@ARGV      = grep { $_ ne '--severe' } @ARGV;
9eval {
10	require Prima::Config;
11	$d  = $Prima::Config::Config{define};
12	$i  = "$Prima::Config::Config{inc} -Iinclude -Iinclude/generic";
13	$l  = $Prima::Config::Config{libs};
14	$co = $Prima::Config::Config{cobjflag};
15	$gencls = $Prima::Config::Config{gencls};
16};
17if ( $@) {
18	warn "** Prima is required for build\n";
19	if ( $severe) {
20		unlink 'Makefile';
21		exit 1;
22	}
23	$prima_failed = 1;
24}
25
26$prima_failed = 1 if @ARGV;
27
28my @files = map {
29	s/\.c$//;
30	m/([^\\\/]*)$/;
31	{ src => $_, name => $1 }
32} <*.c>, <*/*.c>;
33
34$_-> {is_class} = 1 for grep { -f $_-> {src} . '.cls' } @files;
35
36# non-class c files may require h/inc from gencls build
37@files = (
38	(grep { $_-> {is_class}     } @files),
39	(grep { not $_-> {is_class} } @files),
40);
41
42my $o = $Config{obj_ext};
43
44sub post_initialize
45{
46	my $self = shift;
47	my $t = $self->SUPER::post_initialize(@_);
48	$t = <<PRE if $prima_failed;
49
50ipa_init_state:
51	$^X Makefile.PL --severe
52	$Config{make}
53
54PRE
55	return $t;
56}
57
58sub postamble
59{
60	my $self = shift;
61	my $t = $self->SUPER::postamble(@_);
62
63	for ( @files) {
64		next unless $_-> {is_class};
65		my ( $n, $c) = ( $_-> {name}, $_-> {src});
66	  	$t .= <<H
67
68include/generic/$n.h: Makefile $c.cls
69\t$gencls --inc --h $c.cls include/generic
70
71$c$o: Makefile $c.c include/IPAsupp.h include/generic/$n.h include/generic/$n.inc
72
73H
74	}
75
76	return $t;
77}
78
79sub c_o
80{
81	my $t = shift-> SUPER::c_o(@_);
82	unless ( $t =~ /\.c\$\(OBJ_EXT\)\s*:\n\t.*\Q\$\*\$\(OBJ_EXT\)\E/ ) {
83		$t =~ s/(\.c\$\(OBJ_EXT\)\s*:\n\t.*)/$1 $co\$*\$(OBJ_EXT)/;
84	}
85	return $t;
86}
87
88sub clean
89{
90	my $self = shift;
91	my $t = $self->SUPER::clean(@_);
92	$t .= "\t\$(RM_F) " . join( ' ',
93		map  { "include/generic/$_" }
94		map  { $_-> {name} . '.h', $_-> {name} . '.inc' }
95		grep { $_-> {is_class} }
96		@files) .
97		"\n";
98	$t .= "\t\$(RM_F) " . join( ' ',
99		map { $_-> {src} . $o }
100		@files);
101	return $t;
102}
103
104
105WriteMakefile(
106	NAME              => 'IPA',
107	VERSION_FROM      => 'IPA.pm',
108	PREREQ_PM         => {
109		'Prima'		=> 1.24,
110	},
111	ABSTRACT_FROM     => 'IPA.pm',
112	AUTHOR            => 'Dmitry Karasik <dmitry@karasik.eu.org>',
113	LIBS              => [ $l ],
114	DEFINE            => $d,
115	INC               => $i,
116	OBJECT            => join(' ', map { $_->{src} . '$(OBJ_EXT)' } @files),
117	PM                => {
118		# PM
119		'IPA.pm'  	                          => '$(INST_LIBDIR)/IPA.pm',
120		'Global/Region.pm'  	                  => '$(INST_LIBDIR)/IPA/Region.pm',
121		( map  { ( "$_->{src}.pm"                 => "\$(INST_LIBDIR)/IPA/$_->{name}.pm" ) }
122		grep { $_-> {is_class} }
123		@files),
124		# IPA HEADERS
125		'include/IPAsupp.h'  	                  => '$(INST_LIBDIR)/IPA/CORE/IPAsupp.h',
126		( map  { ( "include/generic/$_->{name}.h" => "\$(INST_LIBDIR)/IPA/CORE/generic/$_->{name}.h" ) }
127		grep { $_-> {is_class} }
128		@files),
129		# CLASS HEADERS
130		( map { ( $_                              => '$(INST_LIBDIR)/IPA/' . $_ ) }
131		map  { glob "$_->{name}/*.h" }
132		grep { $_-> {is_class} }
133		@files),
134	},
135	EXE_FILES         => ['bin/iterm'],
136	MAN3PODS          => {
137		'IPA.pm'                                  => '$(INST_MAN3DIR)/IPA.$(MAN3EXT)',
138		'Global/Region.pm'                        => '$(INST_MAN3DIR)/IPA::Region.$(MAN3EXT)',
139		# MANPAGES
140		( map { ( "$_->{src}.pm"                  => "\$(INST_MAN3DIR)/IPA::$_->{name}.\$(MAN3EXT)") }
141		grep { $_-> {is_class} }
142		@files),
143	},
144);
145