/usr/local/CPAN/IO-Socket-TIPC/Makefile.PL


use 5.006002;
use ExtUtils::MakeMaker;

# Tell CPANPLUS (and everyone else) right up-front that this module only works
# on selected platforms.

my %supported_platforms = ( # capitalized the way they appear in $^O
    "linux"   => 1,
    "solaris" => 1,
);

# The string "No support for os" is a CPANPLUS hint that it shouldn't send me
# irrelevant test failures for unsupported platforms.

die("No support for os: $^O\n".
    "Yet.  For the moment, TIPC only seems to exist on Linux and Solaris.\n")
     unless exists($supported_platforms{$^O});

# Now we get to try to find tipc.h.
# The Linux kernel's tipc.h likes to include linux/types.h, so somewhere along
# the line, our include path needs to have a linux/types.h in it.  The tipc.h
# from tipc-1.5.10.tar.gz also includes linux/skbuff.h, in addition to
# linux/types.h.  However, this doesn't necessarily have to be the same
# version of linux as the one we pulled tipc.h from, and both types.h and
# skbuff.h are very commonly found in /usr/include/linux/.  And neither tipc.h
# file has any other external dependencies.  And I'd assume the Solaris tipc.h
# doesn't depend on any Linux stuff.  All of this means several important
# things for us:
# 
# * we can find any tipc.h file in either the tipc-addon sources or the linux
#   kernel sources, or even the standard /usr/include fare, and use it without
#   having to care which it is.
# 
# * we can just copy it into the current directory.  This avoids another
#   headerfile nightmare when (for instance) something includes <time.h> and
#   it really gets linux/time.h, which clashes horribly with sys/time.h.  And
#   it doesn't need all the extra staleness-checks a symlink would require.
# 
# * the C file can simply include "tipc.h", and we don't have to generate a
#   custom-prefixed line in an autogenerated headerfile just to include it.
# 
# * When/if tipc.h includes linux/types.h and linux/skbuff.h, it can just use
#   whatever file got installed into /usr/include/linux/ by glibc.  It doesn't
#   matter whether the headers are from a different version of linux, as long
#   as they haven't changed the userspace API.  Which never happens.  Heh.
# 
# * we don't have to specify BOTH -Ilinux/include and -Ilinux/include/linux,
#   or any such nonsense.
# 
# * We don't actually have to search for a kernel at all, if we already know
#   where tipc.h is.
# 
# * If the user can't figure out all this environment variable stuff we're
#   blathering about, (s)he can make the whole problem go away by simply
#   copying the file in for us.
# 
# So, that's my strategy.

unless(-f 'tipc.h') {
	my $uname_r = `uname -r`;
	chomp $uname_r;
	$uname_r = "." unless length $uname_r;
	my @possibilities = (
		"/lib/modules/$uname_r/source/include/linux",
		"/usr/src/linux/include/linux",
		"/usr/include/linux",
		"/opt/SUNWtipc/include/solaris",
	);
	if(exists($ENV{PATH_TO_TIPC})) {
		unshift(@possibilities, $ENV{PATH_TO_TIPC} . "/include/net/tipc");
	}
	if(exists($ENV{KERNDIR})) {
		unshift(@possibilities, $ENV{KERNDIR}."/include/linux");
	}
	if(exists($ENV{PATH_TO_LINUX})) {
		unshift(@possibilities, $ENV{PATH_TO_LINUX} . "/include/linux");
	}
	print("I'm going to try to find a tipc.h header file.\n");
	foreach my $poss (@possibilities) {
		if(defined($poss) && -f "$poss/tipc.h") {
			print("Hey, $poss/tipc.h exists, I'll use it.\n");
			system("cp -f $poss/tipc.h .");
			last;
		} else {
			print("$poss/tipc.h does not exist...\n") if defined $poss;
		}
	}
	
	print("\n");
	# I know the first line of this die() message looks a bit awkward.
	# The string "OS unsupported" is another one of those CPANPLUS hints,
	# telling it not to send me irrelevant test-fail messages for boxes
	# which are missing tipc.h.
	# Hey, it was either this or "No library found for -l<libname>"...
	die "This version of your OS unsupported - get a kernel with TIPC support,\n"
	   ."or download the addon package from tipc.sourceforge.net.\n"
	   ."* If you're using the Linux addon package, try telling me where to find it:\n"
	   ."  PATH_TO_TIPC=/home/user/tipc-1.5.10 perl Makefile.PL\n"
	   ."* Alternately, if you're using CONFIG_TIPC in newer Linux kernels:\n"
	   ."  PATH_TO_LINUX=/usr/src/linux-2.6.16 perl Makefile.PL\n"
	   ."* Solaris users get TIPC support by installing the addon package from\n"
	   ."  http://opensolaris.org/os/project/tipc/ - this will install tipc.h\n"
	   ."  in the right place for you.\n"
	    	unless -f 'tipc.h';
}

