ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/ToolBox.pm
Revision: 1.1.2.5
Committed: Thu Apr 20 10:45:36 2000 UTC (25 years ago) by williamc
Content type: text/plain
Branch: V0_9branch
Changes since 1.1.2.4: +2 -4 lines
Log Message:
BugFix in_toolobject

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     # create tools from clientsettings 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 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     # document
21 williamc 1.1.2.1
22     package BuildSystem::ToolBox;
23     use FileHandle;
24     use BuildSystem::Tool;
25 williamc 1.1.2.3 use Utilities::Verbose;
26    
27     @ISA=qw(Utilities::Verbose);
28 williamc 1.1.2.1 require 5.004;
29    
30     sub new {
31     my $class=shift;
32     $self={};
33     bless $self, $class;
34     $self->init();
35     return $self;
36     }
37    
38     sub init {
39     my $self=shift;
40 williamc 1.1.2.3 $self->{urlcache}="$ENV{LOCALTOP}/.SCRAM/ToolFiles";
41     $self->{datastore}=$ENV{LOCALTOP}."/.SCRAM/".$ENV{SCRAM_ARCH};
42     AddDir::adddir($self->{datastore});
43     AddDir::adddir($self->{urlcache});
44 williamc 1.1.2.1 $self->_readdefaultsfile($ENV{LOCALTOP}."/".$ENV{projconfigdir}.
45     "/External_Dependencies");
46     }
47    
48     sub tools {
49     my $self=shift;
50     return @{$self->{toollist}};
51     }
52    
53 williamc 1.1.2.3 sub toolsetup {
54     my $self=shift;
55     my $name=shift;
56    
57     my $rv=0;
58     # -- get version
59     my $version;
60     if ( @_ ) {
61     $version=shift;
62     }
63     else {
64     $version=$self->defaultversion($name);
65     if ( ! defined $version ) { $rv=1; return $rv; }
66     }
67    
68     my $url;
69    
70     # -- get a tool object
71     my ($tool)=$self->_toolobject($name,$version);
72    
73     # -- get the url
74     if ( @_ ) {
75     $url=shift;
76     }
77     else {
78     # no url specified - try to get it from the tool
79     $url=$tool->url();
80     if ( ! defined $url ) {
81     $self->error("Unable to determine document for tool ".
82     $name." ".$version);
83     }
84     }
85     $url=$self->_download($url);
86    
87     require BuildSystem::ToolDoc;
88     my $doc=BuildSystem::ToolDoc->new();
89     $doc->tool($tool);
90     if ( ! $doc->setup($url,$name,$version) ) {
91     $tool->store($self->_toolfile($name,$version));
92     }
93     undef $doc;
94     return $rv;
95     }
96    
97    
98 williamc 1.1.2.1 sub gettool {
99     my $self=shift;
100     my $product=shift;
101     my $version;
102    
103     if ( @_ ) { $version=shift; }
104     else {
105     # lookup the default version
106     $version=$self->defaultversion($product);
107     return undef, if ( ! defined $version );
108     }
109 williamc 1.1.2.3 my ($tool,$rv)=$self->_toolobject($product,$version);
110     return ( $rv==0?$tool:undef ); # only return if already set up
111 williamc 1.1.2.1 }
112    
113     sub defaultversion {
114     my $self=shift;
115     my $product=shift;
116    
117     return $self->{defaults}{$product};
118     }
119    
120 williamc 1.1.2.3 sub _toolfile {
121     my $self=shift;
122     my $name=shift;
123     my $version=shift;
124    
125     return $self->{datastore}."/$name_$version.dat";
126     }
127    
128     sub _download {
129     my $self=shift;
130     my $url=shift;
131    
132     $url=~s/$self->{urlcache}\///;
133     # -- make sure we have a copy of the file
134     if ( ! -e $self->{urlcache}."/".$url ) {
135     &urlhandler::urlhandler("file:$ENV{SCRAM_HOME}/toolbox/"
136     .$url, $self->{urlcache}."/$url") ;
137     }
138     return $self->{urlcache}."/".$url;
139     }
140    
141 williamc 1.1.2.1 sub _readclientsettings {
142     my $self=shift;
143     my $clientfile=shift;
144    
145     my $fh=FileHandle->new();
146     $fh->open("<".$clientfile) or die "Unable to open $clientfile\n";
147     my ($tool,$product,$type,$version,$variable,$value);
148     while ( <$fh> ) {
149     chomp;
150     next if /^#/;
151     next if /^\s*$/;
152     ($product, $version, $type, $variable, $value)=split /:/;
153     next if ( $variable=~/\&/ );
154     $product=~tr[A-Z][a-z];
155 williamc 1.1.2.3 ($tool,$rv)=$self->_toolobject($product,$version);
156 williamc 1.1.2.1 $tool->addfeature($variable,$value);
157 williamc 1.1.2.2 $type=~tr[A-Z][a-z];
158     $tool->type($variable,$type);
159 williamc 1.1.2.1 }
160     undef $fh;
161     }
162    
163     sub _readdefaultsfile {
164     my $self=shift;
165     my $file=shift;
166    
167     my $fh=FileHandle->new();
168     $fh->open("<".$file) or die "Unable to open $file $!\n";
169     while ( <$fh> ) {
170     chomp;
171     next if /^#/;
172     next if /^\s*$/;
173     ($product, $version)=split /:/;
174     $product=~tr[A-Z][a-z];
175     $self->{defaults}{$product}=$version;
176     }
177     undef $fh;
178     }
179    
180 williamc 1.1.2.3
181 williamc 1.1.2.1 sub _toolobject {
182     my $self=shift;
183     my $product=shift;
184     my $version=shift;
185    
186 williamc 1.1.2.5 my $rv=0;
187 williamc 1.1.2.3
188 williamc 1.1.2.1 if ( ! exists $self->{tools}{$product}{$version} ) {
189 williamc 1.1.2.3 $self->verbose("$product $version being Intitialised");
190 williamc 1.1.2.1 $self->{tools}{$product}{$version}=BuildSystem::Tool->new();
191 williamc 1.1.2.3 my $file=$self->_toolfile($product,$version);
192     if ( -f $file ) { # restore it from disk
193     $self->verbose("Recovering $product $version from $file");
194     $self->{tools}{$product}{$version}->restore($file);
195     }
196     else {
197 williamc 1.1.2.5 $rv=1;
198 williamc 1.1.2.3 $self->verbose("Tool $product $version needs set up");
199     }
200 williamc 1.1.2.1 push @{$self->{toollist}}, [$product, $version];
201     }
202 williamc 1.1.2.3 return ($self->{tools}{$product}{$version}, $rv);
203 williamc 1.1.2.1 }