common/tools/csvToSysDef.pl
author Simon Howkins <simonh@symbian.org>
Wed, 27 Oct 2010 16:22:14 +0100
changeset 1316 0b4a09013baf
parent 1315 8d797b367538
permissions -rw-r--r--
Added copyright messages
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
     1
#!perl -w
1316
0b4a09013baf Added copyright messages
Simon Howkins <simonh@symbian.org>
parents: 1315
diff changeset
     2
# Copyright (c) 2009 Symbian Foundation Ltd
0b4a09013baf Added copyright messages
Simon Howkins <simonh@symbian.org>
parents: 1315
diff changeset
     3
# This component and the accompanying materials are made available
0b4a09013baf Added copyright messages
Simon Howkins <simonh@symbian.org>
parents: 1315
diff changeset
     4
# under the terms of the License "Eclipse Public License v1.0"
0b4a09013baf Added copyright messages
Simon Howkins <simonh@symbian.org>
parents: 1315
diff changeset
     5
# which accompanies this distribution, and is available
0b4a09013baf Added copyright messages
Simon Howkins <simonh@symbian.org>
parents: 1315
diff changeset
     6
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
0b4a09013baf Added copyright messages
Simon Howkins <simonh@symbian.org>
parents: 1315
diff changeset
     7
#
0b4a09013baf Added copyright messages
Simon Howkins <simonh@symbian.org>
parents: 1315
diff changeset
     8
# Initial Contributors:
0b4a09013baf Added copyright messages
Simon Howkins <simonh@symbian.org>
parents: 1315
diff changeset
     9
# Symbian Foundation Ltd - initial contribution.
0b4a09013baf Added copyright messages
Simon Howkins <simonh@symbian.org>
parents: 1315
diff changeset
    10
# 
0b4a09013baf Added copyright messages
Simon Howkins <simonh@symbian.org>
parents: 1315
diff changeset
    11
# Contributors:
0b4a09013baf Added copyright messages
Simon Howkins <simonh@symbian.org>
parents: 1315
diff changeset
    12
#
0b4a09013baf Added copyright messages
Simon Howkins <simonh@symbian.org>
parents: 1315
diff changeset
    13
# Description:
0b4a09013baf Added copyright messages
Simon Howkins <simonh@symbian.org>
parents: 1315
diff changeset
    14
# Generate a system definition from a list of packages in a sources.csv
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    15
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    16
use strict;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    17
331
f7c6fc4239ac Fixed paths and drives for executing script.
Simon Howkins <simonh@symbian.org>
parents: 330
diff changeset
    18
use FindBin;
f7c6fc4239ac Fixed paths and drives for executing script.
Simon Howkins <simonh@symbian.org>
parents: 330
diff changeset
    19
use lib "$FindBin::Bin/lib";
f7c6fc4239ac Fixed paths and drives for executing script.
Simon Howkins <simonh@symbian.org>
parents: 330
diff changeset
    20
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    21
use XML::Parser;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    22
use Text::CSV;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    23
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    24
my $sourcesCSV = shift or die "First arg must be source csv file";
331
f7c6fc4239ac Fixed paths and drives for executing script.
Simon Howkins <simonh@symbian.org>
parents: 330
diff changeset
    25
my $backupBaseDir = shift or die "Second arg must be path to tree of package_definitions to use if not found in the source packages";
f7c6fc4239ac Fixed paths and drives for executing script.
Simon Howkins <simonh@symbian.org>
parents: 330
diff changeset
    26
