Subversion Repositories DevTools

Rev

Rev 6485 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4270 alewis 1
########################################################################
6152 dpurdie 2
# COPYRIGHT - VIX IP PTY LTD ("VIX"). ALL RIGHTS RESERVED.
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 = '';
6112 dpurdie 61
my $opt_ISA_TOOLSET = 0;
4270 alewis 62
my $opt_PKG_TOOL_SCRIPT_DIR = '';
63
my $opt_DOWNLOAD_PKG = '';
4789 alewis 64
my $opt_PATCHES_DIR = 'patches';
4270 alewis 65
 
66
my @ConfigMsg;
67
 
68
my $opt_SCRIPT=abs_path($0);
69
my $opt_SCRIPT_DIR=dirname($opt_SCRIPT);
70
 
71
 
72
#
73
#   Debug support
74
#   Allow the following build operations to be optionally performed
75
#
76
my $DO_CLEAN        = 1;
77
my $DO_DOWNLOAD     = 1;
78
my $DO_PATCHES      = 1;
79
my $DO_CONFIGURE    = 1;
80
my $DO_MAKE         = 1;
81
my $DO_INSTALL      = 1;
82
 
83
my $DO_BASH         = 0;
84
 
85
#-------------------------------------------------------------------------------
86
# Function        : ConfigMsg
87
#
88
# Description     : Display a simple message
89
#                   Retain message text for ue in config dump
90
#
91
# Inputs          : Array of message text
92
#
93
# Returns         : 
94
#
95
sub ConfigMsg
96
{
97
    Message (@_);
98
    push @ConfigMsg, @_;
99
}
100
 
101
#------------------------------------------------------------------------------
102
# Extract arguments - order not important except that the first argument is
103
# the launch script
104
#------------------------------------------------------------------------------
105
 
106
my $result = GetOptions (
107
                "help+"                 => \$opt_help,
108
                "manual:3"              => \$opt_help,
109
                "verbose+"              => \$opt_verbose,
110
 
111
                "clean"                 => \$opt_CLEAN,
112
                "ShellBuild=s"          => \$opt_SHELLBUILD,
113
                "BuildName=s"           => \$opt_BUILD_NAME,
114
                "BuildVersion=s"        => \$opt_BUILD_VERSION,
115
                "Platform=s"            => \$opt_PLATFORM,
116
                "Type=s"                => \$opt_TYPE,
117
                "MachType=s"            => \$opt_MACHTYPE,
118
                "BuildRoot=s"           => \$opt_BUILD_ROOT,
119
                "InterfaceDir=s"        => \$opt_INTERFACE_DIR,
120
                "LocalDir=s"            => \$opt_LOCAL_DIR,
121
                "LocalIncDir=s"         => \$opt_LOCAL_INC_DIR,
122
                "LocalLibDir=s"         => \$opt_LOCAL_LIB_DIR,
123
                "LocalBinDir=s"         => \$opt_LOCAL_BIN_DIR,
124
                "BinDir=s"              => \$opt_BIN_DIR,
125
                "ObjDir=s"              => \$opt_OBJ_DIR,
126
                "LibDir=s"              => \$opt_LIB_DIR,
127
                "PackageBinDir=s"       => \$opt_PKG_BIN_DIR,
128
                "PackageIncDir=s"       => \$opt_PKG_INC_DIR,
129
                "PackageLibDir=s"       => \$opt_PKG_LIB_DIR,
130
                "PackagePkgDir=s"       => \$opt_PKG_PKG_DIR,
131
                "PackageDir=s"          => \$opt_PKG_DIR,
132
                "PackageToolDir=s"      => \$opt_PKG_TOOL_DIR,
133
                "PackageToolBin=s"      => \$opt_PKG_TOOL_BIN_DIR,
134
                "PackageToolScript=s"   => \$opt_PKG_TOOL_SCRIPT_DIR,
135
                "DownloadPkg=s"         => \$opt_DOWNLOAD_PKG,
4789 alewis 136
                "PatchesDir=s"          => \$opt_PATCHES_DIR,
6112 dpurdie 137
                "Toolset"               => \$opt_ISA_TOOLSET,
4270 alewis 138
                );
139
 
140
#
141
#   Configure the error reporting process now that we have the user options
142
#
143
ErrorConfig( 'name'    => 'ShellBuild',
144
             'verbose' => $opt_verbose );
145
InitFileUtils();
146
SystemConfig( 'ExitOnError' => 1);
147
 
148
 
