ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/ToolBox.pm
Revision: 1.1.2.26
Committed: Wed Jun 21 16:22:49 2000 UTC (24 years, 10 months ago) by williamc
Content type: text/plain
Branch: V0_9branch
Changes since 1.1.2.25: +28 -2 lines
Log Message:
untestable runtime

File Contents

# User Rev Content
1 williamc 1.1.2.1 #
2     # ToolBox.pm
3     #
4     # Originally Written by Christopher Williams
5     #
6     # Description
7     # -----------
8 williamc 1.1.2.9 # tools and interface to access them
9 williamc 1.1.2.1 #
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 williamc 1.1.2.3 # 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 williamc 1.1.2.7 # document; returns 0=OK 1=no version
21 williamc 1.1.2.8 # interactive(0|1) : set the setup mode
22 williamc 1.1.2.14 # searcher(SearchObject) : Set the search object for matching tools during setup
23 williamc 1.1.2.1
24     package BuildSystem::ToolBox;
25     use FileHandle;
26     use BuildSystem::Tool;
27 williamc 1.1.2.3 use Utilities::Verbose;
28    
29     @ISA=qw(Utilities::Verbose);
30 williamc 1.1.2.1 require 5.004;
31    
32     sub new {
33     my $class=shift;
34 williamc 1.1.2.15 my $area=shift;
35 williamc 1.1.2.1 $self={};
36     bless $self, $class;
37 williamc 1.1.2.15 $self->init($area);
38 williamc 1.1.2.18 #$self->verbosity(1);
39 williamc 1.1.2.1 return $self;
40     }
41    
42     sub init {
43     my $self=shift;
44 williamc 1.1.2.15 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 williamc 1.1.2.24 $self->verbose("Using Requirements Doc : ".$self->{reqdoc});
51 williamc 1.1.2.3 AddDir::adddir($self->{urlcache});
52 williamc 1.1.2.15 $self->_readdefaultsfile($config."/External_Dependencies");
53 williamc 1.1.2.1 }
54    
55 williamc 1.1.2.8 sub interactive {
56     my $self=shift;
57    
58     @_?$self->{interactive}=shift
59     :((defined $self->{interactive})?$self->{interactive}:0);
60     }
61    
62 williamc 1.1.2.1 sub tools {
63     my $self=shift;
64     return @{$self->{toollist}};
65     }
66    
67 williamc 1.1.2.3 sub toolsetup {
68     my $self=shift;
69     my $name=shift;
70    
71 williamc 1.1.2.20 AddDir::adddir($self->{datastore});
72 williamc 1.1.2.18 $name=~tr[A-Z][a-z];
73 williamc 1.1.2.3 my $rv=0;
74     # -- get version
75     my $version;
76     if ( @_ ) {
77     $version=shift;
78     }
79     else {
80     $version=$self->defaultversion($name);
81     if ( ! defined $version ) { $rv=1; return $rv; }
82     }
83    
84     my $url;
85    
86     # -- get a tool object
87     my ($tool)=$self->_toolobject($name,$version);
88    
89     # -- get the url
90     if ( @_ ) {
91     $url=shift;
92     }
93     else {
94     # no url specified - try to get it from the tool
95     $url=$tool->url();
96     if ( ! defined $url ) {
97     $self->error("Unable to determine document for tool ".
98     $name." ".$version);
99     }
100     }
101     $url=$self->_download($url);
102    
103 williamc 1.1.2.14 # -- the tool setup
104 williamc 1.1.2.19 $tool->url($url);
105 williamc 1.1.2.10 print "\n ----------- Setting Up $name $version ---------------\n";
106 williamc 1.1.2.25 require BuildSystem::ToolDoc;
107     my $doc=BuildSystem::ToolDoc->new();
108     $doc->tool($tool);
109 williamc 1.1.2.26 if ( defined $self->searcher() ) {
110     $doc->toolsearcher($self->searcher());
111     }
112 williamc 1.1.2.25 $doc->interactive($self->interactive());
113     $tool->reset();
114     if ( ! $doc->setup($self->{urlcache}."/".$url,$name,$version) ) {
115     $tool->store($self->_toolfile($name,$version));
116 williamc 1.1.2.3 }
117 williamc 1.1.2.25 else {
118     $self->error("Unable to find $name $version in $url");
119     }
120     undef $doc;
121    
122 williamc 1.1.2.3 return $rv;
123     }
124    
125 williamc 1.1.2.14 sub searcher {
126     my $self=shift;
127    
128     if ( @_ ) {
129     $self->{toolboxsearcher}=shift;
130     }
131     return $self->{toolboxsearcher};
132     }
133 williamc 1.1.2.3
134 williamc 1.1.2.1 sub gettool {
135     my $self=shift;
136     my $product=shift;
137     my $version;
138    
139 williamc 1.1.2.17 $product=~tr[A-Z][a-z];
140 williamc 1.1.2.1 if ( @_ ) { $version=shift; }
141     else {
142     # lookup the default version
143     $version=$self->defaultversion($product);
144     return undef, if ( ! defined $version );
145     }
146 williamc 1.1.2.3 my ($tool,$rv)=$self->_toolobject($product,$version);
147     return ( $rv==0?$tool:undef ); # only return if already set up
148 williamc 1.1.2.1 }
149    
150     sub defaultversion {
151     my $self=shift;
152     my $product=shift;
153    
154     return $self->{defaults}{$product};
155 williamc 1.1.2.13 }
156    
157 williamc 1.1.2.3 sub _toolfile {
158     my $self=shift;
159     my $name=shift;
160     my $version=shift;
161    
162 williamc 1.1.2.12 $name=~tr[A-Z][a-z];
163 williamc 1.1.2.11 return $self->{datastore}."/".$name."_$version.dat";
164 williamc 1.1.2.3 }
165    
166     sub _download {
167     my $self=shift;
168     my $url=shift;
169    
170 williamc 1.1.2.22 my $name;
171 williamc 1.1.2.3 # -- make sure we have a copy of the file
172 williamc 1.1.2.22 if ( ! -f $self->{urlcache}."/".$url ) {
173     if ( $url!~/:/ ) {
174     $name=$url;
175     $url="file:$ENV{SCRAM_HOME}/toolbox/".$url;
176     }
177     else {
178     ($name=$url)=~s/.*\/(.*)/$1/;
179     }
180     $self->verbose("Attempting Download of $url");
181     &urlhandler::urlhandler($url,
182     , $self->{urlcache}."/$name") ;
183 williamc 1.1.2.23 $url=$name;
184 williamc 1.1.2.3 }
185 williamc 1.1.2.15 return $url;
186 williamc 1.1.2.3 }
187    
188 williamc 1.1.2.1 sub _readdefaultsfile {
189     my $self=shift;
190     my $file=shift;
191    
192 williamc 1.1.2.9 # -- Get defaults from the RequirementsDoc
193     my $req=$self->_requirements();
194     my $tool;
195 williamc 1.1.2.17 my $toollower;
196 williamc 1.1.2.9 foreach $tool ( $req->tools()) {
197 williamc 1.1.2.17 ($toollower=$tool)=~tr[A-Z][a-z];
198     push @{$self->{toollist}}, [ ($toollower, $req->version($tool)) ];
199     if ( ! defined $self->{defaults}{$toollower} ) {
200     $self->{defaults}{$toollower}=$req->version($tool);
201 williamc 1.1.2.9 }
202     }
203    
204     # -- Read the default override file
205 williamc 1.1.2.1 my $fh=FileHandle->new();
206 williamc 1.1.2.9 $fh->open("<".$file);
207 williamc 1.1.2.1 while ( <$fh> ) {
208     chomp;
209     next if /^#/;
210     next if /^\s*$/;
211     ($product, $version)=split /:/;
212     $product=~tr[A-Z][a-z];
213     $self->{defaults}{$product}=$version;
214     }
215     undef $fh;
216     }
217    
218 williamc 1.1.2.9 sub _requirements {
219 williamc 1.1.2.15 my $self=shift;
220     if ( ! defined $self->{reqsobj} ) {
221 williamc 1.1.2.9 require BuildSystem::Requirements;
222 williamc 1.1.2.15 $self->{reqsobj}=
223 williamc 1.1.2.16 BuildSystem::Requirements->new($self->{reqdoc});
224 williamc 1.1.2.9 }
225 williamc 1.1.2.15 return $self->{reqsobj};
226 williamc 1.1.2.9 }
227 williamc 1.1.2.3
228 williamc 1.1.2.1 sub _toolobject {
229     my $self=shift;
230     my $product=shift;
231     my $version=shift;
232    
233 williamc 1.1.2.5 my $rv=0;
234 williamc 1.1.2.3
235 williamc 1.1.2.1 if ( ! exists $self->{tools}{$product}{$version} ) {
236 williamc 1.1.2.3 $self->verbose("$product $version being Intitialised");
237 williamc 1.1.2.1 $self->{tools}{$product}{$version}=BuildSystem::Tool->new();
238 williamc 1.1.2.3 my $file=$self->_toolfile($product,$version);
239     if ( -f $file ) { # restore it from disk
240     $self->verbose("Recovering $product $version from $file");
241     $self->{tools}{$product}{$version}->restore($file);
242     }
243     else {
244 williamc 1.1.2.5 $rv=1;
245 williamc 1.1.2.19 $self->{tools}{$product}{$version}->name($product);
246     $self->{tools}{$product}{$version}->version($version);
247 williamc 1.1.2.3 $self->verbose("Tool $product $version needs set up");
248 williamc 1.1.2.26 #push @{$self->{toollist}}, [$product, $version];
249 williamc 1.1.2.3 }
250 williamc 1.1.2.1 }
251 williamc 1.1.2.3 return ($self->{tools}{$product}{$version}, $rv);
252 williamc 1.1.2.26 }
253    
254     sub runtime {
255     my $self=shift;
256     my $hashref=shift;
257    
258     $self->verbose("ToolBox Runtime Setting");
259     foreach $tool ( $self->_toolobjs() ) {
260     $self->verbose("Setting runtime on ".$tool->name());
261     $tool->runtime($hashref);
262     }
263     }
264    
265     sub _toolobjs {
266     my $self=shift;
267    
268     my @tools=();
269     foreach $toolpair ( $self->tools() ) {
270     my $tool=$self->gettool($$toolpair[0]); #only defaults
271     if ( defined $tool ) {
272     push @tools, $tool;
273     }
274     }
275     return @tools;
276 williamc 1.1.2.1 }