use 5.007; use open IO => ':bytes'; use Cwd; use Config; no lib '.'; BEGIN { $IsWin32 = ($^O eq 'MSWin32' || $Config{'ccflags'} =~ /-D_?WIN32_?/); $xtra = ""; if ($Config{myuname} =~ /\bredhat\.com\b/ && $ENV{LANG} =~ /\.UTF-8/) { warn "RedHat perl in UTF-8 locale may not build Tk\n"; } open(M, "Tk.pm") or die "Can't open Tk.pm for reading VERSION: $!"; while() { if (/\$Tk::VERSION\s+=\s+'([0-9._]+)'/) { $VERSION = $1; last; } } close M; if (!defined $VERSION) { die "Can't find \$Tk::VERSION in Tk.pm"; } $win_arch = shift @ARGV if @ARGV and $ARGV[0] =~ /^(open32|pm|x|MSWin32)$/; require('fix_4_os2.pl'), OS2_massage() if $^O eq 'os2'; $win_arch = ($IsWin32 or $^O eq 'cygwin') ? 'MSWin32' : 'x' if not defined $win_arch; # Currently 'x', 'pm', 'open32', 'MSWin32' require "./myConfig"; use lib ($Tk::MMutil::dir=getcwd); } use Tk::MMutil; if ($IsWin32) { *MY::makeaperl = \&makeWin32perl; @libs = ('-lcomctl32 -limm32'); } else { my $plibs = $Config{'libs'}; my $libs = "$xlib -lX11$xtra"; # Used to have -lpt in here as well. my @try = qw(-lsocket -lnsl -lm); push(@try,'-lc') if $^O =~ /svr4/i; my $lib; # perl needs sockets and math library too # so only include these if they made it through perl's Configure foreach $lib (@try) { $libs .= " $lib" if ($plibs =~ /$lib\b/); } @libs = ("$libs"); } my $dir = Tk::MMutil::find_subdir(); delete $dir->{'pTk'}; Tk::MMutil::TkExtMakefile( 'VERSION' => $VERSION, 'EXE_FILES' => [qw(ptksh ptked gedi)], 'NAME' => 'Tk', 'DIR' => ['pTk',reverse(sort(keys %$dir))], 'DISTNAME' => "Tk", 'MYEXTLIB' => 'pTk/libpTk$(LIB_EXT)' . ($win_arch =~ /^(open32|pm)$/ ? ' pTk/dllInit$(LIB_EXT)' : ''), 'LIBS' => \@libs, 'OBJECT' => '$(O_FILES)', 'clean' => { FILES => 'pTk/tkConfig.h Tk/Config.pm' }, @macro ); sub MY::top_targets { my ($self) = @_; my $str = $self->MM::top_targets; $str =~ s/\bmanifypods\b/html/g; return $str; } sub MY::post_initialize { my ($self) = @_; my ($ret) = ''; my %files = (); my $dir = $self->catdir('$(INST_ARCHLIBDIR)','Tk'); my $name; foreach $name (grep /(%|\.q4|\.bck|\.old)$/,keys %{$self->{PM}}) { delete $self->{PM}->{$name}; } delete $self->{PM}->{'Tk/Config.pm'}; $self->{PM}->{'Tk/Config.pm'} = $self->catfile($dir,'Config.pm'); # $files{'typemap'} = 1; foreach $name ($self->lsdir(".")) { next if ($name =~ /^\./); next unless (-f $name); $files{$name} = 1 if ($name =~ /\.[tm]$/); $files{$name} = 1 if ($name =~ /\.def$/); } foreach $name (sort(@{$self->{H}},keys %files)) { $self->{PM}->{$name} = $self->catfile($dir,$name); } if ($IsWin32) { if ($Config{cc} =~ /^bcc/i) { $ret .= "\nRESFILES = pTk\\tk.res\n"; } else { push(@{$self->{'O_FILES'}}, ($Config{'cc'} =~ /^gcc/i) ? 'pTk\\tkres$(OBJ_EXT)' : 'pTk\\tk.res'); } } if ($win_arch eq 'MSWin32' and $^O eq 'cygwin') { push(@{$self->{'O_FILES'}}, 'pTk/tkres$(OBJ_EXT)'); } $ret; } sub needs_Test { my $file = shift; local $_; unless (open(TFILE,"$file")) { warn "Cannot open $file:$!"; return 1; } my $code = 0; while () { last if ($code = /^\s*(use|require)\s+Test\b/); } close(TFILE); warn "Skipping test $file needs 'Test.pm':$_" if $code; return $code; } sub MY::test { my ($self,%attrib) = @_; my @tests = sort glob($self->catfile('t','*.t')); eval { require Test }; if ($@) { @tests = grep(!needs_Test($_),@tests); } $attrib{'TESTS'} = join(' ',@tests); # Temporarily remove sub-dirs from $self as we 'know' # there are no tests down there my $dir = delete $self->{'DIR'}; my @td; foreach my $sd (@$dir) { my @tests = sort glob($self->catfile($sd,'t','*.t')); if (@tests) { warn "Tests in $sd\n"; push(@td,$sd); } } if (@td) { $self->{DIR} = \@td; } my $str = $self->MM::test(%attrib); # Put sub-dirs back $self->{'DIR'} = $dir; return $str; } sub MY::postamble { my $str = ' html : subdirs manifypods @cd pod && $(MAKE) html $(PASTHRU) config :: tkGlue.t tkGlue.m @$(NOOP) $(BASEEXT)$(OBJ_EXT) : tkGlue.h Makefile : myConfig tkGlue.t : tkGlue.h pTk/mkVFunc $(PERL) pTk/mkVFunc -t $(WINARCH) tkGlue.h tkGlue.m : tkGlue.h pTk/mkVFunc $(PERL) pTk/mkVFunc -m $(WINARCH) tkGlue.h $(MYEXTLIB) : config FORCE cd pTk && $(MAKE) DEFINE="$(DEFINE)" perlmain.c : config Makefile pTk/tk.res : $(MYEXTLIB) basic : $(INST_DYNAMIC) pm_to_blib MANIFEST : MANIFEST.SKIP $(FIRST_MAKEFILE) $(MAKE) manifest '; $str =~ s/DEFINE=.*// if($^O eq 'cygwin'); $str; }