ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/BuildFile.pm
(Generate patch)

Comparing COMP/SCRAM/src/BuildSystem/BuildFile.pm (file contents):
Revision 1.1 by williamc, Fri Dec 17 11:02:27 1999 UTC vs.
Revision 1.28 by sashby, Wed Mar 9 19:28:19 2005 UTC

# Line 1 | Line 1
1 + #____________________________________________________________________
2 + # File: BuildFile.pm
3 + #____________________________________________________________________
4 + #  
5 + # Author: Shaun Ashby <Shaun.Ashby@cern.ch>
6 + # Update: 2003-12-03 19:03:15+0100
7 + # Revision: $Id$
8   #
9 < # BuildFile.pm - An Active Document
9 > # Copyright: 2003 (C) Shaun Ashby
10   #
11 < # Originally Written by Christopher Williams
5 < #
6 < # Description
7 < # -----------
8 < # Parse a BuildFile to figure out the required build rules
9 < #
10 < # Interface
11 < # ---------
12 < # new()         : A new BuildFile object
13 <
11 > #--------------------------------------------------------------------
12   package BuildSystem::BuildFile;
13 < require 5.001;
14 < @ISA=qw(ActiveDoc)
13 > require 5.004;
14 > use Exporter;
15 > use BuildSystem::TagUtils;
16 > use BuildSystem::BuildDataUtils;
17 > use ActiveDoc::SimpleDoc;
18  
19 < sub init {
20 <        my $self=shift;
19 > @ISA=qw(Exporter BuildSystem::BuildDataUtils);
20 > @EXPORT_OK=qw( );
21  
22 <        # set up our data structures
23 <        $self->{Benv}=BuildEnvironment->new();
24 <        # Specific tags
25 <        # environment tags
26 <        $self->{tags}->addtag("Environment", \&Environment_Start, "",
27 <                        \&Environment_End);
28 <        # bin tags
29 <        $self->{bincontext}=0;
30 <        $self->{tags}->addtag("bin", \&bin_Start, \&bin_text, \&bin_End);
31 <
32 <        $self->_addignore();
33 < }
34 <
35 < # --------------------- Support Routines ----
36 < sub _expandvars {
37 <        my $self=shift;
38 <        my $string=shift;
39 <
40 <        # Deal with Use in the environment
41 <        
42 <        # expand directly from the local build Env
43 <        $self->{Benv}->expandvars($string);
44 < }
45 <
46 < # ------------------- Tag Routines ------------------------------
47 <
48 < sub Environment_Start {
49 <        my $self=shift;
50 <        my $name=shift;
51 <        my $hashref=shift;
52 <
53 <        $self->{Benv}->newenv();
54 <        
55 < }
56 <
57 < sub Environment_End {
58 <        my $self=shift;
59 <        my $name=shift;
60 <        my $hashref=shift;
61 <
62 <        $self->{Benv}->restoreenv();
63 < }
64 <
65 < sub Use_Start {
66 <        my $self=shift;
67 <        my $name=shift;
68 <        my $hashref=shift;
69 <
70 <        # checks
71 <        $self->checktag($hashref, 'name' ,$name );
72 <
73 <        $self->{Benv}->addparam('scram_use', $$hashref->{'name'});
74 <        $self->{Benv}->addparam('scram_use_group', $$hashref->{'group'});
75 < }
76 <
77 < # ---- binary specific tags
78 < sub bin_Start {
79 <        my $self=shift;
80 <        my $name=shift;
81 <        my $hashref=shift;
82 <        
83 <        my $extension;
84 <
85 <        # checks
86 <        if ( $self->{bincontext} == 0 ) {
87 <          $self->{bincontext}=1;
88 <          $self->checktag($hashref, 'file' ,$name );
89 <          ($extension=$$hashref{file})=~s/.*\.//;
90 <          if ( ! defined $$hashref{name} ) {
91 <                ($$hashref{name}=$$hashref{file})=~s/\..*//;
92 <          }
93 <
94 <          push @{$self->{bins}}, $self->_expandvars(
95 <                $self->{Toolbox}->gettool($extension, "exe"));
96 <        }
97 <        else {
98 <          $self->parseerror("Attempt to open a new <$name> before a </$name>");
99 <        }
100 < }
101 <
102 < sub bin_text {
103 <        my $self=shift;
104 <        my $name=shift;
105 <        my $string=shift;
106 <
107 <        push @{$self->{binstext}}, $string;
108 < }
109 <
110 < sub bin_End {
111 <        my $self=shift;
112 <        my $name=shift;
113 <
114 <        $self->{bincontext}=0;
115 < }
116 <
117 < sub lib_start {
118 <        my $self=shift;
119 <        my $name=shift;
120 <        my $hashref=shift;
121 < }
122 <
123 < # libray specific tags
124 < sub libtype {
125 <        my $self=shift;
126 <        my $name=shift;
127 <        my $hashref=shift;
128 < }
22 > #
23 > sub new()
24 >   ###############################################################
25 >   # new                                                         #
26 >   ###############################################################
27 >   # modified : Wed Dec  3 19:03:22 2003 / SFA                   #
28 >   # params   :                                                  #
29 >   #          :                                                  #
30 >   # function :                                                  #
31 >   #          :                                                  #
32 >   ###############################################################
33 >   {
34 >   my $proto=shift;
35 >   my $class=ref($proto) || $proto;
36 >   my $self={};
37 >  
38 >   bless $self,$class;
39 >
40 >   $self->{DEPENDENCIES} = {};
41 >   $self->{content} = {};
42 >   return $self;
43 >   }
44 >
45 > sub _initparser()
46 >   {
47 >   my $self=shift;
48 >
49 >   $self->{simpledoc}=ActiveDoc::SimpleDoc->new();
50 >   $self->{simpledoc}->newparse("builder");
51 >   $self->{simpledoc}->addignoretags("builder");
52 >
53 >   # For blank lines do nothing:
54 >   $self->{simpledoc}->addtag("builder","none",
55 >                              "", $self,
56 >                              "", $self,
57 >                              "", $self);
58 >  
59 >   # Define the tags to be used in this class:
60 >   $self->{simpledoc}->addtag("builder","classpath",
61 >                              \&BuildSystem::TagUtils::classpathtagOpen, $self,
62 >                              "", $self,
63 >                              "", $self);
64 >
65 >   $self->{simpledoc}->addtag("builder","productstore",
66 >                              \&BuildSystem::TagUtils::productstoretagOpen, $self,
67 >                              "", $self,
68 >                              "", $self);
69 >
70 >   $self->{simpledoc}->addtag("builder","architecture",
71 >                              \&BuildSystem::TagUtils::archtagOpen, $self,
72 >                              "", $self,
73 >                              \&BuildSystem::TagUtils::archtagClose, $self);
74 >
75 >   $self->{simpledoc}->addtag("builder","include_path",
76 >                              \&BuildSystem::TagUtils::includetagOpen, $self,
77 >                              "", $self,
78 >                              "", $self);
79 >  
80 >   $self->{simpledoc}->addtag("builder","define_group",
81 >                              \&BuildSystem::TagUtils::groupdeftagOpen, $self,
82 >                              "", $self,
83 >                              \&BuildSystem::TagUtils::groupdeftagClose, $self);
84 >  
85 >   $self->{simpledoc}->addtag("builder","group",
86 >                              \&BuildSystem::TagUtils::grouptagOpen, $self,
87 >                              "", $self,
88 >                              "", $self);
89 >  
90 >   $self->{simpledoc}->addtag("builder","lib",
91 >                              \&BuildSystem::TagUtils::libtagOpen, $self,
92 >                              "", $self,
93 >                              "", $self);
94 >
95 >   $self->{simpledoc}->addtag("builder","export",
96 >                              \&BuildSystem::TagUtils::exporttagOpen, $self,
97 >                              "", $self,
98 >                              \&BuildSystem::TagUtils::exporttagClose, $self);
99 >
100 >   $self->{simpledoc}->addtag("builder","use",
101 >                              \&BuildSystem::TagUtils::usetagOpen, $self,
102 >                              "", $self,
103 >                              "", $self);
104 >  
105 >   $self->{simpledoc}->addtag("builder","libtype",
106 >                              \&BuildSystem::TagUtils::libtypetagOpen, $self,
107 >                              "", $self,
108 >                              "", $self);
109 >
110 >   $self->{simpledoc}->addtag("builder","skip",
111 >                              \&BuildSystem::TagUtils::skiptagOpen, $self,
112 >                              \&BuildSystem::TagUtils::skiptagMessage, $self,
113 >                              \&BuildSystem::TagUtils::skiptagClose, $self);
114 >
115 >   $self->{simpledoc}->addtag("builder","makefile",
116 >                              \&BuildSystem::TagUtils::makefiletagOpen, $self,
117 >                              \&BuildSystem::TagUtils::makefiletagContent, $self,
118 >                              \&BuildSystem::TagUtils::makefiletagClose, $self);
119 >
120 >   $self->{simpledoc}->addtag("builder","flags",
121 >                              \&BuildSystem::TagUtils::flagstagOpen, $self,
122 >                              "", $self,
123 >                              "", $self);
124 >  
125 >   $self->{simpledoc}->addtag("builder","bin",
126 >                              \&BuildSystem::TagUtils::binarytagOpen, $self,
127 >                              "", $self,
128 >                              \&BuildSystem::TagUtils::binarytagClose, $self);
129 >  
130 >   $self->{simpledoc}->addtag("builder","module",
131 >                              \&BuildSystem::TagUtils::moduletagOpen, $self,
132 >                              "", $self,
133 >                              \&BuildSystem::TagUtils::moduletagClose, $self);
134 >  
135 >   $self->{simpledoc}->addtag("builder","application",
136 >                              \&BuildSystem::TagUtils::applicationtagOpen, $self,
137 >                              "", $self,
138 >                              \&BuildSystem::TagUtils::applicationtagClose, $self);
139 >
140 >   $self->{simpledoc}->addtag("builder","library",
141 >                              \&BuildSystem::TagUtils::librarytagOpen, $self,
142 >                              "", $self,
143 >                              \&BuildSystem::TagUtils::librarytagClose, $self);
144 >
145 > #    $self->{simpledoc}->addtag("builder"," ",
146 > #                             \&BuildSystem::TagUtils::  ,$self,
147 > #                             \&BuildSystem::TagUtils::  ,$self,
148 > #                             \&BuildSystem::TagUtils::  ,$self);
149 >
150 >   return $self->{simpledoc};
151 >   }
152 >
153 > sub parse()
154 >   {
155 >   my $self=shift;
156 >   my ($filename)=@_;
157 >
158 >   $self->{simpledoc}=$self->_initparser();
159 >   $self->{simpledoc}->filetoparse($filename);
160 >   $self->{simpledoc}->parse("builder");
161 >  
162 >   # We're done with the SimpleDoc object so delete it:
163 >   delete $self->{simpledoc};
164 >   }
165 >
166 > sub _initbranchparser()
167 >   {
168 >   my $self=shift;
169 >
170 >   $self->{simpledoc}=ActiveDoc::SimpleDoc->new();
171 >   $self->{simpledoc}->newparse("branchbuilder");
172 >   $self->{simpledoc}->addignoretags("branchbuilder");
173 >
174 >   # For blank lines do nothing:
175 >   $self->{simpledoc}->addtag("branchbuilder","none",
176 >                              "", $self,
177 >                              "", $self,
178 >                              "", $self);
179 >  
180 >   # Define the tags to be used in this class:
181 >   $self->{simpledoc}->addtag("branchbuilder","productstore",
182 >                              \&BuildSystem::TagUtils::productstoretagOpen, $self,
183 >                              "", $self,
184 >                              "", $self);
185 >  
186 >   $self->{simpledoc}->addtag("branchbuilder","architecture",
187 >                              \&BuildSystem::TagUtils::archtagOpen, $self,
188 >                              "", $self,
189 >                              \&BuildSystem::TagUtils::archtagClose, $self);
190 >
191 >   $self->{simpledoc}->addtag("branchbuilder","include_path",
192 >                              \&BuildSystem::TagUtils::includetagOpen, $self,
193 >                              "", $self,
194 >                              "", $self);
195 >  
196 >   $self->{simpledoc}->addtag("branchbuilder","export",
197 >                              \&BuildSystem::TagUtils::exporttagOpen, $self,
198 >                              "", $self,
199 >                              \&BuildSystem::TagUtils::exporttagClose, $self);
200 >
201 >   $self->{simpledoc}->addtag("branchbuilder","define_group",
202 >                              \&BuildSystem::TagUtils::groupdeftagOpen, $self,
203 >                              "", $self,
204 >                              \&BuildSystem::TagUtils::groupdeftagClose, $self);
205 >  
206 >   $self->{simpledoc}->addtag("branchbuilder","group",
207 >                              \&BuildSystem::TagUtils::grouptagOpen, $self,
208 >                              "", $self,
209 >                              "", $self);
210 >  
211 >   $self->{simpledoc}->addtag("branchbuilder","lib",
212 >                              \&BuildSystem::TagUtils::libtagOpen, $self,
213 >                              "", $self,
214 >                              "", $self);
215 >
216 >   $self->{simpledoc}->addtag("branchbuilder","use",
217 >                              \&BuildSystem::TagUtils::usetagOpen, $self,
218 >                              "", $self,
219 >                              "", $self);
220 >  
221 >   $self->{simpledoc}->addtag("branchbuilder","libtype",
222 >                              \&BuildSystem::TagUtils::libtypetagOpen, $self,
223 >                              "", $self,
224 >                              "", $self);
225 >  
226 >   $self->{simpledoc}->addtag("branchbuilder","makefile",
227 >                              \&BuildSystem::TagUtils::makefiletagOpen, $self,
228 >                              \&BuildSystem::TagUtils::makefiletagContent, $self,
229 >                              \&BuildSystem::TagUtils::makefiletagClose, $self);
230 >
231 >   $self->{simpledoc}->addtag("branchbuilder","flags",
232 >                              \&BuildSystem::TagUtils::flagstagOpen, $self,
233 >                              "", $self,
234 >                              "", $self);
235 >  
236 >   $self->{simpledoc}->addtag("branchbuilder","bin",
237 >                              \&BuildSystem::TagUtils::binarytagOpen, $self,
238 >                              "", $self,
239 >                              \&BuildSystem::TagUtils::binarytagClose, $self);
240 >  
241 >   $self->{simpledoc}->addtag("branchbuilder","module",
242 >                              \&BuildSystem::TagUtils::moduletagOpen, $self,
243 >                              "", $self,
244 >                              \&BuildSystem::TagUtils::moduletagClose, $self);
245 >  
246 >   $self->{simpledoc}->addtag("branchbuilder","application",
247 >                              \&BuildSystem::TagUtils::applicationtagOpen, $self,
248 >                              "", $self,
249 >                              \&BuildSystem::TagUtils::applicationtagClose, $self);
250 >
251 >   $self->{simpledoc}->addtag("branchbuilder","library",
252 >                              \&BuildSystem::TagUtils::librarytagOpen, $self,
253 >                              "", $self,
254 >                              \&BuildSystem::TagUtils::librarytagClose, $self);
255 >  
256 >   return $self->{simpledoc};
257 >   }
258 >
259 > sub parsebranchfiles()
260 >   {
261 >   my $self=shift;
262 >   my ($filenames)=@_; # array ref
263 >   # List of buildfiles:
264 >   $self->{localpaths}=$filenames;
265 >   $self->{simpledoc}=$self->_initbranchparser();
266 >   # We iterate over an array of files to be read in turn: all
267 >   # build data will be stored in the same BuildFile object:
268 >   $self->{simpledoc}->parsefilelist("branchbuilder",$filenames);
269 >   # We're done with the SimpleDoc object so delete it:
270 >   delete $self->{simpledoc};
271 >   }
272 >
273 > sub productcollector()
274 >   {
275 >   my $self=shift;
276 >   my ($name,$typeshort,$typefull)=@_;
277 >   # Create a new Product object for storage of data:
278 >   use BuildSystem::Product;
279 >   my $product = BuildSystem::Product->new();
280 >   # Store the name:
281 >   $product->name($name);
282 >   $product->type($typeshort);
283 >   # Store the files:
284 >   $product->_files($self->{id}->{'file'},$self->{localpaths});
285 >   # Store the data content:
286 >   $product->_data($self->{tagcontent});
287 >   # And store in a hash (all build products in same place):
288 >   $self->{content}->{BUILDPRODUCTS}->{$typefull}->{$name} = $product;
289 >   }
290 >
291 > sub pushlevel
292 >   {
293 >   my $self = shift;
294 >   my ($info)=@_;
295 >  
296 >   $self->{id} = $info if (defined $info);
297 >   $self->{nested} = 1;
298 >   $self->{tagcontent}={};
299 >   }
300 >
301 > sub poplevel
302 >   {
303 >   my $self = shift;
304 >   delete $self->{id};
305 >   delete $self->{nested};
306 >   delete $self->{tagcontent};
307 >   }
308 >
309 > sub dependencies()
310 >   {
311 >   my $self=shift;
312 >   # Make a copy of the variable so that
313 >   # we don't have a DEPENDENCIES entry in RAWDATA:
314 >   my %DEPS=%{$self->{DEPENDENCIES}};
315 >   delete $self->{DEPENDENCIES};
316 >   return \%DEPS;
317 >   }
318 >
319 > sub skippeddirs()
320 >   {
321 >   my $self=shift;
322 >   my ($here)=@_;
323 >   my $skipped;
324 >
325 >   if ($self->{content}->{SKIPPEDDIRS}->[0] == 1)
326 >      {
327 >      $skipped = [ @{$self->{content}->{SKIPPEDDIRS}} ];
328 >      delete $self->{content}->{SKIPPEDDIRS};
329 >      }
330 >  
331 >   delete $self->{content}->{SKIPPEDDIRS};
332 >   return $skipped;
333 >   }
334 >
335 > #
336 > # All data access methods are inherited from BuildDataUtils.
337 > #
338 > 1;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines