ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/ToolBox.pm
Revision: 1.6
Committed: Wed Nov 15 10:50:56 2000 UTC (24 years, 5 months ago) by williamc
Content type: text/plain
Branch: MAIN
CVS Tags: V0_19_0, V0_18_5, V0_18_4, V_18_3_TEST, VO_18_3, V0_18_2, V0_18_1
Changes since 1.5: +11 -1 lines
Log Message:
import from V0_18_0

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