149
#   Determine the location of the generated files
150
#   Will simplify processing later
151
#
152
$opt_SHELLBUILD=FullPath($opt_SHELLBUILD);
153
$opt_BUILD_ROOT=FullPath($opt_BUILD_ROOT);
154
$opt_INTERFACE_DIR=FullPath($opt_INTERFACE_DIR);
155
$opt_LOCAL_DIR=FullPath ($opt_LOCAL_DIR);
156
$opt_LOCAL_INC_DIR=FullPath ($opt_LOCAL_INC_DIR);
157
$opt_LOCAL_LIB_DIR=FullPath ($opt_LOCAL_LIB_DIR);
158
$opt_LOCAL_BIN_DIR=FullPath ($opt_LOCAL_BIN_DIR);
159
 
160
$opt_PKG_BIN_DIR=FullPath ($opt_PKG_BIN_DIR);
161
$opt_PKG_INC_DIR=FullPath ($opt_PKG_INC_DIR);
162
$opt_PKG_LIB_DIR=FullPath ($opt_PKG_LIB_DIR);
163
$opt_PKG_PKG_DIR=FullPath ($opt_PKG_PKG_DIR);
164
$opt_PKG_DIR=FullPath ($opt_PKG_DIR);
165
 
166
$opt_PKG_TOOL_DIR=FullPath ($opt_PKG_TOOL_DIR);
167
$opt_PKG_TOOL_BIN_DIR=FullPath($opt_PKG_TOOL_BIN_DIR);
168
$opt_PKG_TOOL_SCRIPT_DIR=FullPath($opt_PKG_TOOL_SCRIPT_DIR);
169
 
170
 
171
#------------------------------------------------------------------------------
172
# Dump JATS information for debugging purposes
173
#------------------------------------------------------------------------------
174
Message "================================================================================";
175
Message "   JATS SUPPLIED FIELDS";
176
Message "================================================================================";
177
ConfigMsg " BuildName         = $opt_BUILD_NAME $opt_BUILD_VERSION";
178
ConfigMsg " Script            = $opt_SCRIPT";
179
ConfigMsg " ScriptDir         = $opt_SCRIPT_DIR";
180
ConfigMsg " ShellBuild        = $opt_SHELLBUILD";
181
ConfigMsg " Platform          = $opt_PLATFORM";
182
ConfigMsg " Type              = $opt_TYPE";
183
ConfigMsg " MachType          = $opt_MACHTYPE";
184
ConfigMsg " BuildRoot         = $opt_BUILD_ROOT";
185
ConfigMsg " InterfaceDir      = $opt_INTERFACE_DIR";
186
ConfigMsg " LocalDir          = $opt_LOCAL_DIR";
187
ConfigMsg " LocalIncDir       = $opt_LOCAL_INC_DIR";
188
ConfigMsg " LocalLibDir       = $opt_LOCAL_LIB_DIR";
189
ConfigMsg " LocalBinDir       = $opt_LOCAL_BIN_DIR";
190
ConfigMsg " BinDir            = $opt_BIN_DIR";
191
ConfigMsg " ObjDir            = $opt_OBJ_DIR";
192
ConfigMsg " LibDir            = $opt_LIB_DIR";
193
ConfigMsg " PackageBinDir     = $opt_PKG_BIN_DIR";
194
ConfigMsg " PackageIncDir     = $opt_PKG_INC_DIR";
195
ConfigMsg " PackageLibDir     = $opt_PKG_LIB_DIR";
196
ConfigMsg " PackagePkgDir     = $opt_PKG_PKG_DIR";
197
ConfigMsg " PackageDir        = $opt_PKG_DIR";
198
ConfigMsg " PackageToolDir    = $opt_PKG_TOOL_DIR";
199
ConfigMsg " PackageToolBin    = $opt_PKG_TOOL_BIN_DIR";
200
ConfigMsg " PackageToolScript = $opt_PKG_TOOL_SCRIPT_DIR";
201
ConfigMsg " DownloadPkg       = $opt_DOWNLOAD_PKG";
4789 alewis 202
ConfigMsg " PatchesDir        = $opt_PATCHES_DIR";
6112 dpurdie 203
ConfigMsg " Toolset           = $opt_ISA_TOOLSET";
4270 alewis 204
Message "================================================================================";
205
 
206
 
207
 
208
# Calculate the relative directory locations
209
my $BASE_DIR=$opt_BUILD_ROOT;
210
my $DOWNLOADS_DIR="$BASE_DIR/downloads";
211
my $SRC_DIR="$BASE_DIR/src";
212
 
213
# Find the downloaded package
214
my $TARBALL_FILE="$DOWNLOADS_DIR/$opt_DOWNLOAD_PKG";
215
my $TAR_DECOMP_ARG;
216
my $ZIP_DECOMP_ARG;
217
my $ext;
218
 