WriteMakefile(
    NAME              => 'IO::Socket::TIPC',
    VERSION_FROM      => 'lib/IO/Socket/TIPC.pm', # finds $VERSION
    PREREQ_PM         => {
                         Scalar::Util    => 0,
                         },
    ($] >= 5.005 ?     ## Add these new keywords supported since 5.005
      (ABSTRACT_FROM  => 'lib/IO/Socket/TIPC.pm', # retrieve abstract from module
       AUTHOR         => 'Mark Glines <mark-tipc@glines.org>') : ()),
    LIBS              => [''], # e.g., '-lm'
    DEFINE            => '', # e.g., '-DHAVE_SOMETHING
    INC               => '', # e.g., '-I. -I/usr/include/other'
    clean             => { FILES => 'tipc.h' },
);
if  (eval {require ExtUtils::Constant; 1}) {
  # If you edit these definitions to change the constants used by this module,
  # you will need to use the generated const-c.inc and const-xs.inc
  # files to replace their "fallback" counterparts before distributing your
  # changes.  Also update the test spec, and the @EXPORT_OK variables.
  my @names = (qw(AF_TIPC PF_TIPC SOL_TIPC TIPC_ADDR_ID TIPC_ADDR_MCAST
		 TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV
		 TIPC_CLUSTER_SCOPE TIPC_CONN_SHUTDOWN TIPC_CONN_TIMEOUT
		 TIPC_CRITICAL_IMPORTANCE TIPC_DESTNAME TIPC_DEST_DROPPABLE
		 TIPC_ERRINFO TIPC_ERR_NO_NAME TIPC_ERR_NO_NODE
		 TIPC_ERR_NO_PORT TIPC_ERR_OVERLOAD TIPC_HIGH_IMPORTANCE
		 TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MAX_USER_MSG_SIZE
		 TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_OK TIPC_PUBLISHED
		 TIPC_RESERVED_TYPES TIPC_RETDATA TIPC_SRC_DROPPABLE
		 TIPC_SUBSCR_TIMEOUT TIPC_SUB_NO_BIND_EVTS
		 TIPC_SUB_NO_UNBIND_EVTS TIPC_SUB_PORTS TIPC_SUB_SERVICE
		 TIPC_SUB_SINGLE_EVT TIPC_TOP_SRV TIPC_WAIT_FOREVER
		 TIPC_WITHDRAWN TIPC_ZONE_SCOPE));
  ExtUtils::Constant::WriteConstants(
                                     NAME         => 'IO::Socket::TIPC',
                                     NAMES        => \@names,
                                     DEFAULT_TYPE => 'IV',
                                     C_FILE       => 'const-c.inc',
                                     XS_FILE      => 'const-xs.inc',
                                  );

}
else {
  use File::Copy;
  use File::Spec;
  foreach my $file ('const-c.inc', 'const-xs.inc') {
    my $fallback = File::Spec->catfile('fallback', $file);
    copy ($fallback, $file) or die "Can't copy $fallback to $file: $!";
  }
}