shift and die "No more than two arguments please";
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    27
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    28
# Load CSV
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    29
open my $csvText, "<", $sourcesCSV or die;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    30
my $csv = Text::CSV->new();
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    31
my @keys;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    32
my @packages;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    33
while (my $line = <$csvText>)
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    34
{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    35
	chomp $line;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    36
	next unless $line;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    37
	unless ($csv->parse($line))
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    38
	{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    39
		my $err = $csv->error_input();
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    40
		die "Failed to parse line '$line': $err";
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    41
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    42
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    43
	if (! @keys)
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    44
	{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    45
		# First line - note the column names
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    46
		@keys =  $csv->fields();
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    47
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    48
	else
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    49
	{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    50
		# Already got the keys, so get the data
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    51
		my %package;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    52
		# Read into a hash slice
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    53
		@package{@keys} = $csv->fields();
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    54
		push @packages, \%package;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    55
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    56
}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    57
close $csvText;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    58
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    59
my $parser = new XML::Parser(Style => "Objects") or die;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    60
my $outTree;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    61
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    62
# For each package in CSV...
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    63
foreach my $package (@packages)
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    64
{
335
15307a7772ea If a package does not have a definition in the sources.csv then it won't get built, so don't try to incorporate it into the system definition.
Simon Howkins <simonh@symbian.org>
parents: 333
diff changeset
    65
	# If the sources.csv does not include a sys def for this package, it doesn't get built
15307a7772ea If a package does not have a definition in the sources.csv then it won't get built, so don't try to incorporate it into the system definition.
Simon Howkins <simonh@symbian.org>
parents: 333
diff changeset
    66
	next unless $package->{sysdef};
340
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
    67
	# If it's in the "backup" location, use that one (ie our copy overrides the package's own copy)
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    68
	my $pkgDef = "$package->{dst}/$package->{sysdef}";
340
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
    69
	$pkgDef =~ s{^/sf/}{};
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
    70
	$pkgDef =~ s{/[^/]*$}{};
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
    71
	$pkgDef = "$backupBaseDir/$pkgDef/package_definition.xml";
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    72
	if (!-f $pkgDef)
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    73
	{
340
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
    74
		# Not there, so look for the pkg defn in the root of the package tree
1314
2a30d4157ddd Script now outputs info message if sources.csv specifies a file that's not in the package (irrespective of whether it will try to use it).
Simon Howkins <simonh@symbian.org>
parents: 976
diff changeset
    75
		warn "WARNING: Package $package->{dst} does not appear on the local system\n" unless -d $package->{dst};
340
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
    76
		$pkgDef = "$package->{dst}/$package->{sysdef}";
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    77
	}
1314
2a30d4157ddd Script now outputs info message if sources.csv specifies a file that's not in the package (irrespective of whether it will try to use it).
Simon Howkins <simonh@symbian.org>
parents: 976
diff changeset
    78
	warn "INFO: sources.csv lists '$package->{sysdef}', which is not supplied in $package->{dst}\n" if -d "$package->{dst}" && !-f "$package->{dst}/$package->{sysdef}";
2a30d4157ddd Script now outputs info message if sources.csv specifies a file that's not in the package (irrespective of whether it will try to use it).
Simon Howkins <simonh@symbian.org>
parents: 976
diff changeset
    79
	die "ERROR: Unable to locate any package_definition at all for $package->{dst}" unless -f $pkgDef;
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    80
344
348670fc497a Added output of the package definition incorporated for each package.
Simon Howkins <simonh@symbian.org>
parents: 341
diff changeset
    81
	warn "Including $pkgDef for $package->{dst}\n";
333
7b0a774a0c87 Made error messages more useful.
Simon Howkins <simonh@symbian.org>
parents: 331
diff changeset
    82
	my $pkgTree = eval { $parser->parsefile($pkgDef) } or die "Failed to parse $pkgDef : $@";
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    83
	if (!$outTree)
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    84
	{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    85
		# The first file is taken verbatim
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    86
		$outTree = $pkgTree;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    87
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    88
	else
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    89
	{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    90
		# Merge into output Tree
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    91
		mergeTrees($outTree->[0], $pkgTree->[0]);
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    92
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    93
}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    94
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    95
# Output total tree
340
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
    96
print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    97
printTree($outTree->[0]);
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    98
print "\n";
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
    99
340
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   100
exit;
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   101
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   102
sub mergeTrees
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   103
{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   104
	my $baseTree = shift or die;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   105
	my $extrasTree = shift or die;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   106
333
7b0a774a0c87 Made error messages more useful.
Simon Howkins <simonh@symbian.org>
parents: 331
diff changeset
   107
	die ("Package Definitions do not match: ".(ref $baseTree)." vs ".(ref $extrasTree)) unless ref $baseTree eq ref $extrasTree;
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   108
	return if ref $baseTree eq "main::Characters";
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   109
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   110
	foreach my $extraChild (@{$extrasTree->{Kids}})
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   111
	{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   112
		# Work out whether this child should be merged with a namesake, or appended
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   113
		my $mergeIt = undef;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   114
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   115
		my $extraChildTag = ref $extraChild;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   116
		$extraChildTag =~ s{^main::}{};
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   117
		
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   118
		if ($extraChildTag =~ m{^(SystemDefinition|systemModel)$})
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   119
		{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   120
			# Should be merged if there's already one there
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   121
			# Look for a namesake in the base
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   122
			$mergeIt = matchTag($baseTree->{Kids}, $extraChild, undef);
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   123
		}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   124
		elsif ($extraChildTag =~ m{layer|block|package|collection|component})
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   125
		{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   126
			# Should be merged if there is another tag with the same "name" attribute
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   127
			# Look for a namesake in the base
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   128
			$mergeIt = matchTag($baseTree->{Kids}, $extraChild, "name");
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   129
		}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   130
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   131
		if ($mergeIt)
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   132
		{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   133
			# Merge children
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   134
			mergeTrees($mergeIt, $extraChild);
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   135
		}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   136
		else
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   137
		{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   138
			# Add this child
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   139
			push @{$baseTree->{Kids}}, $extraChild;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   140
		}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   141
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   142
}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   143
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   144
sub matchTag
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   145
{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   146
	my $peers = shift;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   147
	my $outsider = shift;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   148
	my $attr = shift;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   149
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   150
	foreach my $peer (@$peers)
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   151
	{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   152
		if (ref $peer eq ref $outsider && (!defined $attr || $peer->{$attr} eq $outsider->{$attr}))
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   153
		{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   154
			return $peer;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   155
		}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   156
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   157
	
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   158
	return undef;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   159
}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   160
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   161
sub printTree
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   162
{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   163
	my $tree = shift or die;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   164
	die unless ref $tree;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   165
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   166
	my $tagName = ref $tree;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   167
	$tagName =~ s{^main::}{};
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   168
	if ($tagName eq "Characters")
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   169
	{
961
94716c328941 Fix canonical_system_definition.xml doesn't have XML special characters escaped
Dario Sestito <darios@symbian.org>
parents: 344
diff changeset
   170
		if ($tree->{Text} =~ m{[<>&]})
94716c328941 Fix canonical_system_definition.xml doesn't have XML special characters escaped
Dario Sestito <darios@symbian.org>
parents: 344
diff changeset
   171
		{
94716c328941 Fix canonical_system_definition.xml doesn't have XML special characters escaped
Dario Sestito <darios@symbian.org>
parents: 344
diff changeset
   172
			print "<![CDATA[$tree->{Text}]]>";
94716c328941 Fix canonical_system_definition.xml doesn't have XML special characters escaped
Dario Sestito <darios@symbian.org>
parents: 344
diff changeset
   173
		}
94716c328941 Fix canonical_system_definition.xml doesn't have XML special characters escaped
Dario Sestito <darios@symbian.org>
parents: 344
diff changeset
   174
		else
94716c328941 Fix canonical_system_definition.xml doesn't have XML special characters escaped
Dario Sestito <darios@symbian.org>
parents: 344
diff changeset
   175
		{
94716c328941 Fix canonical_system_definition.xml doesn't have XML special characters escaped
Dario Sestito <darios@symbian.org>
parents: 344
diff changeset
   176
			print $tree->{Text};
94716c328941 Fix canonical_system_definition.xml doesn't have XML special characters escaped
Dario Sestito <darios@symbian.org>
parents: 344
diff changeset
   177
		}
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   178
		return;
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   179
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   180
	
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   181
	print "<$tagName";
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   182
340
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   183
	foreach my $attr (
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   184
		sort {
1315
8d797b367538 Added new attributes found in v3 system definitions
Simon Howkins <simonh@symbian.org>
parents: 1314
diff changeset
   185
			my $order = "id name long-name tech_domain level span schema levels filter introduced deprecated purpose class plugin origin-model bldFile proFile qmakeArgs mrp version priority target";
340
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   186
			my $ixA = index $order, $a;
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   187
			my $ixB = index $order, $b;
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   188
			die "$a $b" if $ixA + $ixB == -2;
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   189
			$ixA - $ixB;
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   190
		}
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   191
		grep {
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   192
			! ref $tree->{$_}
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   193
		}
aee074ee2646 Changed preference for selecting package definition files, so that it takes the one from our tree in preference to the one in the package itself. This means that we can just delete items from our tree when we're happy to switch to using the one in the package (as this will vary from package to package).
Simon Howkins <simonh@symbian.org>
parents: 335
diff changeset
   194
		keys %$tree)
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   195
	{
961
94716c328941 Fix canonical_system_definition.xml doesn't have XML special characters escaped
Dario Sestito <darios@symbian.org>
parents: 344
diff changeset
   196
		my $value_escaped = $tree->{$attr};
94716c328941 Fix canonical_system_definition.xml doesn't have XML special characters escaped
Dario Sestito <darios@symbian.org>
parents: 344
diff changeset
   197
		$value_escaped =~ s/&/&amp;/g;
94716c328941 Fix canonical_system_definition.xml doesn't have XML special characters escaped
Dario Sestito <darios@symbian.org>
parents: 344
diff changeset
   198
		$value_escaped =~ s/</&lt;/g;
94716c328941 Fix canonical_system_definition.xml doesn't have XML special characters escaped
Dario Sestito <darios@symbian.org>
parents: 344
diff changeset
   199
		$value_escaped =~ s/>/&gt;/g;
94716c328941 Fix canonical_system_definition.xml doesn't have XML special characters escaped
Dario Sestito <darios@symbian.org>
parents: 344
diff changeset
   200
		print " $attr=\"$value_escaped\"";
329
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   201
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   202
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   203
	my $children = $tree->{Kids};
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   204
	if (scalar @$children)
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   205
	{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   206
		print ">";
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   207
		foreach my $child (@$children)
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   208
		{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   209
			printTree($child);
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   210
		}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   211
		print "</$tagName";
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   212
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   213
	else
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   214
	{
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   215
		print "/"
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   216
	}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   217
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   218
	print ">";
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   219
}
06c2c867c6ad Added tool for collating a build definition from the set of package defintions indicated by the sources.csv
Simon Howkins <simonh@symbian.org>
parents:
diff changeset
   220