219
if ( -e $TARBALL_FILE . ".tar.bz2" ) {
220
    $TARBALL_FILE=$TARBALL_FILE . ".tar.bz2";
221
    $TAR_DECOMP_ARG='j';
4275 alewis 222
    $ext = '.tar.bz2';
4270 alewis 223
} elsif ( -e $TARBALL_FILE . ".tar.gz" ) {
224
    $TARBALL_FILE=$TARBALL_FILE . ".tar.gz";
225
    $TAR_DECOMP_ARG='z';
226
    $ext = '.tar.gz';
6485 dpurdie 227
} elsif ( -e $TARBALL_FILE . ".tgz" ) {
4270 alewis 228
    $TARBALL_FILE=$TARBALL_FILE . ".tgz";
229
    $TAR_DECOMP_ARG='z';
230
    $ext = '.tgz';
6485 dpurdie 231
} elsif ( -e $TARBALL_FILE . ".tar" ) {
232
    $TARBALL_FILE=$TARBALL_FILE . ".tar";
233
    $ext = '.tar';
234
} elsif ( -e $TARBALL_FILE . ".zip" ) {
4270 alewis 235
    $TARBALL_FILE=$TARBALL_FILE . ".zip";
236
    $ZIP_DECOMP_ARG='x';
237
    $ext = '.zip';
238
} else {
239
    Error ("Could not find download file $TARBALL_FILE.<tar.gz|tar.bz2|tgz|zip>");
240
}
241
 
242
my $UNTAR_DIR="$SRC_DIR/$opt_DOWNLOAD_PKG";
243
my $WORK_DIR = "$UNTAR_DIR.$opt_PLATFORM$opt_TYPE";
4789 alewis 244
my $PATCH_DIR= "$BASE_DIR/$opt_PATCHES_DIR";
4270 alewis 245
 
246
# Dump configuration
247
Message "================================================================================";
248
Message "   BUILD CONFIGURATION";
249
Message "================================================================================";
250
ConfigMsg " Base Dir       = $BASE_DIR";
251
ConfigMsg " Tarball File   = $TARBALL_FILE";
252
ConfigMsg " Working Dir    = $WORK_DIR";
253
Message "================================================================================";
254
 
255
# Prepare the environment
256
Message " --> Preparing environment";
257
 
258
#
259
#   Clean it up - if requested
260
#
261
if ( $opt_CLEAN )
262
{
263
    Message " --> Cleaning generated files";
264
    DeleteDir( $UNTAR_DIR );
265
    DeleteDir( $WORK_DIR );
266
    if ( -d $UNTAR_DIR)
267
    {
268
        Error("Could not delete directory $UNTAR_DIR");
269
    }
270
    if ( -d $WORK_DIR)
271
    {
272
        Error("Could not delete directory $WORK_DIR");
273
    }
274
    exit (0);
275
}
276
 
277
#
278
#   Download and unzip/untar the source package
279
#
4275 alewis 280
if ( ! -d  $WORK_DIR )
281
{
282
    $DO_DOWNLOAD = 1;
283
}
4270 alewis 284
 
285
if ( $DO_DOWNLOAD )
286
{
287
    Message " --> Deleting existing build objects directory";
288
    DeleteDir( $UNTAR_DIR );
289
    DeleteDir( $WORK_DIR );
290
    if ( -d $UNTAR_DIR )
291
    {
292
        Error("Could not delete directory $UNTAR_DIR");
293
    }
294
    if ( -d $WORK_DIR )
295
    {
296
        Error("Could not delete directory $WORK_DIR");
297
    }
298
 
299
    Message " --> Extracting $TARBALL_FILE";
300
    $DO_PATCHES = 1;
301
    chdir $SRC_DIR || Error ("Cannot cd to $SRC_DIR");
302
    if ( $TAR_DECOMP_ARG )
303
    {
304
        #
305
        # Extract tar from archive
306
        # Extract files from tar
307
        #
4275 alewis 308
        my $tfile = $opt_DOWNLOAD_PKG . '.tar';
4270 alewis 309
 
310
        System ('7z', 'e', $TARBALL_FILE, '-y');
311
        System ('7z', 'x', $tfile, '-y' );
312
        unlink $tfile;
313
    }
314
    else
315
    {
316
        System ('7z', 'x', $TARBALL_FILE, '-y' );
317
    }
318
 
319
    # Make sure it exists in the expected directory.
320
    if ( ! -d $UNTAR_DIR ) {
321
        Error ("Decompression to $UNTAR_DIR did not occur as expected");
322
    }
323
 
324
    # It does exist, so move it to the TARBALL directory we expect.
325
    rename $UNTAR_DIR,$WORK_DIR || Error("Could not move $UNTAR_DIR to $WORK_DIR");
326
 
327
}
4275 alewis 328
else
329
{
330
    Message " --> Keep downloaded package";
331
}
4270 alewis 332
chdir $WORK_DIR || Error ("Cannot cd to $WORK_DIR");
333
 
