ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/ToolBox.pm
Revision: 1.3
Committed: Thu Sep 21 13:36:52 2000 UTC (24 years, 7 months ago) by williamc
Content type: text/plain
Branch: MAIN
Changes since 1.2: +3 -2 lines
Log Message:
Remove SCRAM_ARCH

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