Subversion Repositories DevTools

Rev

Rev 6114 | Rev 6485 | Go to most recent revision | 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';
227
} elsif ( $TARBALL_FILE . ".tgz" ) {
228
    $TARBALL_FILE=$TARBALL_FILE . ".tgz";
229
    $TAR_DECOMP_ARG='z';
230
    $ext = '.tgz';
231
} elsif ( $TARBALL_FILE . ".zip" ) {
232
    $TARBALL_FILE=$TARBALL_FILE . ".zip";
233
    $ZIP_DECOMP_ARG='x';
234
    $ext = '.zip';
235
} else {
236
    Error ("Could not find download file $TARBALL_FILE.<tar.gz|tar.bz2|tgz|zip>");
237
}
238
 
239
my $UNTAR_DIR="$SRC_DIR/$opt_DOWNLOAD_PKG";
240
my $WORK_DIR = "$UNTAR_DIR.$opt_PLATFORM$opt_TYPE";
4789 alewis 241
my $PATCH_DIR= "$BASE_DIR/$opt_PATCHES_DIR";
4270 alewis 242
 
243
# Dump configuration
244
Message "================================================================================";
245
Message "   BUILD CONFIGURATION";
246
Message "================================================================================";
247
ConfigMsg " Base Dir       = $BASE_DIR";
248
ConfigMsg " Tarball File   = $TARBALL_FILE";
249
ConfigMsg " Working Dir    = $WORK_DIR";
250
Message "================================================================================";
251
 
252
# Prepare the environment
253
Message " --> Preparing environment";
254
 
255
#
256
#   Clean it up - if requested
257
#
258
if ( $opt_CLEAN )
259
{
260
    Message " --> Cleaning generated files";
261
    DeleteDir( $UNTAR_DIR );
262
    DeleteDir( $WORK_DIR );
263
    if ( -d $UNTAR_DIR)
264
    {
265
        Error("Could not delete directory $UNTAR_DIR");
266
    }
267
    if ( -d $WORK_DIR)
268
    {
269
        Error("Could not delete directory $WORK_DIR");
270
    }
271
    exit (0);
272
}
273
 
274
#
275
#   Download and unzip/untar the source package
276
#
4275 alewis 277
if ( ! -d  $WORK_DIR )
278
{
279
    $DO_DOWNLOAD = 1;
280
}
4270 alewis 281
 
282
if ( $DO_DOWNLOAD )
283
{
284
    Message " --> Deleting existing build objects directory";
285
    DeleteDir( $UNTAR_DIR );
286
    DeleteDir( $WORK_DIR );
287
    if ( -d $UNTAR_DIR )
288
    {
289
        Error("Could not delete directory $UNTAR_DIR");
290
    }
291
    if ( -d $WORK_DIR )
292
    {
293
        Error("Could not delete directory $WORK_DIR");
294
    }
295
 
296
    Message " --> Extracting $TARBALL_FILE";
297
    $DO_PATCHES = 1;
298
    chdir $SRC_DIR || Error ("Cannot cd to $SRC_DIR");
299
    if ( $TAR_DECOMP_ARG )
300
    {
301
        #
302
        # Extract tar from archive
303
        # Extract files from tar
304
        #
4275 alewis 305
        my $tfile = $opt_DOWNLOAD_PKG . '.tar';
4270 alewis 306
 
307
        System ('7z', 'e', $TARBALL_FILE, '-y');
308
        System ('7z', 'x', $tfile, '-y' );
309
        unlink $tfile;
310
    }
311
    else
312
    {
313
        System ('7z', 'x', $TARBALL_FILE, '-y' );
314
    }
315
 
316
    # Make sure it exists in the expected directory.
317
    if ( ! -d $UNTAR_DIR ) {
318
        Error ("Decompression to $UNTAR_DIR did not occur as expected");
319
    }
320
 
321
    # It does exist, so move it to the TARBALL directory we expect.
322
    rename $UNTAR_DIR,$WORK_DIR || Error("Could not move $UNTAR_DIR to $WORK_DIR");
323
 
324
}
4275 alewis 325
else
326
{
327
    Message " --> Keep downloaded package";
328
}
4270 alewis 329
chdir $WORK_DIR || Error ("Cannot cd to $WORK_DIR");
330
 
