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

# Content
1 #____________________________________________________________________
2 # File: ToolManager.pm
3 #____________________________________________________________________
4 #
5 # Author: Shaun Ashby <Shaun.Ashby@cern.ch>
6 # Update: 2003-11-12 15:04:16+0100
7 # Revision: $Id: ToolManager.pm,v 1.19.2.2.2.1 2008/03/13 12:54:50 muzaffar Exp $
8 #
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 use SCRAM::MsgLog;
21
22 @ISA=qw(BuildSystem::ToolCache Utilities::Verbose);
23 @EXPORT_OK=qw( );
24 #
25
26 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 $self->init (shift);
33 return $self;
34 }
35
36 sub init ()
37 {
38 my $self=shift;
39 my $projectarea=shift;
40 $self->{topdir}=$projectarea->location();
41 $self->{configdir}=$self->{topdir}."/".$projectarea->configurationdir();
42 $self->{archstore}=$projectarea->archdir();
43 $self->{toolcache}=$self->{configdir}."/toolbox/".$projectarea->arch()."/tools";
44 $self->name($projectarea->toolcachename());
45 $self->dirty();
46 }
47
48 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 my @selected=();
60 my $tooldir=$self->{toolcache}."/selected";
61 foreach my $tool (@{&getfileslist($tooldir)})
62 {
63 if ($tool=~/^(.+)\.xml$/) {push @selected,$1;}
64 }
65 foreach my $tool (@selected){$self->coresetup("${tooldir}/${tool}.xml");}
66 scramlogmsg("\n");
67 }
68
69 sub coresetup()
70 {
71 my $self=shift;
72 my ($toolfile) = @_;
73
74 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 scramlogmsg("\n",$::bold."Setting up ",$toolname," version ",$toolversion,": ".$::normal,"\n");
81
82 # Next, set up the tool:
83 my $store = $toolparser->processrawtool($self->interactive());
84
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 # Store the ToolData object in the cache:
97 $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 }
109 symlink("../available/${toolname}.xml",$desfile);
110 }
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 my $filename=$self->{configdir}."/Self.xml";
120
121 if ( -f $filename )
122 {
123 scramlogmsg("\n",$::bold."Setting up SELF:".$::normal,"\n");
124 # Self file exists so process it:
125 $selfparser = BuildSystem::ToolParser->new();
126 $selfparser->filehead ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><doc type="BuildSystem::ToolDoc" version="1.0">');
127 $selfparser->filehead ('</doc>');
128 $selfparser->parse($filename);
129
130 # Next, set up the tool:
131 $store = $selfparser->processrawtool($self->interactive());
132
133 # 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 scramlogmsg("\n");
143 }
144 else
145 {
146 scramlogdump();
147 print "\n";
148 print "SCRAM: No file config/Self.xml...nothing to do.";
149 print "\n";
150 return;
151 }
152 }
153
154 sub update()
155 {
156 my $self=shift;
157 my $area=shift;
158 $self->init($area);
159 $self->setupself();
160 $self->dirty ()
161 }
162
163 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 $self->updatetooltimestamp($dataobject, $toolname);
172 delete $self->{SETUP}->{$toolname};
173 $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 $self->{internal}{donetools}={};
203 $self->{internal}{scram_tools}={};
204 foreach my $tool (sort keys %{$self->{SETUP}})
205 {
206 if ($self->{SETUP}{$tool}->scram_project()) {$self->{internal}{scram_tools}{$tool}=1;}
207 elsif ($tool ne "self")
208 {
209 $self->_toolsdata($tool,$tooldata);
210 }
211 }
212 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 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 }
228
229 sub _toolsdata()
230 {
231 my $self = shift;
232 my $tool=shift;
233 my $data=shift || [];
234 my $order=-1;
235 if(exists $self->{internal}{donetools}{$tool}){return $self->{internal}{donetools}{$tool};}
236 $self->{internal}{donetools}{$tool}=$order;
237 if (exists $self->{SETUP}{$tool})
238 {
239 if (exists $self->{SETUP}{$tool}{USE})
240 {
241 foreach my $use (@{$self->{SETUP}{$tool}{USE}})
242 {
243 my $o=$self->_toolsdata(lc($use),$data);
244 if ($o>$order){$order=$o;}
245 }
246 }
247 $order++;
248 if(!defined $data->[$order]){$data->[$order]=[];}
249 push @{$data->[$order]},$self->{SETUP}{$tool};
250 $self->{internal}{donetools}{$tool}=$order;
251 }
252 return $order;
253 }
254
255 sub _toolsdata_scram()
256 {
257 my $self = shift;
258 my $tool=shift;
259 my $data=shift || [];
260 my $order=-1;
261 if(exists $self->{internal}{donetools}{$tool}){return $self->{internal}{donetools}{$tool};}
262 $self->{internal}{donetools}{$tool}=$order;
263 if(!exists $self->{internal}{scram_tools}{$tool}){return $order;}
264 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 return $order;
272 }
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 return $order;
280 }
281 $cache=&Cache::CacheUtilities::read($cachefile);
282 my $tools=$cache->setup();
283 $order=scalar(@$data)-1;
284 foreach my $use (keys %$tools)
285 {
286 if ($tools->{$use}->scram_project() == 1)
287 {
288 my $o=$self->_toolsdata_scram($use,$data);
289 if ($o>$order){$order=$o;}
290 }
291 }
292 $order++;
293 if(!defined $data->[$order]){$data->[$order]=[];}
294 push @{$data->[$order]},$self->{SETUP}{$tool};
295 $self->{internal}{donetools}{$tool}=$order;
296 return $order;
297 }
298
299 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 my $tool = $self->{SETUP}{$toolname};
313 if ($tool->scram_compiler() == 1)
314 {
315 while (my ($langtype, $ctool) = each %{$self->{SCRAM_COMPILER}})
316 {
317 if ($toolname eq $ctool->[0]){delete $self->{SCRAM_COMPILER}->{$langtype};}
318 }
319 }
320 delete $self->{SETUP}{$toolname};
321 print "Deleting $toolname from cache.","\n";
322 $self->updatetooltimestamp (undef, $toolname);
323 $self->writecache();
324 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 }
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 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 sub updatetooltimestamp ()
369 {
370 my $self=shift;
371 my $obj=shift;
372 my $toolname=shift;
373 my $samevalues=0;
374 my $stampdir = $self->{archstore}."/timestamps";
375 my $stampfile="${stampdir}/${toolname}";
376 if (exists $self->{SETUP}->{$toolname})
377 {
378 $samevalues=$self->comparetoolsdata($self->{SETUP}->{$toolname},$obj);
379 }
380 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 if ((!$samevalues) || (!-f $stampfile))
394 {
395 if (!-d $stampdir)
396 {
397 Utilities::AddDir::adddir($stampdir);
398 }
399 my $ref;
400 open($ref,">$stampfile");
401 close($ref);
402 if (!$samevalues){$self->dirty();}
403 }
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 1;