ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/BuildFile.pm
(Generate patch)

Comparing COMP/SCRAM/src/BuildSystem/BuildFile.pm (file contents):
Revision 1.1 by williamc, Fri Dec 17 11:02:27 1999 UTC vs.
Revision 1.25 by sashby, Mon Nov 11 17:28:56 2002 UTC

# Line 1 | Line 1
1 < #
2 < # BuildFile.pm - An Active Document
3 < #
4 < # Originally Written by Christopher Williams
5 < #
6 < # Description
7 < # -----------
8 < # Parse a BuildFile to figure out the required build rules
1 > # BuildFile
2   #
3   # Interface
4   # ---------
5 < # new()         : A new BuildFile object
5 > # new(toolbox)
6 > # ParseBuildFile($base,$path,$file)
7 > # ParseBuildFileExport(filename)
8 > # BlockClassPath() : Return the class path
9 > # ignore()      : return 1 if directory should be ignored 0 otherwise
10  
11   package BuildSystem::BuildFile;
12 < require 5.001;
13 < @ISA=qw(ActiveDoc)
12 > use Utilities::Verbose;
13 > use ActiveDoc::SimpleDoc;
14 > use BuildSystem::ToolBox;
15 > require 5.004;
16 > @ISA=qw(Utilities::Verbose);
17 >
18 > BEGIN {
19 > $buildfile="BuildFile";
20 > }
21 >
22 > sub new {
23 >        my $class=shift;
24 >        my $self={};
25 >        bless $self, $class;
26 >        $self->{toolbox}=shift;
27 >        $self->{Arch}=1;
28 >        push @{$self->{ARCHBLOCK}}, $self->{Arch};
29 >        return $self;
30 > }
31 >
32 > sub ignore {
33 >        my $self=shift;
34 >        $self->verbose(">> ignore......<<");
35 >        
36 >        return (defined $self->{ignore})?$self->{ignore}:0;
37 > }
38 >
39 > sub _initswitcher {
40 >        my $self=shift;
41 >        my $switch=ActiveDoc::SimpleDoc->new();
42 >        my $parse="makebuild";
43 >        $self->verbose(">> _initswitcher: <<");
44 >        $switch->newparse($parse);
45 >        $switch->addignoretags($parse);
46 >        $self->_commontags($switch,$parse);
47 >        $switch->addtag($parse,"Build", \&Build_start, $self);
48 >        $switch->addtag($parse,"none",
49 >                                        \&OutToMakefile,$self,
50 >                                        \&OutToMakefile, $self,
51 >                                        "", $self);
52 >        $switch->addtag($parse,"Bin",
53 >                                        \&Bin_start,$self,
54 >                                        \&OutToScreen, $self,
55 >                                        "", $self);
56 >        $switch->addtag($parse,"Module",
57 >                                        \&Module_start,$self,
58 >                                        \&OutToScreen, $self,
59 >                                        "", $self);
60 >
61 >        $switch->addtag($parse,"ProductStore",
62 >                                        \&Store_start,$self,
63 >                                        "", $self,
64 >                                        "", $self);
65 >        $switch->addtag($parse,"LibType",
66 >                                        \&LibType_Start,$self,
67 >                                        \&LibType_text, $self,
68 >                                        \&LibType_end,$self);
69 >        $switch->addtag($parse,"ConfigurationClass",
70 >                                        \&Class_StartTag,$self,
71 >                                        \&OutToMakefile, $self,
72 >                                        "", $self);
73 >        $switch->addtag($parse,"ClassPath",
74 >                                        \&setBlockClassPath,$self,
75 >                                        \&OutToMakefile, $self,
76 >                                        "", $self);
77 >        $switch->addtag($parse,"AssociateGroup",
78 >                                        "",$self,
79 >                                        \&AssociateGroup,$self,
80 >                                        "", $self);
81 >        $switch->addtag($parse,"Environment",
82 >                                        \&Environment_start,$self,
83 >                                        \&OutToMakefile, $self,
84 >                                        \&Environment_end,$self);
85 >        $switch->addtag($parse,"Export",
86 >                                        \&export_start,$self,
87 >                                        \&OutToMakefile, $self,
88 >                                        \&export_end,$self);
89 >        return $switch;
90 > }
91 >
92 > sub _commontags
93 >   {
94 >   my $self=shift;
95 >   my $switch=shift;
96 >   my $parse=shift;
97 >  
98 >   $self->verbose(">> _commontags: SW ".$switch." PARSE ".$parse." <<");
99 >  
100 >   $switch->grouptag("Export",$parse);
101 >   $switch->addtag($parse,"Use",
102 >                   \&Use_start,$self,
103 >                   \&OutToMakefile, $self,
104 >                   "", $self);
105 >   $switch->addtag($parse,"Group",
106 >                   \&Group_start,$self,
107 >                   \&OutToMakefile, $self,
108 >                   "", $self);
109 >   $switch->grouptag("Group",$parse);
110 >   $switch->addtag($parse,"External",
111 >                   \&External_StartTag,$self,
112 >                   \&OutToMakefile, $self,
113 >                   "", $self);
114 >   $switch->addtag($parse,"lib",
115 >                   \&lib_start,$self,
116 >                   \&OutToMakefile, $self,"", $self);
117 >   $switch->addtag($parse,"debuglib",
118 >                   \&debuglib_start,$self,
119 >                   \&OutToMakefile, $self,
120 >                   "", $self);
121 >   $switch->addtag($parse,"Architecture",
122 >                   \&Arch_Start,$self,
123 >                   \&OutToMakefile, $self,
124 >                   \&Arch_End,$self);
125 >   $switch->addtag($parse,"INCLUDE_PATH",
126 >                   \&IncludePath_Start,$self,
127 >                   \&OutToMakefile, $self,
128 >                   "",$self);
129 >   $switch->addtag($parse,"CompilerMap",
130 >                   \&CompilerMap_Start,$self,
131 >                   \&OutToMakefile, $self,
132 >                   "",$self);
133 >   return $switch;
134 >   }
135  
136 < sub init {
136 > sub ParseBuildFile {
137          my $self=shift;
138 +        my $base=shift;
139 +        my $path=shift;
140 +        my $filename=shift @_;
141 +        my $fullfilename;
142 +        if ( $filename!~/^\// ) {
143 +         $fullfilename="$base/$path/$filename";
144 +        }
145 +        else {
146 +         $fullfilename=$filename;
147 +        }
148  
149 <        # set up our data structures
150 <        $self->{Benv}=BuildEnvironment->new();
151 <        # Specific tags
152 <        # environment tags
153 <        $self->{tags}->addtag("Environment", \&Environment_Start, "",
154 <                        \&Environment_End);
155 <        # bin tags
156 <        $self->{bincontext}=0;
157 <        $self->{tags}->addtag("bin", \&bin_Start, \&bin_text, \&bin_End);
149 >        $self->verbose(">> ParseBuildFile: FN ".$fullfilename." <<");
150 >        
151 >        $self->{path}=$path;
152 >        $numbins=0;
153 >        $self->{envnum}=0;
154 >        $self->{envlevel}=0;
155 >        $self->{currentenv}="$ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/".
156 >                                                                "BuildFile.mk";
157 >        $self->{switch}=$self->_initswitcher();
158 >        $self->{switch}->filetoparse($fullfilename);
159 >
160 >        # open a temporary gnumakefile to store output.
161 >        use Utilities::AddDir;
162 >        AddDir::adddir("$ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}");
163 >        my $fh=FileHandle->new();
164 >        open ( $fh, ">$ENV{LOCALTOP}/$ENV{INTwork}/".$self->{path}."/BuildFile.mk"
165 >          ) or die "Unable to open /$ENV{INTwork}/".$self->{path}."/BuildFile.mk $!\n";
166 >        @{$self->{filehandlestack}}=($fh);
167 >        # make an alias
168 >        *GNUmakefile=$fh;
169 >        if ( -e $ENV{LatestBuildFile} ) {
170 >          print GNUmakefile "include $ENV{LatestBuildFile}\n";
171 >        }
172  
173 <        $self->_addignore();
173 >        $ENV{LatestBuildFile}="$ENV{LOCALTOP}/$ENV{INTwork}/".$self->{path}."/BuildFile.mk";
174 >        $self->{switch}->parse("makebuild"); # sort out supported tags
175 >        if ( $numbins > 0 ) {
176 >         print GNUmakefile <<ENDTEXT;
177 > ifndef BINMODE
178 > help::
179 > \t\@echo Generic Binary targets
180 > \t\@echo ----------------------
181 > endif
182 > ENDTEXT
183 >         foreach $target ( keys %$targettypes ) {
184 >         print GNUmakefile <<ENDTEXT;
185 > ifndef BINMODE
186 > help::
187 > \t\@echo $target
188 > endif
189 > ENDTEXT
190 >         }
191 >        }
192 >        close GNUmakefile;
193   }
194  
195 < # --------------------- Support Routines ----
35 < sub _expandvars {
195 > sub ParseBuildFile_Export {
196          my $self=shift;
197 <        my $string=shift;
197 >        my $filename=shift;
198  
199 <        # Deal with Use in the environment
199 >        $self->verbose(">> ParseBuildFile_Export: FN ".$filename." <<");
200          
201 <        # expand directly from the local build Env
202 <        $self->{Benv}->expandvars($string);
201 >        my $bf=BuildSystem::BuildFile->new($self->{toolbox});
202 >        if ( defined $self->{remoteproject} ) {
203 >           $bf->{remoteproject}=$self->{remoteproject};
204 >        }
205 >        $bf->_parseexport($filename);
206 >        undef $bf;
207   }
208  
209 < # ------------------- Tag Routines ------------------------------
209 > sub _location {
210 >        my $self=shift;
211 >        use File::Basename;
212 >        $self->verbose(">> _location: <<");
213 >        return dirname($self->{switch}->filetoparse());
214 > }
215  
216 < sub Environment_Start {
216 > sub _parseexport {
217 >        my $self=shift;
218 >        my $filename=shift;
219 >        $self->verbose(">> _parseexport: FN ".$filename." <<");
220 >        
221 >        my $switchex=ActiveDoc::SimpleDoc->new();
222 >        $switchex->filetoparse($filename);
223 >        $switchex->newparse("export");
224 >        $switchex->addignoretags("export");
225 >        $switchex->addtag("export","Export",
226 >                                        \&export_start_export,$self,
227 >                                        \&OutToMakefile, $self,
228 >                                        \&export_end_export,$self);
229 >        $self->_commontags($switchex,"export");
230 >        $switchex->allowgroup("__export","export");
231 >        $self->{switch}=$switchex;
232 >        $switchex->parse("export"); # sort out supported tags
233 > }
234 >
235 > sub _pushremoteproject {
236 >        my $self=shift;
237 >        my $path=shift;
238 >
239 >        $self->verbose(">> _pushremoteproject: PATH ".$path." <<");
240 >        
241 >        if ( defined $self->{remoteproject} ) {
242 >          push @{$self->{rpstack}}, $self->{remoteproject};
243 >        }
244 >        $self->{remoteproject}=$path;
245 > }
246 >
247 > sub _popremoteproject {
248 >        my $self=shift;
249 >        $self->verbose(">> _popremoteproject:  <<");
250 >        
251 >        if ( $#{$self->{rpstack}} >=0 ) {
252 >          $self->{remoteproject}=pop @{$self->{rpstack}};
253 >        }
254 >        else {
255 >          undef $self->{remoteproject};
256 >        }
257 > }
258 >
259 > sub _toolmapper {
260 >        my $self=shift;
261 >
262 >        if ( ! defined $self->{mapper} ) {
263 >           require BuildSystem::ToolMapper;
264 >           $self->{mapper}=BuildSystem::ToolMapper->new();
265 >        }
266 >        $self->verbose(">> _toolmapper: TM ".$self->{mapper}."<<");
267 >        return $self->{mapper};
268 > }
269 >
270 >
271 > # ---- Tag routines
272 >
273 > #-- Override a class type with the <ConfigurationClass type=xxx> tag
274 > #   the type tag will pick up a pre-defined class type from project space.
275 >
276 > sub Class_StartTag {
277          my $self=shift;
278          my $name=shift;
279          my $hashref=shift;
280  
281 <        $self->{Benv}->newenv();
281 >        $self->verbose(">> Classs_StartTag: NM ".$name." <<");
282          
283 +        if ( $self->{Arch} ) {
284 +         if ( defined $$hashref{'type'} ) {
285 +                $ClassName=$$hashref{'type'};
286 +         }
287 +        }
288   }
289 +
290 + sub IncludePath_Start
291 +   {
292 +   my $self=shift;
293 +   my $name=shift;
294 +   my $hashref=shift;
295 +  
296 +   $self->verbose(">> IncludePath_Start: NM ".$name." <<");
297 +  
298 +   $self->{switch}->checktag( $name, $hashref, 'path');
299 +   if ( $self->{Arch} )
300 +      {
301 +      print GNUmakefile "INCLUDE+=".$self->_location()."/".$$hashref{'path'}."\n";
302 +      }
303 +   }
304  
305 < sub Environment_End {
306 <        my $self=shift;
307 <        my $name=shift;
308 <        my $hashref=shift;
305 > #
306 > # generic build tag
307 > #
308 > sub Build_start {
309 >        my $self=shift;
310 >        my $name=shift;
311 >        my $hashref=shift;
312 >
313 >        $self->verbose(">> Build_start: NM ".$name." <<");
314 >        
315 >        $self->{switch}->checktag($name,$hashref,'class');
316 >        if ( $self->{Arch} ) {
317 >
318 >          # -- determine the build products name
319 >          my $name;
320 >          if ( exists $$hashref{'name'} ) {
321 >            $name=$$hashref{'name'};
322 >          }
323 >          else {
324 >            $self->{switch}->parseerror("No name specified for build product");
325 >          }
326 >
327 >          # -- check we have a lookup for the class type
328 >          my $mapper=$self->_toolmapper();
329 >          if ( ! $mapper->exists($$hashref{'class'}) ) {
330 >            $self->{switch}->parseerror("Unknown class : ".$$hashref{'class'});
331 >          }
332 >          else {
333 >           my @types=$self->_toolmapper()->types($$hashref{'class'});
334 >           my @deftypes=$self->_toolmapper()->defaulttypes($$hashref{'class'});
335 >
336 >           my $fh=$self->{filehandlestack}[0];
337 >           my @targets=();
338 >
339 >           # -- generate generic targets
340 >           print $fh "ifndef _BuildLink_\n";
341 >           print $fh "# -- Generic targets\n";
342 >           push @targets, $$hashref{'class'};
343 >           foreach $dtype ( @deftypes ) {
344 >            print $fh $$hashref{'class'}."::".$$hashref{'class'}."_".
345 >                                                                $dtype."\n";
346 >           }
347 >           print $fh "\n";
348 >
349 >           # -- generate targets for each type
350 >           foreach $type ( @types ) {
351 >
352 >            # -- generic name for each type
353 >            my $pattern=$$hashref{'class'}."_".$type;
354 >            my $dirname=$$hashref{'class'}."_".$type."_".$name;
355 >            print $fh "# ------ $pattern rules ---------------\n";
356 >            print $fh $$hashref{'class'}."_".$type."::".$$hashref{'class'}.
357 >                                                        "_".$type."_$name\n\n";
358 >
359 >            # -- create a new directory for each type
360 >            push @targets, $pattern;
361 >            my $dirname=$$hashref{'class'}."_".$type."_".$name;
362 >            my $here="$ENV{LOCALTOP}/$ENV{INTwork}/".$self->{path}."/".$dirname;
363 >            my $makefile=$here."/BuildFile.mk";
364 >
365 >            # -- create link targets to the directory
366 >            push @targets, $dirname;
367 >            print $fh "# -- Link Targets to $type directories\n";
368 >            print $fh "$dirname: make_$dirname\n";
369 >            print $fh "\t\@cd $here; \\\n";
370 >            print $fh "\t\$(MAKE) LatestBuildFile=$makefile _BuildLink_=1".
371 >                        " workdir=$here ".
372 >                        " -f \$(TOOL_HOME)/basics.mk datestamp \$\@; \n\n";
373 >
374 >            # -- write target to make makefile for each directory
375 >            print $fh "# -- Build target directories\n";
376 >            print $fh "make_$dirname:\n";
377 >            print $fh "\tif [ ! -e \"$makefile\" ]; then \\\n";
378 >            print $fh "\t if [ ! -d \"$here\" ]; then \\\n";
379 >            print $fh "\t  mkdir $here; \\\n";
380 >            print $fh "\t fi;\\\n";
381 >            print $fh "\t cd $dirname; \\\n";
382 >            print $fh "\t echo include ".$self->{currentenv}." > ".
383 >                                                        "$makefile; \\\n";
384 >            print $fh "\t echo VPATH+=$ENV{LOCALTOP}/".$self->{path}.
385 >                                        " >> $makefile; \\\n";
386 >            print $fh "\t echo buildname=$name >> $makefile;\\\n";
387 >            print $fh "\t echo ".$dirname.":".$pattern." >> $makefile;\\\n";
388 >            if ( defined (my @file=$mapper->rulesfile($$hashref{'class'})) ) {
389 >             foreach $f ( @file ) {
390 >              print $fh "\t echo -include $f >> $makefile; \\\n";
391 >             }
392 >            }
393 >            print $fh "\tfi\n";
394 >            print $fh "\n";
395 >
396 >            # -- cleaning targets
397 >            push @targets, "clean_$dirname";
398 >            print $fh "# -- cleaning targets\n";
399 >            print $fh "clean::clean_$dirname\n";
400 >            print $fh "clean_".$dirname."::\n";
401 >            print $fh "\t\@echo cleaning $dirname\n";
402 >            print $fh "\t\@if [ -d $here ]; then \\\n";
403 >            print $fh "\tcd $here; \\\n";
404 >            print $fh "\t\$(MAKE) LatestBuildFile=$makefile workdir=".
405 >                        $here." _BuildLink_=1 -f ".
406 >                        "\$(TOOL_HOME)/basics.mk clean; \\\n";
407 >            print $fh "\tfi\n\n";
408 >
409 >
410 >          }
411 >          # -- help targets
412 >          print $fh "helpheader::\n";
413 >          print $fh "\t\@echo Targets available:\n";
414 >          print $fh "\t\@echo ------------------\n\n";
415 >          print $fh "help::helpheader\n";
416 >          foreach $target ( @targets ) {
417 >            print $fh "help::\n";
418 >            print $fh "\t\@echo $target\n"
419 >          }
420 >          print $fh "endif\n";
421 >         } # end else
422 >        }
423 > }
424 >
425 > sub Bin_start {
426 >        my $self=shift;
427 >        my $name=shift;
428 >        my $hashref=shift;
429 >
430 >        my $fileclass;
431 >        my @tools;
432 >        my $tool;
433 >        my $filename;
434 >        my $objectname;
435 >
436 >        $self->verbose(">>          <<");
437 >        
438 >        $self->{switch}->checktag($name,$hashref,'file');
439 >        if ( $self->{Arch} ) {
440 >        if ( ! defined $$hashref{name} ) {
441 >                ($$hashref{name}=$$hashref{file})=~s/\..*//;
442 >        }
443 >        ($filename=$$hashref{file})=~s/\..*//;
444 >
445 >        # Create a new directory for each binary target
446 >        my $dirname="bin_".$$hashref{name};
447 >        AddDir::adddir("$ENV{LOCALTOP}/$ENV{INTwork}/".$self->{path}."/$dirname");
448 >        open (binGNUmakefile,
449 >           ">$ENV{LOCALTOP}/$ENV{INTwork}/".$self->{path}."/$dirname/BuildFile.mk") or die           "Unable to make $ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/$dirname/".
450 >           "BuildFile.mk $!\n";
451 >
452 >        # Create the link targets
453 >        $numbins++;
454 >        my $fh=$self->{filehandlestack}[0];
455 >        print $fh <<ENDTEXT;
456 >
457 > # Link Targets to binary directories
458 > ifdef BINMODE
459 > # We dont want to build a library here
460 > override files:=
461 > endif
462 > ifndef BINMODE
463 >
464 > define stepdown_$$hashref{'name'}
465 > if [ -d "$ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/$dirname" ]; then \\
466 > cd $ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/$dirname; \\
467 > \$(MAKE) BINMODE=true LatestBuildFile=$ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/$dirname/BuildFile.mk workdir=\$(workdir)/$dirname -f \$(TOOL_HOME)/basics.mk datestamp \$\@; \\
468 > fi
469 > endef
470 >
471 > define stepdown2_$$hashref{'name'}
472 > if [ -d "$ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/$dirname" ]; then \\
473 > cd $ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/$dirname; \\
474 > \$(MAKE) BINMODE=true LatestBuildFile=$ENV{LOCALTOP}/$ENV{INTwork}/$self{path}/$dirname/BuildFile.mk workdir=\$(workdir)/$dirname -f \$(TOOL_HOME)/basics.mk datestamp \$\*; \\
475 > fi
476 >
477 > endef
478 >
479 > bin_$$hashref{'name'}_%:: dummy
480 >        \@\$(stepdown2_$$hashref{'name'})
481 >
482 > $$hashref{'name'}_%:: dummy
483 >        \@\$(stepdown_$$hashref{'name'})
484 >
485 > help bin bin_debug bin_debug_local bin_insure bin_Insure clean $$hashref{'name'}:: dummy
486 >        \@\$(stepdown_$$hashref{'name'})
487 >
488 > binfiles+=$$hashref{'file'}
489 > locbinfiles+=$dirname/$$hashref{'file'}
490 > endif
491 >
492 >
493 > ENDTEXT
494 >
495 >
496 > # the binary specifics makefile
497 >        print binGNUmakefile "include ".$self->{currentenv}."\n";
498 >        print binGNUmakefile "VPATH+=$ENV{LOCALTOP}/$self{path}\n";
499 >
500 > # alias for bin_Insure
501 >        print binGNUmakefile <<ENDTEXT;
502 >
503 > bin_insure:bin_Insure
504 > ifdef MAKETARGET_bin_insure
505 > MAKETARGET_$$hashref{name}_Insure=1
506 > endif
507 >
508 > # debuggging target
509 > $$hashref{'name'}_echo_% :: echo_%
510 >
511 > # help targets
512 > help::
513 > \t\@echo Targets For $$hashref{'name'}
514 > \t\@echo -------------------------------------
515 > \t\@echo $$hashref{'name'}  - default build
516 > \t\@echo bin_$$hashref{'name'}_clean - executable specific cleaning
517 > ENDTEXT
518 >
519 > # Make generic rules for each type
520 >        $targettypes={
521 >                "bin" => 'o',
522 >                "bin_debug" => 'd',
523 >                "bin_debug_local" => 'l_d',
524 >                "bin_Insure" => 'Insure'
525 >        };
526 >        #
527 >        foreach $target ( keys %$targettypes ) {
528 >          print binGNUmakefile <<ENDTEXT;
529 >
530 > # Type $target specifics
531 > ifdef MAKETARGET_$target
532 > MAKETARGET_$$hashref{name}_$$targettypes{$target}=1
533 > endif
534 > $target ::$$hashref{name}_$$targettypes{$target}
535 >
536 > bintargets+=$$hashref{name}_$$targettypes{$target}
537 > help::
538 > \t\@echo $$hashref{name}_$$targettypes{$target}
539 > clean::
540 > \t\@if [ -f \$(binarystore)/$$hashref{name}_$$targettypes{$target} ]; then \\
541 > \techo Removing \$(binarystore)/$$hashref{name}; \\
542 > \trm \$(binarystore)/$$hashref{name}_$$targettypes{$target}; \\
543 > \tfi
544 >
545 > ENDTEXT
546 >          ($objectname=$$hashref{file})=~s/\..*/_$$targettypes{$target}\.o/;
547 >          ${"objectname_$$targettypes{$target}"}=$objectname;
548 >          print binGNUmakefile "$objectname:$$hashref{name}.dep\n";
549 >        } # end loop
550 >
551 >        print binGNUmakefile "$$hashref{name}_Insure.exe:.psrc\n";
552 >        print binGNUmakefile "$$hashref{name}_d.exe:$objectname_d\n";
553 >        print binGNUmakefile "\t\$(CClinkCmdDebug)\n";
554 >        print binGNUmakefile "\t\@\$(SCRAMPERL) \$(SCRAM_HOME)/src/scramdatestamp \$\@\.ds \$\@ \$\^\n";
555 >        print binGNUmakefile "$$hashref{name}_l_d.exe:$objectname_d\n";
556 >        print binGNUmakefile "\t\$(CClinkCmdDebugLocal)\n";
557 >        print binGNUmakefile "\t\@\$(SCRAMPERL) \$(SCRAM_HOME)/src/scramdatestamp \$\@\.ds \$\@ \$\^\n";
558 >        print binGNUmakefile "$$hashref{name}_Insure.exe:$objectname_Insure\n";
559 >        print binGNUmakefile "\t\$(CClinkCmdInsure)\n";
560 >        print binGNUmakefile "\t\@\$(SCRAMPERL) \$(SCRAM_HOME)/src/scramdatestamp \$\@\.ds \$\@ \$\^\n";
561 >        print binGNUmakefile "$$hashref{name}_o.exe:$objectname_o\n";
562 >        print binGNUmakefile "\t\$(CClinkCmd)\n";
563 >        print binGNUmakefile "\t\@\$(SCRAMPERL) \$(SCRAM_HOME)/src/scramdatestamp \$\@\.ds \$\@ \$\^\n";
564 >        print binGNUmakefile "$$hashref{name}.dep:$$hashref{file}\n";
565 >        print binGNUmakefile "-include $$hashref{name}.dep\n";
566 > print binGNUmakefile <<ENDTEXT;
567 > clean::
568 > \t\@if [ -f \$(binarystore)/$$hashref{name} ]; then \\
569 > \techo Removing \$(binarystore)/$$hashref{name}; \\
570 > \trm \$(binarystore)/$$hashref{name}; \\
571 > \tfi
572 >
573 > $$hashref{name}_d.exe:\$(libslocal_d)
574 > $$hashref{name}_o.exe:\$(libslocal)
575 > ifdef MCCABE_DATA_DIR
576 > $$hashref{name}_mccabe.exe: \$(libslocal_d) \$(MCCABE_DATA_DIR)/mccabeinstr/instplus.cpp
577 > endif
578 > $$hashref{name}_Insure.exe:\$(libslocal_I)
579 > $$hashref{name}_d:$$hashref{name}_d.exe
580 >        \@cp $$hashref{name}_d.exe \$(binarystore)/$$hashref{name}
581 > $$hashref{name}_l_d:$$hashref{name}_l_d.exe
582 >        \@cp $$hashref{name}_l_d.exe \$(binarystore)/$$hashref{name}
583 > $$hashref{name}_Insure:$$hashref{name}_Insure.exe
584 >        \@cp $$hashref{name}_Insure.exe \$(binarystore)/$$hashref{name}_Insure
585 > $$hashref{name}:$$hashref{name}_d.exe
586 >        \@mv $$hashref{name}_d.exe \$(binarystore)/$$hashref{name}
587 > $$hashref{name}_o:$$hashref{name}_o.exe
588 >        \@mv $$hashref{name}_o.exe \$(binarystore)/$$hashref{name}
589 > binfiles+=$$hashref{file}
590 > ENDTEXT
591 >        }
592 >        close binGNUmakefile;
593 > }
594 >
595 > sub Module_start {
596 >        my $self=shift;
597 >        my $name=shift;
598 >        my $hashref=shift;
599 >
600 >        my $fileclass;
601 >        my @tools;
602 >        my $tool;
603 >        my $filename;
604 >        my $objectname;
605 >
606 >        $self->verbose(">> In module_start: ".$name." <<");
607 >        
608 >        $self->{switch}->checktag($name,$hashref,'file');
609 >        if ( $self->{Arch} ) {
610 >        if ( ! defined $$hashref{name} ) {
611 >                ($$hashref{name}=$$hashref{file})=~s/\..*//;
612 >        }
613 >        ($filename=$$hashref{file})=~s/\..*//;
614 >
615 >        # Create a new directory for each module target
616 >        my $dirname="module_".$$hashref{name};
617 >        AddDir::adddir("$ENV{LOCALTOP}/$ENV{INTwork}/".$self->{path}."/$dirname");
618 >        open (moduleGNUmakefile,
619 >           ">$ENV{LOCALTOP}/$ENV{INTwork}/".$self->{path}."/$dirname/BuildFile.mk") or die           "Unable to make $ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/$dirname/".
620 >           "BuildFile.mk $!\n";
621 >
622 >        # Create the link targets
623 >        $numbins++;
624 >        my $fh=$self->{filehandlestack}[0];
625 >        print $fh <<ENDTEXT;
626 >
627 > # Link Targets to module directories
628 > ifdef MODULEMODE
629 > # We dont want to build a library here
630 > override files:=
631 > endif
632 > ifndef MODULEMODE
633 >
634 > BINMODE=true
635 >  
636 > define stepdown_$$hashref{'name'}
637 > if [ -d "$ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/$dirname" ]; then \\
638 > cd $ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/$dirname; \\
639 > \$(MAKE) MODULEMODE=true LatestBuildFile=$ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/$dirname/BuildFile.mk workdir=\$(workdir)/$dirname -f \$(TOOL_HOME)/basics.mk datestamp \$\@; \\
640 > fi
641 > endef
642 >
643 > define stepdown2_$$hashref{'name'}
644 > if [ -d "$ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/$dirname" ]; then \\
645 > cd $ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/$dirname; \\
646 > \$(MAKE) MODULEMODE=true LatestBuildFile=$ENV{LOCALTOP}/$ENV{INTwork}/$self{path}/$dirname/BuildFile.mk workdir=\$(workdir)/$dirname -f \$(TOOL_HOME)/basics.mk datestamp \$\*; \\
647 > fi
648 >
649 > endef
650 >
651 > module_$$hashref{'name'}_%:: dummy
652 >        \@\$(stepdown2_$$hashref{'name'})
653 >
654 > $$hashref{'name'}_%:: dummy
655 >        \@\$(stepdown_$$hashref{'name'})
656 >
657 > help module module_debug module_debug_local module_insure module_Insure clean $$hashref{'name'}:: dummy
658 >        \@\$(stepdown_$$hashref{'name'})
659 >
660 > modulefiles+=$$hashref{'file'}
661 > locmodulefiles+=$dirname/$$hashref{'file'}
662 > endif
663 >
664 >
665 > ENDTEXT
666 >
667 >
668 > # the module specifics makefile
669 >        print moduleGNUmakefile "include ".$self->{currentenv}."\n";
670 >        print moduleGNUmakefile "VPATH+=$ENV{LOCALTOP}/$self{path}\n";
671 >
672 > # alias for bin_Insure
673 >        print moduleGNUmakefile <<ENDTEXT;
674 >
675 > module_insure:module_Insure
676 > ifdef MAKETARGET_module_insure
677 > MAKETARGET_$$hashref{name}_Insure=1
678 > endif
679 >
680 > # debuggging target
681 > $$hashref{'name'}_echo_% :: echo_%
682 >
683 > # help targets
684 > help::
685 > \t\@echo  
686 > \t\@echo Targets For $$hashref{'name'}
687 > \t\@echo -------------------------------------
688 > \t\@echo $$hashref{'name'}  - default build
689 > \t\@echo module_$$hashref{'name'}_clean - executable specific cleaning
690 > ENDTEXT
691 >
692 > # Make generic rules for each type
693 >        $targettypes={
694 >                "module" => 'o',
695 >                "module_debug" => 'd',
696 >                "module_debug_local" => 'l_d',
697 >                "module_Insure" => 'Insure'
698 >        };
699 >        #
700 >        foreach $target ( keys %$targettypes ) {
701 >          print moduleGNUmakefile <<ENDTEXT;
702 >
703 > # Type $target specifics
704 > ifdef MAKETARGET_$target
705 > MAKETARGET_$$hashref{name}_$$targettypes{$target}=1
706 > endif
707 > $target ::$$hashref{name}_$$targettypes{$target}
708 >
709 > moduletargets+=$$hashref{name}_$$targettypes{$target}
710 > help::
711 > \t\@echo $$hashref{name}_$$targettypes{$target}
712 > clean::
713 > \t\@if [ -f \$(modulestore)/$$hashref{name}_$$targettypes{$target} ]; then \\
714 > \techo Removing \$(modulestore)/$$hashref{name}; \\
715 > \trm \$(modulestore)/$$hashref{name}_$$targettypes{$target}; \\
716 > \tfi
717 >
718 > ENDTEXT
719 >          ($objectname=$$hashref{file})=~s/\..*/_$$targettypes{$target}\.o/;
720 >          ${"objectname_$$targettypes{$target}"}=$objectname;
721 >          print moduleGNUmakefile "$objectname:$$hashref{name}.dep\n";
722 >        } # end loop
723 >        print moduleGNUmakefile "MDFLAGS= -shared -Wl,-soname,\$\@","\n";
724 >        print moduleGNUmakefile "$$hashref{name}_Insure.so:.psrc\n";
725 >        print moduleGNUmakefile "$$hashref{name}_d.so:$objectname_d\n";
726 >        print moduleGNUmakefile "\t\$(CClinkCmdDebug) \$(MDFLAGS)\n";
727 >        print moduleGNUmakefile "\t\@\$(SCRAMPERL) \$(SCRAM_HOME)/src/scramdatestamp \$\@\.ds \$\@ \$\^\n";
728 >        print moduleGNUmakefile "$$hashref{name}_l_d.so:$objectname_d\n";
729 >        print moduleGNUmakefile "\t\$(CClinkCmdDebugLocal) \$(MDFLAGS)\n";
730 >        print moduleGNUmakefile "\t\@\$(SCRAMPERL) \$(SCRAM_HOME)/src/scramdatestamp \$\@\.ds \$\@ \$\^\n";
731 >        print moduleGNUmakefile "$$hashref{name}_Insure.so:$objectname_Insure\n";
732 >        print moduleGNUmakefile "\t\$(CClinkCmdInsure) \$(MDFLAGS)\n";
733 >        print moduleGNUmakefile "\t\@\$(SCRAMPERL) \$(SCRAM_HOME)/src/scramdatestamp \$\@\.ds \$\@ \$\^\n";
734 >        print moduleGNUmakefile "$$hashref{name}_o.so:$objectname_o\n";
735 >        print moduleGNUmakefile "\t\$(CClinkCmd) \$(MDFLAGS)\n";
736 >        print moduleGNUmakefile "\t\@\$(SCRAMPERL) \$(SCRAM_HOME)/src/scramdatestamp \$\@\.ds \$\@ \$\^\n";
737 >        print moduleGNUmakefile "$$hashref{name}.dep:$$hashref{file}\n";
738 >        print moduleGNUmakefile "-include $$hashref{name}.dep\n";
739 > print moduleGNUmakefile <<ENDTEXT;
740 > clean::
741 > \t\@if [ -f \$(modulestore)/lib$$hashref{name} ]; then \\
742 > \techo Removing \$(modulestore)/lib$$hashref{name}; \\
743 > \trm \$(modulestore)/lib$$hashref{name}; \\
744 > \tfi
745 >
746 >  
747 > $$hashref{name}_d.so:\$(libslocal_d)
748 > $$hashref{name}_o.so:\$(libslocal)
749 > ifdef MCCABE_DATA_DIR
750 > $$hashref{name}_mccabe.so: \$(libslocal_d) \$(MCCABE_DATA_DIR)/mccabeinstr/instplus.cpp
751 > endif
752 > $$hashref{name}_Insure.so:\$(libslocal_I)
753 > $$hashref{name}_d:$$hashref{name}_d.so
754 >        \@cp $$hashref{name}_d.so \$(modulestore)/lib$$hashref{name}
755 > $$hashref{name}_l_d:$$hashref{name}_l_d.so
756 >        \@cp $$hashref{name}_l_d.so \$(modulestore)/lib$$hashref{name}
757 > $$hashref{name}_Insure:$$hashref{name}_Insure.so
758 >        \@cp $$hashref{name}_Insure.so \$(modulestore)/lib$$hashref{name}_Insure
759 > $$hashref{name}:$$hashref{name}_d.so
760 >        \@mv $$hashref{name}_d.so \$(modulestore)/lib$$hashref{name}
761 > $$hashref{name}_o:$$hashref{name}_o.so
762 >        \@mv $$hashref{name}_o.so \$(modulestore)/lib$$hashref{name}.so
763 > modulefiles+=$$hashref{file}
764 > ENDTEXT
765 >        }
766 >        close moduleGNUmakefile;
767 > }
768 >
769 >
770 > sub External_StartTag {
771 >        my $self=shift;
772 >        my $name=shift;
773 >        my $hashref=shift;
774 >
775 >        $self->verbose(">> External_StartTag: NM ".$name." <<");
776 >        
777 >        my $tool;
778 >        if ( $self->{Arch} ) {
779 >        $self->{switch}->checktag($name,$hashref,'ref');
780 >
781 >        # -- oo toolbox stuff
782 >        # - get the appropriate tool object
783 >        $$hashref{'ref'}=~tr[A-Z][a-z];
784 >        if ( ! exists $$hashref{'version'} ) {
785 >         $tool=$self->{toolbox}->gettool($$hashref{'ref'});
786 >        }
787 >        else {
788 >         $tool=$self->{toolbox}->gettool($$hashref{'ref'},$$hashref{'version'});
789 >        }
790 >        if ( ! defined $tool ) {
791 >          $self->{switch}->parseerror("Unknown Tool Specified ("
792 >                                                        .$$hashref{'ref'}.")");
793 >        }
794 >
795 >        # -- old fashioned GNUmakefile stuff
796 >        print GNUmakefile $$hashref{'ref'};
797 >        if ( defined $$hashref{'version'} ) {
798 >                print GNUmakefile "_V_".$$hashref{'version'};
799 >        }
800 >        print GNUmakefile "=true\n";
801 >        
802 >        # -- Sub system also specified?
803 >        if ( exists $$hashref{'use'} ) {
804 >           # -- look for a buildfile
805 >           my @paths=$tool->getfeature("INCLUDE");
806 >           my $file="";
807 >           my ($path,$testfile);
808 >           foreach $path ( @paths ) {
809 >             $testfile=$path."/".$$hashref{'use'}."/BuildFile" ;
810 >             if ( -f $testfile ) {
811 >                $file=$testfile;
812 >                $self->_pushremoteproject($path);
813 >             }
814 >           }
815 >           if ( $file eq "" ) {
816 >             $self->{switch}->parseerror("Unable to find SubSystem $testfile");
817 >           }
818 >           $self->ParseBuildFile_Export($file);
819 >           $self->_popremoteproject();
820 >         }
821 >        }
822 > }      
823 >
824 > sub Group_start {
825 >        my $self=shift;
826 >        my $name=shift;
827 >        my $hashref=shift;
828 >        
829 >        $self->verbose(">> Group_start: NM ".$name." <<");
830 >        
831 >        $self->{switch}->checktag($name, $hashref, 'name');
832 >        if ( $self->{Arch} ) {
833 >        print GNUmakefile "GROUP_".$$hashref{'name'};
834 >        if ( defined $$hashref{'version'} ) {
835 >                print GNUmakefile "_V_".$$hashref{'version'};
836 >        }
837 >        print GNUmakefile "=true\n";
838 >        }
839 > }      
840  
841 <        $self->{Benv}->restoreenv();
841 > sub Use_start
842 >   {
843 >   my $self=shift;
844 >   my $name=shift;
845 >   my $hashref=shift;
846 >   my $filename;
847 >   use Utilities::SCRAMUtils;
848 >
849 >   $self->verbose(">> Use_start: NM ".$name." <<");
850 >  
851 >   $self->{switch}->checktag($name, $hashref, "name");
852 >   if ( $self->{Arch} )
853 >      {
854 >      if ( exists $$hashref{'group'} )
855 >         {
856 >         print GNUmakefile "GROUP_".$$hashref{'group'}."=true\n";
857 >         }
858 >      if ( ! defined $self->{remoteproject} )
859 >         {
860 >         $filename=SCRAMUtils::checkfile("/$ENV{INTsrc}/$$hashref{name}/BuildFile");
861 >         }
862 >      else
863 >         {
864 >         $filename=$self->{remoteproject}."/$$hashref{name}/BuildFile";
865 >         # Not sure how useful this statement is, so I'll remove it for now:
866 >         # print STDERR "Trying $filename\n";
867 >         if ( ! -f $filename ) { $filename=""; };
868 >         }
869 >      if ( $filename ne "" )
870 >         {
871 >         $self->ParseBuildFile_Export( $filename );
872 >         }
873 >      else
874 >         {
875 >         $self->{switch}->parseerror("Unable to detect Appropriate ".
876 >                                     "decription file for <$name name=".$$hashref{name}.">");
877 >         }
878 >      }
879 >   }
880 >
881 > sub CheckBuildFile {
882 >         my $self=shift;
883 >         my $classdir=shift;
884 >         my $ClassName="";
885 >         my $thisfile="$classdir/$buildfile";
886 >        
887 >         if ( -e $ENV{LOCALTOP}."/".$thisfile ) {
888 >            $DefaultBuildfile="$ENV{LOCALTOP}/$thisfile";
889 >            $self->ParseBuildFile($ENV{LOCALTOP}, $classdir, $buildfile);
890 >         }
891 >         elsif ( -e $ENV{RELEASETOP}."/".$thisfile ) {
892 >            $DefaultBuildfile="$ENV{RELEASETOP}/$thisfile";
893 >            $self->ParseBuildFile($ENV{RELEASETOP}, $classdir, $buildfile);
894 >         }
895 >         $self->verbose(">> CheckBuildFile: FN ".$thisfile." CN ".$ClassName." <<");
896 >         return $ClassName;
897 > }
898 >
899 > # List association groups between <AssociateGroup> tags
900 > # seperated by newlines or spaces
901 > sub AssociateGroup {
902 >        my $self=shift;
903 >        my $name=shift;
904 >        my $string=shift;
905 >        my $word;
906 >
907 >        $self->verbose(">> AssociateGroup: NM ".$name." ST ".$string." <<");
908 >        
909 >        if ( $self->{Arch} ) {
910 >        foreach $word ( (split /\s/, $string) ){
911 >                chomp $word;
912 >                next if /^#/;
913 >                if ( $word=~/none/ ) {
914 >                        $self->{ignore}=1;
915 >                }
916 >        }
917 >        }
918   }
919  
920 < sub Use_Start {
920 > sub Arch_Start
921 >   {
922 >   my $self=shift;
923 >   my $name=shift;
924 >   my $hashref=shift;
925 >  
926 >   $self->verbose(">> Arch_Start: NM ".$name." <<");
927 >  
928 >   $self->{switch}->checktag($name, $hashref,'name');
929 >  
930 > #   if ($ENV{SCRAM_ARCH} =~ /$$hashref{name}$/)
931 >   if ( $$hashref{name} eq $ENV{SCRAM_ARCH} )
932 >      {
933 > #      print "HASHREFNAME= ",$$hashref{name},"\n";     # The tag read from BuildFile
934 > #      print "Scram arch()? ",$ENV{SCRAM_ARCH},"\n";   # Also SCRAM_ARCH
935 >      $self->{Arch}=1;
936 >      }
937 >   else
938 >      {
939 >      $self->{Arch}=0;
940 >      }
941 > #   ( ($ENV{SCRAM_ARCH}=~/$$hashref{name}.*/) )? ($self->{Arch}=1)
942 > #      : ($self->{Arch}=0);
943 >  
944 >   $self->verbose(($self->{Arch}?"OK":"skipping")." ".$$hashref{name});
945 >   push @{$self->{ARCHBLOCK}}, $self->{Arch};
946 >   }
947 >
948 > sub Arch_End {
949          my $self=shift;
950          my $name=shift;
951 <        my $hashref=shift;
951 >        
952 >        $self->verbose(">> Arch_End: NM ".$name." <<");
953  
954 <        # checks
955 <        $self->checktag($hashref, 'name' ,$name );
954 >        pop @{$self->{ARCHBLOCK}};
955 >        $self->{Arch}=$self->{ARCHBLOCK}[$#{$self->{ARCHBLOCK}}];
956 > }
957  
958 <        $self->{Benv}->addparam('scram_use', $$hashref->{'name'});
959 <        $self->{Benv}->addparam('scram_use_group', $$hashref->{'group'});
958 > # Split up the Class Block String into a useable array
959 > sub _CutBlock {
960 >    my $self=shift;
961 >    my $string= shift @_;
962 >
963 >    $self->verbose(">> _CutBlock: ST ".$string." <<");
964 >    
965 >    @BlockClassA = split /\//, $string;
966 > }
967 >
968 > sub OutToMakefile {
969 >        my $self=shift;
970 >        my $name=shift;
971 >        my @vars=@_;
972 >        
973 >        $self->verbose(">> OutToMakefile: <<");
974 >
975 >        if ( $self->{Arch} ) {
976 >          $self->verbose(">> CONT: ".$#vars." lines <<");
977 >          print GNUmakefile @vars;
978 >        }
979   }
980  
981 < # ---- binary specific tags
982 < sub bin_Start {
981 > sub OutToScreen {
982 >        my $name=shift;
983 >        my @vars=@_;
984 >        
985 >        if ( $self->{Arch} ) {
986 >          print @vars;
987 >        }
988 > }
989 > sub setBlockClassPath {
990          my $self=shift;
991          my $name=shift;
992 <        my $hashref=shift;
992 >        my $hashref=shift;
993 >
994 >        $self->verbose(">> setBlockClassPath: NM ".$name." <<");
995          
996 <        my $extension;
996 >        $self->{switch}->checktag($name, $hashref, 'path');
997 >        $self->{BlockClassPath}=$self->{BlockClassPath}.":".$$hashref{path};
998 >        $self->_CutBlock($$hashref{path});
999 > }
1000  
1001 <        # checks
1002 <        if ( $self->{bincontext} == 0 ) {
1003 <          $self->{bincontext}=1;
1004 <          $self->checktag($hashref, 'file' ,$name );
1005 <          ($extension=$$hashref{file})=~s/.*\.//;
1006 <          if ( ! defined $$hashref{name} ) {
1007 <                ($$hashref{name}=$$hashref{file})=~s/\..*//;
91 <          }
1001 > sub BlockClassPath {
1002 >        my $self=shift;
1003 >
1004 >        $self->verbose(">> BlockClassPath: <<");
1005 >
1006 >        return $self->{BlockClassPath};
1007 > }
1008  
1009 <          push @{$self->{bins}}, $self->_expandvars(
1010 <                $self->{Toolbox}->gettool($extension, "exe"));
1009 > sub export_start_export {
1010 >        my $self=shift;
1011 >        my $name=shift;
1012 >        my $hashref=shift;
1013 >
1014 >        $self->verbose(">> export_start_export: NM ".$name." <<");
1015 >        
1016 >        $self->{switch}->opengroup("__export");
1017 > }
1018 >
1019 > sub export_start {
1020 >        my $self=shift;
1021 >        my $name=shift;
1022 >        my $hashref=shift;
1023 >
1024 >        $self->verbose(">> export_start: NM ".$name." <<");
1025 >        
1026 >        $self->{switch}->opengroup("__export");
1027 >        if ( exists $$hashref{autoexport} ) {
1028 >          print GNUmakefile "scram_autoexport=".$$hashref{autoexport}."\n";
1029 >          if ( $$hashref{autoexport}=~/true/ ) {
1030 >           $self->{switch}->allowgroup("__export","makebuild");
1031 >          }
1032 >          else {
1033 >           $self->{switch}->disallowgroup("__export","makebuild");
1034 >          }
1035 >        }
1036 >        # -- allow default setting from other makefiles
1037 >        print GNUmakefile "ifeq (\$(scram_autoexport),true)\n";
1038 > }
1039 >
1040 > sub export_end_export {
1041 >        my $self=shift;
1042 >        $self->verbose(">> export_end_export: <<");
1043 >        $self->{switch}->closegroup("__export");
1044 > }
1045 >
1046 > sub export_end {
1047 >        my $self=shift;
1048 >        $self->verbose(">> export_end: <<");
1049 >        $self->{switch}->closegroup("__export");
1050 >        print GNUmakefile "endif\n";
1051 > }
1052 >
1053 > #
1054 > # Standard lib tag
1055 > #
1056 > sub lib_start
1057 >   {
1058 >   my $self=shift;
1059 >   my $name=shift;
1060 >   my $hashref=shift;
1061 >  
1062 >   $self->verbose(">> lib_start: NM ".$name." <<");
1063 >  
1064 >   $self->{switch}->checktag($name, $hashref, 'name');
1065 >
1066 >   if ( $self->{Arch} )
1067 >      {
1068 >      print GNUmakefile "lib+=$$hashref{name}\n";
1069 >      }
1070 >   }
1071 >
1072 > # Standard debug lib tag
1073 > #
1074 > sub debuglib_start
1075 >   {
1076 >   my $self=shift;
1077 >   my $name=shift;
1078 >   my $hashref=shift;
1079 >  
1080 >   $self->verbose(">> debuglib_start: NM ".$name." <<");
1081 >   $self->{switch}->checktag($name, $hashref, 'name');
1082 >
1083 >   if ( $self->{Arch} )
1084 >      {
1085 >      print GNUmakefile "debuglib+=$$hashref{name}\n";
1086 >      }
1087 >   }
1088 >
1089 > #
1090 > # libtype specification
1091 > #
1092 > sub LibType_Start {
1093 >        my $self=shift;
1094 >        my $name=shift;
1095 >        my $hashref=shift;
1096 >        
1097 >        $self->verbose(">> LibType_Start: NM ".$name." <<");
1098 >        
1099 >        if ( $self->{Arch} ) {
1100 >        if ( defined $self->{libtype_conext} ) {
1101 >          $self->{switch}->parseerror("<$name> tag cannot be specified".
1102 >                " without a </$name> tag to close previous context");
1103          }
1104          else {
1105 <          $self->parseerror("Attempt to open a new <$name> before a </$name>");
1105 >        $self->{libtype_conext}=1;
1106 >        $self->{switch}->checktag($name, $hashref, 'type');
1107 >        
1108 >        print GNUmakefile "# Specify Library Type\n";
1109 >        print GNUmakefile "DefaultLibsOff=yes\n";
1110 >        if ( $$hashref{'type'}=~/^archive/i ) {
1111 >          print GNUmakefile "LibArchive=true\n";
1112 >        }
1113 >        elsif ($$hashref{'type'}=~/debug_archive/i ) {
1114 >          print GNUmakefile "LibDebugArchive=true\n";
1115 >        }
1116 >        elsif ($$hashref{'type'}=~/debug_shared/i ) {
1117 >          print GNUmakefile "LibDebugShared=true\n";
1118 >        }
1119 >        elsif ($$hashref{'type'}=~/shared/i ) {
1120 >          print GNUmakefile 'LibShared=true'."\n";
1121          }
1122 < }
1122 >        print GNUmakefile "\n";
1123 >        }
1124 >        }
1125 > }
1126  
1127 < sub bin_text {
1127 > sub LibType_text {
1128          my $self=shift;
1129          my $name=shift;
1130 <        my $string=shift;
1130 >        my $string=shift;
1131 >        $self->verbose(">> LibType_text: NM ".$name." <<");
1132  
1133 <        push @{$self->{binstext}}, $string;
1133 >        if ( $self->{Arch} ) {
1134 >          $string=~s/\n/ /g;
1135 >          print GNUmakefile "libmsg::\n\t\@echo Library info: ";
1136 >          print GNUmakefile $string;
1137 >          print GNUmakefile "\n";
1138 >        }
1139   }
1140  
1141 < sub bin_End {
1141 > sub LibType_end {
1142          my $self=shift;
1143          my $name=shift;
1144  
1145 <        $self->{bincontext}=0;
1145 >        $self->verbose(">> LibType_end: NM ".$name." <<");
1146 >
1147 >        undef $self->{libtype_conext};
1148   }
1149  
1150 < sub lib_start {
1150 > sub Environment_start {
1151          my $self=shift;
1152          my $name=shift;
1153          my $hashref=shift;
1154 +
1155 +        $self->verbose(">> Environment_start: NM ".$name." <<");
1156 +        
1157 +        if ( $self->{Arch} ) {
1158 +          $self->{envnum}++;
1159 +
1160 +          # open a new Environment File
1161 +          my $envfile="$ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/Env_".
1162 +                $self->{envnum}.".mk";
1163 +          use FileHandle;
1164 +          my $fh=FileHandle->new();
1165 +          open ($fh,">$envfile") or die "Unable to open file $envfile \n$!\n";
1166 +          push @{$self->{filehandlestack}}, $fh;
1167 +          *GNUmakefile=$fh;
1168 +
1169 +          # include the approprate environment file
1170 +          if ( $self->{envlevel} == 0 ) {
1171 +             print GNUmakefile "include $ENV{LOCALTOP}/$ENV{INTwork}/".
1172 +                $self->{path}."/BuildFile.mk\n";
1173 +          }
1174 +          else {
1175 +             print GNUmakefile "include $ENV{LOCALTOP}/$ENV{INTwork}/".
1176 +                $self->{path}."/Env_".$self->{Envlevels}[$self->{envlevel}].".mk\n";
1177 +          }
1178 +          $self->{envlevel}++;
1179 +          $self->{Envlevels}[$self->{envlevel}]=$self->{envnum};
1180 +          $self->{currentenv}="$ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/Env_$self->{envnum}.mk";
1181 +        }
1182   }
1183  
1184 < # libray specific tags
123 < sub libtype {
1184 > sub Environment_end {
1185          my $self=shift;
1186 <        my $name=shift;
1186 >        my $fd;
1187 >
1188 >        $self->verbose(">> Environment_end: NM ".$name." <<");
1189 >
1190 >        if ( $self->{Arch} ) {
1191 >          $self->{envlevel}--;
1192 >          if ( $self->{envlevel} < 0 ) {
1193 >            print "Too many </Environent> Tags on $self->{switch}->line()\n";
1194 >            exit 1;
1195 >          }
1196 >          close GNUmakefile;
1197 >          # restore the last filehandle
1198 >          $fd=pop @{$self->{filehandlestack}};
1199 >          close $fd;
1200 >          *GNUmakefile=$self->{filehandlestack}[$#{$self->{filehandlestack}}];
1201 >          if ( $self->{envlevel} < 1 ) {
1202 >            $self->{currentenv}="$ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/".
1203 >                        "BuildFile.mk";
1204 >          }
1205 >          else {
1206 >            $self->{currentenv}=
1207 >             "$ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/Env_".
1208 >                $self->{Envlevels}[$self->{envlevel}];
1209 >          }
1210 >        }
1211 > }
1212 >
1213 > sub Store_start {
1214 >        my $self=shift;
1215 >        my $name=shift;
1216          my $hashref=shift;
1217 +
1218 +        $self->verbose(">> Store_start: NM ".$name." <<");
1219 +
1220 +        if ( $self->{Arch} ) {
1221 +          $self->{switch}->checktag( $name, $hashref, 'name' );
1222 +
1223 +          # -- store creation
1224 +          my $dir=$$hashref{'name'};
1225 +          AddDir::adddir($ENV{LOCALTOP}."/".$dir);
1226 +          if ( exists $$hashref{'type'} ) {
1227 +            # -- architecture specific store
1228 +            if ( $$hashref{'type'}=~/^arch/i ) {
1229 +                $dir=$dir."/".$ENV{SCRAM_ARCH};
1230 +                AddDir::adddir($ENV{LOCALTOP}."/".$dir);
1231 +            }
1232 +            else {
1233 +                $self->parseerror("Unknown type in <$name> tag");
1234 +            }
1235 +          }
1236 +
1237 +          # -- set make variables for the store
1238 +          print GNUmakefile "SCRAMSTORENAME_".$$hashref{'name'}.":=".$dir."\n";
1239 +          print GNUmakefile "SCRAMSTORE_".$$hashref{'name'}.":=".
1240 +                                        $ENV{LOCALTOP}."/".$dir."\n";
1241 +          print GNUmakefile "VPATH+=".$ENV{LOCALTOP}
1242 +                        ."/".$dir.":".$ENV{RELEASETOP}."/".$dir."\n";
1243 +        }
1244   }
1245 +
1246 + sub CompilerMap_Start
1247 +   {
1248 +   ###############################################################
1249 +   # CompilerMap_Start                                           #
1250 +   ###############################################################
1251 +   # modified : Fri Oct  4 15:08:39 2002 / SFA                   #
1252 +   # params   :                                                  #
1253 +   #          :                                                  #
1254 +   #          :                                                  #
1255 +   #          :                                                  #
1256 +   # function : Create a map between a SUBARCH and specific      #
1257 +   #          : compiler and version.                            #
1258 +   #          :                                                  #
1259 +   #          :                                                  #
1260 +   ###############################################################
1261 +   my $self=shift;
1262 +   my $name=shift;
1263 +   my $hashref=shift;
1264 +   ## Not working yet !!!!##
1265 +   $self->verbose(">> CompilerMap_Start: NM ".$name." <<");
1266 +   # We can only map compilers to already-defined architectures, so
1267 +   # we check for 'Arch':
1268 + #   if ( $self->{Arch} )
1269 + #      {
1270 + #      my @tagnames=keys %{$hashref};
1271 + #      my @tagvalues=values %{$hashref};
1272 +      
1273 + #      foreach my $tag ( @tagnames )
1274 + #        {
1275 + #         $self->{switch}->checktag($name,$hashref,$tag);
1276 + #         print GNUmakefile $tag."=".$$hashref{$tag}."\n";
1277 +
1278 + #        if ( defined $$hashref{'version'} )
1279 + #           {
1280 + #           print GNUmakefile "_V_".$$hashref{'version'};
1281 + #           }
1282 + #        print GNUmakefile "=true\n";
1283 + #         }
1284 + #        $self->{switch}->checktag($name,$hashref,'ref');
1285 +
1286 + #       # -- oo toolbox stuff
1287 + #       # - get the appropriate tool object
1288 + #       $$hashref{'ref'}=~tr[A-Z][a-z];
1289 + #       if ( ! exists $$hashref{'version'} ) {
1290 + #        $tool=$self->{toolbox}->gettool($$hashref{'ref'});
1291 + #       }
1292 + #       else {
1293 + #        $tool=$self->{toolbox}->gettool($$hashref{'ref'},$$hashref{'version'});
1294 + #       }
1295 + #       if ( ! defined $tool ) {
1296 + #         $self->{switch}->parseerror("Unknown Tool Specified ("
1297 + #                                                       .$$hashref{'ref'}.")");
1298 + #       }
1299 +
1300 + #       # -- old fashioned GNUmakefile stuff
1301 + #       print GNUmakefile $$hashref{'ref'};
1302 + #       if ( defined $$hashref{'version'} ) {
1303 + #               print GNUmakefile "_V_".$$hashref{'version'};
1304 + #       }
1305 + #       print GNUmakefile "=true\n";
1306 +        
1307 + #       # -- Sub system also specified?
1308 + #       if ( exists $$hashref{'use'} ) {
1309 + #          # -- look for a buildfile
1310 + #          my @paths=$tool->getfeature("INCLUDE");
1311 + #          my $file="";
1312 + #          my ($path,$testfile);
1313 + #          foreach $path ( @paths ) {
1314 + #            $testfile=$path."/".$$hashref{'use'}."/BuildFile" ;
1315 + #            if ( -f $testfile ) {
1316 + #               $file=$testfile;
1317 + #               $self->_pushremoteproject($path);
1318 + #            }
1319 + #          }
1320 + #          if ( $file eq "" ) {
1321 + #            $self->{switch}->parseerror("Unable to find SubSystem $testfile");
1322 + #          }
1323 + #          $self->ParseBuildFile_Export($file);
1324 + #          $self->_popremoteproject();
1325 + #        }
1326 + #      }
1327 + #   else
1328 + #      {
1329 + #      return;
1330 + #      }
1331 +   }
1332 +
1333 +

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines