Subversion Repositories DevTools

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
263 dpurdie 1
########################################################################
2
# Copyright (C) 2008 ERG Limited, All rights reserved
3
#
4
# Module name   : PHARLAP.PL
5
# Module type   : JATS TOOLSET
6
# Compiler(s)   : Perl
7
# Environment(s): JATS
8
#
9
# Description   : PharLap (and VC6) for PHARLAP
10
#
11
#                 Based on the WIN32 toolset
12
#                 Pharlap uses the MS V6 compiler
13
#                 but provides its own linker
14
#
15
# Notes         : The Pharlap linker does not support PDB files
16
#
17
#                 Shared Library (DLL) support has not bee implemented
18
#                 Not currently needed
19
#
20
#                 Building via Visual Studio Project is to be discouraged.
21
#                 The linker intrerface requires:
22
#                   1) Great care
23
#                   2) Hacking of the Visual Studio install
24
#
25
#......................................................................#
26
 
27
use strict;
28
use warnings;
29
 
30
#
31
#   Global data
32
#
33
my $target_file_lib;                        # Last library built
34
my $target_file_dll;                        # Last dll built
35
my $target_file_exe;                        # Last program built
36
 
37
my $toolset_name = 'pharlap';               # Toolset name : Error reporting
38
 
39
##############################################################################
40
#   Version information
41
#
42
my $toolset_info;
43
my $toolset_version = 'PHARLAP.10.1';
44
my %ToolsetVersion =
45
    (
46
        'PHARLAP.10.1' => { 'def'        => 'PHARLAP.def' ,
47
                            'buildcmd'   => 'msdev =DSW= /make "ALL - =TYPE=" /useenv /out =LOG=' ,
48
                            'cleancmd'   => 'msdev =DSW= /make "ALL - =TYPE=" /clean /useenv' ,
49
                            'tmp'        => 'vc60',
50
                            'VSCOMPILER' => '1',
51
                          },
52
    );
53
 
54
 
55
##############################################################################
56
#   ToolsetInit()
57
#       Runtime initialisation
58
#
59
##############################################################################
60
 
61
ToolsetInit();
62
 
63
sub ToolsetInit
64
{
65
 
66
#.. Parse arguments (Toolset arguments)
67
#
68
    Debug( "$toolset_name(@::ScmToolsetArgs)" );
69
 
70
    foreach $_ ( @::ScmToolsetArgs ) {
71
        if (/^--Version=(.*)/) {           # MS SDK Version
72
            $toolset_version = $1;
73
 
74
        } else {
75
            Message( "$toolset_name toolset: unknown option $_ -- ignored\n" );
76
        }
77
    }
78
 
79
#.. Parse arguments (platform arguments)
80
#
81
    Debug( "$toolset_name(@::ScmPlatformArgs)" );
82
 
83
    foreach $_ ( @::ScmPlatformArgs ) {
84
        if (/^--product=(.*)/) {                # GBE product
85
 
86
        } elsif (/^--Version=(.*)/) {           # MS SDK Version
87
            $toolset_version = $1;
88
 
89
        } else {
90
            Message( "$toolset_name toolset: unknown platform argument $_ -- ignored\n" );
91
        }
92
    }
93
 
94
#.. Validate SDK version
95
#   Currently only one version is supported
96
#       1) PHARLAP.10.1     - As provided via Visual Studio and PharLap 10.1
97
#
98
    $toolset_info = $ToolsetVersion{$toolset_version};
99
    Error( "toolset_name: Unknown version: $toolset_version" ) unless ( defined $toolset_info );
100
 
101
 
102
#.. Standard.rul requirements
103
#
104
    $::s = 'asm';
105
    $::o = 'obj';
106
    $::a = 'lib';
107
    $::so = 'dll';
108
    $::exe = '.exe';
109
 
110
#.. Toolset configuration
111
#
112
    $::ScmToolsetVersion = "1.0.0";             # our version
113
    $::ScmToolsetGenerate = 0;                  # generate optional
114
    $::ScmToolsetProgDependancies = 0;          # handle Prog dependancies myself
115
 
116
#.. define Visual C/C+ environment
117
    Init( "visualc" );
118
    ToolsetDefines( $toolset_info->{'def'} );
119
    PlatformDefine ("VSCOMPILER\t= $toolset_info->{'VSCOMPILER'}" );
120
    ToolsetRequire( "exctags" );                # and Exuberant Ctags
121
    ToolsetRules( "pharlap.rul" );
122
    ToolsetRules( "standard.rul" );
123
 
124
#.. define PCLint envrionment
125
    ToolsetRequire( "pclint" );                 # using pclint
126
    PlatformDefine ("LINT_COFILE\t= co-msc60.lnt");
127
    PlatformDefine ("LINT_PRJ_FILE\t=lint.visualc");
128
 
129
#.. Cleanup rules
130
#
131
    ToolsetGenerate( "\$(OBJDIR)/$toolset_info->{'tmp'}.idb" );     # vc60.idb
132
    ToolsetGenerate( "\$(OBJDIR)/$toolset_info->{'tmp'}.pch" );
133
    ToolsetGenerate( "\$(OBJDIR)/$toolset_info->{'tmp'}.pdb" );
134
 
135
 
136
 
137
#.. Extend the CompilerOption directive
138
#   Create a standard data structure
139
#   This is a hash of hashes
140
#       The first hash is keyed by CompileOption keyword
141
#       The second hash contains pairs of values to set or remove
142
#
143
    %::ScmToolsetCompilerOptions =
144
    (
145
        #
146
        #   Control the thread model to use
147
        #   This will affect the compiler options and the linker options
148
        #
149
    );
150
 
151
    #
152
    #   Set default options
153
    #
154
}
155
 
