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

# 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.4 #$self->verbosity(1);
45 williamc 1.2 $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 williamc 1.4
55     my $cache=$area->cache();
56 williamc 1.5 if ( defined $cache ) {
57     $self->{urlhandler}=URL::URLhandler->new($cache);
58     }
59 williamc 1.2 $self->{toolfiledir}="$top/.SCRAM/ToolFiles";
60 williamc 1.3 $self->{datastore}=$top."/.SCRAM/".$self->{arch};
61 williamc 1.2 #$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 williamc 1.5 my $dh=DirHandle->new();
72 williamc 1.2 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 williamc 1.6 if ( ! $doc->setup($filename,$name,$version,$self) ) {
150 williamc 1.2 $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 williamc 1.5 if ( $rv != 0 ) {
236     delete $self->{tools}{$product}{$version};
237     }
238 williamc 1.2 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 williamc 1.6 }
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 williamc 1.2 }
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 williamc 1.5 $self->verbose("$product $version being Initialised");
362 williamc 1.2 $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     }