ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/ToolBox.pm
Revision: 1.1.2.14
Committed: Fri Apr 28 12:59:53 2000 UTC (25 years ago) by williamc
Content type: text/plain
Branch: V0_9branch
Changes since 1.1.2.13: +43 -11 lines
Log Message:
Add searcher capabilities

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     $self={};
35     bless $self, $class;
36     $self->init();
37     return $self;
38     }
39    
40     sub init {
41     my $self=shift;
42 williamc 1.1.2.3 $self->{urlcache}="$ENV{LOCALTOP}/.SCRAM/ToolFiles";
43     $self->{datastore}=$ENV{LOCALTOP}."/.SCRAM/".$ENV{SCRAM_ARCH};
44     AddDir::adddir($self->{datastore});
45     AddDir::adddir($self->{urlcache});
46 williamc 1.1.2.1 $self->_readdefaultsfile($ENV{LOCALTOP}."/".$ENV{projconfigdir}.
47     "/External_Dependencies");
48     }
49    
50 williamc 1.1.2.8 sub interactive {
51     my $self=shift;
52    
53     @_?$self->{interactive}=shift
54     :((defined $self->{interactive})?$self->{interactive}:0);
55     }
56    
57 williamc 1.1.2.1 sub tools {
58     my $self=shift;
59     return @{$self->{toollist}};
60     }
61    
62 williamc 1.1.2.3 sub toolsetup {
63     my $self=shift;
64     my $name=shift;
65    
66     my $rv=0;
67     # -- get version
68     my $version;
69     if ( @_ ) {
70     $version=shift;
71     }
72     else {
73     $version=$self->defaultversion($name);
74     if ( ! defined $version ) { $rv=1; return $rv; }
75     }
76    
77     my $url;
78    
79     # -- get a tool object
80     my ($tool)=$self->_toolobject($name,$version);
81    
82     # -- get the url
83     if ( @_ ) {
84     $url=shift;
85     }
86     else {
87     # no url specified - try to get it from the tool
88     $url=$tool->url();
89     if ( ! defined $url ) {
90     $self->error("Unable to determine document for tool ".
91     $name." ".$version);
92     }
93     }
94     $url=$self->_download($url);
95    
96 williamc 1.1.2.14 # -- the tool setup
97 williamc 1.1.2.10 print "\n ----------- Setting Up $name $version ---------------\n";
98 williamc 1.1.2.14 if ( ! $self->_copymatchingtool($tool) ) {
99     require BuildSystem::ToolDoc;
100     my $doc=BuildSystem::ToolDoc->new();
101     $doc->tool($tool);
102     $doc->interactive($self->interactive());
103     $tool->reset();
104     if ( ! $doc->setup($url,$name,$version) ) {
105     $tool->store($self->_toolfile($name,$version));
106     }
107     else {
108     $self->error("Unable to find $name $version in $url");
109     }
110     undef $doc;
111 williamc 1.1.2.3 }
112     return $rv;
113     }
114    
115 williamc 1.1.2.14 sub searcher {
116     my $self=shift;
117    
118     if ( @_ ) {
119     $self->{toolboxsearcher}=shift;
120     }
121     return $self->{toolboxsearcher};
122     }
123 williamc 1.1.2.3
124 williamc 1.1.2.1 sub gettool {
125     my $self=shift;
126     my $product=shift;
127     my $version;
128    
129     if ( @_ ) { $version=shift; }
130     else {
131     # lookup the default version
132     $version=$self->defaultversion($product);
133     return undef, if ( ! defined $version );
134     }
135 williamc 1.1.2.3 my ($tool,$rv)=$self->_toolobject($product,$version);
136     return ( $rv==0?$tool:undef ); # only return if already set up
137 williamc 1.1.2.1 }
138    
139     sub defaultversion {
140     my $self=shift;
141     my $product=shift;
142    
143     return $self->{defaults}{$product};
144 williamc 1.1.2.14 }
145    
146     sub _copymatchingtool {
147     my $self=shift;
148     my $tool=shift;
149    
150     my $rv=0;
151     my @validtools=$self->_gettools($tool);
152    
153     # -- for now we just take the first one
154     if ( ! $self->interactive() ) {
155     if ( $#validtools >= 0 ) {
156     my $file=$self->_toolfile($validtool[0]->name(),
157     $validtool[0]->version());
158     $validtools[0]->store($file);
159     $tool->restore($file);
160     $rv=1;
161     }
162     }
163     return $rv;
164 williamc 1.1.2.1 }
165    
166 williamc 1.1.2.13 #
167     # return list of matching tools
168     sub _gettools {
169     my $self=shift;
170     my $tool=shift;
171    
172     my @tools=();
173     if ( defined $self->{toolboxsearcher} ) {
174     my $it=$self->{toolboxsearcher}->newiterator();
175     while ( ! $it->last() ) {
176     $rtool=$it->next();
177     if ( $rtool->equals($tool) ) {
178     push @tools,$rtool;
179     }
180     }
181     }
182     return @tools;
183     }
184    
185 williamc 1.1.2.3 sub _toolfile {
186     my $self=shift;
187     my $name=shift;
188     my $version=shift;
189    
190 williamc 1.1.2.12 $name=~tr[A-Z][a-z];
191 williamc 1.1.2.11 return $self->{datastore}."/".$name."_$version.dat";
192 williamc 1.1.2.3 }
193    
194     sub _download {
195     my $self=shift;
196     my $url=shift;
197    
198     $url=~s/$self->{urlcache}\///;
199     # -- make sure we have a copy of the file
200     if ( ! -e $self->{urlcache}."/".$url ) {
201     &urlhandler::urlhandler("file:$ENV{SCRAM_HOME}/toolbox/"
202     .$url, $self->{urlcache}."/$url") ;
203     }
204     return $self->{urlcache}."/".$url;
205     }
206    
207 williamc 1.1.2.1 sub _readdefaultsfile {
208     my $self=shift;
209     my $file=shift;
210    
211 williamc 1.1.2.9 # -- Get defaults from the RequirementsDoc
212     my $req=$self->_requirements();
213     my $tool;
214     foreach $tool ( $req->tools()) {
215     if ( ! defined $self->{defaults}{$tool} ) {
216     $self->{defaults}{$tool}=$req->version($tool);
217     }
218     }
219    
220     # -- Read the default override file
221 williamc 1.1.2.1 my $fh=FileHandle->new();
222 williamc 1.1.2.9 $fh->open("<".$file);
223 williamc 1.1.2.1 while ( <$fh> ) {
224     chomp;
225     next if /^#/;
226     next if /^\s*$/;
227     ($product, $version)=split /:/;
228     $product=~tr[A-Z][a-z];
229     $self->{defaults}{$product}=$version;
230     }
231     undef $fh;
232     }
233    
234 williamc 1.1.2.9 sub _requirements {
235     if ( ! defined $reqsobj ) {
236     require BuildSystem::Requirements;
237     $reqsobj=BuildSystem::Requirements->new($ENV{SCRAM_ProjReqsDoc});
238     }
239     return $reqsobj;
240     }
241 williamc 1.1.2.3
242 williamc 1.1.2.1 sub _toolobject {
243     my $self=shift;
244     my $product=shift;
245     my $version=shift;
246    
247 williamc 1.1.2.5 my $rv=0;
248 williamc 1.1.2.3
249 williamc 1.1.2.1 if ( ! exists $self->{tools}{$product}{$version} ) {
250 williamc 1.1.2.3 $self->verbose("$product $version being Intitialised");
251 williamc 1.1.2.1 $self->{tools}{$product}{$version}=BuildSystem::Tool->new();
252 williamc 1.1.2.3 my $file=$self->_toolfile($product,$version);
253     if ( -f $file ) { # restore it from disk
254     $self->verbose("Recovering $product $version from $file");
255     $self->{tools}{$product}{$version}->restore($file);
256     }
257     else {
258 williamc 1.1.2.5 $rv=1;
259 williamc 1.1.2.3 $self->verbose("Tool $product $version needs set up");
260     }
261 williamc 1.1.2.1 push @{$self->{toollist}}, [$product, $version];
262     }
263 williamc 1.1.2.3 return ($self->{tools}{$product}{$version}, $rv);
264 williamc 1.1.2.1 }