156
##############################################################################
157
#   ToolsetPostprocess
158
#       Process collected data as the makefile is generated
159
#       This, optional, routine is called from within MakefileGenerate()
160
#       It allows the toolset to massage any of the collected data before
161
#       the makefile is finally closed created
162
#
163
##############################################################################
164
 
165
sub ToolsetPostprocess
166
{
167
    MakeHeader('Toolset Postprocessed Information');
168
 
169
    #
170
    #   Add values to the perl environment
171
    #   May be used by post processing tools to create Visual Studio Projects
172
    #
173
    $::TS_sbr_support = 1;
174
 
175
    #
176
    #   Prioritorise target: EXE, DLL, LIB
177
    #
178
    for my $tgt ( $target_file_exe, $target_file_dll, $target_file_lib  )
179
    {
180
        if ( $tgt )
181
        {
182
            $::TS_target_file = $tgt;
183
            last;
184
        }
185
    }
186
}
187
 
188
 
189
###############################################################################
190
#   ToolsetCTAGS()
191
#       This subroutine takes the user options and builds the rules
192
#       required to build the CTAGS database.
193
#
194
#   Arguments:
195
#       --xxx                   No arguments currently defined
196
#
197
#   Output:
198
#       [ctags:]
199
#           $(EXCTAGS)
200
#
201
###############################################################################
202
 
203
sub ToolsetCTAGS
204
{
205
    EXCTAGS( @_ );
206
}
207
 
208
 
209
###############################################################################
210
#   ToolsetCC( $source, $obj, \@args )
211
#       This subroutine takes the user options and builds the rule(s)
212
#       required to compile the source file 'source' to 'obj'
213
#
214
###############################################################################
215
 
216
sub ToolsetCC
217
{
218
    ToolsetCC_common( "CC", @_ );
219
}
220
 
221
sub ToolsetCC_common
222
{
223
    my( $name, $source, $obj, $pArgs ) = @_;
224
    my( $cflags );
225
 
226
    foreach $_ ( @$pArgs ) {
227
        if (/--Shared$/) {                      # Building a 'shared' object
228
            $cflags = "$cflags \$(SHCFLAGS)";
229
 
230
        } else {
231
            Message( "$toolset_name $name: unknown option $_ -- ignored\n" );
232
        }
233
    }
234
 
235
    MakePrint( "\n\t\$($name)\n" );
236
    MakePadded( 4, "\$(OBJDIR)/$obj.$::o:", "\tCFLAGS +=$cflags\n" )
237
        if ( $cflags );                         # object specific CFLAGS
238
 
239
    #
240
    #   Remove possible Source Browser Files and source file
241
    #
242
    ToolsetGenerate( "\$(OBJDIR)/$obj.sbr" );
243
    ToolsetGenerate( "\$(OBJDIR)/$obj.src" );
244
    MakePrint( "\n" );
245
}
246
 
247
 
