ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/BuildFile.pm
Revision: 1.24
Committed: Wed Nov 6 17:31:04 2002 UTC (22 years, 6 months ago) by sashby
Content type: text/plain
Branch: MAIN
Changes since 1.23: +7 -7 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 sashby 1.22 $switch->addtag($parse,"CompilerMap",
130     \&CompilerMap_Start,$self,
131     \&OutToMakefile, $self,
132     "",$self);
133 sashby 1.19 return $switch;
134     }
135 williamc 1.2
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 sashby 1.15
149     $self->verbose(">> ParseBuildFile: FN ".$fullfilename." <<");
150    
151 williamc 1.2 $self->{path}=$path;
152     $numbins=0;
153     $self->{envnum}=0;
154     $self->{envlevel}=0;
155 williamc 1.13 $self->{currentenv}="$ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/".
156     "BuildFile.mk";
157 williamc 1.2 $self->{switch}=$self->_initswitcher();
158     $self->{switch}->filetoparse($fullfilename);
159    
160 sashby 1.14 # open a temporary gnumakefile to store output.
161 williamc 1.2 use Utilities::AddDir;
162 williamc 1.13 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 sashby 1.14
173 williamc 1.13 $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 williamc 1.6 }
194    
195 williamc 1.2 sub ParseBuildFile_Export {
196 williamc 1.1 my $self=shift;
197 williamc 1.2 my $filename=shift;
198 sashby 1.15
199     $self->verbose(">> ParseBuildFile_Export: FN ".$filename." <<");
200    
201 williamc 1.13 my $bf=BuildSystem::BuildFile->new($self->{toolbox});
202 williamc 1.2 if ( defined $self->{remoteproject} ) {
203     $bf->{remoteproject}=$self->{remoteproject};
204     }
205     $bf->_parseexport($filename);
206     undef $bf;
207     }
208 williamc 1.1
209 williamc 1.2 sub _location {
210     my $self=shift;
211     use File::Basename;
212 sashby 1.15 $self->verbose(">> _location: <<");
213 williamc 1.2 return dirname($self->{switch}->filetoparse());
214 williamc 1.1 }
215    
216 williamc 1.2 sub _parseexport {
217 williamc 1.1 my $self=shift;
218 williamc 1.2 my $filename=shift;
219 sashby 1.15 $self->verbose(">> _parseexport: FN ".$filename." <<");
220    
221 williamc 1.2 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 williamc 1.1
235 williamc 1.2 sub _pushremoteproject {
236     my $self=shift;
237     my $path=shift;
238 sashby 1.15
239     $self->verbose(">> _pushremoteproject: PATH ".$path." <<");
240 williamc 1.1
241 williamc 1.2 if ( defined $self->{remoteproject} ) {
242     push @{$self->{rpstack}}, $self->{remoteproject};
243     }
244     $self->{remoteproject}=$path;
245 williamc 1.1 }
246    
247 williamc 1.2 sub _popremoteproject {
248     my $self=shift;
249 sashby 1.15 $self->verbose(">> _popremoteproject: <<");
250    
251 williamc 1.2 if ( $#{$self->{rpstack}} >=0 ) {
252     $self->{remoteproject}=pop @{$self->{rpstack}};
253     }
254     else {
255     undef $self->{remoteproject};
256     }
257     }
258 williamc 1.1
259 williamc 1.2 sub _toolmapper {
260     my $self=shift;
261 sashby 1.15
262 williamc 1.2 if ( ! defined $self->{mapper} ) {
263     require BuildSystem::ToolMapper;
264     $self->{mapper}=BuildSystem::ToolMapper->new();
265     }
266 sashby 1.15 $self->verbose(">> _toolmapper: TM ".$self->{mapper}."<<");
267 williamc 1.2 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 williamc 1.1 my $self=shift;
278     my $name=shift;
279     my $hashref=shift;
280 sashby 1.15
281     $self->verbose(">> Classs_StartTag: NM ".$name." <<");
282 williamc 1.2
283     if ( $self->{Arch} ) {
284     if ( defined $$hashref{'type'} ) {
285 williamc 1.13 $ClassName=$$hashref{'type'};
286 williamc 1.2 }
287     }
288     }
289    
290 sashby 1.17 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 williamc 1.2
305     #
306 williamc 1.13 # generic build tag
307 williamc 1.10 #
308 williamc 1.2 sub Build_start {
309     my $self=shift;
310     my $name=shift;
311     my $hashref=shift;
312    
313 sashby 1.15 $self->verbose(">> Build_start: NM ".$name." <<");
314    
315 williamc 1.2 $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 williamc 1.12 print $fh "# -- Generic targets\n";
342 williamc 1.2 push @targets, $$hashref{'class'};
343 williamc 1.12 foreach $dtype ( @deftypes ) {
344     print $fh $$hashref{'class'}."::".$$hashref{'class'}."_".
345     $dtype."\n";
346     }
347     print $fh "\n";
348 williamc 1.2
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 williamc 1.12 my $here="$ENV{LOCALTOP}/$ENV{INTwork}/".$self->{path}."/".$dirname;
363 williamc 1.2 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 williamc 1.12 print $fh "\t echo VPATH+=$ENV{LOCALTOP}/".$self->{path}.
385 williamc 1.2 " >> $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 sashby 1.15
436     $self->verbose(">> <<");
437 williamc 1.2
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 williamc 1.12 AddDir::adddir("$ENV{LOCALTOP}/$ENV{INTwork}/".$self->{path}."/$dirname");
448 williamc 1.2 open (binGNUmakefile,
449 williamc 1.12 ">$ENV{LOCALTOP}/$ENV{INTwork}/".$self->{path}."/$dirname/BuildFile.mk") or die "Unable to make $ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/$dirname/".
450 williamc 1.2 "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 williamc 1.12 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 williamc 1.2 fi
469     endef
470    
471     define stepdown2_$$hashref{'name'}
472 williamc 1.12 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 williamc 1.2 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 williamc 1.12 print binGNUmakefile "VPATH+=$ENV{LOCALTOP}/$self{path}\n";
499 williamc 1.2
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 williamc 1.6 print binGNUmakefile "\t\@\$(SCRAMPERL) \$(SCRAM_HOME)/src/scramdatestamp \$\@\.ds \$\@ \$\^\n";
555 williamc 1.2 print binGNUmakefile "$$hashref{name}_l_d.exe:$objectname_d\n";
556     print binGNUmakefile "\t\$(CClinkCmdDebugLocal)\n";
557 williamc 1.6 print binGNUmakefile "\t\@\$(SCRAMPERL) \$(SCRAM_HOME)/src/scramdatestamp \$\@\.ds \$\@ \$\^\n";
558 williamc 1.2 print binGNUmakefile "$$hashref{name}_Insure.exe:$objectname_Insure\n";
559     print binGNUmakefile "\t\$(CClinkCmdInsure)\n";
560 williamc 1.6 print binGNUmakefile "\t\@\$(SCRAMPERL) \$(SCRAM_HOME)/src/scramdatestamp \$\@\.ds \$\@ \$\^\n";
561 williamc 1.2 print binGNUmakefile "$$hashref{name}_o.exe:$objectname_o\n";
562     print binGNUmakefile "\t\$(CClinkCmd)\n";
563 williamc 1.6 print binGNUmakefile "\t\@\$(SCRAMPERL) \$(SCRAM_HOME)/src/scramdatestamp \$\@\.ds \$\@ \$\^\n";
564 williamc 1.2 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 sashby 1.18
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 williamc 1.2
770     sub External_StartTag {
771     my $self=shift;
772     my $name=shift;
773     my $hashref=shift;
774 sashby 1.15
775     $self->verbose(">> External_StartTag: NM ".$name." <<");
776 williamc 1.2
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 sashby 1.15 $self->verbose(">> Group_start: NM ".$name." <<");
830    
831 williamc 1.2 $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 williamc 1.1
841 sashby 1.15 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 sashby 1.21 # Not sure how useful this statement is, so I'll remove it for now:
866     # print STDERR "Trying $filename\n";
867 sashby 1.15 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 williamc 1.1
881 williamc 1.13 sub CheckBuildFile {
882     my $self=shift;
883     my $classdir=shift;
884     my $ClassName="";
885     my $thisfile="$classdir/$buildfile";
886 sashby 1.15
887 williamc 1.13 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 sashby 1.15 $self->verbose(">> CheckBuildFile: FN ".$thisfile." CN ".$ClassName." <<");
896 williamc 1.13 return $ClassName;
897     }
898    
899 williamc 1.2 # 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 sashby 1.15 $self->verbose(">> AssociateGroup: NM ".$name." ST ".$string." <<");
908    
909 williamc 1.2 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 sashby 1.23 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 williamc 1.1
948 williamc 1.2 sub Arch_End {
949 williamc 1.1 my $self=shift;
950     my $name=shift;
951 sashby 1.15
952     $self->verbose(">> Arch_End: NM ".$name." <<");
953 williamc 1.1
954 sashby 1.15 pop @{$self->{ARCHBLOCK}};
955 williamc 1.2 $self->{Arch}=$self->{ARCHBLOCK}[$#{$self->{ARCHBLOCK}}];
956     }
957    
958     # Split up the Class Block String into a useable array
959     sub _CutBlock {
960     my $self=shift;
961     my $string= shift @_;
962 sashby 1.15
963     $self->verbose(">> _CutBlock: ST ".$string." <<");
964    
965 williamc 1.2 @BlockClassA = split /\//, $string;
966     }
967    
968     sub OutToMakefile {
969     my $self=shift;
970     my $name=shift;
971     my @vars=@_;
972 sashby 1.15
973     $self->verbose(">> OutToMakefile: <<");
974 williamc 1.2
975     if ( $self->{Arch} ) {
976 sashby 1.16 $self->verbose(">> CONT: ".$#vars." lines <<");
977 williamc 1.2 print GNUmakefile @vars;
978     }
979     }
980    
981     sub OutToScreen {
982     my $name=shift;
983     my @vars=@_;
984 sashby 1.15
985 williamc 1.2 if ( $self->{Arch} ) {
986     print @vars;
987     }
988     }
989     sub setBlockClassPath {
990     my $self=shift;
991     my $name=shift;
992     my $hashref=shift;
993    
994 sashby 1.15 $self->verbose(">> setBlockClassPath: NM ".$name." <<");
995    
996 williamc 1.2 $self->{switch}->checktag($name, $hashref, 'path');
997     $self->{BlockClassPath}=$self->{BlockClassPath}.":".$$hashref{path};
998     $self->_CutBlock($$hashref{path});
999     }
1000    
1001     sub BlockClassPath {
1002     my $self=shift;
1003 sashby 1.15
1004     $self->verbose(">> BlockClassPath: <<");
1005    
1006 williamc 1.2 return $self->{BlockClassPath};
1007     }
1008    
1009     sub export_start_export {
1010     my $self=shift;
1011     my $name=shift;
1012     my $hashref=shift;
1013    
1014 sashby 1.15 $self->verbose(">> export_start_export: NM ".$name." <<");
1015    
1016 williamc 1.2 $self->{switch}->opengroup("__export");
1017     }
1018    
1019     sub export_start {
1020     my $self=shift;
1021     my $name=shift;
1022     my $hashref=shift;
1023    
1024 sashby 1.15 $self->verbose(">> export_start: NM ".$name." <<");
1025    
1026 williamc 1.2 $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 sashby 1.15 $self->verbose(">> export_end_export: <<");
1043 williamc 1.2 $self->{switch}->closegroup("__export");
1044     }
1045 williamc 1.1
1046 williamc 1.2 sub export_end {
1047     my $self=shift;
1048 sashby 1.15 $self->verbose(">> export_end: <<");
1049 williamc 1.2 $self->{switch}->closegroup("__export");
1050     print GNUmakefile "endif\n";
1051 williamc 1.1 }
1052    
1053 williamc 1.2 #
1054     # Standard lib tag
1055     #
1056 sashby 1.17 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 sashby 1.15
1066 sashby 1.17 if ( $self->{Arch} )
1067     {
1068     print GNUmakefile "lib+=$$hashref{name}\n";
1069     }
1070     }
1071 williamc 1.2
1072 sashby 1.19 # 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 williamc 1.2 #
1090     # libtype specification
1091     #
1092     sub LibType_Start {
1093     my $self=shift;
1094     my $name=shift;
1095     my $hashref=shift;
1096 sashby 1.15
1097     $self->verbose(">> LibType_Start: NM ".$name." <<");
1098    
1099 williamc 1.2 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 williamc 1.1 }
1104     else {
1105 williamc 1.2 $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 williamc 1.1 }
1122 williamc 1.2 print GNUmakefile "\n";
1123     }
1124     }
1125     }
1126 williamc 1.1
1127 williamc 1.2 sub LibType_text {
1128 williamc 1.1 my $self=shift;
1129     my $name=shift;
1130 williamc 1.2 my $string=shift;
1131 sashby 1.15 $self->verbose(">> LibType_text: NM ".$name." <<");
1132 williamc 1.1
1133 sashby 1.15 if ( $self->{Arch} ) {
1134 williamc 1.2 $string=~s/\n/ /g;
1135     print GNUmakefile "libmsg::\n\t\@echo Library info: ";
1136     print GNUmakefile $string;
1137     print GNUmakefile "\n";
1138     }
1139 williamc 1.1 }
1140    
1141 williamc 1.2 sub LibType_end {
1142 williamc 1.1 my $self=shift;
1143     my $name=shift;
1144    
1145 sashby 1.15 $self->verbose(">> LibType_end: NM ".$name." <<");
1146    
1147 williamc 1.2 undef $self->{libtype_conext};
1148 williamc 1.1 }
1149    
1150 williamc 1.2 sub Environment_start {
1151 williamc 1.1 my $self=shift;
1152     my $name=shift;
1153     my $hashref=shift;
1154 williamc 1.2
1155 sashby 1.15 $self->verbose(">> Environment_start: NM ".$name." <<");
1156    
1157 williamc 1.2 if ( $self->{Arch} ) {
1158     $self->{envnum}++;
1159    
1160     # open a new Environment File
1161 williamc 1.13 my $envfile="$ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/Env_".
1162 williamc 1.2 $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 williamc 1.13 print GNUmakefile "include $ENV{LOCALTOP}/$ENV{INTwork}/".
1172 williamc 1.2 $self->{path}."/BuildFile.mk\n";
1173     }
1174     else {
1175 williamc 1.13 print GNUmakefile "include $ENV{LOCALTOP}/$ENV{INTwork}/".
1176 williamc 1.2 $self->{path}."/Env_".$self->{Envlevels}[$self->{envlevel}].".mk\n";
1177     }
1178     $self->{envlevel}++;
1179     $self->{Envlevels}[$self->{envlevel}]=$self->{envnum};
1180 williamc 1.13 $self->{currentenv}="$ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/Env_$self->{envnum}.mk";
1181 williamc 1.2 }
1182 williamc 1.1 }
1183    
1184 williamc 1.2 sub Environment_end {
1185 williamc 1.1 my $self=shift;
1186 williamc 1.2 my $fd;
1187    
1188 sashby 1.15 $self->verbose(">> Environment_end: NM ".$name." <<");
1189    
1190 williamc 1.2 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 williamc 1.13 $self->{currentenv}="$ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/".
1203 williamc 1.2 "BuildFile.mk";
1204     }
1205     else {
1206     $self->{currentenv}=
1207 williamc 1.13 "$ENV{LOCALTOP}/$ENV{INTwork}/$self->{path}/Env_".
1208 williamc 1.2 $self->{Envlevels}[$self->{envlevel}];
1209     }
1210 williamc 1.8 }
1211     }
1212    
1213     sub Store_start {
1214 williamc 1.12 my $self=shift;
1215     my $name=shift;
1216 williamc 1.8 my $hashref=shift;
1217    
1218 sashby 1.15 $self->verbose(">> Store_start: NM ".$name." <<");
1219    
1220 williamc 1.12 if ( $self->{Arch} ) {
1221     $self->{switch}->checktag( $name, $hashref, 'name' );
1222 williamc 1.8
1223 williamc 1.12 # -- store creation
1224     my $dir=$$hashref{'name'};
1225 williamc 1.13 AddDir::adddir($ENV{LOCALTOP}."/".$dir);
1226 williamc 1.12 if ( exists $$hashref{'type'} ) {
1227     # -- architecture specific store
1228     if ( $$hashref{'type'}=~/^arch/i ) {
1229     $dir=$dir."/".$ENV{SCRAM_ARCH};
1230 williamc 1.13 AddDir::adddir($ENV{LOCALTOP}."/".$dir);
1231 williamc 1.12 }
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 williamc 1.13 $ENV{LOCALTOP}."/".$dir."\n";
1241     print GNUmakefile "VPATH+=".$ENV{LOCALTOP}
1242     ."/".$dir.":".$ENV{RELEASETOP}."/".$dir."\n";
1243 williamc 1.12 }
1244 williamc 1.8 }
1245 sashby 1.22
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    
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 sashby 1.24 if ( defined $$hashref{'version'} )
1279     {
1280     print GNUmakefile "_V_".$$hashref{'version'};
1281     }
1282     print GNUmakefile "=true\n";
1283 sashby 1.22 }
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 sashby 1.24 return;
1330 sashby 1.22 }
1331     }
1332 sashby 1.24
1333 sashby 1.22