331
#
332
#   Apply local patches
333
#
334
if ( $DO_PATCHES )
335
{
336
    my $patch_script = "$opt_SCRIPT_DIR/patch.pl";
337
    Message " --> Patch script found at $patch_script";
6152 dpurdie 338
 
4270 alewis 339
    my @patches = glob("$PATCH_DIR/*.patch");
340
    @patches = sort @patches;
341
    foreach (@patches) {
342
        my $patch=$_;
6152 dpurdie 343
        Message " --> Applying patch: $patch";
4270 alewis 344
        System ("perl $patch_script -p1 < $patch");
345
    }
6152 dpurdie 346
 
347
    my @patches = glob("$PATCH_DIR/*.patch.$opt_PLATFORM");
348
    @patches = sort @patches;
349
    foreach (@patches) {
350
        my $patch=$_;
351
        Message " --> Applying platform patch: $patch";
352
        System ("perl $patch_script -p1 < $patch");
353
    }
354
 
4270 alewis 355
}
356
 
357
#
358
#   Call the build script - first setup the environment, then enter the script.
359
#
360
$opt_SHELLBUILD=~tr{/}{\\};
361
$WORK_DIR=~tr{/}{\\};
362
$opt_PKG_BIN_DIR=~tr{/}{\\};
363
$opt_PKG_INC_DIR=~tr{/}{\\};
364
$opt_PKG_LIB_DIR=~tr{/}{\\};
365
$opt_PKG_PKG_DIR=~tr{/}{\\}; 
6114 dpurdie 366
 
367
$opt_PKG_TOOL_DIR=~tr{/}{\\}; 
368
$opt_PKG_TOOL_BIN_DIR=~tr{/}{\\}; 
369
$opt_PKG_TOOL_SCRIPT_DIR=~tr{/}{\\}; 
370
 
4270 alewis 371
$opt_INTERFACE_DIR=~tr{/}{\\}; 
372
 
373
$ENV{WORK_DIR}=$WORK_DIR;
374
$ENV{DOWNLOAD_PKG}=$opt_BUILD_NAME;
375
$ENV{PLATFORM}=$opt_PLATFORM;
6152 dpurdie 376
$ENV{TYPE}=$opt_TYPE;
4270 alewis 377
$ENV{PKG_BIN_DIR}=$opt_PKG_BIN_DIR;
378
$ENV{PKG_INC_DIR}=$opt_PKG_INC_DIR;
379
$ENV{PKG_LIB_DIR}=$opt_PKG_LIB_DIR;
380
$ENV{PKG_PKG_DIR}=$opt_PKG_PKG_DIR;
381
 
6112 dpurdie 382
if ($opt_ISA_TOOLSET)
383
{
384
    $ENV{PKG_TOOL_DIR}=$opt_PKG_TOOL_DIR;
385
    $ENV{PKG_TOOL_BIN_DIR}=$opt_PKG_TOOL_BIN_DIR;
386
    $ENV{PKG_TOOL_SCRIPT_DIR}=$opt_PKG_TOOL_SCRIPT_DIR;
387
    $ENV{PKG_TOOL_ISA_TOOLSET}=1;
388
}
389
 
4270 alewis 390
$ENV{INTERFACE_LIB_DIR}="$opt_INTERFACE_DIR\\lib\\$opt_PLATFORM";
391
$ENV{INTERFACE_INC_DIR}="$opt_INTERFACE_DIR\\include";
392
 
393
# Clean-up the various flags that can impact nmake.
394
my $cur_MAKEFLAGS=$ENV{MAKEFLAGS};
395
my $cur_MAKE=$ENV{MAKE};
396
 
397
$ENV{MAKEFLAGS}='';
398
$ENV{MAKE}='';
399
 
400
$result=System("$opt_SHELLBUILD");
401
if ($result != 0 ) 
402
{
403
    Error("Shell build failed with code $result");
404
}
405
 
406
# Restore the flags.
407
$ENV{MAKEFLAGS}=$cur_MAKEFLAGS;
408
$ENV{MAKE}=$cur_MAKE;
409
 
410
 
411
Message " --> All Done";
412
exit 0;