248
###############################################################################
249
#   ToolsetCCDepend( $depend, \@sources )
250
#       This subroutine takes the user options and builds the
251
#       rule(s) required to build the dependencies for the source
252
#       files 'sources' to 'depend'.
253
#
254
###############################################################################
255
 
256
sub ToolsetCCDepend
257
{
258
    MakePrint( "\t\$(CCDEPEND)\n" );
259
}
260
 
261
 
262
###############################################################################
263
#   ToolsetCXX( $source, $obj, \@args )
264
#       This subroutine takes the user options and builds the rule(s)
265
#       required to compile the source file 'source' to 'obj'
266
#
267
###############################################################################
268
 
269
sub ToolsetCXX
270
{
271
    ToolsetCC_common( "CXX", @_ );
272
}
273
 
274
###############################################################################
275
#   ToolsetCXXDepend( $depend, \@sources )
276
#       This subroutine takes the user options and builds the
277
#       rule(s) required to build the dependencies for the source
278
#       files 'sources' to 'depend'.
279
#
280
###############################################################################
281
 
282
sub ToolsetCXXDepend
283
{
287 dpurdie 284
    ToolsetCCDepend();
263 dpurdie 285
}
286
 
287
 
288
###############################################################################
289
#   ToolsetAS( $source, $obj, \@args )
290
#       This subroutine takes the user options and builds the rule(s)
291
#       required to compile the source file 'source' to 'obj'
292
#
293
###############################################################################
294
 
295
sub ToolsetAS
296
{
297
    MakePrint( "\n\t\$(AS)\n" );
298
}
299
 
300
sub ToolsetASDepend
301
{
302
}
303
 
304
###############################################################################
305
#   ToolsetAR( $name, \@args, \@objs )
306
#       This subroutine takes the user options and builds the rules
307
#       required to build the library 'name'.
308
#
309
#   Arguments:
310
#       --Def=name              Library definition module
311
#
312
#   Output:
313
#       [ $(LIBDIR)/name$.${a}:   .... ]
314
#           $(AR)
315
#
316
###############################################################################
317
 
318
sub ToolsetAR
319
{
320
    my( $name, $pArgs, $pObjs ) = @_;
321
    my( $def );
322
    my ( $res, @reslist );
323
    my $lib_base = "\$(LIBDIR)/${name}\$(GBE_TYPE)";
324
    my $lib_name = "$lib_base.${a}";
325
 
326
 
327
#.. Parse arguments
328
#
329
    $def = "";                                  # options
330
    $res = "";
331
 
332
    foreach $_ ( @$pArgs ) {
333
        if (/^--Def=(.*)/) {                    # library definition
334
            $def = "$1";
335
 
336
        } elsif (/^--Resource=(.*)/) {          # Resource definition
337
            ($res, @reslist) = ToolsetRClist( "$name", $1 );
338
 
339
        } else {                                # unknown
340
            Message( "$toolset_name AR: unknown option $_ -- ignored\n" );
341
        }
342
    }
343
 
344
#.. Resource Creation
345
#
346
    MakePrint( "#.. Library Resource ($name)\n\n" );
347
    ToolsetRCrecipe( $res, @reslist )
348
        if ( $res );
349
 
350
#.. Target
351
#
352
    MakePrint( "#.. Library ($name)\n\n" );     # label
353
 
354
    MakePrint( "$lib_name:\tLIBDEF=$def\n" ) if ($def);
355
    MakeEntry( "$lib_name:\t", "", "\\\n\t\t", ".$::o", @$pObjs );
356
    MakePrint( "\\\n\t\t$def" ) if ($def);
357
    MakePrint( "\\\n\t\t$res" ) if ($res);
358
    MakePrint( "\n\t\$(AR)" );
359
 
360
#
361
#   Track the name of the possible target file
362
#   Used when creating Visual Studio projects
363
#
364
    $target_file_lib = $lib_name;
365
 
366
}
367
 
368
 
369
###############################################################################
370
#   ToolsetARLINT( $name, \@args, \@objs )
371
#       This subroutine takes the user options and builds the rules
372
#       required to build the library 'name'.
373
#
374
#   Arguments:
375
#       --xxx                   No arguments currently defined
376
#
377
#   Output:
378
#       [ $(LIBDIR)/name$_lint:   .... ]
379
#           $(ARLINT)
380
#
381
###############################################################################
382
 
