#!/usr/bin/perl
# 
# Configure script for Net-SNMP and MSVC
# Written by Alex Burger
# March 5th, 2004
#
use Getopt::Long;
use strict;

my $config;
my $sdk = 0;
my $linktype;
my $prefix;
my $prefixdos;
my $openssl = 0;
my $b_ipv6 = 0;
my $b_winextdll = 0;
my $help = 0;

GetOptions      ('config=s' => \$config,
                 'with-sdk' => \$sdk,
                 'linktype=s' => \$linktype,
                 'destdir=s' => \$prefix,
                 'prefix=s' => \$prefix,
                 'with-ssl' => \$openssl,
                 'with-ipv6' => \$b_ipv6,
                 'with-winextdll' => \$b_winextdll,
                 'help' => \$help);

if ($help == 1)
{
my $USAGE = qq/
Usage:
    perl Configure [<options>] 
    
Options:

    --config=[release | debug]       Compile as release or with debug symbols
    --with-sdk                       Link against MS Platform SDK
    --linktype=[static | dynamic]    Build static or dynamic (DLL)
    --prefix=\"path\"                  Set INSTALL_BASE path (install path)
    --destdir=\"path\"                 Same as --prefix
    --with-ssl                       Link against OpenSSL
    --with-ipv6                      Build in IPv6 transports (enables SDK)
    --with-winextdll                 Build winExtDLL agent (enables SDK, see README.win32)
    --help                           This help screen
/;

  print $USAGE;

  exit(0);

}
               
$config = lc($config);  
if (($config ne "debug") && ($config ne "release")) {
  $config = "release";
}

$linktype = lc($linktype);              
if (($linktype ne "static") && ($linktype ne "dynamic")) {
  $linktype = "static";
}

if ($prefix eq "") {
  $prefix = "c:/usr";
}

# Make sure prefix only contains forward slashes
$prefix =~ s/\\/\//g;

$prefixdos = "\"$prefix\"";
# Make sure prefixdos only contains backward slashes
$prefixdos =~ s/\//\\/g;

# Enable SDK for IPV6 and winExtDLL
if ($b_ipv6 == 1) {
  $sdk = 1;
}
if ($b_winextdll == 1) {
  $sdk = 1;
}

print "\n\n";

###############################################
#
# Create main Makefile
#
###############################################
{  
  my $makefile_out = "Makefile";
  my $makefile_in  = "Makefile.in";

  open (MAKE_OUT, ">$makefile_out") || die "Can't Open $makefile_out\n";
  open (MAKE_IN, "<$makefile_in") || die "Can't Open $makefile_in\n";

  print "creating $makefile_out\n";
  
  while (<MAKE_IN>)
  {
    chomp;
    if ($sdk == 1) {
      s/^SDK=/SDK=true/;
    }
    else {
      s/^SDK=/SDK=false/;
    }
    
    s/^LINKTYPE=/LINKTYPE=$linktype/;
    s/^CFG=/CFG=$config/;
    s/^PREFIX=/PREFIX=$prefix/;    
    s/^PREFIX_DOS=/PREFIX_DOS=$prefixdos/;    
    s/^SSL=.*/SSL=$openssl/;

    print MAKE_OUT $_ . "\n";
  }
}

###############################################
#
# Create Makefiles for applications from 
# Makefile-apps.in
# (except for snmpnetstat)
#
###############################################
my @programs = qw 
/encode_keychange
snmpbulkget
snmpbulkwalk
snmpdelta
snmpdf
snmpget
snmpgetnext
snmpset
snmpstatus
snmptable
snmptest
snmptranslate
snmptrap
snmpusm
snmpvacm
snmpwalk
/;

foreach my $progName (@programs) {
  
  my $makefile_out = "$progName\\Makefile";
  my $makefile_in = "Makefile-apps.in";

  my $outdir = $config;
  my $intdir = $config;
  
  open (MAKE_OUT, ">$makefile_out") || die "Can't Open $makefile_out\n";
  open (MAKE_IN, "<$makefile_in") || die "Can't Open $makefile_in\n";

  print "creating $makefile_out\n";
  
  while (<MAKE_IN>)
  {
    chomp;
    
    s/^LINKTYPE=/LINKTYPE=$linktype/;
    s/^PROGNAME=/PROGNAME=$progName/;
    s/^CFG=/CFG=$config/;
    s/^OUTDIR=/OUTDIR=.\\$outdir/;
    s/^INTDIR=/INTDIR=.\\$intdir/;
    s/^SSL=.*/SSL=$openssl/;

    print MAKE_OUT $_ . "\n";
  }
}