334
#
335
#   Apply local patches
336
#
337
if ( $DO_PATCHES )
338
{
339
    my $patch_script = "$opt_SCRIPT_DIR/patch.pl";
340
    Message " --> Patch script found at $patch_script";
6152 dpurdie 341
 
4270 alewis 342
    my @patches = glob("$PATCH_DIR/*.patch");
343
    @patches = sort @patches;
344
    foreach (@patches) {
345
        my $patch=$_;
6152 dpurdie 346
        Message " --> Applying patch: $patch";
4270 alewis 347
        System ("perl $patch_script -p1 < $patch");
348
    }
6152 dpurdie 349
 
6485 dpurdie 350
    @patches = glob("$PATCH_DIR/*.patch.$opt_PLATFORM");
6152 dpurdie 351
    @patches = sort @patches;
352
    foreach (@patches) {
353
        my $patch=$_;
354
        Message " --> Applying platform patch: $patch";
355
        System ("perl $patch_script -p1 < $patch");
356
    }
357
 
4270 alewis 358
}
359
 
360
#
361
#   Call the build script - first setup the environment, then enter the script.
362
#
6114 dpurdie 363
 
6528 whooper 364
ExportDir('WORK_DIR', $WORK_DIR);
4270 alewis 365
$ENV{DOWNLOAD_PKG}=$opt_BUILD_NAME;
366
$ENV{PLATFORM}=$opt_PLATFORM;
6152 dpurdie 367
$ENV{TYPE}=$opt_TYPE;
4270 alewis 368
 
6528 whooper 369
ExportDir('PKG_DIR'    , $opt_PKG_DIR    );
370
ExportDir('PKG_BIN_DIR', $opt_PKG_BIN_DIR);
371
ExportDir('PKG_INC_DIR', $opt_PKG_INC_DIR);
372
ExportDir('PKG_LIB_DIR', $opt_PKG_LIB_DIR);
373
ExportDir('PKG_PKG_DIR', $opt_PKG_PKG_DIR);
374
 
375
ExportDir('LOCAL_DIR'    , $opt_LOCAL_DIR    );
376
ExportDir('LOCAL_BIN_DIR', $opt_LOCAL_BIN_DIR);
377
ExportDir('LOCAL_INC_DIR', $opt_LOCAL_INC_DIR);
378
ExportDir('LOCAL_LIB_DIR', $opt_LOCAL_LIB_DIR);
379
 
380
ExportDir('BIN_DIR'    , $opt_BIN_DIR    );
381
ExportDir('OBJ_DIR'    , $opt_OBJ_DIR    );
382
ExportDir('LIB_DIR'    , $opt_LIB_DIR    );
383
 
6112 dpurdie 384
if ($opt_ISA_TOOLSET)
385
{
6528 whooper 386
    ExportDir('PKG_TOOL_DIR'        ,$opt_PKG_TOOL_DIR );
387
    ExportDir('PKG_TOOL_BIN_DIR'    ,$opt_PKG_TOOL_BIN_DIR );
388
    ExportDir('PKG_TOOL_SCRIPT_DIR' ,$opt_PKG_TOOL_SCRIPT_DIR );
6112 dpurdie 389
    $ENV{PKG_TOOL_ISA_TOOLSET}=1;
390
}
391
 
6528 whooper 392
ExportDir('INTERFACE_DIR'     , $opt_INTERFACE_DIR);
393
ExportDir('INTERFACE_LIB_DIR' , "$opt_INTERFACE_DIR/lib/$opt_PLATFORM");
394
ExportDir('INTERFACE_INC_DIR' , "$opt_INTERFACE_DIR/include");
4270 alewis 395
 
396
# Clean-up the various flags that can impact nmake.
397
$ENV{MAKEFLAGS}='';
398
$ENV{MAKE}='';
399
 
6528 whooper 400
$opt_SHELLBUILD=~tr{/}{\\};
4270 alewis 401
$result=System("$opt_SHELLBUILD");
402
if ($result != 0 ) 
403
{
404
    Error("Shell build failed with code $result");
405
}
406
 
6528 whooper 407
Message " --> All Done";
408
exit 0;
4270 alewis 409
 
6528 whooper 410
#-------------------------------------------------------------------------------
411
# Function        : ExportDir 
412
#
413
# Description     : Export a directory into the Windows environment 
414
#
415
# Inputs          : VarName     - Target Var Name
416
#                   Data        - Data to set     
417
#
418
# Returns         : Cleaned up data  
419
#
420
sub ExportDir
421
{
422
    my ($varName, $data) = @_;
423
    $data=~tr{/}{\\};
424
    $ENV{$varName} = $data;
4270 alewis 425
 
6528 whooper 426
    return $data;
427
}