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

# 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 sashby 1.10 my $self=shift;
101     my $name=shift;
102    
103     AddDir::adddir($self->{datastore});
104 williamc 1.2 $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.9 print "\n----------- Setting Up $name $version -----------------------------------------------\n\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     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 williamc 1.5 if ( $rv != 0 ) {
233     delete $self->{tools}{$product}{$version};
234     }
235 williamc 1.2 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 williamc 1.6 }
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 williamc 1.2 }
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 williamc 1.5 $self->verbose("$product $version being Initialised");
359 williamc 1.2 $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     }