ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/ToolData.pm
Revision: 1.2
Committed: Fri Dec 10 13:41:37 2004 UTC (20 years, 4 months ago) by sashby
Content type: text/plain
Branch: MAIN
CVS Tags: V1_0_0
Changes since 1.1: +349 -0 lines
Log Message:
Merged V1_0 branch to HEAD

File Contents

# Content
1 #____________________________________________________________________
2 # File: ToolData.pm
3 #____________________________________________________________________
4 #
5 # Author: Shaun Ashby <Shaun.Ashby@cern.ch>
6 # Update: 2003-11-21 15:26:07+0100
7 # Revision: $Id: ToolData.pm,v 1.1.2.9 2004/10/27 12:35:25 sashby Exp $
8 #
9 # Copyright: 2003 (C) Shaun Ashby
10 #
11 #--------------------------------------------------------------------
12 package BuildSystem::ToolData;
13 require 5.004;
14
15 use Exporter;
16
17 @ISA=qw(Exporter);
18 #
19 sub new
20 ###############################################################
21 # new #
22 ###############################################################
23 # modified : Fri Nov 21 15:26:14 2003 / SFA #
24 # params : #
25 # : #
26 # function : #
27 # : #
28 ###############################################################
29 {
30 my $proto=shift;
31 my $class=ref($proto) || $proto;
32 my $self={SCRAM_PROJECT => 0};
33 bless $self,$class;
34 return $self;
35 }
36
37 sub toolname()
38 {
39 my $self=shift;
40 @_ ? $self->{TOOLNAME} = shift
41 : $self->{TOOLNAME};
42 }
43
44 sub toolversion()
45 {
46 my $self=shift;
47 @_ ? $self->{TOOLVERSION} = shift
48 : $self->{TOOLVERSION};
49 }
50
51 sub lib()
52 {
53 my $self=shift;
54 # Add libs to array:
55 @_ ? push(@{$self->{LIB}},@{$_[0]})
56 : @{$self->{LIB}};
57 }
58
59 sub include()
60 {
61 my $self=shift;
62 # Add libs to array:
63 @_ ? push(@{$self->{INCLUDE}},@{$_[0]})
64 : @{$self->{INCLUDE}};
65 }
66
67 sub libdir()
68 {
69 my $self=shift;
70 # Add libdir to array:
71 @_ ? push(@{$self->{LIBDIR}},@{$_[0]})
72 : @{$self->{LIBDIR}};
73 }
74
75 sub use()
76 {
77 my $self=shift;
78 # Add deps to array:
79 @_ ? push(@{$self->{USE}},@{$_[0]})
80 : @{$self->{USE}};
81 }
82
83 sub makefile()
84 {
85 my $self=shift;
86 @_ ? push(@{$self->{MAKEFILE}},@{$_[0]})
87 : @{$self->{MAKEFILE}};
88 }
89
90 sub flags()
91 {
92 my $self=shift;
93 my ($flag,$flagvalue) = @_;
94
95 if ($flag && $flagvalue)
96 {
97 if (exists ($self->{FLAGS}->{$flag}))
98 {
99 # Add each flag ONLY if it doesn't already exist:
100 foreach my $F (@$flagvalue)
101 {
102 push(@{$self->{FLAGS}->{$flag}},$F),
103 if (! grep($F eq $_,@{$self->{FLAGS}->{$flag}}));
104 }
105 }
106 else
107 {
108 $self->{FLAGS}->{$flag} = [ @$flagvalue ];
109 }
110 }
111 elsif ($flag && $self->{FLAGS}->{$flag}->[0] ne '')
112 {
113 return @{$self->{FLAGS}->{$flag}};
114 }
115 else
116 {
117 return "";
118 }
119 }
120
121 sub allflags()
122 {
123 my $self=shift;
124 (scalar(keys %{$self->{FLAGS}}) > 0) ? return $self->{FLAGS} : return undef;
125 }
126
127 sub scram_project()
128 {
129 my $self=shift;
130 @_ ? $self->{SCRAM_PROJECT} = shift
131 : $self->{SCRAM_PROJECT};
132 }
133
134 sub variable_data()
135 {
136 my $self=shift;
137 my ($varname,$varvalue) = @_;
138
139 if ($varname && $varvalue)
140 {
141 $self->{$varname} = $varvalue; # Maybe need to handle more than one value?
142 # Keep track of all variables:
143 if (! grep($varname eq $_, @{$self->{VARIABLES}}))# Remove duplicates!!
144 {
145 push(@{$self->{VARIABLES}},$varname);
146 }
147 }
148 else
149 {
150 return $self->{$varname};
151 }
152 }
153
154 sub list_variables
155 {
156 my $self=shift;
157 return @{$self->{VARIABLES}};
158 }
159
160 sub runtime()
161 {
162 my $self=shift;
163 my ($rt,$rtvalue) = @_;
164
165 # If both a runtime name and value are supplied, store this variable:
166 if ($rt && $rtvalue)
167 {
168 # Check to see if the environment already exists:
169 if (exists ($self->{RUNTIME}->{$rt}))
170 {
171 push(@{$self->{RUNTIME}->{$rt}},@$rtvalue);
172 }
173 else
174 {
175 # Doesn't already exist so just set the value, in an array:
176 $self->{RUNTIME}->{$rt} = [ @$rtvalue ];
177 }
178 }
179 elsif ($rt)
180 {
181 # Return the value for this runtime var name:
182 return $self->{RUNTIME}->{$rt};
183 }
184 else
185 {
186 # Return all RT settings:
187 return $self->{RUNTIME};
188 }
189 }
190
191 sub getfeatures()
192 {
193 my $self=shift;
194 my ($feature)=@_;
195 my @feature_vars=$self->list_variables();
196 my @features;
197 push (@features, @feature_vars, qw(LIB LIBDIR INCLUDE MAKEFILE USE));
198
199 # Make sure feature name is uppercase:
200 $feature =~ tr/a-z/A-Z/;
201 if ($feature) # A feature name was given
202 {
203 # Check to see if this feature is valid and is defined for this tool:
204 if (grep($feature eq $_, @features) && exists($self->{$feature}))
205 {
206 (ref($self->{$feature}) eq 'ARRAY') ? print join(" ",@{$self->{$feature}})
207 : print join(" ",$self->{$feature});
208 print "\n";
209 }
210 else
211 {
212 # This feature isn't a valid feature or is valid but doens't
213 # have a value for this tool:
214 print "SCRAM: No type of variable called \"",$feature,"\" ","defined for this tool.\n";
215 }
216 }
217 else
218 {
219 # No feature name so dump list of valid features for current tool:
220 map
221 {
222 print $_,"\n", if (exists ($self->{$_}));
223 } @features;
224 }
225 }
226
227 sub summarize_features()
228 {
229 my $self=shift;
230 my @variables = $self->list_variables();
231
232 # Show whether this tool is a SCRAM project or not:
233 print "SCRAM_PROJECT=";
234 ($self->scram_project() == 1) ? print "yes" : print "no";
235 print "\n";
236
237 # Print out any variables:
238 foreach my $var (@variables)
239 {
240 print $var,"=",$self->{$var},"\n";
241 }
242
243 # Makefile and flags first:
244 if (exists($self->{'MAKEFILE'}) && $#{$self->{'MAKEFILE'}} != -1)
245 {
246 print join(" ",@{$self->{'MAKEFILE'}}),"\n\n";
247 }
248
249 if (exists($self->{'FLAGS'}) && (my ($nkeys) = scalar(keys %{$self->{'FLAGS'}}) > 0 ))
250 {
251 my $flags=$self->allflags();
252
253 while (my ($f,$fv) = each %{$flags})
254 {
255 print $f,"+=",join(" ",@{$fv}),"\n";
256 }
257 }
258
259 foreach my $feature (qw( LIB LIBDIR INCLUDE USE ))
260 {
261 if (exists($self->{$feature}) && $#{$self->{$feature}} != -1)
262 {
263 print $feature,"=",join(" ",@{$self->{$feature}}),"\n";
264 }
265 }
266
267 # Finally, look for runtime vars:
268 if (exists($self->{'RUNTIME'}) && (my ($nkeys) = scalar(keys %{$self->{'RUNTIME'}}) > 0 ))
269 {
270 while (my ($rt,$val) = each %{$self->{$feature}})
271 {
272 if ($rt =~ /:/)
273 {
274 my ($type,$name) = split(":",$rt);
275 print $name,"=",join(":",@$val),"\n";
276 }
277 else
278 {
279 print $rt,"=",join(":",@$val),"\n";
280 }
281 }
282 }
283
284 print "\n";
285 }
286
287
288 sub addreleasetoself()
289 {
290 my $self=shift;
291 # Go through the settings obtained so far (only from SELF) and, for
292 # every LIBDIR/INCLUDE/RUNTIME path, add another value with
293 # LOCALTOP==RELEASETOP:
294 my $relldir = [];
295 my $relinc = [];
296 my @locallibdirs = $self->libdir();
297 my @localincdirs = $self->include();
298
299 foreach my $libdir (@locallibdirs)
300 {
301 # Convert LOCAL to RELEASE top:
302 $libdir =~ s/$ENV{LOCALTOP}/$ENV{RELEASETOP}/g;
303 push(@$relldir, $libdir);
304 }
305
306 # Add the new libdirs to our object:
307 $self->libdir($relldir);
308
309 foreach my $incdir (@localincdirs)
310 {
311 # Convert LOCAL to RELEASE top:
312 $incdir =~ s/$ENV{LOCALTOP}/$ENV{RELEASETOP}/g;
313 push(@$relinc, $incdir);
314 }
315
316 # Add the new libdirs to our object:
317 $self->include($relinc);
318
319 # Handle runtime settings:
320 my $runtime=$self->runtime();
321
322 while (my ($rt,$val) = each %{$runtime})
323 {
324 # Only handle anything that's a PATH:
325 if ($rt =~ /:/)
326 {
327 my ($type,$name) = split(":",$rt);
328
329 if ($type eq 'PATH')
330 {
331 my @PATHS=@$val;
332 my $RELPATHS=[];
333
334 # Process the values for this path:
335 foreach my $rtpath (@PATHS)
336 {
337 $rtpath =~ s/$ENV{LOCALTOP}/$ENV{RELEASETOP}/g;
338 push(@$RELPATHS,$rtpath);
339 }
340
341 # Add the new settings:
342 $self->runtime($rt,$RELPATHS);
343 }
344 }
345 }
346
347 }
348
349 1;