author | Simon Howkins <simonh@symbian.org> |
Mon, 07 Jun 2010 15:17:50 +0100 | |
changeset 1077 | f16ac94c147c |
parent 1075 | 20205e7ab525 |
child 1078 | 551e851f4b49 |
permissions | -rw-r--r-- |
1067 | 1 |
# Copyright (c) 2009 Symbian Foundation Ltd |
2 |
# This component and the accompanying materials are made available |
|
3 |
# under the terms of the License "Eclipse Public License v1.0" |
|
4 |
# which accompanies this distribution, and is available |
|
5 |
# at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
6 |
# |
|
7 |
# Initial Contributors: |
|
8 |
# Symbian Foundation Ltd - initial contribution. |
|
9 |
# |
|
10 |
# Contributors: |
|
11 |
# |
|
12 |
# Description: |
|
13 |
# Split a system model file into many package model files (one per package) |
|
14 |
||
15 |
use strict; |
|
16 |
use Getopt::Long; |
|
17 |
use XML::DOM; |
|
18 |
||
19 |
my $DEFAULT_OUTDIR = "models"; |
|
20 |
||
21 |
my $sysdef = ''; |
|
22 |
my $outdir = $DEFAULT_OUTDIR; |
|
23 |
my $help = 0; |
|
24 |
GetOptions(( |
|
25 |
'sysdef=s' => \$sysdef, |
|
26 |
'outdir:s' => \$outdir, |
|
27 |
'help!' => \$help |
|
28 |
)); |
|
29 |
||
30 |
$help = 1 if (!$sysdef); |
|
31 |
||
32 |
if ($help) |
|
33 |
{ |
|
34 |
print "Split a system model file into many package model files (one per package)\n"; |
|
35 |
print "Usage: perl split_sysdef.pl --sysdef=FILE [OPTIONS]\n"; |
|
36 |
print "where:\n"; |
|
37 |
print "\tFILE is the input file to split\n"; |
|
38 |
print "and OPTIONS are:\n"; |
|
39 |
print "\t--outdir=DIR Generate package model files under DIR (default: $DEFAULT_OUTDIR)\n"; |
|
40 |
exit(0); |
|
41 |
} |
|
42 |
||
43 |
mkdir("$outdir") if (!-d$outdir); |
|
44 |
||
45 |
my $parser = new XML::DOM::Parser; |
|
46 |
my $doc = $parser->parsefile ($sysdef); |
|
47 |
||
48 |
# fix bldFile and mrp paths |
|
49 |
for my $unit ( $doc->getElementsByTagName("unit") ) |
|
50 |
{ |
|
51 |
my $bldfile = $unit->getAttribute("bldFile"); |
|
52 |
if ($bldfile) |
|
53 |
{ |
|
54 |
$bldfile =~ s,\\,/,g; |
|
55 |
$bldfile = "/$bldfile" if ( $bldfile !~ m,^/, ); |
|
56 |
$bldfile = "/sf$bldfile" if ( $bldfile !~ m,^/sf, ); |
|
57 |
if ($bldfile =~ m,^/sf/(os|mw|app|tools|ostools|adaptation)/,) |
|
58 |
{ |
|
59 |
$unit->setAttribute("bldFile", $bldfile); |
|
60 |
} |
|
61 |
else |
|
62 |
{ |
|
63 |
print "WARNING: unexpected path in bldFile: $bldfile. Keeping as is\n"; |
|
64 |
} |
|
65 |
} |
|
66 |
||
67 |
my $mrp = $unit->getAttribute("mrp"); |
|
68 |
if ($mrp) |
|
69 |
{ |
|
70 |
$mrp =~ s,\\,/,g; |
|
71 |
$mrp = "/$mrp" if ( $mrp !~ m,^/, ); |
|
72 |
$mrp = "/sf$mrp" if ( $mrp !~ m,^/sf, ); |
|
73 |
if ($mrp =~ m,^/sf/(os|mw|app|tools|ostools|adaptation)/,) |
|
74 |
{ |
|
75 |
$unit->setAttribute("mrp", $mrp); |
|
76 |
} |
|
77 |
else |
|
78 |
{ |
|
79 |
print "WARNING: unexpected path in mrp: $mrp. Keeping as is\n" ; |
|
80 |
} |
|
81 |
} |
|
82 |
} |
|
83 |
||
84 |
my $packagedef_header = ''; |
|
85 |
my $packagedef_trailer = ''; |
|
86 |
||
87 |
my $systemdefinition = $doc->getElementsByTagName("SystemDefinition")->item(0); |
|
88 |
my $systemdefinition_attributes = $systemdefinition->getAttributes(); |
|
89 |
my $systemdefinition_attributes_tostring = ''; |
|
90 |
for ($systemdefinition_attributes->getValues) {$systemdefinition_attributes_tostring .= " ".$_->getName."=\"".$_->getValue."\"";} |
|
91 |
$packagedef_header .= "<SystemDefinition$systemdefinition_attributes_tostring>\n"; |
|
92 |
$packagedef_trailer = "\n</SystemDefinition>".$packagedef_trailer; |
|
93 |
||
94 |
my $systemmodel = $systemdefinition->getElementsByTagName("systemModel")->item(0); |
|
95 |
my $systemmodel_attributes = $systemmodel->getAttributes(); |
|
96 |
my $systemmodel_attributes_tostring = ''; |
|
97 |
for ($systemmodel_attributes->getValues) {$systemmodel_attributes_tostring .= " ".$_->getName."=\"".$_->getValue."\"";} |
|
1077
f16ac94c147c
Added a few strategically placed spaces, to improve the indentation of the output.
Simon Howkins <simonh@symbian.org>
parents:
1075
diff
changeset
|
98 |
$packagedef_header .= " <systemModel$systemmodel_attributes_tostring>\n"; |
f16ac94c147c
Added a few strategically placed spaces, to improve the indentation of the output.
Simon Howkins <simonh@symbian.org>
parents:
1075
diff
changeset
|
99 |
$packagedef_trailer = "\n </systemModel>".$packagedef_trailer; |
1067 | 100 |
|
101 |
for my $layer ( $systemmodel->getElementsByTagName("layer") ) |
|
102 |
{ |
|
103 |
my $layer_name = $layer->getAttribute("name"); |
|
104 |
||
105 |
my $layer_attributes = $layer->getAttributes(); |
|
106 |
my $layer_attributes_tostring = ''; |
|
107 |
for ($layer_attributes->getValues) {$layer_attributes_tostring .= " ".$_->getName."=\"".$_->getValue."\"";} |
|
1077
f16ac94c147c
Added a few strategically placed spaces, to improve the indentation of the output.
Simon Howkins <simonh@symbian.org>
parents:
1075
diff
changeset
|
108 |
my $layer_header = " <layer$layer_attributes_tostring>\n "; |
f16ac94c147c
Added a few strategically placed spaces, to improve the indentation of the output.
Simon Howkins <simonh@symbian.org>
parents:
1075
diff
changeset
|
109 |
my $layer_trailer = "\n </layer>"; |
1067 | 110 |
|
111 |
for my $block ( $layer->getElementsByTagName("block") ) |
|
112 |
{ |
|
113 |
my $block_name = $block->getAttribute("name"); |
|
114 |
||
115 |
mkdir("$outdir/$layer_name") if (!-d "$outdir/$layer_name"); |
|
116 |
mkdir("$outdir/$layer_name/$block_name") if (!-d "$outdir/$layer_name/$block_name"); |
|
117 |
||
118 |
# what source code doesn't belong to this package ? |
|
119 |
for my $unit ( $block->getElementsByTagName("unit") ) |
|
120 |
{ |
|
121 |
my $bldinf = $unit->getAttribute("bldFile"); |
|
122 |
if ($bldinf and $bldinf !~ m,^/sf/$layer_name/$block_name,) |
|
123 |
{ |
|
124 |
print "WARNING: $bldinf is in package: $layer_name/$block_name\n"; |
|
125 |
} |
|
126 |
} |
|
127 |
||
128 |
open(FILE, ">$outdir/$layer_name/$block_name/package_definition.xml"); |
|
129 |
print FILE $doc->getXMLDecl->toString."\n" if ($doc->getXMLDecl); |
|
130 |
print FILE $doc->getDoctype->toString."\n" if ($doc->getDoctype); |
|
131 |
print FILE $packagedef_header; |
|
132 |
print FILE $layer_header; |
|
133 |
print FILE $block->toString; |
|
134 |
print FILE $layer_trailer; |
|
135 |
print FILE $packagedef_trailer; |
|
136 |
close(FILE); |
|
137 |
} |
|
138 |
} |
|
139 |
||
140 |
$doc->dispose; |
|
141 |