ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/ToolBox.pm
Revision: 1.8
Committed: Fri Oct 19 18:14:23 2001 UTC (23 years, 6 months ago) by sashby
Content type: text/plain
Branch: MAIN
Changes since 1.7: +0 -2 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 williamc 1.2 #
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 williamc 1.3 # new(ConfigArea,archstring) : A new toolbox object
13 williamc 1.2 # 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 williamc 1.6 # toolmakefile(name,version) : Return the location of the tool makefile
27 williamc 1.2
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 williamc 1.3 $self->{arch}=shift;
44 williamc 1.2 $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 williamc 1.4
54     my $cache=$area->cache();
55 williamc 1.5 if ( defined $cache ) {
56     $self->{urlhandler}=URL::URLhandler->new($cache);
57     }
58 williamc 1.2 $self->{toolfiledir}="$top/.SCRAM/ToolFiles";
59 williamc 1.3 $self->{datastore}=$top."/.SCRAM/".$self->{arch};
60 williamc 1.2 $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 williamc 1.5 my $dh=DirHandle->new();
70 williamc 1.2 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 sashby 1.7 print "\n----------- Setting Up $name $version ----------------------------------\n";
138 williamc 1.2 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 williamc 1.6 if ( ! $doc->setup($filename,$name,$version,$self) ) {
148 williamc 1.2 $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    
168     return $rv;
169     }
170    
171     sub copytools {
172     my $self=shift;
173     my $newtoolbox=shift;
174    
175     # - copy over data dir and admin files
176     AddDir::copydir($self->datastore(),$newtoolbox->datastore());
177    
178     # - copy ToolFiles
179     AddDir::copydir($self->toolfiledir(),$newtoolbox->toolfiledir());
180    
181     # - reinitialise the toolobject
182     $newtoolbox->_restore($self->{tooladmin});
183     }
184    
185     sub toolfiledir {
186     my $self=shift;
187     return $self->{toolfiledir};
188     }
189    
190     sub datastore {
191     my $self=shift;
192     return $self->{datastore};
193     }
194    
195     sub searcher {
196     my $self=shift;
197    
198     if ( @_ ) {
199     $self->{toolboxsearcher}=shift;
200     }
201     return $self->{toolboxsearcher};
202     }
203    
204     sub versions {
205     my $self=shift;
206     my $toolname=shift;
207    
208     return @{$self->{'version'}{$toolname}};
209     }
210    
211     sub setdefault {
212     my $self=shift;
213     my $product=shift;
214     my $version=shift;
215    
216     $self->{defaults}{$product}=$version;
217     $self->_save();
218     }
219    
220     sub gettool {
221     my $self=shift;
222     my $product=shift;
223     my $version;
224    
225     $product=~tr[A-Z][a-z];
226     if ( @_ ) { $version=shift; }
227     else {
228     # lookup the default version
229     $version=$self->defaultversion($product);
230     return undef, if ( ! defined $version );
231     }
232     my ($tool,$rv)=$self->_toolobject($product,$version);
233 williamc 1.5 if ( $rv != 0 ) {
234     delete $self->{tools}{$product}{$version};
235     }
236 williamc 1.2 return ( $rv==0?$tool:undef ); # only return if already set up
237     }
238    
239     sub defaultversion {
240     my $self=shift;
241     my $product=shift;
242    
243     return $self->{defaults}{$product};
244 williamc 1.6 }
245    
246     sub toolmakefile {
247     my $self=shift;
248     my $name=shift;
249     my $version=shift;
250    
251     $name=~tr[A-Z][a-z];
252     return $self->{datastore}."/".$name."_$version.mk";
253 williamc 1.2 }
254    
255     sub _toolfile {
256     my $self=shift;
257     my $name=shift;
258     my $version=shift;
259    
260     $name=~tr[A-Z][a-z];
261     return $self->{datastore}."/".$name."_$version.dat";
262     }
263    
264     #
265     # Get a copy of the file we want in a place where users can easily find it
266     #
267     sub _download {
268     my $self=shift;
269     my $url=shift;
270     my $tool=shift;
271     my $version=shift;
272    
273     my $name=$tool."_".$version;
274     # -- make sure we have a copy of the file
275     my $filename=$self->{toolfiledir}."/".$name;
276     if ( ! -f $filename ) {
277     $self->verbose("Attempting Download of $url");
278     ($url,$filename)=$self->{urlhandler}->get($url);
279     use File::Copy;
280     my $tfname=$self->{toolfiledir}."/$name";
281     copy($filename, $tfname);
282     $self->verbose("Toolfile=".$tfname." copied from $filename");
283     $filename=$tfname;
284     }
285     return $filename;
286     }
287    
288     sub _save {
289     my $self=shift;
290     $self->_store($self->{tooladmin});
291     }
292    
293     sub _restore {
294     my $self=shift;
295     my $file=shift;
296    
297     my $fh=FileHandle->new();
298     $fh->open("<".$file);
299     $self->verbose("Restoring toolbox from $file");
300     my @versions;
301     my $ver;
302     while ( <$fh> ) {
303     chomp;
304     $name=$_;
305     push @{$self->{toollist}}, $name;
306     $ver=<$fh>;
307     chomp $ver;
308     @versions=split / /, $ver;
309     push @{$self->{version}{$name}},@versions;
310     $ver=<$fh>;
311     chomp $ver;
312     $self->{defaults}{$name}=$ver;
313     }
314     undef $fh;
315     }
316    
317     sub _store {
318     my $self=shift;
319     my $file=shift;
320     my $fh=FileHandle->new();
321     $fh->open(">".$file);
322    
323     # save as triplets - name, versions, default version
324     foreach $tool ( @{$self->{toollist}} ) {
325     print $fh $tool."\n";
326     my $vers=join " ",@{$self->{version}{$tool}};
327     print $fh $vers."\n";
328     print $fh $self->{defaults}{$tool}."\n";
329     }
330     undef $fh;
331     }
332    
333     sub _readdefaultsfile {
334     my $self=shift;
335     my $file=shift;
336    
337     # -- Read the default override file
338     my $fh=FileHandle->new();
339     $fh->open("<".$file);
340     while ( <$fh> ) {
341     chomp;
342     next if /^#/;
343     next if /^\s*$/;
344     ($product, $version)=split /:/;
345     $product=~tr[A-Z][a-z];
346     $self->{defaults}{$product}=$version;
347     }
348     undef $fh;
349     }
350    
351     sub _toolobject {
352     my $self=shift;
353     my $product=shift;
354     my $version=shift;
355    
356     my $rv=0;
357    
358     if ( ! exists $self->{tools}{$product}{$version} ) {
359 williamc 1.5 $self->verbose("$product $version being Initialised");
360 williamc 1.2 $self->{tools}{$product}{$version}=BuildSystem::Tool->new();
361     my $file=$self->_toolfile($product,$version);
362     if ( -f $file ) { # restore it from disk
363     $self->verbose("Recovering $product $version from $file");
364     $self->{tools}{$product}{$version}->restore($file);
365     }
366     else {
367     $rv=1;
368     $self->{tools}{$product}{$version}->name($product);
369     $self->{tools}{$product}{$version}->version($version);
370     $self->verbose("Tool $product $version needs set up");
371     }
372     # push @{$self->{toollist}}, [$product, $version];
373     }
374     return ($self->{tools}{$product}{$version}, $rv);
375     }