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

# 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
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 $self->{arch}=shift;
43 $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 $self->{datastore}=$top."/.SCRAM/".$self->{arch};
56 #$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 }