# -*- cperl -*- require 5.00404; my $path = "$Config{'archlibexp'}/CORE/perl.h"; die "Cannot find '$path' have you installed $^X?\n" unless (-r $path); print "$^X is installed in $Config{'archlibexp'} okay\n"; use Config; use Cwd; warn "No VERSION" unless (defined $VERSION); my %define = (); $inc = ""; $xlib = ""; $define = ''; $gccopt = ""; @macro = ( macro => {} ); if (defined $Config{'gccversion'}) { $ver = $Config{'gccversion'}; if( $ver ge "2.8" ) { # retain author's favourite warnings if using gcc $gccopt .= " -ggdb -Wall -Wno-implicit-int -Wno-comment -Wno-unused -D__USE_FIXED_PROTOTYPES__"; eval { if ((getpwuid($<))[6] =~ /Nick\s+Ing-Simmons/) { # This is the author - catch as many bugs as possible $gccopt .= " -MMD -Werror"; @macro = ( macro => { INSTALLDIRS => 'perl' }); } }; } # else{ $define .= ' -g ' } } if ($] >= 5.005) { # Add PPM support stuff push(@macro, ABSTRACT => 'Tk::tkTable - a Spreadsheet/Table Widget', AUTHOR => 'jcerney@home.com (John Cerney)' ); my $arch = ($^O eq 'MSWin32') ? $ENV{'PROCESSOR_ARCHITECTURE'} : $Config{'archname'}; push(@ARGV,"BINARY_LOCATION=$arch/Tk$VERSION-PPM.tar.gz"); warn "PPM for perl$]\n"; } else { warn "No PPM for perl$]\n"; } $macro[1]->{WINARCH} = $win_arch; # # Convert perls Config info into -DXXXX for Tk # $define{'USE_PROTOTYPE'} = 1 if ($Config{'prototype'}); $define{'HAVE_UNISTD_H'} = 1 if ($Config{'i_unistd'}); $define{'HAVE_SYS_SELECT_H'} = 1 if ($Config{'i_sysselct'}); $define{'NO_STDLIB_H'} = 1 unless ($Config{'i_stdlib'}); $define{'HAVE_SYS_TIME_H'} = 1 if ($Config{'i_systime'}); $define{'HAVE_LIMITS_H'} = 1 if ($Config{'i_limits'}); $define{'HAS_STDARG'} = 1 if ($Config{'i_stdarg'}); $define{'USE_BCOPY'} = 1 if (!$Config{'d_memmove'} && $Config{'d_bcopy'}); if (defined $Config{'selecttype'}) { my $type = $Config{'selecttype'}; $type =~ s/\s*\*\s*$//; $define{'SELECT_MASK'} = $type; } if (!$Config{'i_unistd'} && defined $Config{'lseektype'}) { my $type = $Config{'lseektype'}; $type =~ s/\s*\*\s*$//; $define{'LSEEK_TYPE'} =$type; } my $voidflags = $Config{'voidflags'}; my $voidused = $Config{'defvoidused'}+0; $define{'NOVOID'} = 1 if (($voidflags & $voidused) != $voidused); $define{'NOCONST'} = 1 unless ($Config{'d_const'}); # # Hunt down X Library - first a function # sub lX11 { my $user = shift; foreach (@_) { # allow any of libX11.a libX11.so.* etc. if (-d $_) { local ($lib); my $pattern = "$_/libX11.*"; $pattern .= " $_/X11$Config::Config{lib_ext}" if $Config::Config{osname} eq 'os2'; foreach $lib (reverse(<$ {pattern}>)) { if (-r $lib) { print "Using -L$_ to find $lib\n"; return "-L$_"; } } } } print "No -lX11 in ",join(' ',@_),"\n" if (@_ && $user); return undef; } sub IX11 { foreach (@_) { if (-d $_ && -d "$_/X11" && -r "$_/X11/Xlib.h") { print "Using -I$_ to find $_/X11/Xlib.h\n"; return "-I$_"; } } return undef; } my @args = (); my $arg; foreach $arg (@ARGV) { if ($arg =~ /^(X11\w*)=(.*)$/) { ${"$1"} = $2; } else { $MakefileName = $1 if ($arg =~ /^MAKEFILE=(.*)$/); push(@args,$arg); } } @ARGV = @args; $win_arch or die '$win_arch not set in myConfig'; if ($win_arch eq 'x') { @xdirs = (); if (defined $X11) { my $dir = $X11; if (-d $dir) { print "Looking for X in $dir\n"; push(@xdirs,$dir); } else { die "X11=$dir is not a directory"; } } else { # Find the X Library through xmkmf! $xmkmf = undef; my @exts = ("", ".cmd", ".bat"); LOOK: foreach $dir (split($Config::Config{path_sep},$ENV{'PATH'})) { foreach $ext (@exts) { if (-x "$dir/xmkmf$ext" && -r "$dir/xmkmf$ext") { $xmkmf = "$dir/xmkmf$ext"; last LOOK; } } } $uiline = undef; if (defined $xmkmf) { open(XMKMF,$xmkmf) || die("Can't open $xmkmf: $!\n"); while() { next unless /UseInstalled/o; warn ("Odd, two lines in the $xmkmf file that have UseInstalled on them:\n$uidir$_") if defined $uiline; $uidir = $_; } close(XMKMF); while (defined $uidir) { last unless ($uidir =~ s!^.*-I(\S+)/lib/X11/config!!o); $try = $1; $try =~ s/'x11root'/$ENV{X11ROOT}/; push(@xdirs,$try); } } print "$xmkmf suggests ",join(' ',@xdirs),"\n" if (@xdirs); } undef $xlib; # Make sure if (defined $X11LIB) { $xlib = &lX11(1,$X11LIB) } if (!defined($xlib) && defined($X11)) { $xlib = &lX11(1,"$X11/lib") } $xlib = &lX11(0,map("$_/lib",@xdirs)) unless (defined $xlib); # Special case for sun-machines unless (defined $xlib) { if ($Config{'osname'} eq 'solaris' || $Config{'osname'} eq 'sunos') { $xlib = &lX11(0,'/usr/openwin/lib'); } } sub chooseX11 { # Aim to prefer X11R5 over X11R4 over X11 (reverse(sort(@_))); } # # If no luck there try "common" places # unless (defined $xlib) { $xlib = &lX11(0,chooseX11(),chooseX11(),,'/usr/X386/lib') } # # Try places perl looks for libraries # This is now "last resort" as /lib and /usr/local/lib are so often # full of dubious links # unless (defined $xlib) { $xlib = &lX11(0,split(/\s+/,$Config{'libpth'})) } unless (defined $xlib) { warn "Cannot find -lX11 anywhere --- cannot build Tk::TableMatrix\n"; exit 0; } ($base) = $xlib =~ m#-L(.*)(?:/lib)$#x; if (defined $X11INC) { $xinc = &IX11("$X11INC"); } $xinc = &IX11("$base/include") unless (defined $xinc); unless (defined $xinc) { warn "Cannot find X include files via $base/include\n"; $xinc = &IX11(map("$_/include",@xdirs), '/usr/openwin/include', chooseX11(), chooseX11(), , '/usr/X386/include', $Config{'usrinc'}); } die "Cannot find X include files anywhere" unless (defined $xinc); if (defined($Config{'gccversion'}) && $Config{'gccversion'} =~ /\S/ && $xinc =~ /^-I(.*openwin.*)$/) { $gccopt .= " -isystem $1"; } $inc = ($xinc eq "-I/usr/include") ? "" : $xinc; } elsif ($win_arch eq 'open32') { unless (defined $toolkit) { my @path = split /;/, $ENV{PATH}; foreach (@path) { next unless m:[\\/]toolkit[\\/]bin:i; my $tlk = "$`/toolkit"; next unless -d "$tlk/H" and -f "$tlk/H/os2win.h"; $toolkit = $tlk; $toolkit =~ s:\\:/:g ; last; } } die "Cannot find OS/2 toolkit" unless $toolkit; $inc = "-I../pTk/mTk/xlib -I../../pTk/mTk/xlib -IpTk/mTk/xlib"; $inc .= " -I$toolkit/H -I../pTk/mTk/open32/h -IpTk/mTk/open32/h -ImTk/os2_rc"; $define .= " -D__WIN32__"; $xlib = "-L$toolkit/LIB -lpmwinx"; } elsif ($win_arch eq 'pm') { $define .= " -D__PM__"; $inc = "-I../pTk/mTk/xlib -I../../pTk/mTk/xlib -IpTk/mTk/xlib -ImTk/os2_rc"; $xlib = ""; # No library is needed } elsif ($IsWin32) { $inc = '-I$(TKDIR)/pTk/mTk/xlib'; } if ($Config{'osname'} eq 'solaris' && $xlib =~ /\bopenwin\b/ ) { $define{'NEED_PRELOAD'} = 1; } sub WriteIfChanged { my ($file,$string) = @_; my ($dir) = $file =~ m#^(.*)/[^/]+$#; if (defined($dir) && !-d $dir) { mkdir($dir,0777) || die "Cannot mkdir $dir:$!"; } my $ok = -f $file; if ($ok = open(IN,"$file")) { my $old = join('',); close(IN); $ok = $old eq $string; print STDERR "$file has changed\n" unless ($ok); } unless ($ok) { open(OUT,">$file") || die "Cannot open $file:$!"; print STDERR "Writing $file\n"; print OUT $string; close(OUT); } } # Config File Write ( Not Needed when building tkTable ) # if (!defined($MakefileName) || $MakefileName eq 'Makefile') if(0) { my $config = "package Tk::Config;\nrequire Exporter;\nuse base qw(Exporter);\n"; my $sym; my @export = (); foreach $sym (qw(VERSION inc define xlib xinc gccopt win_arch)) { my $val = ${$sym}; $val =~ s/([\\\'])/\\$1/g; $config .= "\$$sym = '$val';\n"; push(@export,"\$$sym"); } $config .= "\@EXPORT = qw(".join(' ',@export).");\n1;\n"; WriteIfChanged("Tk/Config.pm",$config); $config = "#ifndef _TKCONFIG\n#define _TKCONFIG\n"; foreach $sym (sort keys %define) { $config .= "#define $sym $define{$sym}\n"; } $config .= "#endif\n"; WriteIfChanged("pTk/tkConfig.h",$config); } 1;