Subversion Repositories DevTools

Rev

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

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