File: build.pl

package info (click to toggle)
0ad 0.0.17-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 51,248 kB
  • ctags: 46,933
  • sloc: cpp: 223,208; ansic: 31,240; python: 16,343; perl: 4,083; sh: 1,011; makefile: 915; xml: 733; java: 621; ruby: 229; erlang: 53; sql: 40
file content (167 lines) | stat: -rw-r--r-- 5,311 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# Build script - does the actual building of the project

use strict;
use warnings;

use constant EXIT_BUILDCOMPLETE => 0;
use constant EXIT_FAILED => 1;

my %config = (load_conf("c:\\0ad\\autobuild\\aws.conf"), load_conf("d:\\0ad\\autobuild\\run.conf"));
my $build_options = do "d:\\0ad\\autobuild\\options.pl";

my $svn_trunk = "e:\\svn";
my $temp_trunk = "d:\\0ad\\svn";
my $log_dir = "d:\\0ad\\buildlogs";
my $vcbuild = "$svn_trunk\\source\\tools\\autobuild2\\vcbuild_env.bat";

my @gloox_libs = qw(glooxwrapper.dll glooxwrapper.lib glooxwrapper.pdb glooxwrapper_dbg.dll glooxwrapper_dbg.lib glooxwrapper_dbg.pdb);

my $time_start = time();

eval { # catch deaths

# Clean the output directory, just in case it's got old junk left over somehow
`rmdir /q /s $temp_trunk 2>&1`; # (ignore failures, they don't matter)
`rmdir /q /s $log_dir 2>&1`; # (ignore failures, they don't matter)
mkdir $temp_trunk or die $!;
mkdir $log_dir or die $!;

# Capture all output
open STDOUT, '>', "$log_dir\\build_stdout.txt";
open STDERR, '>', "$log_dir\\build_stderr.txt";
open BUILDLOG, '>', "$log_dir\\buildlog.txt" or die $!;

add_to_buildlog("Starting build");

chdir $svn_trunk or die $!;

# Copy all the necessary files into the temporary working area

# For some directories, do a real copy
for (qw(build source libraries))
{
    add_to_buildlog("xcopying $_");
    `xcopy /e $svn_trunk\\$_ $temp_trunk\\$_\\ 2>&1`;
    die "xcopy $_: $?" if $?;
}

# # For other directories (which we're only going to read), do a 'junction' (like a symbolic link) because it's faster
# #
# # Actually don't, because it's easier to not have to install the junction tool
# for (qw(source libraries))
# {
#     `$junction $temp_trunk\\$_ $svn_trunk\\$_`;
#     die "junction $_: $?" if $?;
# }

# Store the SVN revision identifier in a file, so it can be embedded into the .exe
{
    my $rev = `svnversion -n $svn_trunk`;
    die "svnversion: $?" if $?;
    add_to_buildlog("SVN revision $rev");
    open my $f, '>', "$temp_trunk\\build\\svn_revision\\svn_revision.txt" or die $!;
    print $f qq{L"$rev"\n};
}

# Create the workspace files

my $updateworkspaces_args = '';
$updateworkspaces_args .= ' --atlas' if $build_options->{atlas};
$updateworkspaces_args .= ' --collada' if $build_options->{collada};
$updateworkspaces_args .= ' --build-shared-glooxwrapper' if $build_options->{glooxwrapper};
add_to_buildlog("Running update-workspaces$updateworkspaces_args");
chdir "$temp_trunk\\build\\workspaces" or die $!;
my $updateworkspaces_output = `update-workspaces.bat$updateworkspaces_args 2>&1`;
add_to_buildlog($updateworkspaces_output);
die $? if $?;

# Create target directories for built files

mkdir "$temp_trunk\\binaries" or die $!;
mkdir "$temp_trunk\\binaries\\system" or die $!;

# Copy the prebuilt glooxwrapper, if needed

if (not $build_options->{glooxwrapper}) {
    add_to_buildlog("copying glooxwrapper");
    for (@gloox_libs) {
        `copy $svn_trunk\\binaries\\system\\$_ $temp_trunk\\binaries\\system\\`;
        die "Failed to copy $_: $?" if $?;
    }
}

# Do the Release build

add_to_buildlog("Running vcbuild (release)");
my $build_output = `$vcbuild /time /M2 /logfile:$log_dir\\build_vcbuild.txt vc2008\\pyrogenesis.sln "Release|Win32" 2>&1`;
add_to_buildlog($build_output);
die $? if ($? and $? != 32768);

# Do the Debug build of glooxwrapper, if needed

if ($build_options->{glooxwrapper}) {
    add_to_buildlog("Running vcbuild (debug glooxwrapper)");
    my $build_output = `$vcbuild /time /M2 /logfile:$log_dir\\build_vcbuild.txt vc2008\\glooxwrapper.vcproj "Debug|Win32" 2>&1`;
    add_to_buildlog($build_output);
    die $? if ($? and $? != 32768);
}

# Copy the output

add_to_buildlog("Copying generated binaries");
my @binaries = qw(pyrogenesis.exe pyrogenesis.pdb);
push @binaries, 'AtlasUI.dll' if $build_options->{atlas};
push @binaries, 'Collada.dll' if $build_options->{collada};
push @binaries, @gloox_libs if $build_options->{glooxwrapper};
for (@binaries) {
    `copy $temp_trunk\\binaries\\system\\$_ $svn_trunk\\binaries\\system\\`;
    die "Failed to copy $_: $?" if $?;
}

# Commit to SVN

my $commit_binaries = join ' ', map "$svn_trunk\\binaries\\system\\$_", @binaries;
my $svn_output = `svn commit --username $config{svn_username} --password $config{svn_password} $commit_binaries --message "Automated build." 2>&1`;
add_to_buildlog($svn_output);
die $? if $?;

}; # end of eval

if ($@)
{
    warn $@;
    quit(EXIT_FAILED);
}
else
{
    quit(EXIT_BUILDCOMPLETE);
}


# Exit, after copying the current log files over the previous ones
sub quit
{
    my $time_end = time();
    my $time_taken = $time_end - $time_start;
    add_to_buildlog("Build completed with code $_[0] - took $time_taken seconds.");

    exit($_[0]);
}


sub add_to_buildlog
{
    print BUILDLOG +(gmtime time)."\n$_[0]\n--------------------------------------------------------------------------------\n";
}

sub load_conf {
    my ($filename) = @_;
    open my $f, '<', $filename or die "Failed to open $filename: $!";
    my %c;
    while (<$f>) {
        if (/^(.+?): (.+)/) {
            $c{$1} = $2;
        }
    }
    return %c;
}