diff options
Diffstat (limited to 'perl/SNMP/Makefile.PL')
-rw-r--r-- | perl/SNMP/Makefile.PL | 363 |
1 files changed, 363 insertions, 0 deletions
diff --git a/perl/SNMP/Makefile.PL b/perl/SNMP/Makefile.PL new file mode 100644 index 0000000..928cb67 --- /dev/null +++ b/perl/SNMP/Makefile.PL @@ -0,0 +1,363 @@ +use ExtUtils::MakeMaker; +require 5; +use Config; +use Getopt::Long; +my $lib_version; +my %MakeParams = (); +my $opts; + +# See lib/ExtUtils/MakeMaker.pm for details of how to influence +# the contents of the Makefile that is written. + +%MakeParams = InitMakeParams(); + +WriteMakefile(%MakeParams); + +Check_Version(); + +GetTestInfo(); + +sub InitMakeParams { + my %Params = ( + NAME => 'SNMP', + dist => { SUFFIX => "gz", COMPRESS => "gzip -9f"}, + MAN3PODS => { 'SNMP.pm' => '$(INST_MAN3DIR)/SNMP.3' }, + XSPROTOARG => '-noprototypes', # XXX remove later? + VERSION_FROM => 'SNMP.pm', + realclean => { FILES => 'host' }, + ); + + if ($ENV{'OSTYPE'} eq 'msys') { + $Params{'DEFINE'} = "-DMINGW_PERL"; + } + + my ($snmp_lib, $snmp_llib, $sep); + if (($Config{'osname'} eq 'MSWin32' && $ENV{'OSTYPE'} ne 'msys')) { + $opts = NetSNMPGetOpts(); + $Params{'DEFINE'} = "-DMSVC_PERL"; + $sep = '\\'; + $snmp_lib_file = 'netsnmp.lib'; + $snmp_link_lib = 'netsnmp'; + + if (lc($opts->{'debug'}) eq "true") { + $lib_dir = 'lib\\debug'; + } + else { + $lib_dir = 'lib\\release'; + } + + if (lc($opts->{'insource'}) eq "true") { + $Params{'LIBS'} = "-L$basedir\\win32\\$lib_dir\\ -l$snmp_link_lib"; + } + else { + my @LibDirs = split (';',$ENV{LIB}); + my $LibDir; + if ($opts->{'prefix'}) { + push (@LibDirs,"$ENV{'NET-SNMP-PATH'}${sep}lib"); + } + $noLibDir = 1; + while ($noLibDir) { + $LibDir = find_files(["$snmp_lib_file"],\@LibDirs); + if ($LibDir ne '') { + $noLibDir = 0; + # Put quotes around LibDir to allow spaces in paths + $LibDir = '"' . $LibDir . '"'; + } + else + { + @LibDirs = (); + $LibDirs[0] = prompt("The Net-SNMP library ($snmp_lib_file) could not be found.\nPlease enter the directory where it is located:"); + $LibDirs[0] =~ s/\\$//; + } + } + $Params{LIBS} = "-L$LibDir -l$snmp_link_lib"; + } + + $Params{'INC'} = "-I$basedir\\include\\ -I$basedir\\include\\net-snmp\\ -I$basedir\\win32\\ "; + } + else { + $opts = NetSNMPGetOpts(); + $Params{'LDDLFLAGS'} = "$Config{lddlflags} " . `$opts->{'nsconfig'} --ldflags`; + if (!$ENV{'NETSNMP_LIBS'}) { + $Params{'LIBS'} = `$opts->{'nsconfig'} --libs`; + chomp($Params{'LIBS'}); + } else { + $Params{'LIBS'} = $ENV{'NETSNMP_LIBS'}; + } + if (!$ENV{'NETSNMP_CCFLAGS'}) { + $Params{'CCFLAGS'} = `$opts->{'nsconfig'} --cflags`; + chomp($Params{'CCFLAGS'}); + $Params{'CCFLAGS'} .= " " . $Config{'ccflags'}; + } else { + $Params{'CCFLAGS'} = $ENV{'NETSNMP_CCFLAGS'}; + } + $lib_version = `$opts->{'nsconfig'} --version`; + if (lc($opts->{'insource'}) eq "true") { + $Params{'LIBS'} = "-L../../snmplib/.libs -L../../snmplib/ " . $Params{'LIBS'}; + $Params{'CCFLAGS'} = "-I../../include " . $Params{'CCFLAGS'}; +# } else { +# $Params{'PREREQ_PM'} = { 'NetSNMP::default_store' => 0.01 }; + } + $Params{'CCFLAGS'} =~ s/ -W(all|inline|strict-prototypes|write-strings|cast-qual|no-char-subscripts)//g; # ignore developer warnings + if (!$ENV{'NETSNMP_PREFIX'}) { + $prefix = `$opts->{'nsconfig'} --prefix`; + chomp($prefix); + $sep = '/'; + } else { + $prefix = $ENV{'NETSNMP_PREFIX'}; + } + if ($Params{'LIBS'} eq "" || $Params{'CCFLAGS'} eq "") { + die "You need to install net-snmp first (I can't find net-snmp-config)"; + } + } + + return(%Params); + +} + +sub GetTestInfo { + my $sep = ($^O =~ /win32/i ? '\\' : '/'); + my $info_file = "t${sep}snmptest.cmd"; + my $snmpd_path1 = "${prefix}${sep}sbin"; + my $snmpd_path2 = "${sep}usr${sep}sbin"; + my $snmpd_path3 = "${sep}usr${sep}bin"; + my $win32_snmpd_path = $ENV{'NET-SNMP-PATH'} . $sep . "bin"; + + open(H, ">$info_file") || die "Error: could not open file '$info_file'($!)"; + + my ($mibdir, $snmpd, $snmptrapd); + + # Windows + if ($Config{'osname'} eq 'MSWin32' && $ENV{'OSTYPE'} ne 'msys') { + if (lc ($opts->{'insource'}) eq "true") { + $mibdir = "../../mibs"; + if (lc($opts->{'debug'}) eq "true") { + $snmpd = "../../win32/bin/debug"; + $snmptrapd = "../../win32/bin/debug"; + } + else { + $snmpd = "../../win32/bin/release"; + $snmptrapd = "../../win32/bin/release"; + } + } else { + $mibdir = $ENV{'NET-SNMP-PATH'} . "${sep}share${sep}snmp${sep}mibs"; + $snmpd = find_files(["snmpd.exe"], [$win32_snmpd_path]); + $snmptrapd = find_files(["snmptrapd.exe"], [$win32_snmpd_path]); + } + } + + # Unix + else { + if (lc($opts->{'insource'}) eq "true") { + $mibdir = "../../mibs"; + $snmpd = "../../agent/snmpd"; + $snmptrapd = "../../apps/snmptrapd"; + } else { + $mibdir = "${prefix}${sep}share${sep}snmp${sep}mibs"; + $snmpd = find_files(["snmpd"], [$snmpd_path1, $snmpd_path2]); + $snmptrapd = find_files(["snmptrapd"], [$snmpd_path1, $snmpd_path2]); + } + } + + $mibdir = find_files(["NET-SNMP-MIB.txt"],[$mibdir]); + + $mibdir ||= prompt("Unable to locate the MIBs, Please enter the path: ", + $mibdir); + $snmpd ||= prompt("Unable to locate \"snmpd\". Please enter the path: ", + $snmpd_path1); + $snmptrapd ||= + prompt("Unable to locate \"snmptrapd\". Please enter the path: ", + $snmpd_path1); + + if ($Config{'osname'} eq 'MSWin32' && $ENV{'OSTYPE'} ne 'msys') { + $snmpd = $snmpd . $sep . "snmpd.exe"; + $snmptrapd = $snmptrapd . $sep . "snmptrapd.exe"; + } + else { + if ($ENV{'OSTYPE'} eq 'msys') { + $snmpd =~ s/snmpd$/snmpd.exe/; + $snmptrapd =~ s/snmptrapd$/snmptrapd.exe/; + } + else + { + $snmpd =~ s/($sep)?(snmpd)?$/${sep}snmpd/; + $snmptrapd =~ s/($sep)?(snmptrapd)?$/${sep}snmptrapd/; + } + } + + print H "SNMPD => $snmpd\n"; + print H "SNMPTRAPD => $snmptrapd\n"; + print H "MIBDIR => $mibdir\n"; + + if (!(lc($opts->{'insource'}) eq "true")) { + if (-e $snmpd and -r $snmpd) { + if (not -x $snmpd) { + warn("Error: $snmpd not executable. 'make test' will not work.\n"); + } + } else { + warn("Error: $snmpd does not exist or is unreadable. 'make test' will not work.\n"); + } + + if (-e $snmptrapd and -r $snmptrapd) { + if (not -x $snmptrapd) { + warn("Error: $snmptrapd not executable. 'make test' will not work.\n"); + } + } else { + warn("Error: $snmptrapd does not exist or is unreadable. 'make test' will not work.\n"); + } + } +# end of else + close H; +} + +sub HasSSL { + my $config_header = shift; + my $has_ssl; + unless (open(C,"<$config_header")) { + warn("Unable to open $config_header, assuming no SSL\n"); + return undef; + } + while (<C>) { + $has_ssl++, last if /^\s*#define\s+NETSNMP_USE_OPENSSL/; + } + close C; + return $has_ssl; +} +# common subroutines -- DO NOT EDIT. +# They are imported from the Makefile.subs.pl file +sub NetSNMPGetOpts { + my %ret; + my $rootpath = shift; + $rootpath = "../" if (!$rootpath); + $rootpath .= '/' if ($rootpath !~ /\/$/); + + if (($Config{'osname'} eq 'MSWin32' && $ENV{'OSTYPE'} ne 'msys')) { + + # Grab command line options first. Only used if environment variables are not set + GetOptions("NET-SNMP-IN-SOURCE=s" => \$ret{'insource'}, + "NET-SNMP-PATH=s" => \$ret{'prefix'}, + "NET-SNMP-DEBUG=s" => \$ret{'debug'}); + + if ($ENV{'NET-SNMP-IN-SOURCE'}) + { + $ret{'insource'} = $ENV{'NET-SNMP-IN-SOURCE'}; + undef ($ret{'prefix'}); + } + elsif ($ENV{'NET-SNMP-PATH'}) + { + $ret{'prefix'} = $ENV{'NET-SNMP-PATH'}; + } + + if ($ENV{'NET-SNMP-DEBUG'}) + { + $ret{'debug'} = $ENV{'NET-SNMP-DEBUG'}; + } + + # Update environment variables in case they are needed + $ENV{'NET-SNMP-IN-SOURCE'} = $ret{'insource'}; + $ENV{'NET-SNMP-PATH'} = $ret{'prefix'}; + $ENV{'NET-SNMP-DEBUG'} = $ret{'debug'}; + + $basedir = `%COMSPEC% /c cd`; + chomp $basedir; + $basedir =~ /(.*?)\\perl.*/; + $basedir = $1; + print "Net-SNMP base directory: $basedir\n"; + if ($basedir =~ / /) { + die "\nA space has been detected in the base directory. This is not " . + "supported\nPlease rename the folder and try again.\n\n"; + } + } + else + { + if ($ENV{'NET-SNMP-CONFIG'} && + $ENV{'NET-SNMP-IN-SOURCE'}) { + # have env vars, pull from there + $ret{'nsconfig'} = $ENV{'NET-SNMP-CONFIG'}; + $ret{'insource'} = $ENV{'NET-SNMP-IN-SOURCE'}; + } else { + # don't have env vars, pull from command line and put there + GetOptions("NET-SNMP-CONFIG=s" => \$ret{'nsconfig'}, + "NET-SNMP-IN-SOURCE=s" => \$ret{'insource'}); + + if (lc($ret{'insource'}) eq "true" && $ret{'nsconfig'} eq "") { + $ret{'nsconfig'}="sh ROOTPATH../net-snmp-config"; + } elsif ($ret{'nsconfig'} eq "") { + $ret{'nsconfig'}="net-snmp-config"; + } + + $ENV{'NET-SNMP-CONFIG'} = $ret{'nsconfig'}; + $ENV{'NET-SNMP-IN-SOURCE'} = $ret{'insource'}; + } + } + + $ret{'nsconfig'} =~ s/ROOTPATH/$rootpath/; + + $ret{'rootpath'} = $rootpath; + + \%ret; +} + +sub find_files { + my($f,$d) = @_; + my ($dir,$found,$file); + for $dir (@$d){ + $found = 0; + for $file (@$f) { + $found++ if -f "$dir/$file"; + } + if ($found == @$f) { + return $dir; + } + } +} + + +sub Check_Version { + if (($Config{'osname'} ne 'MSWin32' || $ENV{'OSTYPE'} eq 'msys')) { + my $foundversion = 0; + return if ($ENV{'NETSNMP_DONT_CHECK_VERSION'}); + open(I,"<Makefile"); + while (<I>) { + if (/^VERSION = (.*)/) { + my $perlver = $1; + my $srcver = $lib_version; + chomp($srcver); + my $srcfloat = floatize_version($srcver); + $perlver =~ s/pre/0./; + # we allow for perl/CPAN-only revisions beyond the default + # version formatting of net-snmp itself. + $perlver =~ s/(\.\d{5}).*/\1/; + $perlver =~ s/0*$//; + if ($srcfloat ne $perlver) { + if (!$foundversion) { + print STDERR "ERROR: +Net-SNMP installed version: $srcver => $srcfloat +Perl Module Version: $perlver + +These versions must match for perfect support of the module. It is possible +that different versions may work together, but it is strongly recommended +that you make these two versions identical. You can get the Net-SNMP +source code and the associated perl modules directly from + + http://www.net-snmp.org/ + +If you want to continue anyway please set the NETSNMP_DONT_CHECK_VERSION +environmental variable to 1 and re-run the Makefile.PL script.\n"; + exit(1); + } + } + $foundversion = 1; + last; + } + } + close(I); + die "ERROR: Couldn't find version number of this module\n" + if (!$foundversion); + } +} + +sub floatize_version { + my ($major, $minor, $patch, $opps) = ($_[0] =~ /^(\d+)\.(\d+)\.?(\d*)\.?(\d*)/); + return $major + $minor/100 + $patch/10000 + $opps/100000; +} |