383
sub ToolsetARLINT
384
{
385
    PCLintAR( @_ );
386
}
387
 
388
 
389
###############################################################################
390
#   ToolsetARMerge( $name, \@args, \@libs )
391
#       This subroutine takes the user options and builds the rules
392
#       required to build the library 'name' by merging the specified
393
#       libaries
394
#
395
#   Arguments:
396
#       --xxx                   No arguments currently defined
397
#
398
#   Output:
399
#       [ $(LIBDIR)/name$.${a}:   .... ]
400
#           ...
401
#
402
###############################################################################
403
 
404
sub ToolsetARMerge
405
{
406
    my ($name, $pArgs, $pLibs) = @_;
407
    MakePrint( "\n\t\$(ARMERGE)\n\n" );
408
}
409
 
410
###############################################################################
411
# Function        : ToolsetLD
412
#
413
# Description     : Takes the user options and builds the rules required to
414
#                   link the program 'name'.
415
#
416
# Inputs          : $name           - base name of the program
417
#                   $pArgs          - Ref to program arguments
418
#                   $pObjs          - Ref to program objects
419
#                   $pLibs          - Ref to program library list
420
#
421
# Returns         : Nothing
422
#
423
# Output:         : Rules and recipes to create a program
424
#                       Create program rules and recipes
425
#                       Create linker input script
426
#                       Create library dependency list
427
#                       Include library dependency information
428
#
429
sub ToolsetLD
430
{
431
    my ( $name, $pArgs, $pObjs, $pLibs ) = @_;
432
    my ( $res, @reslist );
433
    my @cmd_files;
434
 
435
#.. Parse arguments
436
#
437
    foreach ( @$pArgs ) {
438
        if (/^--Resource=(.*)/) {               # Resource definition
439
            ($res, @reslist) = ToolsetRClist( $name, $1 );
440
 
441
        } elsif (/^--CmdFile=(.+)/) {
442
            push @cmd_files, MakeSrcResolve($1);
443
 
444
        } else {
445
            Message( "$toolset_name LD: unknown option $_ -- ignored\n" );
446
 
447
        }
448
    }
449
 
450
#.. Names of important files
451
#
452
    my $base = "\$(BINDIR)/${name}";
453
    my $full = $base . $::exe;
454
    my $map  = $base . '.map';
455
    my $dep  = $base . '.dep';
456
 
457
 
458
#.. Cleanup rules
459
#
460
#   dep             Dependency file
461
#   ld              Linker command file
462
#   map             Map file
463
#   ilk             Microsoft Linker Database
464
#   res             Compiled resource script
465
#
466
    ToolsetGenerate( $dep );
467
    ToolsetGenerate( $map );
468
    ToolsetGenerate( $base . '.ld' );
469
    ToolsetGenerate( $base . '.ilk' );
470
 
471
#.. Linker command
472
#
473
    my ($io) = ToolsetPrinter::New();
474
 
475
    $io->Prt( "$full : $dep " );
476
    $io->Entry( "", "", "\\\n\t", ".$::o ", @$pObjs );
477
    $io->Prt( "\\\n\t$res " ) if ( $res );
478
    $io->Prt( "\n\t\$(LD)\n\n" );
479
 
480
 
481
#.. Linker command file
482
#
483
#       Now piece together a variable $(name_ld) which ends up in
484
#       the command file linking the application.
485
#
486
    $io->SetTag( "${name}_ld" );                # macro tag
487
 
488
    $io->Label( "Linker commands", $name );     # label
489
 
490
    $io->Cmd( "\@\$(subst /,\\\\,$_)" ) foreach (@cmd_files);
491
    $io->Cmd( "-exe \$(subst /,\\\\,$full)" );
492
    $io->Cmd( "-cvsymbols" );
493
    $io->Cmd( "-map \$(subst /,\\\\,$map)" );
494
    $io->Cmd( "\$(subst /,\\\\,$res)" )             if ( $res );
495
 
496
    $io->ObjList( $name, $pObjs, \&ToolsetObjRecipe );  # object list
497
    $io->LibList( $name, $pLibs, \&ToolsetLibRecipe );  # library list
498
    $io->Newline();
499
 
500
#.. Library dependency information
501
#   Rules to include a .dep file when required
502
#
503
    $io->LDDEPEND( $name );
504
 
505
#.. Dependencies
506
#
507
#       Now piece together a variable $(name_dp) which ends up in
508
#       the command file building the application dependency list.
509
#
510
    $io->SetTag( "${name}_dp" );                                # macro tag
511
    $io->DepRules( $name, $pLibs, \&ToolsetLibRecipe, $full );  # library depends rules
512
    $io->Newline();
513
 
514
#.. Compile up the resource file
515
#
516
    ToolsetRCrecipe( $res, @reslist )
517
        if ( $res );
518
 
519
#.. Package up the program
520
#
521
    PackageProgAddFiles ( $name, $full );
522
 
523
#
524
#   Track the name of the possible target file
525
#   Used when creating Visual Studio projects
526
#
527
    $target_file_exe = $full;
528
}
529
 
