diff --git a/product.version b/product.version new file mode 100644 index 00000000..ee90284c --- /dev/null +++ b/product.version @@ -0,0 +1 @@ +1.0.4 diff --git a/tools/buildbot/bootstrap.pl b/tools/buildbot/bootstrap.pl new file mode 100644 index 00000000..df7e995e --- /dev/null +++ b/tools/buildbot/bootstrap.pl @@ -0,0 +1,59 @@ +#!/usr/bin/perl + +use strict; +use Cwd; +use File::Basename; + +my ($myself, $path) = fileparse($0); +chdir($path); + +require 'helpers.pm'; + +chdir(Build::PathFormat('../builder')); +if ($^O eq "linux") +{ + Build::Command('make clean'); + Build::Command('make'); +} +else +{ + Build::Command('"' . $ENV{'MSVC7'} . '" /Rebuild Release builder.csproj'); + Build::Command('move ' . Build::PathFormat('bin/Release/builder.exe') . ' .'); +} + +die "Unable to build builder tool!\n" unless -e 'builder.exe'; + +#Go back to main source dir. +chdir(Build::PathFormat('../..')); + +#Get the source path. +my ($root) = getcwd(); + +#Create output folder if it doesn't exist. +if (!(-d 'OUTPUT')) { + mkdir('OUTPUT') or die("Failed to create output folder: $!\n"); +} + +#Write the configuration file. +open(CONF, '>build.cfg') or die("Failed to write build.cfg: $!\n"); +print CONF "OutputBase = " . Build::PathFormat($root . '/OUTPUT') . "\n"; +print CONF "SourceBase = $root\n"; +if ($^O eq "linux") +{ + print CONF "BuilderPath = /usr/bin/make\n"; +} +else +{ + print CONF "BuilderPath = " . $ENV{'MSVC8'} . "\n"; +} +close(CONF); + +#Do the annoying revision bumping. +#Linux needs some help here. +if ($^O eq "linux") +{ + Build::Command("flip -u modules.versions"); + Build::Command("flip -u tools/versionchanger.pl"); + Build::Command("chmod +x tools/versionchanger.pl"); +} +Build::Command(Build::PathFormat('tools/versionchanger.pl')); diff --git a/tools/buildbot/helpers.pm b/tools/buildbot/helpers.pm new file mode 100644 index 00000000..c1b5de72 --- /dev/null +++ b/tools/buildbot/helpers.pm @@ -0,0 +1,116 @@ +#!/usr/bin/perl + +use strict; +use Cwd; + +package Build; + +our $SVN = "/usr/bin/svn"; +our $SVN_USER = 'dvander'; +our $SVN_ARGS = ''; +our $SVN_VERSION = "/usr/bin/svnversion"; + +sub Revision +{ + my ($str)=(@_); + my $dir = $SVN_VERSION; + + my $data = Command($dir . ' -c ' . $str); + if ($data =~ /(\d+):(\d+)/) + { + return $2; + } elsif ($data =~ /(\d+)/) { + return $1; + } else { + return 0; + } +} + +sub Delete +{ + my ($str)=(@_); + if ($^O =~ /MSWin/) + { + Command("del /S /F /Q \"$str\""); + Command("rmdir /S /Q \"$str\""); + } else { + Command("rm -rf $str"); + } + return !(-e $str); +} + +sub Copy +{ + my ($src,$dest)=(@_); + if ($^O =~ /MSWin/) + { + Command("copy \"$src\" \"$dest\" /y"); + } else { + Command("cp \"$src\" \"$dest\""); + } + return (-e $dest); +} + +sub Move +{ + my ($src,$dest)=(@_); + if ($^O =~ /MSWin/) + { + Command("move \"$src\" \"$dest\""); + } else { + Command("mv \"$src\" \"$dest\""); + } + return (-e $dest); +} + +sub Command +{ + my($cmd)=(@_); + print "$cmd\n"; + return `$cmd`; +} + +sub PathFormat +{ + my ($str)=(@_); + if ($^O =~ /MSWin/) + { + $str =~ s#/#\\#g; + } else { + $str =~ s#\\#/#g; + } + return $str; +} + +sub SVN_Remove +{ + my ($file)=(@_); + my ($path, $name); + if ($^O =~ /MSWin/) + { + ($path, $name) = ($file =~ /(.+)\/([^\/]+)$/); + } else { + ($path, $name) = ($file =~ /(.+)\\([^\\]+)$/); + } + my $dir = Cwd::cwd(); + chdir($path); + Command($SVN . ' ' . $SVN_ARGS . ' delete ' . $name); + chdir($dir); +} + +sub SVN_Add +{ + my ($file)=(@_); + my ($path, $name); + if ($^O =~ /MSWin/) + { + ($path, $name) = ($file =~ /(.+)\/([^\/]+)$/); + } else { + ($path, $name) = ($file =~ /(.+)\\([^\\]+)$/); + } + my $dir = Cwd::cwd(); + chdir($path); + Command($SVN . ' ' . $SVN_ARGS . ' add ' . $name); + chdir($dir); +} + diff --git a/tools/buildbot/package.pl b/tools/buildbot/package.pl new file mode 100644 index 00000000..99e33b68 --- /dev/null +++ b/tools/buildbot/package.pl @@ -0,0 +1,79 @@ +#!/usr/bin/perl + +use strict; +use Cwd; +use File::Basename; +use Net::FTP; + +my ($ftp_file, $ftp_host, $ftp_user, $ftp_pass, $ftp_path); + +$ftp_file = shift; + +open(FTP, $ftp_file) or die "Unable to read FTP config file $ftp_file: $!\n"; +$ftp_host = ; +$ftp_user = ; +$ftp_pass = ; +$ftp_path = ; +close(FTP); + +chomp $ftp_host; +chomp $ftp_user; +chomp $ftp_pass; +chomp $ftp_path; + +my ($myself, $path) = fileparse($0); +chdir($path); + +require 'helpers.pm'; + +#Switch to the output folder. +chdir(Build::PathFormat('../../OUTPUT/base')); + +my ($version); + +$version = `cat ../../product.version`; +chomp $version; +$version .= '.' . Build::Revision('../..'); + +my ($filename); +$filename = 'sourcemod-' . $version; +if ($^O eq "linux") +{ + $filename .= '.tar.gz'; + print "tar zcvf $filename addons cfg\n"; + system("tar zcvf $filename addons cfg"); +} +else +{ + $filename .= '.zip'; + print "zip -r $filename addons cfg\n"; + system("zip -r $filename addons cfg"); +} + +my ($major,$minor) = ($version =~ /^(\d+)\.(\d+)/); +$ftp_path .= "/$major.$minor"; + +my ($ftp); + +$ftp = Net::FTP->new($ftp_host, Debug => 0) + or die "Cannot connect to host $ftp_host: $@"; + +$ftp->login($ftp_user, $ftp_pass) + or die "Cannot connect to host $ftp_host as $ftp_user: " . $ftp->message . "\n"; + +if ($ftp_path ne '') +{ + $ftp->cwd($ftp_path) + or die "Cannot change to folder $ftp_path: " . $ftp->message . "\n"; +} + +$ftp->binary(); +$ftp->put($filename) + or die "Cannot drop file $filename ($ftp_path): " . $ftp->message . "\n"; + +$ftp->close(); + +print "File sent to drop site as $filename -- build succeeded.\n"; + +exit(0); + diff --git a/tools/buildbot/startbuild.pl b/tools/buildbot/startbuild.pl new file mode 100644 index 00000000..9c371032 --- /dev/null +++ b/tools/buildbot/startbuild.pl @@ -0,0 +1,39 @@ +#!/usr/bin/perl + +use File::Basename; + +my ($myself, $path) = fileparse($0); +chdir($path); + +require 'helpers.pm'; + +chdir('..'); +chdir('..'); + +my ($cmd, $output); + +$cmd = Build::PathFormat('tools/builder/builder.exe') . ' build.cfg 2>&1'; + +if ($^O eq "linux") +{ + $cmd = 'mono ' . $cmd; +} + +system($cmd); + +if ($? == -1) +{ + die "Build failed: $!\n"; +} +elsif ($^O eq "linux" and $? & 127) +{ + die "Build died :(\n"; +} +elsif ($? >> 8 != 0) +{ + die "Build failed with exit code: " . ($? >> 8) . "\n"; +} +else +{ + exit(0); +} diff --git a/tools/builder/ABuilder.cs b/tools/builder/ABuilder.cs index ffe46784..4796f89d 100644 --- a/tools/builder/ABuilder.cs +++ b/tools/builder/ABuilder.cs @@ -44,7 +44,6 @@ namespace builder p.WaitForExit(); p.Close(); - Console.WriteLine("Debug: wd = " + info.WorkingDirectory + " fn = " + info.FileName + " arg = " + info.Arguments); Console.WriteLine(output); string binary = Config.PathFormat("{0}/{1}/addons/sourcemod/scripting/{2}.smx", cfg.pkg_path, pkg.GetBaseFolder(), pl.Source); diff --git a/tools/builder/Main.cs b/tools/builder/Main.cs index e4aa6452..ce22634a 100644 --- a/tools/builder/Main.cs +++ b/tools/builder/Main.cs @@ -43,8 +43,11 @@ namespace builder } catch (System.Exception e) { - Console.WriteLine("Build failed: " + e.Message); + Console.WriteLine("Build failed, exception: " + e.Message); + Environment.Exit(1); } + + Environment.Exit(0); } } }