Subversion Repositories DevTools

Rev

Rev 6828 | Rev 6835 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4270 alewis 1
########################################################################
5721 dpurdie 2
# Copyright (c) VIX TECHNOLOGY (AUST) LTD
4270 alewis 3
#
4275 alewis 4
# Module name   : shellbuild_windows.pl
4270 alewis 5
# Module type   : Makefile system
6
# Compiler(s)   : Perl
7
# Environment(s): jats
8
#
9
# Description   : Script invoked by Makefile system to do the hard work
4275 alewis 10
#                 of building COTS windows packages.
4270 alewis 11
#
12
#......................................................................#
13
 
14
require 5.008_002;
15
use strict;
16
use warnings;
17
use File::Basename;
18
use File::Copy;
19
use File::Path;
20
 
21
 
22
use Pod::Usage;
23
use Getopt::Long;
24
use Cwd 'abs_path';
25
 
26
use JatsError;
27
use FileUtils;
28
use JatsSystem;
29
use JatsCopy;
30
 
31
#
32
#   Options
33
#
34
my $opt_debug   = $ENV{'GBE_DEBUG'};        # Allow global debug
35
my $opt_verbose = $ENV{'GBE_VERBOSE'};      # Allow global verbose
36
my $opt_help = 0;
37
 
38
my $opt_CLEAN = '';
39
my $opt_SHELLBUILD = '';
40
my $opt_BUILD_NAME = '';
41
my $opt_BUILD_VERSION = '';
42
my $opt_PLATFORM = '';
43
my $opt_TYPE = '';
44
my $opt_MACHTYPE = '';
45
my $opt_BUILD_ROOT = '';
46
my $opt_INTERFACE_DIR = '';
47
my $opt_LOCAL_DIR = '';
48
my $opt_LOCAL_INC_DIR = '';
49
my $opt_LOCAL_LIB_DIR = '';
50
my $opt_LOCAL_BIN_DIR = '';
51
my $opt_BIN_DIR = '';
52
my $opt_OBJ_DIR = '';
53
my $opt_LIB_DIR = '';
54
my $opt_PKG_BIN_DIR = '';
55
my $opt_PKG_INC_DIR = '';
56
my $opt_PKG_LIB_DIR = '';
57
my $opt_PKG_PKG_DIR = '';
58
my $opt_PKG_DIR = '';
59
my $opt_PKG_TOOL_DIR = '';
60
my $opt_PKG_TOOL_BIN_DIR = '';
61
my $opt_PKG_TOOL_SCRIPT_DIR = '';
62
my $opt_DOWNLOAD_PKG = '';
4789 alewis 63
my $opt_PATCHES_DIR = 'patches';
4270 alewis 64
 
65
my @ConfigMsg;
66
 
67
my $opt_SCRIPT=abs_path($0);
68
my $opt_SCRIPT_DIR=dirname($opt_SCRIPT);
69
 
70
 
71
#
72
#   Debug support
73
#   Allow the following build operations to be optionally performed
74
#
75
my $DO_CLEAN        = 1;
76
my $DO_DOWNLOAD     = 1;
77
my $DO_PATCHES      = 1;
78
my $DO_CONFIGURE    = 1;
79
my $DO_MAKE         = 1;
80
my $DO_INSTALL      = 1;
81
 
82
my $DO_BASH         = 0;
83
 
84
#-------------------------------------------------------------------------------
85
# Function        : ConfigMsg
86
#
87
# Description     : Display a simple message
88
#                   Retain message text for ue in config dump
89
#
90
# Inputs          : Array of message text
91
#
92
# Returns         : 
93
#
94
sub ConfigMsg
95
{
96
    Message (@_);
97
    push @ConfigMsg, @_;
98
}
99
 
100
#------------------------------------------------------------------------------
101
# Extract arguments - order not important except that the first argument is
102
# the launch script
103
#------------------------------------------------------------------------------
104
 
