ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/XMLBuildFile.pm
Revision: 1.1
Committed: Thu Apr 28 09:17:46 2005 UTC (20 years ago) by sashby
Content type: text/plain
Branch: MAIN
Log Message:
Added XML version of BuildFile object

File Contents

# User Rev Content
1 sashby 1.1 #____________________________________________________________________
2     # File: XMLBuildFile.pm
3     #____________________________________________________________________
4     #
5     # Author: Shaun Ashby <Shaun.Ashby@cern.ch>
6     # Update: 2005-04-22 15:22:06+0200
7     # Revision: $Id$
8     #
9     # Copyright: 2005 (C) Shaun Ashby
10     #
11     #--------------------------------------------------------------------
12     package BuildSystem::XMLBuildFile;
13     require 5.004;
14     use Exporter;
15     use BuildSystem::XMLTagUtils;
16     use ActiveDoc::SimpleXMLDoc;
17    
18     @ISA=qw(Exporter);
19     @EXPORT_OK=qw( );
20    
21     #
22     sub new()
23     ###############################################################
24     # new #
25     ###############################################################
26     # modified : Wed Dec 3 19:03:22 2003 / SFA #
27     # params : #
28     # : #
29     # function : #
30     # : #
31     ###############################################################
32     {
33     my $proto=shift;
34     my $class=ref($proto) || $proto;
35     my $self={};
36    
37     bless $self,$class;
38     $self->{content} = {};
39     return $self;
40     }
41    
42     sub _parser()
43     {
44     my $self=shift;
45    
46     # Initialise the doc and a XML::Parser instance, passing in
47     # the default handlers for start, end and char types:
48     $self->{simplexmldoc} = ActiveDoc::SimpleXMLDoc->new(\&BuildSystem::XMLTagUtils::OpenTagHandler,
49     \&BuildSystem::XMLTagUtils::ClosingTagHandler,
50     \&BuildSystem::XMLTagUtils::CharHandler,
51     "builder");
52    
53     # Pass a ref to parent object so that tag data can be stored
54     # directly in the XMLBuildFile object:
55     &BuildSystem::XMLTagUtils::datastore($self);
56    
57     # Register the specific tag routines with expected attributes. If no checking should be done
58     # then just put 0. For nested tags, last element is 1:
59     $self->{simplexmldoc}->registerTag("builder",
60     "classpath",
61     \&BuildSystem::XMLTagUtils::classpathtaghandler,
62     [ "path" ],
63     0);
64    
65     $self->{simplexmldoc}->registerTag("builder",
66     "productstore",
67     \&BuildSystem::XMLTagUtils::productstoretaghandler,
68     [ "name" ],
69     0);
70    
71     $self->{simplexmldoc}->registerTag("builder",
72     "include",
73     \&BuildSystem::XMLTagUtils::includetaghandler,
74     [ "path" ],
75     0);
76    
77     $self->{simplexmldoc}->registerTag("builder",
78     "use",
79     \&BuildSystem::XMLTagUtils::usetaghandler,
80     [ "name" ],
81     0);
82    
83     $self->{simplexmldoc}->registerTag("builder",
84     "lib",
85     \&BuildSystem::XMLTagUtils::libtaghandler,
86     [ "name" ],
87     0);
88    
89     $self->{simplexmldoc}->registerTag("builder",
90     "group",
91     \&BuildSystem::XMLTagUtils::grouptaghandler,
92     [ "name" ],
93     0);
94    
95     $self->{simplexmldoc}->registerTag("builder",
96     "libtype",
97     \&BuildSystem::XMLTagUtils::libtypetaghandler,
98     [ "type" ],
99     0);
100    
101     $self->{simplexmldoc}->registerTag("builder",
102     "flags",
103     \&BuildSystem::XMLTagUtils::flagstaghandler,
104     0,
105     0);
106    
107     $self->{simplexmldoc}->registerTag("builder",
108     "skip",
109     \&BuildSystem::XMLTagUtils::skiptaghandler,
110     0,
111     1);
112    
113     # Nested tags (i.e. tags that can contain other tags):
114     $self->{simplexmldoc}->registerTag("builder",
115     "export",
116     \&BuildSystem::XMLTagUtils::exporttaghandler,
117     0,
118     1);
119    
120     $self->{simplexmldoc}->registerTag("builder",
121     "makefile",
122     \&BuildSystem::XMLTagUtils::makefiletaghandler,
123     0,
124     1);
125    
126     $self->{simplexmldoc}->registerTag("builder",
127     "architecture",
128     \&BuildSystem::XMLTagUtils::archtaghandler,
129     0,
130     1);
131    
132     $self->{simplexmldoc}->registerTag("builder",
133     "define_group",
134     \&BuildSystem::XMLTagUtils::groupdeftaghandler,
135     [ "name" ],
136     1);
137    
138     $self->{simplexmldoc}->registerTag("builder",
139     "bin",
140     \&BuildSystem::XMLTagUtils::binarytaghandler,
141     [ "file" ],
142     1);
143    
144     $self->{simplexmldoc}->registerTag("builder",
145     "module",
146     \&BuildSystem::XMLTagUtils::moduletaghandler,
147     [ "file" ],
148     1);
149    
150     $self->{simplexmldoc}->registerTag("builder",
151     "plugin",
152     \&BuildSystem::XMLTagUtils::plugintaghandler,
153     [ "file" ],
154     1);
155    
156     $self->{simplexmldoc}->registerTag("builder",
157     "application",
158     \&BuildSystem::XMLTagUtils::applicationtaghandler,
159     [ "file" ],
160     1);
161    
162     $self->{simplexmldoc}->registerTag("builder",
163     "library",
164     \&BuildSystem::XMLTagUtils::librarytaghandler,
165     [ "file" ],
166     1);
167    
168     # Register the XML parsing tag routines (default ones, plus those added above):
169     $self->{simplexmldoc}->setHandlers();
170    
171     # Return the parser object:
172     return $self->{simplexmldoc};
173     }
174    
175     sub simplexmldoc()
176     {
177     my $self=shift;
178     @_ ? $self->{simplexmldoc} = shift
179     : $self->{simplexmldoc};
180     }
181    
182     sub parse()
183     {
184     my $self=shift;
185     my ($filename)=@_;
186     # Parse the file:
187     $self->_parser()->parsefile($filename);
188     # We're done with the simpleXMLDoc object:
189     delete $self->{simplexmldoc};
190     }
191    
192     sub pushlevel
193     {
194     my $self = shift;
195     my ($info)=@_;
196    
197     $self->{id} = $info if (defined $info);
198     $self->{nested} = 1;
199     $self->{tagcontent}={};
200     }
201    
202     sub poplevel
203     {
204     my $self = shift;
205     delete $self->{id};
206     delete $self->{nested};
207     delete $self->{tagcontent};
208     }
209    
210     sub dependencies()
211     {
212     my $self=shift;
213     # Make a copy of the variable so that
214     # we don't have a DEPENDENCIES entry in RAWDATA:
215     my %DEPS=%{$self->{DEPENDENCIES}};
216     delete $self->{DEPENDENCIES};
217     return \%DEPS;
218     }
219    
220     sub skippeddirs()
221     {
222     my $self=shift;
223     my ($here)=@_;
224     my $skipped;
225    
226     if ($self->{content}->{SKIPPEDDIRS}->[0] == 1)
227     {
228     $skipped = [ @{$self->{content}->{SKIPPEDDIRS}} ];
229     delete $self->{content}->{SKIPPEDDIRS};
230     }
231    
232     delete $self->{content}->{SKIPPEDDIRS};
233     return $skipped;
234     }
235    
236     sub productcollector()
237     {
238     my $self=shift;
239     my ($name,$typeshort,$typefull)=@_;
240     # Create a new Product object for storage of data:
241     use BuildSystem::Product;
242     my $product = BuildSystem::Product->new();
243     # Store the name:
244     $product->name($name);
245     $product->type($typeshort);
246     # Store the files:
247     $product->_files($self->{id}->{'file'},$self->{localpaths});
248     # Store the data content:
249     $product->_data($self->{tagcontent});
250     # And store in a hash (all build products in same place):
251     $self->{content}->{BUILDPRODUCTS}->{$typefull}->{$name} = $product;
252     }
253    
254     1;