2
0
mirror of https://github.com/xcat2/xcat-dep.git synced 2024-11-28 20:29:13 +00:00
xcat-dep/Curses-1.23/Makefile.PL
2008-04-10 19:36:34 +00:00

630 lines
21 KiB
Perl
Executable File

#! /usr/bin/perl -w
##
## Makefile.PL
##
## Copyright (c) 1994-2000 William Setzer
##
## You may distribute under the terms of either the Artistic License
## or the GNU General Public License, as specified in the README file.
require 5.005;
use strict;
#use warnings; Can't use; new since Perl 5.005; use perl -w instead
use ExtUtils::MakeMaker;
use English;
# Here are the arguments defined for this file:
#
# PANELS -- enable panel functions
# MENUS -- enable menus functions
# FORMS -- enable forms functions
# GEN -- add generation function to Makefile (developers only!)
#
# Ex: "perl Makefile.PL PANELS MENUS GEN"
# Environment variables tell us how one accesses the Curses library
# on this system.
#
# CURSES_LIBTYPE
# 'bsd', 'ncurses', or 'ncursesw' on most systems.
# In some environments, there are other possibilities.
#
# CURSES_CFLAGS
# CURSES_PANEL_CFLAGS
# CURSES_MENUS_CFLAGS
# CURSES_FORMS_CFLAGS
# contains any includes or defines (-I or -D) that are
# needed to compile libcurses applications
#
# CURSES_LDFLAGS
# CURSES_PANEL_LDFLAGS
# CURSES_MENUS_LDFLAGS
# CURSES_FORMS_LDFLAGS
# contains any libraries or library paths (-l or -L) that are
# needed to compile libcurses applications. This must be
# -l and -L options only -- we parse it. Note that if you
# specify something that doesn't result in MakeMaker finding
# a library, your value just gets silently ignored -- it
# won't show up in the make file.
# If these environment variables aren't set, we try in a fairly
# stupid fashion to pick them for you, along with a "c-config.h" file.
my $libType = $ENV{'CURSES_LIBTYPE'};
my $inc = $ENV{'CURSES_CFLAGS'};
my $libs = $ENV{'CURSES_LDFLAGS'};
my $panel_inc = $ENV{'CURSES_PANEL_CFLAGS'} || '';
my $panel_libs = $ENV{'CURSES_PANEL_LDFLAGS'} || '';
my $menu_inc = $ENV{'CURSES_MENU_CFLAGS'} || '';
my $menu_libs = $ENV{'CURSES_MENU_LDFLAGS'} || '';
my $form_inc = $ENV{'CURSES_FORM_CFLAGS'} || '';
my $form_libs = $ENV{'CURSES_FORM_LDFLAGS'} || '';
# If you want to see examples of what needs to go in the $inc and
# $libs variables, check out the `guess_cfg' tables of values below.
# In fact, one way to set the variables would be to add or modify an
# entry for your 'osname'. If you're not sure what the osname is for
# your machine, you can use the following at your command line to
# print it out:
#
# perl -MConfig -le 'print $^O'
#
# Some lines have multiple versions (such as `freebsd' and `linux'),
# representing different versions of curses that an OS might have.
# You can pick the version you want by setting the `default' entry.
# Here are some notes provided by the hint providers for certain of the
# OSes. You should scan them first to see if they apply to you.
#
# Notes for FreeBSD ncurses:
# [Courtesy of "Andrew V. Stesin" <stesin@elvisti.kiev.ua>]
# FreeBSD-2.0.5 ncurses + mytinfo NOTE! Straight curses works much
# better for me!
#
# Notes for Solaris:
# Under 2.3, it was reported that to get the module to compile properly
# with gcc, you must add `-DSYSV=1' to $inc. This will disable the
# redefinition of memcpy to bcopy that is present in /usr/include/curses.h.
# [Courtesy of Dave Blaszyk <dvb@ycc.Kodak.COM>]
#
# $inc also contained "-I/usr/include", but this seems to cause a great
# deal of trouble for gcc under perl5.002, so I removed it by default.
# I have tested Curses-a9 with perl5.002 and gcc263 and Sun's unbundled
# cc on Solaris 2.4 with an empty $inc and had no problems, but your
# mileage may vary.
#
# If you are having trouble compiling under Solaris, try various
# combinations of "-I/usr/include" and "-DSYSV=1" in $inc to see if
# it fixes things.
## OS default guess for $inc default guess for $libs
#
my $guess_cfg = {
'aix' => [ '' , '-lcurses -ltermcap' ],
'bsd386' => [ '' , '-lcurses -ltermcap' ],
'bsdos' => [ '' , '-lcurses -ltermcap' ],
'cygwin' => [ '-I/usr/include/ncurses' , '-lncurses' ],
'darwin' => [ '' , '-lcurses' ],
'dec_osf' => [ '' , '-lcurses -ltermcap' ],
'dgux' => [ '' , '-lcurses -ltermcap' ],
'dynixptx' => [ '' , '-lcurses -lc' ],
'freebsd' => {
'bsd' => [ '' , '-lcurses -ltermcap' ],
'ncurses' => [ '' , '-lncurses' ],
'default' => 'bsd'
},
'hpux' => [ '' , '-lcurses -ltermcap' ],
# See INSTALL file for information about a different Curses library on HPUX.
'irix' => {
'bsd' => [ '' , '-lcurses -ltermcap' ],
'ncurses' => [ '' , '-lncurses' ],
'default' => 'bsd'
},
'isc' => [ '' , '-lcurses -ltermcap' ],
'linux' => {
'bsd' => [ '' , '-lcurses -ltermcap' ],
'ncurses' => [ '-I/usr/include/ncurses' , '-lncurses' ],
'default' => 'ncurses'
},
'netbsd' => [ '' , '-lcurses -ltermcap' ],
'next' => [ '' , '-lcurses -ltermcap' ],
'openbsd' => [ '' , '-lcurses -ltermcap' ],
'os2' => {
'bsd' => [ '' , '-lcurses -ltermcap' ],
'ncurses' => [ '' , '-lncurses' ],
'default' => 'ncurses'
},
'sco' => [ '' , '-lcurses -ltermcap' ],
'solaris' => [ '' , '-L/usr/ccs/lib -lcurses' ],
'sunos' => {
'bsd' => [ '' , '-lcurses -ltermcap' ],
'sysv' => [ '-I/usr/5include' , '-L/usr/5lib -lcurses' ],
'ncurses' => [ '' , '-lncurses' ],
'default' => 'sysv'
},
'VMS' => [ '' , 'sys$library:vaxccurse.olb' ],
'svr4' => [ '' , '-lcurses' ],
'MSWin32' => {
'borland' => [ '-w- -Id:\bc5\include' , '-Ld:\bc5\lib pdcurses.lib' ],
'visualc' => [ '' , 'pdcurses' ],
'default' => 'visualc'
},
'' => undef
};
###
## You shouldn't need to change anything below
#
my $TRUE = 1; my $FALSE = 0;
sub nCursesIsInstalled() {
if (-f('/usr/include/ncurses/ncurses.h')) {
return $TRUE;
} elsif (-f('/usr/include/ncurses.h')) {
return $TRUE;
} else {
return $FALSE;
}
}
sub bsdIsInstalled() {
if (-f('/usr/include/curses/curses.h')) {
return $TRUE;
} elsif (-f('/usr/include/curses.h')) {
return $TRUE;
} else {
return $FALSE;
}
}
sub chooseLibraryType($$) {
my ($typeList, $libtypR) = @_;
#-----------------------------------------------------------------------------
# Assuming this is a platform on which there may be multiple versions of
# Curses, choose one.
#
# Return the choice as $$libtypR.
#
# We prefer Ncurses, so choose that if it appears to be installed.
# If it doesn't, but BSD appears to be installed, we choose that. If
# we don't see either, we choose $libtypDefault.
#-----------------------------------------------------------------------------
if (0) {
} elsif ($typeList->{'ncurses'} && nCursesIsInstalled()) {
$$libtypR = 'ncurses';
} elsif ($typeList->{'bsd'} && bsdIsInstalled()) {
$$libtypR = 'bsd';
} else {
$$libtypR = $typeList->{'default'};
}
}
sub guessAtCursesLocation($$$) {
my ($libtypR, $incR, $libsR) = @_;
#-----------------------------------------------------------------------------
# Return as $$libtypR the type of Curses library we should use, e.g.
# 'ncurses', 'ncursesw' or 'bsd'. May be undefined if we don't think
# we have to choose between those on this system.
#
# Return as $$incR the -I option we think is appropriate to get the
# Curses interface header files.
#
# Return as $$libsR the -L and -l options we think are needed to link
# the main Curses library (doesn't cover panels/menus/forms).
#-----------------------------------------------------------------------------
print qq{Making a guess for -I and -L/-l options...\n};
# We need to move away from the inflexible $guess_cfg thing. For
# starters, we don't use it when the system looks like one with
# wide-character Ncurses.
if (-f('/usr/include/ncursesw/ncurses.h')) {
$$incR = '-I/usr/include/ncursesw';
$$libsR = '-lncursesw';
$$libtypR = 'ncursesw';
} else {
my $guess1 = $guess_cfg->{$OSNAME};
my $libtyp;
# typically 'bsd' or 'ncurses'. Undefined if we think
# there's no choice of Curses version on this platform.
my $guess;
if (ref $guess1 eq 'HASH') {
# For this platform, we have a choice of Curses library.
chooseLibraryType($guess1, \$libtyp);
$guess = $guess1->{$libtyp};
} else {
$guess = $guess1;
}
if (not defined $guess) {
print STDERR <<"EOW";
I'm sorry, but I could not make a good guess for the includes and
libraries that are needed. You will need to set the CURSES_
environment variables as described in the INSTALL file.
OSNAME=$OSNAME
EOW
exit 1;
}
if (ref $guess ne 'ARRAY') {
die "FATAL: internal error: guess_cfg is bad";
}
if (!defined($libtyp)) {
if (0) {
} elsif (-f('/usr/include/ncurses/ncurses.h')) {
$inc = '-I/usr/include/ncurses';
} elsif (-f('/usr/include/curses/curses.h')) {
$inc = '-I/usr/include/curses';
} elsif (-f('/usr/include/ncurses.h')) {
$inc = '';
} elsif (-f('/usr/include/curses.h')) {
$inc = '';
} else {
$inc = $guess->[0];
}
} else {
if ($libtyp eq 'ncurses') {
if (-f('/usr/include/ncurses/ncurses.h')) {
$inc = '-I/usr/include/ncurses';
} elsif (-f('/usr/include/ncurses.h')) {
$inc = '';
} else {
$inc = $guess->[0];
}
} else {
if (-f('/usr/include/curses/curses.h')) {
$inc = '-I/usr/include/curses';
} elsif (-f('/usr/include/curses.h')) {
$inc = '';
} else {
$inc = $guess->[0];
}
}
}
$libs = $guess->[1];
$$libtypR = $libtyp;
$$incR = $inc;
$$libsR = $libs;
}
print("Guesses:\n");
print(" includes: '$$incR'\n");
print(" libs: '$$libsR'\n");
if (defined($$libtypR)) {
print(" Curses type: $$libtypR");
} else {
print(" Curses type: irrelevant");
}
print("\n");
}
sub defaultLibTypeForOs($) {
my ($osname) = @_;
#-----------------------------------------------------------------------------
# Return the default library type for OS named '$osname'; if we don't think
# there is a choice of library type on this OS, return undef.
#-----------------------------------------------------------------------------
my $libType;
my $guess = $guess_cfg->{$OSNAME};
if (ref $guess eq 'HASH') {
# For this platform, we have a choice of Curses library.
$libType = $guess->{'default'};
}
return $libType;
}
# A "library class" is a more abstract categorization than a "library type."
# The difference between two library types is just compiler and linker
# options to choose the right library, but different library classes
# have bigger differences and can have different hints files. The
# library class is part of the hint file name.
my %libClass = (
'bsd' => 'bsd',
'ncurses' => 'ncurses',
'ncursesw' => 'ncurses',
'sysv' => 'sysv',
'visualc' => 'visualc',
'borland' => 'borland',
);
sub makeConfigH($) {
my ($libType) = @_;
#-----------------------------------------------------------------------------
# $libType is the kind of Curses library we are using - e.g. 'bsd',
# 'ncurses', or 'ncursesw'. It may be undefined if there is no
# choice on this system.
#-----------------------------------------------------------------------------
print qq{Making a guess for "c-config.h"...\n};
my $libClass;
if (defined($libType)) {
$libClass = $libClass{$libType};
if (!defined($libClass)) {
print STDERR ("Internal error: invalid library type '$libType' " .
"in makeConfigH()\n");
exit 1;
}
}
my $hintsfile;
if (defined($libType) && -f("hints/c-$OSNAME.$libType.h")) {
$hintsfile = "hints/c-$OSNAME.$libType.h";
} elsif (defined($libClass) && -f("hints/c-$OSNAME.$libClass.h")) {
$hintsfile = "hints/c-$OSNAME.$libClass.h";
} else {
my $candidate = "hints/c-$OSNAME.h";
if (-f($candidate)) {
$hintsfile = $candidate;
} else {
print STDERR <<"EOW";
I'm sorry, but I couldn't find a hints file that was configured for
your OS (named $candidate). You will need to create and configure a
"c-config.h" file for yourself. Please see the "INSTALL" directions
for pointers on how to do this.
EOW
exit 1;
}
}
print("Choosing hints file '$hintsfile'\n");
eval "require File::Copy;";
if (! $@) {
&File::Copy::copy($hintsfile, "c-config.h");
} else {
my $cp;
if ($OSNAME eq 'MSWin32') { $cp = "perl -MExtUtils::Command -e cp" }
elsif ($OSNAME eq 'VMS') { $cp = "copy/log" }
else { $cp = "cp" }
my $sys = "$cp $hintsfile c-config.h";
if ($sys =~ m!([^\\:\w/. -])!) {
print STDERR <<"EOW";
I'm sorry. I was going to try to create a "c-config.h" for you, but it
looks like there are some non-standard characters in the exec string.
I'm feeling rather paranoid, so I'll let you look at the line and do
it by hand if it looks OK. I wanted to execute a copy and thought I
might be able to use:
$sys
but it has the (possibly) naughty character '$1' in it. '
EOW
exit 1;
} else {
system($sys);
}
}
}
sub guessPanelMenuFormLibs($$$$$) {
my ($ncursesLibSearch, $libType, $panelLibsR, $menuLibsR, $formLibsR) = @_;
my ($panelLibGuess, $menuLibGuess, $formLibGuess);
if (defined($libType) && $libType eq "ncursesw") {
$panelLibGuess = -lpanelw;
$menuLibGuess = -lmenuw;
$formLibGuess = -lformw;
} else {
$panelLibGuess = -lpanel;
$menuLibGuess = -lmenu;
$formLibGuess = -lform;
}
$$panelLibsR = "$ncursesLibSearch $panelLibGuess";
$$menuLibsR = "$ncursesLibSearch $menuLibGuess";
$$formLibsR = "$ncursesLibSearch $formLibGuess";
}
my $gen;
my $panels;
my $menus;
my $forms;
my @argv;
while (@ARGV) {
my $arg = shift;
if ($arg eq 'GEN') { $gen = $arg }
elsif ($arg eq 'PANELS') { $panels = $arg }
elsif ($arg eq 'MENUS') { $menus = $arg }
elsif ($arg eq 'FORMS') { $forms = $arg }
else { push @argv, $arg }
}
@ARGV = @argv; # pass non-Curses arguments to MakeMaker
print "GEN function: ", ($gen ? "enabled" : "not applicable"), "\n";
print "PANELS functions: ", ($panels ? "enabled" : "not enabled"), "\n";
print "MENUS functions: ", ($menus ? "enabled" : "not enabled"), "\n";
print "FORMS functions: ", ($forms ? "enabled" : "not enabled"), "\n";
print "\n";
if (defined($inc) && defined($libs)) {
# We have the info we need
if (!defined($libType)) {
$libType = defaultLibTypeForOs($OSNAME);
}
} elsif (defined($inc) || defined($libs) || defined($libType)) {
die("You must specify both CURSES_LDFLAGS and CURSES_CFLAGS " .
"environment variables or neither. ");
} else {
guessAtCursesLocation(\$libType, \$inc, \$libs);
}
if (not -e "c-config.h") {
makeConfigH($libType);
}
# Major cheese alert. Any -L for the curses library is probably
# also needed for the panels library.
#
my $ncursesLibSearch;
$ncursesLibSearch = ''; # initial value
while ($libs =~ m{(-L\S+)}g) {
$ncursesLibSearch .= $1 . ' ';
}
guessPanelMenuFormLibs($ncursesLibSearch, $libType,
\my $panelGuess, \my $menuGuess, \my $formGuess);
if ($panels and not $panel_libs) {
$panel_libs = $panelGuess;
}
if ($menus and not $menu_libs) {
$menu_libs = $menuGuess;
}
if ($forms and not $form_libs) {
$form_libs = $formGuess;
}
# Both Perl and Ncurses have a form.h. We have to include the Perl
# header files in our search path, but don't need form.h itself.
# Because the Curses form library header directory comes before the
# perl header directory in our search path, that isn't normally a
# problem. EXCEPT: when there is no specific Curses form library
# directory, and the Curses form.h is instead in the general system
# search path, e.g. /usr/include/form.h. The system directories come
# after the Perl directory in the search. There used to be a
# workaround here where we would simply add /usr/include to the front
# of the search path, but that is not only gross, but ineffective with
# some compilers, which ignore a -I option that adds a directory that
# is a system directory (e.g. gcc 3).
# To deal with this, we make a rough check for the problem, and if it
# appears to exist, we tell the user to fix it.
if ($forms and $form_inc !~ m{-I} and -f('/usr/include/form.h')) {
print("WARNING: Your Curses form.h file appears to be in the default\n");
print("system search path, which will not work for us because of\n");
print("the conflicting Perl form.h file. This means your 'make' will\n");
print("probably fail unless you fix this, as described in the INSTALL\n");
print("file.\n");
}
my $clean = 'CursesDef.h c-config.h cdemo testsym testint testtyp';
my $realc = $gen
? 'list.syms Curses.pm ' .
'CursesFun.c CursesVar.c CursesCon.c CursesTyp.h CursesBoot.c'
: "";
my $components =
($panels ? " PANELS " : "") .
($menus ? " MENUS " : "") .
($forms ? " FORMS " : "");
WriteMakefile(NAME => 'Curses',
INC => "$panel_inc $menu_inc $form_inc $inc",
LIBS => [ "$panel_libs $menu_libs $form_libs $libs" ],
H => [ 'CursesDef.h' ],
clean => { FILES => $clean },
realclean => { FILES => $realc },
dist => { COMPRESS => 'gzip -9f' },
postamble => { COMPONENTS => $components },
VERSION_FROM => 'Curses.pm',
);
sub MY::postamble {
my ($this, %args) = @_;
my $echo = $OSNAME eq 'VMS' ? 'write sys$output' : 'echo';
my $objext = $OSNAME eq 'MSWin32' ? 'obj' : 'o';
my $mf = <<EOM;
CursesDef.h: c-config.h Makefile.PL list.syms
\$(PERL) test.syms $args{COMPONENTS}
c-config.h:
@ $echo "You need to make a c-config.h. See the INSTALL document.";
@ exit 1
cdemo: cdemo.$objext c-config.h
EOM
if ($OSNAME eq 'VMS') {
$mf .= <<EOM;
\$(CC) \$(INC) cdemo.c
\$(LD) cdemo\$(OBJ_EXT), \$(LDLOADLIBS), CURSES2.OPT/opt
EOM
}
else {
$mf .= <<EOM;
\$(CC) \$(INC) -o cdemo cdemo.c \$(LDLOADLIBS)
EOM
}
if ($gen) {
$mf .= <<EOM;
Curses.c :: CursesFun.c CursesVar.c CursesCon.c CursesTyp.h CursesBoot.c
@\$(NOOP)
config :: list.syms Curses.pm \\
CursesFun.c CursesVar.c CursesCon.c CursesTyp.h CursesBoot.c
list.syms : gen/make.list.syms gen/list.fun gen/list.var gen/list.typ
\$(PERL) gen/make.list.syms
Curses.pm : gen/make.Curses.pm gen/list.fun gen/list.var gen/list.con
\$(PERL) gen/make.Curses.pm
CursesFun.c : gen/make.CursesFun.c gen/list.fun
\$(PERL) gen/make.CursesFun.c
CursesVar.c : gen/make.CursesVar.c gen/list.var
\$(PERL) gen/make.CursesVar.c
CursesCon.c : gen/make.CursesCon.c gen/list.con
\$(PERL) gen/make.CursesCon.c
CursesTyp.h : gen/make.CursesTyp.h gen/list.typ
\$(PERL) gen/make.CursesTyp.h
CursesBoot.c : gen/make.CursesBoot.c gen/list.fun gen/list.var gen/list.con
\$(PERL) gen/make.CursesBoot.c
EOM
}
return $mf;
}
__END__