ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/ToolBox.pm
Revision: 1.1.2.23
Committed: Thu May 25 12:47:22 2000 UTC (24 years, 11 months ago) by williamc
Content type: text/plain
Branch: V0_9branch
CVS Tags: V0_12_11, V0_12_9b, V0_12_10, V0_12_9, V0_12_8
Changes since 1.1.2.22: +1 -1 lines
Log Message:
Fix url return on a download

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() : 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 # gettool(name[,version]) : get the tool object with the given name
16 # returns the default version if version not spec.
17 # returns undef if no setup tool is available
18 # toolsetup(name,version[,doc]) : setup the named tool from the specified doc
19 # if doc not specified try and use previous
20 # document; returns 0=OK 1=no version
21 # interactive(0|1) : set the setup mode
22 # searcher(SearchObject) : Set the search object for matching tools during setup
23
24 package BuildSystem::ToolBox;
25 use FileHandle;
26 use BuildSystem::Tool;
27 use Utilities::Verbose;
28
29 @ISA=qw(Utilities::Verbose);
30 require 5.004;
31
32 sub new {
33 my $class=shift;
34 my $area=shift;
35 $self={};
36 bless $self, $class;
37 $self->init($area);
38 #$self->verbosity(1);
39 return $self;
40 }
41
42 sub init {
43 my $self=shift;
44 my $area=shift;
45 my $top=$area->location();
46 my $config=$top."/".$area->configurationdir();
47 $self->{urlcache}="$top/.SCRAM/ToolFiles";
48 $self->{datastore}=$top."/.SCRAM/".$ENV{SCRAM_ARCH};
49 $self->{reqdoc}=$area->requirementsdoc();
50 AddDir::adddir($self->{urlcache});
51 $self->_readdefaultsfile($config."/External_Dependencies");
52 }
53
54 sub interactive {
55 my $self=shift;
56
57 @_?$self->{interactive}=shift
58 :((defined $self->{interactive})?$self->{interactive}:0);
59 }
60
61 sub tools {
62 my $self=shift;
63 return @{$self->{toollist}};
64 }
65
66 sub toolsetup {
67 my $self=shift;
68 my $name=shift;
69
70 AddDir::adddir($self->{datastore});
71 $name=~tr[A-Z][a-z];
72 my $rv=0;
73 # -- get version
74 my $version;
75 if ( @_ ) {
76 $version=shift;
77 }
78 else {
79 $version=$self->defaultversion($name);
80 if ( ! defined $version ) { $rv=1; return $rv; }
81 }
82
83 my $url;
84
85 # -- get a tool object
86 my ($tool)=$self->_toolobject($name,$version);
87
88 # -- get the url
89 if ( @_ ) {
90 $url=shift;
91 }
92 else {
93 # no url specified - try to get it from the tool
94 $url=$tool->url();
95 if ( ! defined $url ) {
96 $self->error("Unable to determine document for tool ".
97 $name." ".$version);
98 }
99 }
100 $url=$self->_download($url);
101
102 # -- the tool setup
103 $tool->url($url);
104 print "\n ----------- Setting Up $name $version ---------------\n";
105 if ( ($self->interactive()) || (! $self->_copymatchingtool($tool)) ) {
106 require BuildSystem::ToolDoc;
107 my $doc=BuildSystem::ToolDoc->new();
108 $doc->tool($tool);
109 $doc->interactive($self->interactive());
110 $tool->reset();
111 if ( ! $doc->setup($self->{urlcache}."/".$url,$name,$version) ) {
112 $tool->store($self->_toolfile($name,$version));
113 }
114 else {
115 $self->error("Unable to find $name $version in $url");
116 }
117 undef $doc;
118 }
119 return $rv;
120 }
121
122 sub searcher {
123 my $self=shift;
124
125 if ( @_ ) {
126 $self->{toolboxsearcher}=shift;
127 }
128 return $self->{toolboxsearcher};
129 }
130
131 sub gettool {
132 my $self=shift;
133 my $product=shift;
134 my $version;
135
136 $product=~tr[A-Z][a-z];
137 if ( @_ ) { $version=shift; }
138 else {
139 # lookup the default version
140 $version=$self->defaultversion($product);
141 return undef, if ( ! defined $version );
142 }
143 my ($tool,$rv)=$self->_toolobject($product,$version);
144 return ( $rv==0?$tool:undef ); # only return if already set up
145 }
146
147 sub defaultversion {
148 my $self=shift;
149 my $product=shift;
150
151 return $self->{defaults}{$product};
152 }
153
154 sub _copymatchingtool {
155 my $self=shift;
156 my $tool=shift;
157
158 my $rv=0;
159 $self->verbose("Check Other Projects for tool");
160 my @validtools=$self->_gettools($tool);
161
162 # -- for now we just take the first one
163 if ( ! $self->interactive() ) {
164 if ( $#validtools >= 0 ) {
165 $self->verbose("Found Settings in another tool");
166 my $file=$self->_toolfile($validtools[0]->name(),
167 $validtools[0]->version());
168 $validtools[0]->store($file);
169 $tool->restore($file);
170 $rv=1;
171 }
172 }
173 return $rv;
174 }
175
176 #
177 # return list of matching tools
178 sub _gettools {
179 my $self=shift;
180 my $tool=shift;
181
182 my @tools=();
183 my $area;
184 my $rtool;
185 if ( defined $self->{toolboxsearcher} ) {
186 my $it=$self->{toolboxsearcher}->newiterator();
187 while ( ! $it->last() ) {
188 $area=$it->next();
189 if ( defined $area ) {
190 $self->verbose("Searching for ".$tool->name()." ".
191 $tool->version()." in ".$area->location());
192 $rtool=$area->toolbox()->gettool($tool->name(),$tool->version());
193 if ( (defined $rtool) && $rtool->equals($tool) ) {
194 push @tools,$rtool;
195 }
196 }
197 }
198 }
199 return @tools;
200 }
201
202 sub _toolfile {
203 my $self=shift;
204 my $name=shift;
205 my $version=shift;
206
207 $name=~tr[A-Z][a-z];
208 return $self->{datastore}."/".$name."_$version.dat";
209 }
210
211 sub _download {
212 my $self=shift;
213 my $url=shift;
214
215 my $name;
216 # -- make sure we have a copy of the file
217 if ( ! -f $self->{urlcache}."/".$url ) {
218 if ( $url!~/:/ ) {
219 $name=$url;
220 $url="file:$ENV{SCRAM_HOME}/toolbox/".$url;
221 }
222 else {
223 ($name=$url)=~s/.*\/(.*)/$1/;
224 }
225 $self->verbose("Attempting Download of $url");
226 &urlhandler::urlhandler($url,
227 , $self->{urlcache}."/$name") ;
228 $url=$name;
229 }
230 return $url;
231 }
232
233 sub _readdefaultsfile {
234 my $self=shift;
235 my $file=shift;
236
237 # -- Get defaults from the RequirementsDoc
238 my $req=$self->_requirements();
239 my $tool;
240 my $toollower;
241 foreach $tool ( $req->tools()) {
242 ($toollower=$tool)=~tr[A-Z][a-z];
243 push @{$self->{toollist}}, [ ($toollower, $req->version($tool)) ];
244 if ( ! defined $self->{defaults}{$toollower} ) {
245 $self->{defaults}{$toollower}=$req->version($tool);
246 }
247 }
248
249 # -- Read the default override file
250 my $fh=FileHandle->new();
251 $fh->open("<".$file);
252 while ( <$fh> ) {
253 chomp;
254 next if /^#/;
255 next if /^\s*$/;
256 ($product, $version)=split /:/;
257 $product=~tr[A-Z][a-z];
258 $self->{defaults}{$product}=$version;
259 }
260 undef $fh;
261 }
262
263 sub _requirements {
264 my $self=shift;
265 if ( ! defined $self->{reqsobj} ) {
266 require BuildSystem::Requirements;
267 $self->{reqsobj}=
268 BuildSystem::Requirements->new($self->{reqdoc});
269 }
270 return $self->{reqsobj};
271 }
272
273 sub _toolobject {
274 my $self=shift;
275 my $product=shift;
276 my $version=shift;
277
278 my $rv=0;
279
280 if ( ! exists $self->{tools}{$product}{$version} ) {
281 $self->verbose("$product $version being Intitialised");
282 $self->{tools}{$product}{$version}=BuildSystem::Tool->new();
283 my $file=$self->_toolfile($product,$version);
284 if ( -f $file ) { # restore it from disk
285 $self->verbose("Recovering $product $version from $file");
286 $self->{tools}{$product}{$version}->restore($file);
287 }
288 else {
289 $rv=1;
290 $self->{tools}{$product}{$version}->name($product);
291 $self->{tools}{$product}{$version}->version($version);
292 $self->verbose("Tool $product $version needs set up");
293 }
294 # push @{$self->{toollist}}, [$product, $version];
295 }
296 return ($self->{tools}{$product}{$version}, $rv);
297 }