105
my $result = GetOptions (
106
                "help+"                 => \$opt_help,
107
                "manual:3"              => \$opt_help,
108
                "verbose+"              => \$opt_verbose,
109
 
110
                "clean"                 => \$opt_CLEAN,
111
                "ShellBuild=s"          => \$opt_SHELLBUILD,
112
                "BuildName=s"           => \$opt_BUILD_NAME,
113
                "BuildVersion=s"        => \$opt_BUILD_VERSION,
114
                "Platform=s"            => \$opt_PLATFORM,
115
                "Type=s"                => \$opt_TYPE,
116
                "MachType=s"            => \$opt_MACHTYPE,
117
                "BuildRoot=s"           => \$opt_BUILD_ROOT,
118
                "InterfaceDir=s"        => \$opt_INTERFACE_DIR,
119
                "LocalDir=s"            => \$opt_LOCAL_DIR,
120
                "LocalIncDir=s"         => \$opt_LOCAL_INC_DIR,
121
                "LocalLibDir=s"         => \$opt_LOCAL_LIB_DIR,
122
                "LocalBinDir=s"         => \$opt_LOCAL_BIN_DIR,
123
                "BinDir=s"              => \$opt_BIN_DIR,
124
                "ObjDir=s"              => \$opt_OBJ_DIR,
125
                "LibDir=s"              => \$opt_LIB_DIR,
126
                "PackageBinDir=s"       => \$opt_PKG_BIN_DIR,
127
                "PackageIncDir=s"       => \$opt_PKG_INC_DIR,
128
                "PackageLibDir=s"       => \$opt_PKG_LIB_DIR,
129
                "PackagePkgDir=s"       => \$opt_PKG_PKG_DIR,
130
                "PackageDir=s"          => \$opt_PKG_DIR,
131
                "PackageToolDir=s"      => \$opt_PKG_TOOL_DIR,
132
                "PackageToolBin=s"      => \$opt_PKG_TOOL_BIN_DIR,
133
                "PackageToolScript=s"   => \$opt_PKG_TOOL_SCRIPT_DIR,
134
                "DownloadPkg=s"         => \$opt_DOWNLOAD_PKG,
4789 alewis 135
                "PatchesDir=s"          => \$opt_PATCHES_DIR,
4270 alewis 136
 
137
                );
138
 
139
#
140
#   Configure the error reporting process now that we have the user options
141
#
142
ErrorConfig( 'name'    => 'ShellBuild',
143
             'verbose' => $opt_verbose );
144
InitFileUtils();
145
SystemConfig( 'ExitOnError' => 1);
146
 
147
 
148
#   Determine the location of the generated files
149
#   Will simplify processing later
150
#
151
$opt_SHELLBUILD=FullPath($opt_SHELLBUILD);
152
$opt_BUILD_ROOT=FullPath($opt_BUILD_ROOT);
153
$opt_INTERFACE_DIR=FullPath($opt_INTERFACE_DIR);
154
$opt_LOCAL_DIR=FullPath ($opt_LOCAL_DIR);
155
$opt_LOCAL_INC_DIR=FullPath ($opt_LOCAL_INC_DIR);
156
$opt_LOCAL_LIB_DIR=FullPath ($opt_LOCAL_LIB_DIR);
157
$opt_LOCAL_BIN_DIR=FullPath ($opt_LOCAL_BIN_DIR);
158
 
159
$opt_PKG_BIN_DIR=FullPath ($opt_PKG_BIN_DIR);
160
$opt_PKG_INC_DIR=FullPath ($opt_PKG_INC_DIR);
161
$opt_PKG_LIB_DIR=FullPath ($opt_PKG_LIB_DIR);
162
$opt_PKG_PKG_DIR=FullPath ($opt_PKG_PKG_DIR);
163
$opt_PKG_DIR=FullPath ($opt_PKG_DIR);
164
 
165
$opt_PKG_TOOL_DIR=FullPath ($opt_PKG_TOOL_DIR);
166
$opt_PKG_TOOL_BIN_DIR=FullPath($opt_PKG_TOOL_BIN_DIR);
167
$opt_PKG_TOOL_SCRIPT_DIR=FullPath($opt_PKG_TOOL_SCRIPT_DIR);
168
 
169
 
170
#------------------------------------------------------------------------------
171
# Dump JATS information for debugging purposes
172
#------------------------------------------------------------------------------
173
Message "================================================================================";
174
Message "   JATS SUPPLIED FIELDS";
175
Message "================================================================================";
176
ConfigMsg " BuildName         = $opt_BUILD_NAME $opt_BUILD_VERSION";
177
ConfigMsg " Script            = $opt_SCRIPT";
178
ConfigMsg " ScriptDir         = $opt_SCRIPT_DIR";
179
ConfigMsg " ShellBuild        = $opt_SHELLBUILD";
180
ConfigMsg " Platform          = $opt_PLATFORM";
181
ConfigMsg " Type              = $opt_TYPE";
182
ConfigMsg " MachType          = $opt_MACHTYPE";
183
ConfigMsg " BuildRoot         = $opt_BUILD_ROOT";
184
ConfigMsg " InterfaceDir      = $opt_INTERFACE_DIR";
185
ConfigMsg " LocalDir          = $opt_LOCAL_DIR";
186
ConfigMsg " LocalIncDir       = $opt_LOCAL_INC_DIR";
187
ConfigMsg " LocalLibDir       = $opt_LOCAL_LIB_DIR";
188
ConfigMsg " LocalBinDir       = $opt_LOCAL_BIN_DIR";
189
ConfigMsg " BinDir            = $opt_BIN_DIR";
190
ConfigMsg " ObjDir            = $opt_OBJ_DIR";
191
ConfigMsg " LibDir            = $opt_LIB_DIR";
192
ConfigMsg " PackageBinDir     = $opt_PKG_BIN_DIR";
193
ConfigMsg " PackageIncDir     = $opt_PKG_INC_DIR";
194
ConfigMsg " PackageLibDir     = $opt_PKG_LIB_DIR";
195
ConfigMsg " PackagePkgDir     = $opt_PKG_PKG_DIR";
196
ConfigMsg " PackageDir        = $opt_PKG_DIR";
197
ConfigMsg " PackageToolDir    = $opt_PKG_TOOL_DIR";
198
ConfigMsg " PackageToolBin    = $opt_PKG_TOOL_BIN_DIR";
199
ConfigMsg " PackageToolScript = $opt_PKG_TOOL_SCRIPT_DIR";
200
ConfigMsg " DownloadPkg       = $opt_DOWNLOAD_PKG";
4789 alewis 201
ConfigMsg " PatchesDir        = $opt_PATCHES_DIR";
4270 alewis 202
Message "================================================================================";
203
 
