| #!/usr/bin/perl |
| # |
| # Build script for Net-SNMP and MSVC |
| # Written by Alex Burger - alex_b@users.sourceforge.net |
| # May 10th, 2009 |
| # |
| use strict; |
| use File::Basename; |
| use File::Copy; |
| use File::Spec; |
| use Cwd 'abs_path'; |
| |
| print "------------------------------------------------------\n"; |
| |
| my $tar_command; |
| my $gzip_command; |
| for my $msysbindir (("C:\\msys\\1.0\\bin", "C:\\mingw\\msys\\1.0\\bin")) { |
| $tar_command = File::Spec->catfile($msysbindir, "tar.exe"); |
| $gzip_command = File::Spec->catfile($msysbindir, "gzip.exe"); |
| last if (-f $tar_command); |
| } |
| |
| if (! (-f $tar_command)) { |
| die ("Could not find tar command"); |
| } |
| else { |
| print "tar command: $tar_command\n"; |
| } |
| if (! (-f $gzip_command)) { |
| die ("Could not find gzip command"); |
| } |
| else { |
| print "gzip command: $gzip_command\n"; |
| } |
| |
| my $makensis; |
| for my $nsisdir (("C:\\Program Files\\NSIS", "C:\\Program Files (x86)\\NSIS")) { |
| $makensis = File::Spec->catfile($nsisdir, "makensis.exe"); |
| last if (-f $makensis); |
| } |
| die("makensis.exe not found") if (!(-f $makensis)); |
| |
| my $target_arch = $ENV{TARGET_CPU} ? $ENV{TARGET_CPU} : $ENV{Platform} ? |
| $ENV{Platform} : "x86"; |
| my $openssldir = $target_arch eq "x64" ? "C:\\OpenSSL-Win64" : |
| "C:\\OpenSSL-Win32"; |
| my $opensslincdir = $openssldir . "\\include"; |
| my $openssllibdir = $openssldir . "\\lib\\VC"; |
| |
| my $version = "unknown"; |
| my $version_for_perl = "unknown"; |
| my $version_maj; |
| my $version_min; |
| my $version_rev; |
| my $installer_exe_version = 1; |
| my $openssl = "disabled"; |
| my $b_ipv6 = "disabled"; |
| my $b_winextdll = "disabled"; |
| my $sdk = "disabled"; |
| my $default_install_base = "c:/usr"; |
| my $install_base = $default_install_base; |
| my $install = "enabled"; |
| my $install_devel = "disabled"; |
| my $perl = "disabled"; |
| my $perl_install = "disabled"; |
| my $logging = "enabled"; |
| my $debug = "disabled"; |
| my $configOpts = ""; |
| my $cTmp = ""; |
| my $linktype = "static"; |
| my $option; |
| |
| my $scriptdir = dirname(abs_path($0)); |
| my $win32_dir = dirname($scriptdir); |
| my $top_dir = dirname($win32_dir); |
| my $perl_dir = File::Spec->catdir($top_dir, "perl"); |
| |
| print "\ntop_dir: $top_dir\n"; |
| print "win32_dir: $win32_dir\n"; |
| print "perl_dir: $perl_dir\n"; |
| print "install base: $install_base\n\n"; |
| |
| chdir $win32_dir; |
| |
| if ( -d "dist" ) { } |
| else { |
| print "\nPlease copy the win32/dist folder from trunk to $win32_dir/\n\n"; |
| exit; |
| } |
| |
| if (!(-d $ENV{MSVCDir}) && !(-d $ENV{VCINSTALLDIR}) && !defined($ENV{TARGET_CPU})) { |
| print "\nPlease run VCVARS32.BAT first to set up the Visual Studio build\n" . |
| "environment.\n\n"; |
| exit; |
| } |
| |
| if ( -d $install_base) { |
| print "\nPlease delete or rename the $install_base folder.\n\n"; |
| exit; |
| } |
| |
| my $system_netsnmpdll = "$ENV{WINDIR}\\system32\\netsnmp.dll"; |
| if ( -f $system_netsnmpdll) { |
| print "\n$system_netsnmpdll should be renamed or deleted.\n\n"; |
| |
| print "Would you like me to delete it? (y/n?)"; |
| $| = 1; |
| my $temp = <STDIN>; |
| chomp $temp; |
| if (lc($temp) eq "y" || lc($temp) eq "yes") { |
| unlink $system_netsnmpdll || die "Could not delete file $system_netsnmpdll\n"; |
| } |
| else { |
| exit; |
| } |
| } |
| |
| ############################################### |
| # |
| # Determine version from unix configure script |
| # |
| ############################################### |
| |
| my $unix_configure_in = "../configure"; |
| |
| open (UNIX_CONFIGURE_IN, "<$unix_configure_in") || die "Can't Open $unix_configure_in\n"; |
| |
| while (<UNIX_CONFIGURE_IN>) |
| { |
| chomp; |
| /PACKAGE_VERSION='(.*)'/; |
| if ($1 ne "") { |
| $version = $1; |
| last; |
| } |
| } |
| close UNIX_CONFIGURE_IN; |
| |
| # Determine version for Perl (4 characters with commas) |
| $version_for_perl = $version; |
| my $dotCount = ($version =~ tr/.//); |
| while ($dotCount < 3) { |
| $version_for_perl .= ".0"; |
| $dotCount++; |
| } |
| $version_for_perl =~ s/\./,/g; |
| |
| # Determine version for NSIS installer |
| my @version_array = split(/\./, $version); |
| $version =~ /.*?\..*?\.(.*)/; |
| $version_rev = $1 || 0; |
| $version_maj = $version_array[0] || 0; |
| $version_min = $version_array[1] || 0; |
| |
| print "Net-SNMP version: $version\n"; |
| print "Net-SNMP Perl version: $version_for_perl\n"; |
| print "Net-SNMP version MAJ: $version_maj\n"; |
| print "Net-SNMP version MIN1: $version_min\n"; |
| print "Net-SNMP version MIN2: $version_rev\n\n"; |
| |
| #goto skip1; |
| #exit; |
| |
| |
| |
| #*************************************************************** |
| # Common build options: |
| $b_ipv6 = "enabled"; |
| $sdk = "enabled"; |
| $default_install_base = "c:/usr"; |
| $install_base = $default_install_base; |
| $perl_install = "disabled"; |
| $debug = "disabled"; |
| $configOpts = ""; |
| $cTmp = ""; |
| $linktype = "dynamic"; |
| |
| #*************************************************************** |
| # Build binary: |
| # winExtDLL = disabled |
| # SSL = enabled |
| $openssl = "enabled"; |
| $b_winextdll = "disabled"; |
| $perl = "enabled"; |
| $install = "enabled"; |
| $install_devel = "enabled"; |
| |
| chdir $win32_dir; |
| &build(); |
| &create_perl_package(); |
| |
| print "\nCleaning up $install_base/snmp/persist/\n"; |
| unlink ("$install_base/snmp/persist/snmpd.conf"); |
| unlink ("$install_base/snmp/persist/snmptrapd.conf"); |
| |
| #*************************************************************** |
| # Build binary: |
| # winExtDLL = enabled |
| # SSL = enabled |
| $openssl = "enabled"; |
| $b_winextdll = "enabled"; |
| $perl = "disabled"; |
| $install = "disabled"; |
| $install_devel = "disabled"; |
| |
| chdir $win32_dir; |
| &build(); |
| |
| print "\nCopying snmpd.exe to snmpd-winExtDLL.exe\n"; |
| copy("bin/release/snmpd.exe","$install_base/bin/snmpd-winExtDLL.exe") || die ("Could not copy snmpd.exe to snmpd-winExtDLL.exe: $?"); |
| |
| print "\nCleaning up $install_base/snmp/persist/\n"; |
| unlink ("$install_base/snmp/persist/snmpd.conf"); |
| unlink ("$install_base/snmp/persist/snmptrapd.conf"); |
| |
| |
| print "Renaming $install_base/bin to $install_base/bin.ssl\n"; |
| rename ("$install_base/bin","$install_base/bin.ssl") || die ("Could not rename folder: $?"); |
| print "Renaming $install_base/lib to $install_base/lib.ssl\n"; |
| rename ("$install_base/lib","$install_base/lib.ssl") || die ("Could not rename folder: $?"); |
| print "Renaming $install_base/perl to $install_base/perl.ssl\n"; |
| rename ("$install_base/perl","$install_base/perl.ssl") || die ("Could not rename folder: $?"); |
| |
| #*************************************************************** |
| |
| |
| #*************************************************************** |
| # Build binary: |
| # winExtDLL = disabled |
| # SSL = disabled |
| $openssl = "disabled"; |
| $b_winextdll = "disabled"; |
| $perl = "enabled"; |
| $install = "enabled"; |
| $install_devel = "enabled"; |
| |
| chdir $win32_dir; |
| &build(); |
| &create_perl_package(); |
| |
| print "\nCleaning up $install_base/snmp/persist/\n"; |
| unlink ("$install_base/snmp/persist/snmpd.conf"); |
| unlink ("$install_base/snmp/persist/snmptrapd.conf"); |
| |
| #*************************************************************** |
| # Build binary: |
| # winExtDLL = enabled |
| # SSL = disabled |
| $openssl = "disabled"; |
| $b_winextdll = "enabled"; |
| $perl = "disabled"; |
| $install = "disabled"; |
| $install_devel = "disabled"; |
| |
| chdir $win32_dir; |
| &build(); |
| |
| print "\nCopying snmpd.exe to snmpd-winExtDLL.exe\n"; |
| copy("bin/release/snmpd.exe","$install_base/bin/snmpd-winExtDLL.exe") || die ("Could not copy snmpd.exe to snmpd-winExtDLL.exe: $?"); |
| |
| print "\nCleaning up $install_base/snmp/persist/\n"; |
| unlink ("$install_base/snmp/persist/snmpd.conf"); |
| unlink ("$install_base/snmp/persist/snmptrapd.conf"); |
| |
| #*************************************************************** |
| |
| print "\n\nCopying dist files:\n"; |
| print "===================\n\n"; |
| |
| mkdir ("$install_base/docs"); |
| mkdir ("$install_base/temp"); |
| |
| &check_dir_exists("$install_base/docs"); |
| &check_dir_exists("$install_base/temp"); |
| |
| chdir $top_dir; |
| copy("COPYING","$install_base/docs/") || die ("Could not copy file: $?"); |
| copy('win32\dist\README.txt',"$install_base/") || die ("Could not copy file: $?"); |
| copy('win32\dist\scripts\net-snmp-perl-test.pl',"$install_base/bin/") || die ("Could not copy file: $?"); |
| |
| |
| skip1: |
| |
| #*************************************************************** |
| |
| print "\n\nCopying NSIS installer files:\n"; |
| print "=============================\n\n"; |
| |
| chdir $top_dir; |
| copy('win32\dist\installer\SetEnVar.nsi',"$install_base/") || die ("Could not copy file: $?"); |
| copy('win32\dist\installer\net-snmp.nsi',"$install_base/net-snmp.nsi") || die ("Could not copy file: $?"); |
| copy('win32\dist\installer\Add2Path.nsi',"$install_base/") || die ("Could not copy file: $?"); |
| copy('win32\dist\installer\net-snmp-header1.bmp',"$install_base/") || die ("Could not copy file: $?"); |
| |
| open (TEMP, ">$install_base/registeragent.bat") || die ("Could not create file: $?"); |
| close TEMP; |
| open (TEMP, ">$install_base/unregisteragent.bat") || die ("Could not create file: $?"); |
| close TEMP; |
| open (TEMP, ">$install_base/registertrapd.bat") || die ("Could not create file: $?"); |
| close TEMP; |
| open (TEMP, ">$install_base/unregistertrapd.bat") || die ("Could not create file: $?"); |
| close TEMP; |
| open (TEMP, ">$install_base/etc/snmp/snmp.conf") || die ("Could not create file: $?"); |
| close TEMP; |
| |
| print "\n\nCopying documentation:\n"; |
| print "=============================\n\n"; |
| |
| # To do: replace the two lines below with commands that build the .chm file. |
| open out, ">$install_base/docs/net-snmp.chm"; |
| close out; |
| |
| print "\n\nBuilding installer:\n"; |
| print "=============================\n\n"; |
| |
| my $suffix = $ENV{LIB} =~ /\\x64|\\amd64/ ? "x64" : "x86"; |
| if (system("\"$makensis\" /DPRODUCT_MAJ_VERSION=\"$version_maj\" /DPRODUCT_MIN_VERSION=\"$version_min\" /DPRODUCT_REVISION=\"$version_rev\" /DPRODUCT_EXE_VERSION=\"$installer_exe_version\" /DINSTALLER_PLATFORM=\"$suffix\" \"$install_base/net-snmp.nsi\"") != 0) { |
| die("Building installer failed"); |
| } |
| |
| print "\n=======\n"; |
| print "Done!!!\n"; |
| print "=======\n\n"; |
| |
| exit; |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| #*************************************************************** |
| sub build { |
| print "\n\nBuilding with options:\n"; |
| print "======================\n\n"; |
| print "1. OpenSSL support: " . $openssl. "\n"; |
| print "2. Platform SDK support: " . $sdk . "\n"; |
| print "\n"; |
| print "3. Install path: " . $install_base . "\n"; |
| print "4. Install after build: " . $install . "\n"; |
| print "\n"; |
| print "5. Perl modules: " . $perl . "\n"; |
| print "6. Install perl modules: " . $perl_install . "\n"; |
| print "\n"; |
| print "7. Quiet build (logged): " . $logging . "\n"; |
| print "8. Debug mode: " . $debug . "\n"; |
| print "\n"; |
| print "9. IPv6 transports (requires SDK): " . $b_ipv6 . "\n"; |
| print "10. winExtDLL agent (requires SDK): " . $b_winextdll . "\n"; |
| print "\n"; |
| print "11. Link type: " . $linktype . "\n"; |
| print "\n"; |
| print "12. Install development files " . $install_devel . "\n"; |
| |
| $cTmp = ($openssl eq "enabled" ? "--with-ssl" : "" ); |
| $configOpts = "$cTmp"; |
| $cTmp = ($sdk eq "enabled" ? "--with-sdk" : "" ); |
| $configOpts = "$configOpts $cTmp"; |
| $cTmp = ($b_ipv6 eq "enabled" ? "--with-ipv6" : "" ); |
| $configOpts = "$configOpts $cTmp"; |
| $cTmp = ($b_winextdll eq "enabled" ? "--with-winextdll" : "" ); |
| $configOpts = "$configOpts $cTmp"; |
| $cTmp = ($debug eq "enabled" ? "--config=debug" : "--config=release" ); |
| $configOpts = "$configOpts $cTmp"; |
| |
| # Set environment variables |
| |
| # Set to not search for non-existent ".dep" files |
| $ENV{NO_EXTERNAL_DEPS}="1"; |
| |
| $ENV{INCLUDE} .= ";$opensslincdir"; |
| $ENV{LIB} .= ";$openssllibdir"; |
| |
| # Set PATH environment variable so Perl make tests can locate the DLL |
| $ENV{PATH} = File::Spec->catdir($top_dir, "bin", $debug eq "enabled" ? "debug" : "release") . ";$ENV{PATH}"; |
| |
| # Set MIBDIRS environment variable so Perl make tests can locate the mibs |
| my $temp_mibdir = File::Spec->catdir($top_dir, "mibs"); |
| $temp_mibdir =~ s/\\/\//g; |
| $ENV{MIBDIRS}=$temp_mibdir; |
| |
| # 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";$ENV{SNMPCONFPATH}; |
| |
| print "\nBuilding...\n"; |
| |
| print "\nCreating *.out log files.\n\n"; |
| |
| #print "Deleting old log files...\n"; |
| #system("del *.out > NUL: 2>&1"); |
| |
| # Delete net-snmp-config.h from main include folder just in case it was created by a Cygwin or MinGW build |
| system("del ..\\include\\net-snmp\\net-snmp-config.h > NUL: 2>&1"); |
| |
| print "Running Configure...\n"; |
| system("perl Configure $configOpts --linktype=$linktype --prefix=\"$install_base\" > configure.out 2>&1") == 0 || die "Build error (see configure.out)"; |
| |
| print "Cleaning...\n"; |
| system("nmake /nologo clean > clean.out 2>&1") == 0 || die "Build error (see clean.out)"; |
| |
| print "Building main package...\n"; |
| system("nmake /nologo > make.out 2>&1") == 0 || die "Build error (see make.out)"; |
| |
| if ($perl eq "enabled") { |
| if ($linktype eq "static") { |
| print "Running Configure for DLL...\n"; |
| system("perl Configure $configOpts --linktype=dynamic --prefix=\"$install_base\" > perlconfigure.out 2>&1") == 0 || die "Build error (see perlconfigure.out)"; |
| |
| print "Cleaning libraries...\n"; |
| system("nmake /nologo libs_clean >> clean.out 2>&1") == 0 || die "Build error (see clean.out)"; |
| |
| print "Building DLL libraries...\n"; |
| system("nmake /nologo libs > dll.out 2>&1") == 0 || die "Build error (see dll.out)"; |
| } |
| |
| print "Cleaning Perl....\n"; |
| system("nmake /nologo perl_clean >> 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 > perlmake.out 2>&1") == 0 || die "Build error (see perlmake.out)"; |
| |
| # print "Testing Perl modules...\n"; |
| # system("nmake /nologo perl_test > perltest.out 2>&1"); # Don't die if all the tests don't pass.. |
| |
| if ($perl_install eq "enabled") { |
| print "Installing Perl modules...\n"; |
| system("nmake /nologo perl_install > perlinstall.out 2>&1") == 0 || die "Build error (see perlinstall.out)"; |
| } |
| |
| print "\nSee perltest.out for Perl test results\n"; |
| } |
| |
| print "\n"; |
| if ($install eq "enabled") { |
| print "Installing main package...\n"; |
| system("nmake /nologo install > install.out 2>&1") == 0 || die "Build error (see install.out)"; |
| } |
| else { |
| print "Type nmake install to install the package to $install_base\n"; |
| } |
| |
| if ($install_devel eq "enabled") { |
| 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_install eq "disabled" && $perl eq "enabled") { |
| print "Type nmake perl_install to install the Perl modules\n"; |
| } |
| |
| print "\nDone!\n"; |
| } # sub build |
| |
| |
| |
| |
| sub create_perl_package { |
| |
| print "\n\nCreating Perl package:\n"; |
| print "========================\n\n"; |
| |
| chdir $perl_dir || die ("Could not enter Perl directory: $perl_dir"); |
| |
| system("nmake ppd > perlpackage.out 2>&1") == 0 || die "Build error (see perlpackage.out)"; |
| #rename("Bundle-NetSNMP.ppd","NetSNMP.ppd") || die "Could not rename Bundle-NetSNMP.ppd to NetSNMP.ppd"; |
| |
| { |
| my $file_out = "NetSNMP.ppd"; |
| my $file_in = "Bundle-NetSNMP.ppd"; |
| |
| 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; |
| s/^<SOFTPKG NAME.*/<SOFTPKG NAME="NetSNMP" VERSION="$version_for_perl">/; |
| s/.*?<TITLE>.*/ <TITLE>Net-SNMP<\/TITLE>/; |
| s/.*?<ABSTRACT>.*/ <ABSTRACT>Object Oriented Interface to Net-SNMP<\/ABSTRACT>/; |
| s/.*?<CODEBASE.*/ <CODEBASE HREF="x86\/NetSNMP.tar.gz" \/>/; |
| |
| print FILE_OUT $_ . "\n"; |
| } |
| close FILE_IN; |
| close FILE_OUT; |
| } |
| |
| print "Compressing Perl modules\n"; |
| unlink "NetSNMP.tar"; |
| unlink "NetSNMP.tar.gz"; |
| unlink "perl-tar.out"; |
| unlink "perl-gzip.out"; |
| print " Creating Perl tar file\n"; |
| if (system("\"$tar_command\" cvf NetSNMP.tar blib > perl-tar.out 2>&1")) { die ("Could not create tar file. See perl-tar.out"); } |
| print " Compressing Perl tar file\n"; |
| if (system("\"$gzip_command\" --best NetSNMP.tar > perl-gzip.out 2>&1")) { die ("Could not compress tar file with gzip. See perl-gzip.out"); } |
| |
| # Remove chdir.. |
| chdir $perl_dir || die ("Could not enter Perl directory: $perl_dir"); |
| mkdir ("$install_base/perl"); |
| mkdir ("$install_base/perl/x86"); |
| &check_dir_exists("$install_base/perl"); |
| &check_dir_exists("$install_base/perl/x86"); |
| copy("NetSNMP.ppd","$install_base/perl/") || die ("Could not copy file: $?"); |
| copy("NetSNMP.tar.gz","$install_base/perl/x86/") || die ("Could not copy file: $?"); |
| } # sub create_perl_package |
| |
| sub check_dir_exists { |
| my $dir = shift; |
| if (! -d $dir) { |
| die "Directory $dir is missing\n"; |
| } |
| } |
| |