1use strict; 2use warnings; 3use ExtUtils::MakeMaker; 4use File::Spec; 5use Config; 6# [ src => @deps ] 7our @files = ( 8 # compiler files ######################################## 9 ['regcomp.c' => 'dquote.c', 'invlist_inline.h' ], 10 ['regcomp_invlist.c' => 'invlist_inline.h' ], 11 ['regcomp_study.c' ], 12 ['regcomp_trie.c' ], 13 ['regcomp_debug.c' ], 14 # execution engine files ################################ 15 ['regexec.c' => 'invlist_inline.h' ], 16 # misc files ############################################ 17 ['dquote.c' ], 18 ['invlist_inline.h' ], 19 ######################################################### 20); 21 22my @objects = 're$(OBJ_EXT)'; 23foreach my $tuple (@files) { 24 my $src_file = $tuple->[0]; 25 if ($src_file=~s/reg/re_/ and $src_file=~s/\.c/\$(OBJ_EXT)/) { 26 push @objects, $src_file; 27 } 28} 29 30my $defines = '-DPERL_EXT_RE_BUILD -DPERL_EXT_RE_DEBUG -DPERL_EXT'; 31my %args; 32for my $arg (@ARGV) { 33 $args{$1} = $2 if $arg =~ /^(\w+)=(.*)$/; 34} 35if ($args{LINKTYPE} eq "static") { 36 $defines .= ' -DPERL_EXT_RE_STATIC'; 37} 38 39my @libs; 40if ($^O eq 'cygwin' && $Config{usequadmath}) { 41 push @libs, qw(quadmath); 42} 43WriteMakefile( 44 NAME => 're', 45 @libs ? ( 'LIBS' => [ join(" ", map { "-l$_" } @libs) ] ) : (), 46 VERSION_FROM => 're.pm', 47 XSPROTOARG => '-noprototypes', 48 OBJECT => "@objects", 49 DEFINE => $defines, 50 clean => { FILES => '*$(OBJ_EXT) invlist_inline.h *.c ../../lib/re.pm' }, 51); 52 53package MY; 54sub upupfile { 55 File::Spec->catfile(File::Spec->updir, File::Spec->updir, $_[0]); 56} 57 58sub postamble { 59 my $postamble = ""; 60 61 foreach my $tuple (@::files) { 62 my ($file, @deps) = @$tuple; 63 my $src_file = upupfile($file); 64 my $target = $file; 65 $target =~ s/^reg/re_/; 66 $postamble .= 67 <<EOF; 68$target : $src_file 69 - \$(RM_F) $target 70 \$(CP) $src_file $target 71 72EOF 73 next if $target eq $file; 74 my $base_name = $target; 75 if ($base_name=~s/\.c\z//) { 76 $postamble .= <<EOF 77$base_name\$(OBJ_EXT) : $target @deps 78 79EOF 80 } 81 } 82 return $postamble 83} 84 85sub MY::c_o { 86 my($self) = @_; 87 package MY; # so that "SUPER" works right 88 my $inh = $self->SUPER::c_o(@_); 89 use Config; 90 if ($Config{osname} eq 'aix' && $Config{ccversion} eq '5.0.1.0') { 91 # Known buggy optimizer. 92 my $cccmd = $self->const_cccmd; 93 $cccmd =~ s/^CCCMD\s*=\s*//; 94 $cccmd =~ s/\s\$\(OPTIMIZE\)\s/ /; 95 $inh .= qq{ 96 97re_comp\$\(OBJ_EXT\): re_comp.c 98\t$cccmd \$(CCCDLFLAGS) -I\$(PERL_INC) \$(DEFINE) \$*.c 99}; 100 } 101 $inh; 102} 103