530
 
531
###############################################################################
532
#   ToolsetLD( $name, \@args, \@objs, \@libraries, \@csrc, \@cxxsrc )
533
#       This subroutine takes the user options and builds the rules
534
#       required to lint the program 'name'.
535
#
536
#   Arguments:
537
#       (none)
538
#
539
#   Output:
540
#       [ $(BINDIR)/$name_lint:   .... ]
541
#           $(LDLINT)
542
#
543
###############################################################################
544
 
545
sub ToolsetLDLINT
546
{
547
    PCLintLD( @_ );
548
}
549
 
550
 
551
########################################################################
552
#
553
#   Generate a linker object recipe.  This is a helper function used 
554
#   within this toolset.
555
#
556
#   Arguments:
557
#       $io         I/O stream
558
#
559
#       $target     Name of the target
560
#
561
#       $obj        Library specification
562
#
563
########################################################################
564
 
565
sub ToolsetObjRecipe
566
{
567
    my ($io, $target, $obj) = @_;
568
 
569
    $io->Cmd( "\$(subst /,\\\\,\$(strip $obj)).$::o" );
570
}
571
 
572
 
573
########################################################################
574
#
575
#   Generate a linker/depend library recipe.  This is a helper function
576
#   used within this toolset.
577
#
578
#   Arguments:
579
#       $io         I/O stream
580
#
581
#       $target     Name of the target
582
#
583
#       $lib        Library specification
584
#
585
#       $dp         If building a depend list, the full target name.
586
#
587
########################################################################
588
 
589
sub ToolsetLibRecipe
590
{
591
    my ($io, $target, $lib, $dp) = @_;
592
 
593
    if ( !defined($dp) ) {                      # linker
594
        $io->Cmd( "\$(subst /,\\\\,\$(strip $lib)).$::a" );
595
 
596
    } else {                                    # depend
597
        $io->Cmd( "$dp:\t@(vlib2,$lib,LIB)" );
598
    }
599
}
600
 
601
 
602
########################################################################
603
#
604
#   Parse resource file data
605
#   This is a helper function used within this toolset
606
#
607
#   Arguments   : $1  BaseName
608
#                 $2  The users resource list
609
#                     This is a list of comma seperated files
610
#                     The first file is the main resource script
611
#
612
#   Returns     : An array of resource files with full pathnames
613
#                 [0] = The output file
614
#                 [1] = The input file
615
#                 [..] = Other input files
616
#
617
########################################################################
618
 
619
sub ToolsetRClist
620
{
621
    my ($name, $files) = @_;
622
    my @result;
623
 
624
    #
625
    #   Generate the name of the output file
626
    #
627
    push @result, "\$(OBJDIR)/$name.res";
628
 
629
    #
630
    #   Process each user file
631
    #
279 dpurdie 632
    for (split( '\s*,\s*', $files ))
263 dpurdie 633
    {
634
        #
635
        #   Locate the file.
636
        #   If it is a generate file so it will be in the SRCS hash
637
        #   Other wise the use will have to use Src to locate the file
638
        #
639
        push @result, MakeSrcResolve($_);
640
    }
641
 
642
    #
643
    #   Return the array to the user
644
    #
645
    return @result;
646
}
647
 
648
 
649
########################################################################
650
#
651
#   Generate a resource file recipe
652
#   This is a helper function used within this tool
653
#
654
#   Arguments   : $1  Output resource file
655
#                 ..  Input resource files
656
#
657
########################################################################
658
 