204
 
205
 
206
# Calculate the relative directory locations
207
my $BASE_DIR=$opt_BUILD_ROOT;
208
my $DOWNLOADS_DIR="$BASE_DIR/downloads";
209
my $SRC_DIR="$BASE_DIR/src";
210
 
211
# Find the downloaded package
212
my $TARBALL_FILE="$DOWNLOADS_DIR/$opt_DOWNLOAD_PKG";
213
my $TAR_DECOMP_ARG;
214
my $ZIP_DECOMP_ARG;
215
my $ext;
216
 
217
if ( -e $TARBALL_FILE . ".tar.bz2" ) {
218
    $TARBALL_FILE=$TARBALL_FILE . ".tar.bz2";
219
    $TAR_DECOMP_ARG='j';
4275 alewis 220
    $ext = '.tar.bz2';
4270 alewis 221
} elsif ( -e $TARBALL_FILE . ".tar.gz" ) {
222
    $TARBALL_FILE=$TARBALL_FILE . ".tar.gz";
223
    $TAR_DECOMP_ARG='z';
224
    $ext = '.tar.gz';
225
} elsif ( $TARBALL_FILE . ".tgz" ) {
226
    $TARBALL_FILE=$TARBALL_FILE . ".tgz";
227
    $TAR_DECOMP_ARG='z';
228
    $ext = '.tgz';
229
} elsif ( $TARBALL_FILE . ".zip" ) {
230
    $TARBALL_FILE=$TARBALL_FILE . ".zip";
231
    $ZIP_DECOMP_ARG='x';
232
    $ext = '.zip';
233
} else {
234
    Error ("Could not find download file $TARBALL_FILE.<tar.gz|tar.bz2|tgz|zip>");
235
}
236
 
237
my $UNTAR_DIR="$SRC_DIR/$opt_DOWNLOAD_PKG";
238
my $WORK_DIR = "$UNTAR_DIR.$opt_PLATFORM$opt_TYPE";
4789 alewis 239
my $PATCH_DIR= "$BASE_DIR/$opt_PATCHES_DIR";
4270 alewis 240
 
241
# Dump configuration
242
Message "================================================================================";
243
Message "   BUILD CONFIGURATION";
244
Message "================================================================================";
245
ConfigMsg " Base Dir       = $BASE_DIR";
246
ConfigMsg " Tarball File   = $TARBALL_FILE";
247
ConfigMsg " Working Dir    = $WORK_DIR";
248
Message "================================================================================";
249
 
250
# Prepare the environment
251
Message " --> Preparing environment";
252
 
253
#
254
#   Clean it up - if requested
255
#
256
if ( $opt_CLEAN )
257
{
258
    Message " --> Cleaning generated files";
259
    DeleteDir( $UNTAR_DIR );
260
    DeleteDir( $WORK_DIR );
261
    if ( -d $UNTAR_DIR)
262
    {
263
        Error("Could not delete directory $UNTAR_DIR");
264
    }
265
    if ( -d $WORK_DIR)
266
    {
267
        Error("Could not delete directory $WORK_DIR");
268
    }
269
    exit (0);
270
}
271
 
272
#
273
#   Download and unzip/untar the source package
274
#
4275 alewis 275
if ( ! -d  $WORK_DIR )
276
{
277
    $DO_DOWNLOAD = 1;
278
}
4270 alewis 279
 