###############################################
#
# Create Makefiles for snmpnetstat from
# snmpnetstat\Makefile.in
#
###############################################
my @programs = qw 
/snmpnetstat
/;

foreach my $progName (@programs) {
  
  my $makefile_out = "$progName\\Makefile";
  my $makefile_in = "$progName\\Makefile.in";

  my $outdir = $config;
  my $intdir = $config;
  
  open (MAKE_OUT, ">$makefile_out") || die "Can't Open $makefile_out\n";
  open (MAKE_IN, "<$makefile_in") || die "Can't Open $makefile_in\n";

  print "creating $makefile_out\n";
  
  while (<MAKE_IN>)
  {
    chomp;

    s/^LINKTYPE=/LINKTYPE=$linktype/;    
    s/^PROGNAME=/PROGNAME=$progName/;
    s/^CFG=/CFG=$config/;
    s/^OUTDIR=/OUTDIR=.\\$outdir/;
    s/^INTDIR=/INTDIR=.\\$intdir/;
    s/^SSL=.*/SSL=$openssl/;

    print MAKE_OUT $_ . "\n";
  }
}


###############################################
#
# Create Makefiles for libraries  
# from name\Makefile.in
#
###############################################
my @programs = qw 
/libagent
libhelpers
libnetsnmptrapd
/;

if ($sdk == 1) {
  push (@programs, "netsnmpmibssdk");
}
else {
  push (@programs, "netsnmpmibs");
}

if ($linktype eq "dynamic") {
  push (@programs, "libsnmp_dll");
}
else {
  push (@programs, "libsnmp");
}

foreach my $progName (@programs) {
  
  my $makefile_out = "$progName\\Makefile";
  my $makefile_in = "$progName\\Makefile.in";
  
  my $outdir = $config;
  my $intdir = $config;
  
  open (MAKE_OUT, ">$makefile_out") || die "Can't Open $makefile_out\n";
  open (MAKE_IN, "<$makefile_in") || die "Can't Open $makefile_in\n";

  print "creating $makefile_out\n";
  
  while (<MAKE_IN>)
  {
    chomp;
    
    s/^PROGNAME=/PROGNAME=$progName/;
    s/^CFG=/CFG=$config/;
    s/^OUTDIR=/OUTDIR=.\\$outdir/;
    s/^INTDIR=/INTDIR=.\\$intdir/;
    s/^SSL=.*/SSL=$openssl/;
    if ($b_winextdll == 1) {
      s/#(.*?)\s+# uncomment for winExtDLL.*/$1/;
      s/^LIB32_FLAGS=(.*)/LIB32_FLAGS=MgmtAPI.lib snmpapi.lib $1/;
    }
    print MAKE_OUT $_ . "\n";
  }
}

###############################################
#
# Create Makefiles for daemons
# from name\Makefile.in
#
###############################################
my @programs = qw 
/snmptrapd
/;

if ($sdk == 1) {
  push (@programs, "snmpdsdk");
}
else {
  push (@programs, "snmpd");
}

foreach my $progName (@programs) {
  
  my $makefile_out = "$progName\\Makefile";
  my $makefile_in = "$progName\\Makefile.in";
  
  my $outdir = $config;
  my $intdir = $config;
  
  open (MAKE_OUT, ">$makefile_out") || die "Can't Open $makefile_out\n";
  open (MAKE_IN, "<$makefile_in") || die "Can't Open $makefile_in\n";

  print "creating $makefile_out\n";
  
  while (<MAKE_IN>)
  {
    chomp;
    
    s/^LINKTYPE=/LINKTYPE=$linktype/;
    s/^PROGNAME=/PROGNAME=$progName/;
    s/^CFG=/CFG=$config/;
    s/^OUTDIR=/OUTDIR=.\\$outdir/;
    s/^INTDIR=/INTDIR=.\\$intdir/;
    s/^SSL=.*/SSL=$openssl/;

    print MAKE_OUT $_ . "\n";
  }
}

