ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/ToolBox.pm
Revision: 1.10
Committed: Fri Nov 16 16:29:48 2001 UTC (23 years, 5 months ago) by sashby
Content type: text/plain
Branch: MAIN
CVS Tags: V0_19_6, V0_19_6p1, V0_19_5, SFATEST, V0_19_4, V0_19_4_pre3, V0_19_4_pre2, V0_19_4_pre1, V0_19_3, V0_19_2, V0_19_1
Branch point for: V0_19_4_B
Changes since 1.9: +4 -4 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 #
2 # ToolBox.pm
3 #
4 # Originally Written by Christopher Williams
5 #
6 # Description
7 # -----------
8 # tools and interface to access them
9 #
10 # Interface
11 # ---------
12 # new(ConfigArea,archstring) : A new toolbox object
13 # tools() : return a list of tools (name,version) pairs
14 # defaultversion(tool) : return the default version of the specified tool
15 # setdefault(tool,version) : set the default version of a given tool (permanant)
16 # versions(tool) : return a list of available versions of a given tool
17 # gettool(name[,version]) : get the tool object with the given name
18 # returns the default version if version not spec.
19 # returns undef if no setup tool is available
20 # toolsetup(name,version[,docurl]) : setup the named tool from the specified doc
21 # if docurl not specified try and use previous
22 # document; returns 0=OK 1=no version
23 # interactive(0|1) : set the setup mode
24 # searcher(SearchObject) : Set the search object for matching tools during setup
25 # copytools(ToolBox) : copy tools from this to the supplied toolbox
26 # toolmakefile(name,version) : Return the location of the tool makefile
27
28 package BuildSystem::ToolBox;
29 use FileHandle;
30 use BuildSystem::Tool;
31 use Utilities::Verbose;
32 use Utilities::AddDir;
33 use URL::URLhandler;
34
35 @ISA=qw(Utilities::Verbose);
36 require 5.004;
37
38 sub new {
39 my $class=shift;
40 my $area=shift;
41 my $self={};
42 bless $self, $class;
43 $self->{arch}=shift;
44 $self->init($area);
45 return $self;
46 }
47
48 sub init {
49 my $self=shift;
50 my $area=shift;
51 my $top=$area->location();
52 my $config=$top."/".$area->configurationdir();
53
54 my $cache=$area->cache();
55 if ( defined $cache ) {
56 $self->{urlhandler}=URL::URLhandler->new($cache);
57 }
58 $self->{toolfiledir}="$top/.SCRAM/ToolFiles";
59 $self->{datastore}=$top."/.SCRAM/".$self->{arch};
60 $self->{tooladmin}=$self->{datastore}."/admin";
61 AddDir::adddir($self->{toolfiledir});
62 if ( -f $self->{tooladmin} ) {
63 $self->_restore($self->{tooladmin});
64 }
65 else {
66 # do we have toolfile dir and no admin? if so maybe its an old
67 # area and we can attempt to get something from the filenames
68 if ( -d $self->{datastore} ) {
69 my $dh=DirHandle->new();
70 opendir $dh, $self->{datastore};
71 my @files=grep /.*_.*/, readdir $dh;
72 undef $dh;
73 if ( $#files >= 0 ) {
74 $self->verbose("Backwards Compatability Mode");
75 foreach $file ( @files ) {
76 my ($name,$version)=($file=~/(.*)_(.*)\.dat/);
77 push @{$self->{toollist}}, $name;
78 push @{$self->{version}{$name}},$version;
79 $self->{defaults}{$name}=$version;
80 }
81 }
82 }
83 }
84 $self->_readdefaultsfile($config."/External_Dependencies");
85 }
86
87 sub interactive {
88 my $self=shift;
89
90 @_?$self->{interactive}=shift
91 :((defined $self->{interactive})?$self->{interactive}:0);
92 }
93
94 sub tools {
95 my $self=shift;
96 return @{$self->{toollist}};
97 }
98
99 sub toolsetup {
100 my $self=shift;
101 my $name=shift;
102
103 AddDir::adddir($self->{datastore});
104 $name=~tr[A-Z][a-z];
105 my $rv=0;
106 # -- get version
107 my $version;
108 if ( @_ ) {
109 $version=shift;
110 }
111 else {
112 $version=$self->defaultversion($name);
113 if ( ! defined $version ) { $rv=1; return $rv; }
114 }
115
116 my $url;
117
118 # -- get a tool object
119 my ($tool)=$self->_toolobject($name,$version);
120
121 # -- get the url
122 if ( @_ ) {
123 $url=shift;
124 $tool->url($url);
125 }
126 else {
127 # no url specified - try to get it from the tool
128 $url=$tool->url();
129 if ( ! defined $url ) {
130 $self->error("Unable to determine document for tool ".
131 $name." ".$version);
132 }
133 }
134 $filename=$self->_download($url, $name, $version);
135
136 # -- the tool setup
137 print "\n----------- Setting Up $name $version -----------------------------------------------\n\n";
138 require BuildSystem::ToolDoc;
139 my $doc=BuildSystem::ToolDoc->new();
140 $doc->tool($tool);
141 $doc->verbosity($self->verbosity());
142 if ( defined $self->searcher() ) {
143 $doc->toolsearcher($self->searcher());
144 }
145 $doc->interactive($self->interactive());
146 $tool->reset();
147 if ( ! $doc->setup($filename,$name,$version,$self) ) {
148 $tool->store($self->_toolfile($name,$version));
149 # -- keep an internal record of the tool
150 $name=~tr[A-Z][a-z];
151 # -- ad a new version if appropriate
152 if ( ! (grep { $_ eq $version; } @{$self->{version}{$name}}) ) {
153 push @{$self->{version}{$name}},$version;
154 }
155 # - if default version for this tool doesnt exist make it this version
156 if ( ! defined $self->{defaults}{$name} ) {
157 # add to toollist if we dont already have it
158 push @{$self->{toollist}}, $name;
159 $self->{defaults}{$name}=$version;
160 }
161 $self->_save();
162 }
163 else {
164 $self->error("Unable to find $name $version in $url");
165 }
166 undef $doc;
167 return $rv;
168 }
169
170 sub copytools {
171 my $self=shift;
172 my $newtoolbox=shift;
173
174 # - copy over data dir and admin files
175 AddDir::copydir($self->datastore(),$newtoolbox->datastore());
176
177 # - copy ToolFiles
178 AddDir::copydir($self->toolfiledir(),$newtoolbox->toolfiledir());
179
180 # - reinitialise the toolobject
181 $newtoolbox->_restore($self->{tooladmin});
182 }
183
184 sub toolfiledir {
185 my $self=shift;
186 return $self->{toolfiledir};
187 }
188
189 sub datastore {
190 my $self=shift;
191 return $self->{datastore};
192 }
193
194 sub searcher {
195 my $self=shift;
196
197 if ( @_ ) {
198 $self->{toolboxsearcher}=shift;
199 }
200 return $self->{toolboxsearcher};
201 }
202
203 sub versions {
204 my $self=shift;
205 my $toolname=shift;
206
207 return @{$self->{'version'}{$toolname}};
208 }
209
210 sub setdefault {
211 my $self=shift;
212 my $product=shift;
213 my $version=shift;
214
215 $self->{defaults}{$product}=$version;
216 $self->_save();
217 }
218
219 sub gettool {
220 my $self=shift;
221 my $product=shift;
222 my $version;
223
224 $product=~tr[A-Z][a-z];
225 if ( @_ ) { $version=shift; }
226 else {
227 # lookup the default version
228 $version=$self->defaultversion($product);
229 return undef, if ( ! defined $version );
230 }
231 my ($tool,$rv)=$self->_toolobject($product,$version);
232 if ( $rv != 0 ) {
233 delete $self->{tools}{$product}{$version};
234 }
235 return ( $rv==0?$tool:undef ); # only return if already set up
236 }
237
238 sub defaultversion {
239 my $self=shift;
240 my $product=shift;
241
242 return $self->{defaults}{$product};
243 }
244
245 sub toolmakefile {
246 my $self=shift;
247 my $name=shift;
248 my $version=shift;
249
250 $name=~tr[A-Z][a-z];
251 return $self->{datastore}."/".$name."_$version.mk";
252 }
253
254 sub _toolfile {
255 my $self=shift;
256 my $name=shift;
257 my $version=shift;
258
259 $name=~tr[A-Z][a-z];
260 return $self->{datastore}."/".$name."_$version.dat";
261 }
262
263 #
264 # Get a copy of the file we want in a place where users can easily find it
265 #
266 sub _download {
267 my $self=shift;
268 my $url=shift;
269 my $tool=shift;
270 my $version=shift;
271
272 my $name=$tool."_".$version;
273 # -- make sure we have a copy of the file
274 my $filename=$self->{toolfiledir}."/".$name;
275 if ( ! -f $filename ) {
276 $self->verbose("Attempting Download of $url");
277 ($url,$filename)=$self->{urlhandler}->get($url);
278 use File::Copy;
279 my $tfname=$self->{toolfiledir}."/$name";
280 copy($filename, $tfname);
281 $self->verbose("Toolfile=".$tfname." copied from $filename");
282 $filename=$tfname;
283 }
284 return $filename;
285 }
286
287 sub _save {
288 my $self=shift;
289 $self->_store($self->{tooladmin});
290 }
291
292 sub _restore {
293 my $self=shift;
294 my $file=shift;
295
296 my $fh=FileHandle->new();
297 $fh->open("<".$file);
298 $self->verbose("Restoring toolbox from $file");
299 my @versions;
300 my $ver;
301 while ( <$fh> ) {
302 chomp;
303 $name=$_;
304 push @{$self->{toollist}}, $name;
305 $ver=<$fh>;
306 chomp $ver;
307 @versions=split / /, $ver;
308 push @{$self->{version}{$name}},@versions;
309 $ver=<$fh>;
310 chomp $ver;
311 $self->{defaults}{$name}=$ver;
312 }
313 undef $fh;
314 }
315
316 sub _store {
317 my $self=shift;
318 my $file=shift;
319 my $fh=FileHandle->new();
320 $fh->open(">".$file);
321
322 # save as triplets - name, versions, default version
323 foreach $tool ( @{$self->{toollist}} ) {
324 print $fh $tool."\n";
325 my $vers=join " ",@{$self->{version}{$tool}};
326 print $fh $vers."\n";
327 print $fh $self->{defaults}{$tool}."\n";
328 }
329 undef $fh;
330 }
331
332 sub _readdefaultsfile {
333 my $self=shift;
334 my $file=shift;
335
336 # -- Read the default override file
337 my $fh=FileHandle->new();
338 $fh->open("<".$file);
339 while ( <$fh> ) {
340 chomp;
341 next if /^#/;
342 next if /^\s*$/;
343 ($product, $version)=split /:/;
344 $product=~tr[A-Z][a-z];
345 $self->{defaults}{$product}=$version;
346 }
347 undef $fh;
348 }
349
350 sub _toolobject {
351 my $self=shift;
352 my $product=shift;
353 my $version=shift;
354
355 my $rv=0;
356
357 if ( ! exists $self->{tools}{$product}{$version} ) {
358 $self->verbose("$product $version being Initialised");
359 $self->{tools}{$product}{$version}=BuildSystem::Tool->new();
360 my $file=$self->_toolfile($product,$version);
361 if ( -f $file ) { # restore it from disk
362 $self->verbose("Recovering $product $version from $file");
363 $self->{tools}{$product}{$version}->restore($file);
364 }
365 else {
366 $rv=1;
367 $self->{tools}{$product}{$version}->name($product);
368 $self->{tools}{$product}{$version}->version($version);
369 $self->verbose("Tool $product $version needs set up");
370 }
371 }
372 return ($self->{tools}{$product}{$version}, $rv);
373 }