280
if ( $DO_DOWNLOAD )
281
{
282
    Message " --> Deleting existing build objects directory";
283
    DeleteDir( $UNTAR_DIR );
284
    DeleteDir( $WORK_DIR );
285
    if ( -d $UNTAR_DIR )
286
    {
287
        Error("Could not delete directory $UNTAR_DIR");
288
    }
289
    if ( -d $WORK_DIR )
290
    {
291
        Error("Could not delete directory $WORK_DIR");
292
    }
293
 
294
    Message " --> Extracting $TARBALL_FILE";
295
    $DO_PATCHES = 1;
296
    chdir $SRC_DIR || Error ("Cannot cd to $SRC_DIR");
297
    if ( $TAR_DECOMP_ARG )
298
    {
299
        #
300
        # Extract tar from archive
301
        # Extract files from tar
302
        #
4275 alewis 303
        my $tfile = $opt_DOWNLOAD_PKG . '.tar';
4270 alewis 304
 
305
        System ('7z', 'e', $TARBALL_FILE, '-y');
306
        System ('7z', 'x', $tfile, '-y' );
307
        unlink $tfile;
308
    }
309
    else
310
    {
311
        System ('7z', 'x', $TARBALL_FILE, '-y' );
312
    }
313
 
314
    # Make sure it exists in the expected directory.
315
    if ( ! -d $UNTAR_DIR ) {
316
        Error ("Decompression to $UNTAR_DIR did not occur as expected");
317
    }
318
 
319
    # It does exist, so move it to the TARBALL directory we expect.
320
    rename $UNTAR_DIR,$WORK_DIR || Error("Could not move $UNTAR_DIR to $WORK_DIR");
321
 
322
}
4275 alewis 323
else
324
{
325
    Message " --> Keep downloaded package";
326
}
4270 alewis 327
chdir $WORK_DIR || Error ("Cannot cd to $WORK_DIR");
328
 
329
#
330
#   Apply local patches
331
#
332
if ( $DO_PATCHES )
333
{
334
    my $patch_script = "$opt_SCRIPT_DIR/patch.pl";
335
    Message " --> Patch script found at $patch_script";
336
    my @patches = glob("$PATCH_DIR/*.patch");
337
    @patches = sort @patches;
338
    foreach (@patches) {
339
        my $patch=$_;
340
        Message " --> Applying $patch";
341
        System ("perl $patch_script -p1 < $patch");
342
 
343
    }
344
}
345
 
346
#
347
#   Call the build script - first setup the environment, then enter the script.
348
#
349
$opt_SHELLBUILD=~tr{/}{\\};
350
$WORK_DIR=~tr{/}{\\};
351
$opt_PKG_BIN_DIR=~tr{/}{\\};
352
$opt_PKG_INC_DIR=~tr{/}{\\};
353
$opt_PKG_LIB_DIR=~tr{/}{\\};
354
$opt_PKG_PKG_DIR=~tr{/}{\\}; 
6829 cmichael 355
$opt_PKG_TOOL_BIN_DIR=~tr{/}{\\}; 
4270 alewis 356
$opt_INTERFACE_DIR=~tr{/}{\\}; 
357
 
358
$ENV{WORK_DIR}=$WORK_DIR;
359
$ENV{DOWNLOAD_PKG}=$opt_BUILD_NAME;
360
$ENV{PLATFORM}=$opt_PLATFORM;
361
$ENV{PKG_BIN_DIR}=$opt_PKG_BIN_DIR;
362
$ENV{PKG_INC_DIR}=$opt_PKG_INC_DIR;
363
$ENV{PKG_LIB_DIR}=$opt_PKG_LIB_DIR;
364
$ENV{PKG_PKG_DIR}=$opt_PKG_PKG_DIR;
6829 cmichael 365
$ENV{PKG_TOOL_BIN_DIR}=$opt_PKG_TOOL_BIN_DIR;
4270 alewis 366
 
367
$ENV{INTERFACE_LIB_DIR}="$opt_INTERFACE_DIR\\lib\\$opt_PLATFORM";
368
$ENV{INTERFACE_INC_DIR}="$opt_INTERFACE_DIR\\include";
369
 
370
# Clean-up the various flags that can impact nmake.
371
my $cur_MAKEFLAGS=$ENV{MAKEFLAGS};
372
my $cur_MAKE=$ENV{MAKE};
373
 
374
$ENV{MAKEFLAGS}='';
375
$ENV{MAKE}='';
376
 
377
$result=System("$opt_SHELLBUILD");
378
if ($result != 0 ) 
379
{
380
    Error("Shell build failed with code $result");
381
}
382
 
383
# Restore the flags.
384
$ENV{MAKEFLAGS}=$cur_MAKEFLAGS;
385
$ENV{MAKE}=$cur_MAKE;
386
 
387
 
388
Message " --> All Done";
389
exit 0;