###############################################
#
# Create Makefile for Perl scripts in local
# from local\Makefile.in
#
###############################################
  
my $makefile_out = "local\\Makefile";
my $makefile_in = "local\\Makefile.in";

my $outdir = $config;

open (MAKE_OUT, ">$makefile_out") || die "Can't Open $makefile_out\n";
open (MAKE_IN, "<$makefile_in") || die "Can't Open $makefile_in\n";

print "creating $makefile_out\n";

while (<MAKE_IN>)
{
  chomp;
  
  s/^OUTDIR=/OUTDIR=.\\$outdir/;
  s/^PREFIX=/PREFIX=$prefix/;   
  s/^PREFIX_DOS=/PREFIX_DOS=$prefixdos/;    
  
  print MAKE_OUT $_ . "\n";
}


###############################################
#
# Create net-snmp-config.h
#
###############################################
{
  my $file_out = "net-snmp\\net-snmp-config.h";
  my $file_in = "net-snmp\\net-snmp-config.h.in";

  open (FILE_OUT, ">$file_out") || die "Can't Open $file_out\n";
  open (FILE_IN, "<$file_in") || die "Can't Open $file_in\n";
  
  print "creating $file_out\n";

  while (<FILE_IN>)
  {
    chomp;

    if ($prefix ne "") {
      s/^#define INSTALL_BASE.*/#define INSTALL_BASE \"$prefix\"/;
    }
    if ($linktype eq "dynamic") {
      s/^.*#undef NETSNMP_USE_DLL.*/#define NETSNMP_USE_DLL 1/;
    }
    if ($sdk == 1) {
      s/^.*#undef HAVE_WIN32_PLATFORM_SDK.*/#define HAVE_WIN32_PLATFORM_SDK 1/;
    }
    if ($openssl == 1) {
      s/^.*#undef NETSNMP_USE_OPENSSL.*/#define NETSNMP_USE_OPENSSL 1/;
    }
    if ($b_ipv6 == 1) {
      s/^.*#undef NETSNMP_ENABLE_IPV6.*/#define NETSNMP_ENABLE_IPV6 1/;
    }
    if ($b_winextdll == 1) {
      s/^.*#undef USING_WINEXTDLL_MODULE.*/#define USING_WINEXTDLL_MODULE 1/;
    }

    print FILE_OUT $_ . "\n";
  }
}

###############################################
#
# Create libsnmp.def file for libsnmp_dll
#
###############################################
if ($linktype eq "dynamic")
{
  my $file_out = "libsnmp_dll\\libsnmp.def";
  my $file_in = "libsnmp_dll\\libsnmp.def.in";

  open (FILE_OUT, ">$file_out") || die "Can't Open $file_out\n";
  open (FILE_IN, "<$file_in") || die "Can't Open $file_in\n";
  
  print "creating $file_out\n";

  while (<FILE_IN>)
  {
    chomp;

    if ($b_ipv6 == "1") {
      s/^;ipv6//i;
    }

    print FILE_OUT $_ . "\n";
  }
}


print qq/
---------------------------------------------------------
            Net-SNMP configuration summary:
---------------------------------------------------------

/;

print "  Config type:                $config\n";
print "  SDK:                        " . ($sdk == 1 ? "enabled" : "disabled") . "\n";
print "  Link type:                  $linktype\n";
print "  Prefix / Destdir:           " . ($prefix ne "" ? $prefix : "(default)") . "\n";
print "  OpenSSL:                    " . ($openssl == 1 ? "enabled" : "disabled") . "\n";
print "  IPv6 transport:             " . ($b_ipv6 == 1 ? "enabled" : "disabled") . "\n";
print "  winExtDLL agent:            " . ($b_winextdll == 1 ? "enabled" : "disabled") . "\n";

if ($ENV{INCLUDE} eq "") {
  print "\n\nVisual Studio environment not detected.  Please run VCVARS32.BAT before\n";
  print "running nmake\n\n";
}

