ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/ToolBox.pm
Revision: 1.1.2.27
Committed: Fri Jun 23 15:35:09 2000 UTC (24 years, 10 months ago) by williamc
Content type: text/plain
Branch: V0_9branch
CVS Tags: V0_13_3, V0_13_2, V0_13_1
Changes since 1.1.2.26: +3 -6 lines
Log Message:
sort out requirements object problems

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) : 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->{area}=$area;
48 $self->{urlcache}="$top/.SCRAM/ToolFiles";
49 $self->{datastore}=$top."/.SCRAM/".$ENV{SCRAM_ARCH};
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 require BuildSystem::ToolDoc;
106 my $doc=BuildSystem::ToolDoc->new();
107 $doc->tool($tool);
108 if ( defined $self->searcher() ) {
109 $doc->toolsearcher($self->searcher());
110 }
111 $doc->interactive($self->interactive());
112 $tool->reset();
113 if ( ! $doc->setup($self->{urlcache}."/".$url,$name,$version) ) {
114 $tool->store($self->_toolfile($name,$version));
115 }
116 else {
117 $self->error("Unable to find $name $version in $url");
118 }
119 undef $doc;
120
121 return $rv;
122 }
123
124 sub searcher {
125 my $self=shift;
126
127 if ( @_ ) {
128 $self->{toolboxsearcher}=shift;
129 }
130 return $self->{toolboxsearcher};
131 }
132
133 sub gettool {
134 my $self=shift;
135 my $product=shift;
136 my $version;
137
138 $product=~tr[A-Z][a-z];
139 if ( @_ ) { $version=shift; }
140 else {
141 # lookup the default version
142 $version=$self->defaultversion($product);
143 return undef, if ( ! defined $version );
144 }
145 my ($tool,$rv)=$self->_toolobject($product,$version);
146 return ( $rv==0?$tool:undef ); # only return if already set up
147 }
148
149 sub defaultversion {
150 my $self=shift;
151 my $product=shift;
152
153 return $self->{defaults}{$product};
154 }
155
156 sub _toolfile {
157 my $self=shift;
158 my $name=shift;
159 my $version=shift;
160
161 $name=~tr[A-Z][a-z];
162 return $self->{datastore}."/".$name."_$version.dat";
163 }
164
165 sub _download {
166 my $self=shift;
167 my $url=shift;
168
169 my $name;
170 # -- make sure we have a copy of the file
171 if ( ! -f $self->{urlcache}."/".$url ) {
172 if ( $url!~/:/ ) {
173 $name=$url;
174 $url="file:$ENV{SCRAM_HOME}/toolbox/".$url;
175 }
176 else {
177 ($name=$url)=~s/.*\/(.*)/$1/;
178 }
179 $self->verbose("Attempting Download of $url");
180 &urlhandler::urlhandler($url,
181 , $self->{urlcache}."/$name") ;
182 $url=$name;
183 }
184 return $url;
185 }
186
187 sub _readdefaultsfile {
188 my $self=shift;
189 my $file=shift;
190
191 # -- Get defaults from the RequirementsDoc
192 my $req=$self->_requirements();
193 my $tool;
194 my $toollower;
195 foreach $tool ( $req->tools()) {
196 ($toollower=$tool)=~tr[A-Z][a-z];
197 push @{$self->{toollist}}, [ ($toollower, $req->version($tool)) ];
198 if ( ! defined $self->{defaults}{$toollower} ) {
199 $self->{defaults}{$toollower}=$req->version($tool);
200 }
201 }
202
203 # -- Read the default override file
204 my $fh=FileHandle->new();
205 $fh->open("<".$file);
206 while ( <$fh> ) {
207 chomp;
208 next if /^#/;
209 next if /^\s*$/;
210 ($product, $version)=split /:/;
211 $product=~tr[A-Z][a-z];
212 $self->{defaults}{$product}=$version;
213 }
214 undef $fh;
215 }
216
217 sub _requirements {
218 my $self=shift;
219 if ( ! defined $self->{reqsobj} ) {
220 $self->{reqsobj}=$self->{area}->requirementsdoc();
221 }
222 return $self->{reqsobj};
223 }
224
225 sub _toolobject {
226 my $self=shift;
227 my $product=shift;
228 my $version=shift;
229
230 my $rv=0;
231
232 if ( ! exists $self->{tools}{$product}{$version} ) {
233 $self->verbose("$product $version being Intitialised");
234 $self->{tools}{$product}{$version}=BuildSystem::Tool->new();
235 my $file=$self->_toolfile($product,$version);
236 if ( -f $file ) { # restore it from disk
237 $self->verbose("Recovering $product $version from $file");
238 $self->{tools}{$product}{$version}->restore($file);
239 }
240 else {
241 $rv=1;
242 $self->{tools}{$product}{$version}->name($product);
243 $self->{tools}{$product}{$version}->version($version);
244 $self->verbose("Tool $product $version needs set up");
245 #push @{$self->{toollist}}, [$product, $version];
246 }
247 }
248 return ($self->{tools}{$product}{$version}, $rv);
249 }
250
251 sub runtime {
252 my $self=shift;
253 my $hashref=shift;
254
255 $self->verbose("ToolBox Runtime Setting");
256 foreach $tool ( $self->_toolobjs() ) {
257 $self->verbose("Setting runtime on ".$tool->name());
258 $tool->runtime($hashref);
259 }
260 }
261
262 sub _toolobjs {
263 my $self=shift;
264
265 my @tools=();
266 foreach $toolpair ( $self->tools() ) {
267 my $tool=$self->gettool($$toolpair[0]); #only defaults
268 if ( defined $tool ) {
269 push @tools, $tool;
270 }
271 }
272 return @tools;
273 }