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