ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/BuildFile.pm
Revision: 1.21
Committed: Mon Aug 5 11:54:07 2002 UTC (22 years, 9 months ago) by sashby
Content type: text/plain
Branch: MAIN
CVS Tags: V0_19_6, V0_19_6p1
Changes since 1.20: +2 -1 lines
Log Message:
*** empty log message ***

File Contents

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