ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/ToolManager.pm
Revision: 1.19.2.2.2.3
Committed: Tue Jul 15 12:12:40 2008 UTC (16 years, 9 months ago) by muzaffar
Content type: text/plain
Branch: SCRAM_V2_0
CVS Tags: V2_2_1, forV2_2_1, V2_2_0, sm100112, V2_1_4, V2_1_3, V2_1_2, V2_1_1, V2_1_0, V2_0_6, V2_0_5, V2_0_4, V2_0_4_relcand2
Changes since 1.19.2.2.2.2: +5 -5 lines
Log Message:
fix for tool order calculation

File Contents

# User Rev Content
1 sashby 1.2 #____________________________________________________________________
2     # File: ToolManager.pm
3     #____________________________________________________________________
4     #
5     # Author: Shaun Ashby <Shaun.Ashby@cern.ch>
6     # Update: 2003-11-12 15:04:16+0100
7 muzaffar 1.19.2.2.2.2 # Revision: $Id: ToolManager.pm,v 1.19.2.2.2.1 2008/03/13 12:54:50 muzaffar Exp $
8 sashby 1.2 #
9     # Copyright: 2003 (C) Shaun Ashby
10     #
11     #--------------------------------------------------------------------
12     package BuildSystem::ToolManager;
13     require 5.004;
14    
15     use Exporter;
16     use BuildSystem::ToolCache;
17     use BuildSystem::ToolParser;
18     use Utilities::AddDir;
19     use Utilities::Verbose;
20 muzaffar 1.19 use SCRAM::MsgLog;
21 sashby 1.2
22     @ISA=qw(BuildSystem::ToolCache Utilities::Verbose);
23     @EXPORT_OK=qw( );
24     #
25 sashby 1.9
26 sashby 1.2 sub new
27     {
28     my $proto=shift;
29     my $class=ref($proto) || $proto;
30     my $self=$class->SUPER::new(); # Inherit from ToolCache
31     bless $self,$class;
32 muzaffar 1.19.2.2.2.1 $self->init (shift);
33 sashby 1.2 return $self;
34     }
35    
36 muzaffar 1.19.2.2.2.1 sub init ()
37 sashby 1.2 {
38     my $self=shift;
39     my $projectarea=shift;
40     $self->{topdir}=$projectarea->location();
41     $self->{configdir}=$self->{topdir}."/".$projectarea->configurationdir();
42 muzaffar 1.19.2.2.2.1 $self->{archstore}=$projectarea->archdir();
43     $self->{toolcache}=$self->{configdir}."/toolbox/".$projectarea->arch()."/tools";
44 sashby 1.2 $self->name($projectarea->toolcachename());
45 muzaffar 1.19.2.2.2.1 $self->dirty();
46 sashby 1.2 }
47 muzaffar 1.19.2.2.2.1
48 sashby 1.2 sub interactive()
49     {
50     my $self=shift;
51     # Interactive mode on/off:
52     @_ ? $self->{interactive} = shift
53     : ((defined $self->{interactive}) ? $self->{interactive} : 0);
54     }
55    
56     sub setupalltools()
57     {
58     my $self = shift;
59 muzaffar 1.19.2.2.2.1 my @selected=();
60     my $tooldir=$self->{toolcache}."/selected";
61     foreach my $tool (@{&getfileslist($tooldir)})
62 sashby 1.2 {
63 muzaffar 1.19.2.2.2.1 if ($tool=~/^(.+)\.xml$/) {push @selected,$1;}
64 sashby 1.2 }
65 muzaffar 1.19.2.2.2.1 foreach my $tool (@selected){$self->coresetup("${tooldir}/${tool}.xml");}
66 muzaffar 1.19 scramlogmsg("\n");
67 sashby 1.2 }
68    
69     sub coresetup()
70     {
71     my $self=shift;
72 muzaffar 1.19.2.2.2.1 my ($toolfile) = @_;
73 sashby 1.2
74 muzaffar 1.19.2.2.2.1 my $toolparser = BuildSystem::ToolParser->new();
75     $toolparser->filehead('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><doc type="BuildSystem::ToolDoc" version="1.0">');
76     $toolparser->filetail('</doc>');
77     $toolparser->parse($toolfile);
78     my $toolname = $toolparser->toolname();
79     my $toolversion = $toolparser->toolversion();
80 muzaffar 1.19 scramlogmsg("\n",$::bold."Setting up ",$toolname," version ",$toolversion,": ".$::normal,"\n");
81 sashby 1.2
82     # Next, set up the tool:
83     my $store = $toolparser->processrawtool($self->interactive());
84 sashby 1.8
85     # Check to see if this tool is a compiler. If so, store it.
86     # Also store the language that this compiler supprots, and a
87     # compiler name (e.g. gcc323) which, in conjunction with a stem
88     # architecture name like slc3_ia32_, can be used to build a complete arch string:
89     if ($store->scram_compiler() == 1)
90     {
91     my @supported_language = $store->flags("SCRAM_LANGUAGE_TYPE");
92     my @compilername = $store->flags("SCRAM_COMPILER_NAME");
93     $self->scram_compiler($supported_language[0],$toolname,$compilername[0]);
94     }
95    
96 sashby 1.16 # Store the ToolData object in the cache:
97 muzaffar 1.19.2.2.2.1 $self->storeincache($toolname,$store);
98     my $srcfile=Utilities::AddDir::fixpath($toolfile);
99     my $desfile=Utilities::AddDir::fixpath($self->{toolcache}."/selected/${toolname}.xml");
100     use File::Copy;
101     if ($srcfile ne $desfile)
102     {
103     use File::Copy;
104     my $desfile1=Utilities::AddDir::fixpath($self->{toolcache}."/available/${toolname}.xml");
105     if ($srcfile ne $desfile1)
106     {
107     copy($srcfile,$desfile1);
108 sashby 1.2 }
109 muzaffar 1.19.2.2.2.1 symlink("../available/${toolname}.xml",$desfile);
110 sashby 1.2 }
111     return $self;
112     }
113    
114     sub setupself()
115     {
116     my $self=shift;
117     # Process the file "Self" in local config directory. This is used to
118     # set all the paths/runtime settings for this project:
119 muzaffar 1.19.2.2.2.1 my $filename=$self->{configdir}."/Self.xml";
120 sashby 1.16
121 sashby 1.2 if ( -f $filename )
122     {
123 muzaffar 1.19 scramlogmsg("\n",$::bold."Setting up SELF:".$::normal,"\n");
124 sashby 1.2 # Self file exists so process it:
125     $selfparser = BuildSystem::ToolParser->new();
126 muzaffar 1.18 $selfparser->filehead ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><doc type="BuildSystem::ToolDoc" version="1.0">');
127     $selfparser->filehead ('</doc>');
128 muzaffar 1.19.2.2.2.1 $selfparser->parse($filename);
129 sashby 1.2
130     # Next, set up the tool:
131     $store = $selfparser->processrawtool($self->interactive());
132 muzaffar 1.19
133 sashby 1.2 # If we are in a developer area, also add RELEASETOP paths:
134     if (exists($ENV{RELEASETOP}))
135     {
136     print "\nAdding RELEASE area settings to self....OK","\n", if ($ENV{SCRAM_DEBUG});
137     $store->addreleasetoself();
138     }
139    
140     # Store the ToolData object in the cache:
141     $self->storeincache($selfparser->toolname(),$store);
142 muzaffar 1.19 scramlogmsg("\n");
143 sashby 1.2 }
144     else
145     {
146 muzaffar 1.19 scramlogdump();
147 sashby 1.2 print "\n";
148 sashby 1.16 print "SCRAM: No file config/Self.xml...nothing to do.";
149 sashby 1.2 print "\n";
150     return;
151     }
152     }
153    
154 muzaffar 1.19.2.2.2.1 sub update()
155 sashby 1.2 {
156 muzaffar 1.19.2.2.2.1 my $self=shift;
157     my $area=shift;
158     $self->init($area);
159     $self->setupself();
160     $self->dirty ()
161 sashby 1.2 }
162 muzaffar 1.19.2.2.2.1
163 sashby 1.2 sub storeincache()
164     {
165     my $self=shift;
166     my ($toolname,$dataobject)=@_;
167    
168     # Store ToolData object (for a set-up tool) in cache:
169     if (ref($dataobject) eq 'BuildSystem::ToolData')
170     {
171 sashby 1.16 $self->updatetooltimestamp($dataobject, $toolname);
172 muzaffar 1.19.2.2.2.1 delete $self->{SETUP}->{$toolname};
173 sashby 1.2 $self->{SETUP}->{$toolname} = $dataobject;
174     }
175     else
176     {
177     $::scram->scramerror("ToolManager: BuildSystem::ToolData object reference expected.")
178     }
179     }
180    
181     sub tools()
182     {
183     my $self = shift;
184     my @tools;
185    
186     map
187     {
188     if ($_ ne "self")
189     {
190     push(@tools, $_);
191     }
192     } keys %{$self->{SETUP}};
193    
194     # Return list of set-up tools:
195     return @tools;
196     }
197    
198     sub toolsdata()
199     {
200     my $self = shift;
201     my $tooldata = [];
202 muzaffar 1.19.2.2.2.1 $self->{internal}{donetools}={};
203     $self->{internal}{scram_tools}={};
204     foreach my $tool (sort keys %{$self->{SETUP}})
205 sashby 1.2 {
206 muzaffar 1.19.2.2.2.1 if ($self->{SETUP}{$tool}->scram_project()) {$self->{internal}{scram_tools}{$tool}=1;}
207     elsif ($tool ne "self")
208 sashby 1.2 {
209 muzaffar 1.19.2.2.2.1 $self->_toolsdata($tool,$tooldata);
210 sashby 1.2 }
211     }
212 muzaffar 1.19.2.2.2.1 foreach my $tool (keys %{$self->{internal}{scram_tools}})
213     {
214     $self->_toolsdata_scram($tool,$tooldata);
215     }
216     delete $self->{internal}{donetools};
217     delete $self->{internal}{scram_tools};
218 muzaffar 1.19.2.2.2.2 my $data=[];
219     foreach my $d (@$tooldata)
220     {
221     if (ref($d) eq "ARRAY")
222     {
223     foreach my $t (@$d) {push @$data,$t;}
224     }
225     }
226     return $data;
227 sashby 1.2 }
228    
229 muzaffar 1.19.2.2.2.1 sub _toolsdata()
230 sashby 1.2 {
231 muzaffar 1.19.2.2.2.1 my $self = shift;
232     my $tool=shift;
233     my $data=shift || [];
234 muzaffar 1.19.2.2.2.2 my $order=-1;
235     if(exists $self->{internal}{donetools}{$tool}){return $self->{internal}{donetools}{$tool};}
236     $self->{internal}{donetools}{$tool}=$order;
237 muzaffar 1.19.2.2.2.1 if (exists $self->{SETUP}{$tool})
238     {
239     if (exists $self->{SETUP}{$tool}{USE})
240     {
241 muzaffar 1.19.2.2.2.2 foreach my $use (@{$self->{SETUP}{$tool}{USE}})
242     {
243     my $o=$self->_toolsdata(lc($use),$data);
244     if ($o>$order){$order=$o;}
245     }
246 muzaffar 1.19.2.2.2.1 }
247 muzaffar 1.19.2.2.2.2 $order++;
248     if(!defined $data->[$order]){$data->[$order]=[];}
249     push @{$data->[$order]},$self->{SETUP}{$tool};
250 muzaffar 1.19.2.2.2.3 $self->{internal}{donetools}{$tool}=$order;
251 muzaffar 1.19.2.2.2.1 }
252 muzaffar 1.19.2.2.2.2 return $order;
253 sashby 1.2 }
254    
255 muzaffar 1.19.2.2.2.1 sub _toolsdata_scram()
256     {
257     my $self = shift;
258     my $tool=shift;
259     my $data=shift || [];
260 muzaffar 1.19.2.2.2.3 my $order=-1;
261 muzaffar 1.19.2.2.2.2 if(exists $self->{internal}{donetools}{$tool}){return $self->{internal}{donetools}{$tool};}
262     $self->{internal}{donetools}{$tool}=$order;
263 muzaffar 1.19.2.2.2.3 if(!exists $self->{internal}{scram_tools}{$tool}){return $order;}
264 muzaffar 1.19.2.2.2.1 use Configuration::ConfigArea;
265     use Cache::CacheUtilities;
266     my $cache=uc($tool)."_BASE";
267     $cache=$self->{SETUP}{$tool}{$cache};
268     if (!-d $cache)
269     {
270     print "ERROR: Release area \"$cache\" for \"$tool\" is not available.\n";
271 muzaffar 1.19.2.2.2.2 return $order;
272 muzaffar 1.19.2.2.2.1 }
273     my $area=Configuration::ConfigArea->new();
274     $area->location($cache);
275     my $cachefile=$area->toolcachename();
276     if (!-f $cachefile)
277     {
278     print "ERROR: Tools cache file for release area \"$cache\" is not available.\n";
279 muzaffar 1.19.2.2.2.2 return $order;
280 muzaffar 1.19.2.2.2.1 }
281     $cache=&Cache::CacheUtilities::read($cachefile);
282     my $tools=$cache->setup();
283 muzaffar 1.19.2.2.2.3 $order=scalar(@$data)-1;
284 muzaffar 1.19.2.2.2.1 foreach my $use (keys %$tools)
285     {
286     if ($tools->{$use}->scram_project() == 1)
287     {
288 muzaffar 1.19.2.2.2.2 my $o=$self->_toolsdata_scram($use,$data);
289     if ($o>$order){$order=$o;}
290 muzaffar 1.19.2.2.2.1 }
291     }
292 muzaffar 1.19.2.2.2.2 $order++;
293     if(!defined $data->[$order]){$data->[$order]=[];}
294     push @{$data->[$order]},$self->{SETUP}{$tool};
295 muzaffar 1.19.2.2.2.3 $self->{internal}{donetools}{$tool}=$order;
296 muzaffar 1.19.2.2.2.2 return $order;
297 muzaffar 1.19.2.2.2.1 }
298    
299 sashby 1.2 sub checkifsetup()
300     {
301     my $self=shift;
302     my ($tool)=@_;
303     # Return the ToolData object if the tool has been set up:
304     (exists $self->{SETUP}->{$tool}) ? return ($self->{SETUP}->{$tool})
305     : return undef;
306     }
307    
308     sub remove_tool()
309     {
310     my $self=shift;
311     my ($toolname)=@_;
312 muzaffar 1.19.2.2.2.1 my $tool = $self->{SETUP}{$toolname};
313     if ($tool->scram_compiler() == 1)
314 sashby 1.2 {
315 muzaffar 1.19.2.2.2.1 while (my ($langtype, $ctool) = each %{$self->{SCRAM_COMPILER}})
316     {
317     if ($toolname eq $ctool->[0]){delete $self->{SCRAM_COMPILER}->{$langtype};}
318 sashby 1.2 }
319     }
320 muzaffar 1.19.2.2.2.1 delete $self->{SETUP}{$toolname};
321     print "Deleting $toolname from cache.","\n";
322     $self->updatetooltimestamp (undef, $toolname);
323 sashby 1.2 $self->writecache();
324 muzaffar 1.19.2.2.2.1 my $file1=$self->{toolcache}."/selected/${toolname}.xml";
325     my $file2=$self->{toolcache}."/available/${toolname}.xml";
326     if ((!-f $file2) && (-f $file1))
327     {
328     use File::Copy;
329     copy ($file1,$file2);
330     }
331     unlink ($file1);
332 sashby 1.2 }
333    
334     sub scram_projects()
335     {
336     my $self=shift;
337     my $scram_projects={};
338    
339     foreach my $t ($self->tools())
340     {
341     # Get the ToolData object:
342     my $td=$self->{SETUP}->{$t};
343     $scram_projects->{$t}=$td->variable_data(uc($t)."_BASE"), if ($td->scram_project());
344     }
345    
346     return $scram_projects;
347     }
348    
349 sashby 1.8 sub scram_compiler()
350     {
351     my $self=shift;
352     my ($langtype, $toolname, $compilername)=@_;
353    
354     if ($langtype)
355     {
356     # Store the compiler info according to supported
357     # language types.
358     #
359     # ---------------------- e.g C++ cxxcompiler gcc323
360     $self->{SCRAM_COMPILER}->{$langtype}=[ $toolname, $compilername ];
361     }
362     else
363     {
364     return $self->{SCRAM_COMPILER};
365     }
366     }
367    
368 sashby 1.16 sub updatetooltimestamp ()
369     {
370     my $self=shift;
371     my $obj=shift;
372     my $toolname=shift;
373     my $samevalues=0;
374 muzaffar 1.18 my $stampdir = $self->{archstore}."/timestamps";
375     my $stampfile="${stampdir}/${toolname}";
376 sashby 1.16 if (exists $self->{SETUP}->{$toolname})
377     {
378     $samevalues=$self->comparetoolsdata($self->{SETUP}->{$toolname},$obj);
379     }
380 muzaffar 1.19.2.2.2.1 if ($toolname ne "self")
381     {
382     my $instdir = $self->{archstore}."/InstalledTools";
383     my $tfile = "${instdir}/${toolname}";
384     if ((!defined $obj) && (-f $tfile)) {unlink $tfile;}
385     elsif ((defined $obj) && (!-f $tfile))
386     {
387     Utilities::AddDir::adddir($instdir);
388     my $ref;
389     open($ref,">$tfile");
390     close($ref);
391     }
392     }
393 muzaffar 1.18 if ((!$samevalues) || (!-f $stampfile))
394 sashby 1.16 {
395 muzaffar 1.18 if (!-d $stampdir)
396 sashby 1.16 {
397 muzaffar 1.19.2.2 Utilities::AddDir::adddir($stampdir);
398 sashby 1.16 }
399 muzaffar 1.19.2.2.2.1 my $ref;
400     open($ref,">$stampfile");
401     close($ref);
402     if (!$samevalues){$self->dirty();}
403 sashby 1.16 }
404     }
405    
406     sub comparetoolsdata ()
407     {
408     my $self=shift;
409     my $data1=shift || ();
410     my $data2=shift || ();
411    
412     my $ref1=ref($data1);
413     my $ref2=ref($data2);
414    
415     if ($ref1 ne $ref2)
416     {
417     return 0;
418     }
419     elsif ($ref1 eq "CODE")
420     {
421     return 1;
422     }
423     elsif(($ref1 eq "SCALAR") || ($ref1 eq ""))
424     {
425     if ($data1 eq $data2)
426     {
427     return 1;
428     }
429     return 0;
430     }
431     elsif ($ref1 eq "ARRAY")
432     {
433     my $count = scalar(@$data1);
434     if ($count != scalar(@$data2))
435     {
436     return 0;
437     }
438     for (my $i=0; $i<$count; $i++)
439     {
440     if (! $self->comparetoolsdata($data1->[$i],$data2->[$i]))
441     {
442     return 0;
443     }
444     }
445     return 1;
446     }
447     else
448     {
449     foreach my $k (keys %{$data1})
450     {
451     if (! exists $data2->{$k})
452     {
453     return 0;
454     }
455     }
456     foreach my $k (keys %{$data2})
457     {
458     if (! exists $data1->{$k})
459     {
460     return 0;
461     }
462     }
463     foreach my $k (keys %{$data2})
464     {
465     if (! $self->comparetoolsdata($data1->{$k},$data2->{$k}))
466     {
467     return 0;
468     }
469     }
470     return 1;
471     }
472     }
473    
474 sashby 1.2 1;