659
sub ToolsetRCrecipe
660
{
661
    my ($out, @in) = @_;
662
 
663
    #
664
    #   Cleanup
665
    #
666
    ToolsetGenerate( $out );
667
 
668
    #
669
    #   Recipe
670
    #
671
    MakePrint( "\n#.. Compile Resource file: $out\n\n" );
672
    MakePrint( "$out:\t\$(GBE_PLATFORM).mk\n" );
673
    MakeEntry( "$out:\t", "", "\\\n\t\t", " ", @in );
674
    MakePrint( "\n\t\$(RC)\n" );
675
    MakePrint( "\n" );
676
}
677
 
678
########################################################################
679
#
680
#   Generate a project from the provided project solution file
681
#   This is aimed at .NET work
682
#
683
#   Arguments   : $name             - Base name of the project
684
#                 $solution         - Path to the solutionn file
685
#                 $pArgs            - Project specific options
686
#
687
########################################################################
688
 
689
my $project_defines_done = 0;
690
sub ToolsetPROJECT
691
{
692
    my( $name, $solution ,$pArgs ) = @_;
693
    my $buildcmd = $toolset_info->{'buildcmd'};
694
    my $cleancmd = $toolset_info->{'cleancmd'};
695
 
696
    #
697
    #   Process options
698
    #
699
    foreach ( @$pArgs ) {
700
        Message( "$toolset_name PROJECT: unknown option $_ -- ignored\n" );
701
    }
702
 
703
    my ($io) = ToolsetPrinter::New();
704
 
705
    #
706
    #   Setup toolset pecific difinitions. Once
707
    #
708
    unless( $project_defines_done )
709
    {
710
        $project_defines_done = 1;
711
        $io->PrtLn( "ifeq \"\$(DEBUG)\" \"1\"");
712
        $io->PrtLn( "PROJECT_CMD\t:= DEBUG");
713
        $io->PrtLn( "else");
714
        $io->PrtLn( "PROJECT_CMD\t:= RELEASE");
715
        $io->PrtLn( "endif");
716
        $io->Newline();
717
    }
718
 
719
    #
720
    #   Process the build and clean commands
721
    #       Substitute arguments
722
    #           =TYPE=
723
    #           =LOG=
724
    #           =DSW=
725
    #
726
    $buildcmd =~ s~=TYPE=~\$\(PROJECT_CMD)~g;
727
    $buildcmd =~ s~=LOG=~$name\$(GBE_TYPE).log~g;
728
    $buildcmd =~ s~=DSW=~$solution~g;
729
 
730
    $cleancmd =~ s~=TYPE=~\$\(PROJECT_CMD)~g;
731
    $cleancmd =~ s~=LOG=~$name\$(GBE_TYPE).log~g;
732
    $cleancmd =~ s~=DSW=~$solution~g;
733
 
734
    #
735
    #   Generate the recipe to create the project
736
    #   Use the set_WIN32.sh file to extend the DLL search path
737
    #
738
    $io->Label( "Build project", $name );
739
    $io->PrtLn( "Project_$name: $solution \$(INTERFACEDIR)/set_$::ScmPlatform.sh" );
740
 
741
    $io->PrtLn( "\t\$(XX_PRE)( \$(rm) -f $name\$(GBE_TYPE).log; \\" );
742
    $io->PrtLn( "\t. \$(INTERFACEDIR)/set_$::ScmPlatform.sh; \\" );
743
    $io->PrtLn( "\t\$(show_environment); \\" );
744
    $io->PrtLn( "\t$buildcmd; \\" );
745
    $io->PrtLn( "\tret=\$\$?; \\" );
746
    $io->PrtLn( "\t\$(GBE_BIN)/cat $name\$(GBE_TYPE).log; \\" );
747
    $io->PrtLn( "\texit \$\$ret )" );
748
    $io->Newline();
749
 
750
    #
751
    #   Generate the recipe to clean the project
752
    #
753
    $io->Label( "Clean project", $name );
754
    $io->PrtLn( "ProjectClean_$name: $solution" );
755
    $io->PrtLn( "\t-\$(XX_PRE)$cleancmd" );
756
    $io->PrtLn( "\t-\$(XX_PRE)\$(rm) -f $name\$(GBE_TYPE).log" );
757
    $io->Newline();
758
 
759
}
760
 
761
 
762
#.. Successful termination
763
1;
764