blob: 4007faec80d6ce7867f36c528d94f22c76aae5e0 [file] [log] [blame]
#!/usr/bin/perl
#
# Build script for Net-SNMP and MSVC
# Written by Alex Burger - alex_b@users.sourceforge.net
# March 12th, 2004
#
use strict;
use warnings;
use Config;
use Cwd 'abs_path';
use File::Basename;
use constant false => 0;
use constant true => 1;
my $target_arch = $ENV{TARGET_CPU} ? $ENV{TARGET_CPU} : $ENV{Platform} ?
$ENV{Platform} : "x86";
if ($target_arch ne "x86" && $target_arch ne "x64") {
print "Error: unsupported target architecture $target_arch\n";
die;
}
my @perl_arch = split(/-/, $Config{archname});
if ($perl_arch[1] ne $target_arch) {
print "perl_arch = $perl_arch[1] does not match target_arch = $target_arch\n";
die;
}
my $openssl = false;
my $default_openssldir = $target_arch eq "x64" ?
"C:\\OpenSSL-Win64" : "C:\\OpenSSL-Win32";
my $default_opensslincdir = $default_openssldir . "\\include";
my $opensslincdir = $default_opensslincdir;
my $default_openssllibdir = $default_openssldir . "\\lib\\VC";
my $openssllibdir = $default_openssllibdir;
my $b_ipv6 = false;
my $b_winextdll = false;
my $sdk = false;
my $default_install_base = "c:/usr";
my $install_base = $default_install_base;
my $install = true;
my $install_devel = false;
my $perl = false;
my $perl_install = false;
my $logging = true;
my $debug = false;
my $configOpts = "";
my $link_dynamic = false;
my $option;
# Path of this script (source tree path + "win32").
my $current_pwd = dirname(abs_path($0));
if ( -d $ENV{MSVCDir} || -d $ENV{VCINSTALLDIR} || defined($ENV{TARGET_CPU}) ) {
}
else {
print "\nPlease run VCVARS32.BAT first to set up the Visual Studio build\n" .
"environment.\n\n";
system("pause");
exit;
}
while (1) {
print "\n\nNet-SNMP build and install options\n";
print "==================================\n\n";
print "1. OpenSSL support: " . ($openssl ? "enabled" : "disabled"). "\n";
print "2. OpenSSL include directory: " . $opensslincdir. "\n";
print "3. OpenSSL library director: " . $openssllibdir. "\n";
print "4. Platform SDK support: " . ($sdk ? "enabled" : "disabled") . "\n";
print "\n";
print "5. Install path: " . $install_base . "\n";
print "6. Install after build: " . ($install ? "enabled" : "disabled") . "\n";
print "\n";
print "7. Perl modules: " . ($perl ? "enabled" : "disabled") . "\n";
print "8. Install perl modules: " . ($perl_install ? "enabled" : "disabled") . "\n";
print "\n";
print "9. Quiet build (logged): " . ($logging ? "enabled" : "disabled") . "\n";
print "10. Debug mode: " . ($debug ? "enabled" : "disabled") . "\n";
print "\n";
print "11. IPv6 transports (requires SDK): " . ($b_ipv6 ? "enabled" : "disabled") . "\n";
print "12. winExtDLL agent (requires SDK): " . ($b_winextdll ? "enabled" : "disabled") . "\n";
print "\n";
print "13. Link type: " . ($link_dynamic ? "dynamic" : "static") . "\n";
print "\n";
print "14. Install development files " . ($install_devel ? "enabled" : "disabled") . "\n";
print "\nF. Finished - start build\n";
print "Q. Quit - abort build\n\n";
print "Select option to set / toggle: ";
chomp ($option = <>);
if ($option eq "1") {
$openssl = !$openssl;
}
elsif ($option eq "2") {
print "Please enter the OpenSSL include directory [$opensslincdir]: ";
chomp ($opensslincdir = <>);
$opensslincdir =~ s/\\/\//g;
$opensslincdir = $default_opensslincdir if ($opensslincdir eq "");
}
elsif ($option eq "3") {
print "Please enter the OpenSSL library directory [$openssllibdir]: ";
chomp ($openssllibdir = <>);
$openssllibdir =~ s/\\/\//g;
$openssllibdir = $default_openssllibdir if ($openssllibdir eq "");
}
elsif ($option eq "4") {
$sdk = !$sdk;
}
elsif ($option eq "11") {
$b_ipv6 = !$b_ipv6;
if ($b_ipv6 && !$sdk) {
print "\n\n* SDK required for IPv6 and has been automatically enabled";
$sdk = true;
}
}
elsif ($option eq "12") {
$b_winextdll = !$b_winextdll;
if ($b_winextdll && !$sdk) {
print "\n\n* SDK required for IPv6 and has been automatically enabled";
$sdk = true;
}
}
elsif ($option eq "5") {
print "Please enter the new install path [$default_install_base]: ";
chomp ($install_base = <>);
$install_base =~ s/\\/\//g;
$install_base = $default_install_base if ($install_base eq "");
}
elsif ($option eq "6") {
$install = !$install;
}
elsif ($option eq "14") {
$install_devel = !$install_devel;
}
elsif ($option eq "7") {
$perl = !$perl;
}
elsif ($option eq "8") {
$perl_install = !$perl_install;
}
elsif ($option eq "9") {
$logging = !$logging;
}
elsif ($option eq "10") {
$debug = !$debug;
}
elsif ($option eq "13") {
$link_dynamic = !$link_dynamic;
}
elsif (lc($option) eq "f") {
last;
}
elsif (lc($option) eq "q") {
exit;
}
}
my $linktype = $link_dynamic ? "dynamic" : "static";
$configOpts .= $openssl ? "--with-ssl" : "";
$configOpts .= " ";
$configOpts .= $sdk ? "--with-sdk" : "";
$configOpts .= " ";
$configOpts .= $b_ipv6 ? "--with-ipv6" : "";
$configOpts .= " ";
$configOpts .= $b_winextdll ? "--with-winextdll" : "";
$configOpts .= " ";
$configOpts .= $debug ? "--config=debug" : "--config=release";
# Set environment variables
# Set to not search for non-existent ".dep" files
$ENV{NO_EXTERNAL_DEPS}="1";
# Set PATH environment variable so Perl make tests can locate the DLL
$ENV{PATH} = "$current_pwd\\bin\\" . ($debug ? "debug" : "release" ) . ";$ENV{PATH}";
$ENV{INCLUDE} .= ";$opensslincdir";
$ENV{LIB} .= ";$openssllibdir";
# Set MIBDIRS environment variable so Perl make tests can locate the mibs
$ENV{MIBDIRS} = dirname($current_pwd) . "/mibs";
# Set SNMPCONFPATH environment variable so Perl conf.t test can locate
# the configuration files.
# See the note about environment variables in the Win32 section of
# perl/SNMP/README for details on why this is needed.
$ENV{SNMPCONFPATH}="t";
print "\nBuilding...\n";
print "\nCreating *.out log files.\n\n";
print "Deleting old log files...\n";
system("del *.out" . ($logging ? " > NUL: 2>&1" : ""));
# Delete net-snmp-config.h from main include folder just in case it was created by a Cygwin or MinGW build
unlink "../include/net-snmp/net-snmp-config.h";
unlink "../snmplib/transports/snmp_transport_inits.h";
print "Running Configure...\n";
system("perl Configure $configOpts --linktype=$linktype --prefix=\"$install_base\"" . ($logging ? " > configure.out 2>&1" : "")) == 0 || die ($logging ? "Build error (see configure.out)" : "Build error (see above)");
print "Cleaning...\n";
system("nmake /nologo clean" . ($logging ? " > clean.out 2>&1" : "")) == 0 || die ($logging ? "Build error (see clean.out)" : "Build error (see above)");
print "Building main package...\n";
system("nmake /nologo" . ($logging ? " > make.out 2>&1" : "")) == 0 || die ($logging ? "Build error (see make.out)" : "Build error (see above)");
if ($perl) {
if (!$link_dynamic) {
print "Running Configure for DLL...\n";
system("perl Configure $configOpts --linktype=dynamic --prefix=\"$install_base\"" . ($logging ? " > perlconfigure.out 2>&1" : "")) == 0 || die ($logging ? "Build error (see perlconfigure.out)" : "Build error (see above)");
print "Cleaning libraries...\n";
system("nmake /nologo libs_clean" . ($logging ? " >> clean.out 2>&1" : "")) == 0 || die ($logging ? "Build error (see clean.out)" : "Build error (see above)");
print "Building DLL libraries...\n";
system("nmake /nologo libs" . ($logging ? " > dll.out 2>&1" : "")) == 0 || die ($logging ? "Build error (see dll.out)" : "Build error (see above)");
}
print "Cleaning Perl....\n";
system("nmake /nologo perl_clean" . ($logging ? " >> clean.out 2>&1" : "")); # If already cleaned, Makefile is gone so don't worry about errors!
print "Building Perl modules...\n";
system("nmake /nologo perl" . ($logging ? " > perlmake.out 2>&1" : "")) == 0 || die ($logging ? "Build error (see perlmake.out)" : "Build error (see above)");
print "Testing Perl modules...\n";
system("nmake /nologo perl_test" . ($logging ? " > perltest.out 2>&1" : "")); # Don't die if all the tests don't pass..
if ($perl_install) {
print "Installing Perl modules...\n";
system("nmake /nologo perl_install" . ($logging ? " > perlinstall.out 2>&1" : "")) == 0 || die ($logging ? "Build error (see perlinstall.out)" : "Build error (see above)");
}
print "\nSee perltest.out for Perl test results\n";
}
print "\n";
if ($install) {
print "Installing main package...\n";
system("nmake /nologo install" . ($logging ? " > install.out 2>&1" : "")) == 0 || die ($logging ? "Build error (see install.out)" : "Build error (see above)");
}
else {
print "Type nmake install to install the package to $install_base\n";
}
if ($install_devel) {
print "Installing development files...\n";
system("nmake /nologo install_devel > install_devel.out 2>&1") == 0 || die "Build error (see install_devel.out)";
}
else {
print "Type nmake install_devel to install the development files to $install_base\n";
}
if ($perl && !$perl_install) {
print "Type nmake perl_install to install the Perl modules\n";
}
print "\nDone!\n";
# Local Variables:
# mode: perl
# perl-indent-level: 2
# indent-tabs-mode: nil
# End: