source: trunk/bin/createpackage.pl@ 563

Last change on this file since 563 was 561, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.1 sources.

  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 9.6 KB
Line 
1#!/usr/bin/perl
2#############################################################################
3##
4## Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
5## All rights reserved.
6## Contact: Nokia Corporation ([email protected])
7##
8## This file is part of the S60 port of the Qt Toolkit.
9##
10## $QT_BEGIN_LICENSE:LGPL$
11## Commercial Usage
12## Licensees holding valid Qt Commercial licenses may use this file in
13## accordance with the Qt Commercial License Agreement provided with the
14## Software or, alternatively, in accordance with the terms contained in
15## a written agreement between you and Nokia.
16##
17## GNU Lesser General Public License Usage
18## Alternatively, this file may be used under the terms of the GNU Lesser
19## General Public License version 2.1 as published by the Free Software
20## Foundation and appearing in the file LICENSE.LGPL included in the
21## packaging of this file. Please review the following information to
22## ensure the GNU Lesser General Public License version 2.1 requirements
23## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24##
25## In addition, as a special exception, Nokia gives you certain additional
26## rights. These rights are described in the Nokia Qt LGPL Exception
27## version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28##
29## GNU General Public License Usage
30## Alternatively, this file may be used under the terms of the GNU
31## General Public License version 3.0 as published by the Free Software
32## Foundation and appearing in the file LICENSE.GPL included in the
33## packaging of this file. Please review the following information to
34## ensure the GNU General Public License version 3.0 requirements will be
35## met: http://www.gnu.org/copyleft/gpl.html.
36##
37## If you have questions regarding the use of this file, please contact
38## Nokia at [email protected].
39## $QT_END_LICENSE$
40##
41#############################################################################
42
43############################################################################################
44#
45# Convenience script for creating signed packages you can install on your phone.
46#
47############################################################################################
48
49use strict;
50
51# use a command-line parsing module
52use Getopt::Long;
53# Use file name parsing module
54use File::Basename;
55# Use File::Spec services mainly rel2abs
56use File::Spec;
57# use CWD abs_bath, which is exported only on request
58use Cwd 'abs_path';
59
60
61sub Usage() {
62 print <<ENDUSAGESTRING;
63
64==============================================================================================
65Convenience script for creating signed packages you can install on your phone.
66
67Usage: createpackage.pl [options] templatepkg target-platform [certificate key [passphrase]]
68
69Where supported optiobns are as follows:
70 [-i|install] = Install the package right away using PC suite
71 [-p|preprocess] = Only preprocess the template .pkg file.
72 [-c|certfile=<file>] = The file containing certificate information for signing.
73 The file can have several certificates, each specified in
74 separate line. The certificate, key and passphrase in line
75 must be ';' separated. Lines starting with '#' are treated
76 as a comments. Also empty lines are ignored. The paths in
77 <file> can be absolute or relative to <file>.
78Where parameters are as follows:
79 templatepkg = Name of .pkg file template
80 target = Either debug or release
81 platform = One of the supported platform
82 winscw | gcce | armv5 | armv6 | armv7
83 certificate = The certificate file used for signing
84 key = The certificate's private key file
85 passphrase = The certificate's private key file's passphrase
86
87Example:
88 createpackage.pl fluidlauncher_template.pkg release-armv5
89
90Example with certfile:
91 createpackage.pl -c=mycerts.txt fluidlauncher_template.pkg release-armv5
92
93 Content of 'mycerts.txt' must be something like this:
94 # This is comment line, also the empty lines are ignored
95 rd.cer;rd-key.pem
96 .\\cert\\mycert.cer;.\\cert\\mykey.key;yourpassword
97 X:\\QtS60\\selfsigned.cer;X:\\QtS60\\selfsigned.key
98
99If no certificate and key files are provided, either a RnD certificate or
100a self-signed certificate from Qt installation root directory is used.
101==============================================================================================
102
103ENDUSAGESTRING
104
105 exit();
106}
107
108# Read given options
109my $install = "";
110my $preprocessonly = "";
111my $certfile = "";
112
113unless (GetOptions('i|install' => \$install, 'p|preprocess' => \$preprocessonly, 'c|certfile=s' => \$certfile)){
114 Usage();
115}
116
117my $certfilepath = abs_path(dirname($certfile));
118
119# Read params to variables
120my $templatepkg = $ARGV[0];
121my $targetplatform = lc $ARGV[1];
122
123my @tmpvalues = split('-', $targetplatform);
124my $target = $tmpvalues[0];
125my $platform = $tmpvalues[1];;
126
127# Convert visual target to real target (debug->udeb and release->urel)
128$target =~ s/debug/udeb/i;
129$target =~ s/release/urel/i;
130
131my $certificate = $ARGV[2];
132my $key = $ARGV[3];
133my $passphrase = $ARGV[4];
134
135# Generate output pkg basename (i.e. file name without extension)
136my $pkgoutputbasename = $templatepkg;
137$pkgoutputbasename =~ s/_template\.pkg/_$targetplatform/g;
138$pkgoutputbasename = lc($pkgoutputbasename);
139
140# Store output file names to variables
141my $pkgoutput = lc($pkgoutputbasename.".pkg");
142my $unsigned_sis_name = $pkgoutputbasename."_unsigned.sis";
143my $signed_sis_name = $pkgoutputbasename.".sis";
144
145# Store some utility variables
146my $scriptpath = dirname(__FILE__);
147my $certtext = $certificate;
148my $certpath = $scriptpath;
149$certpath =~ s-^(.*[^\\])$-$1\\-o; # ensure path ends with a backslash
150$certpath =~ s-/-\\-go; # for those working with UNIX shells
151$certpath =~ s-bin\\$-src\\s60installs\\-; # certificates are one step up in hierarcy
152
153# Check some pre-conditions and print error messages if needed
154unless (length($templatepkg) && length($platform) && length($target)) {
155 print "\nError: Template PKG filename, platform or target is not defined!\n";
156 Usage();
157}
158
159# Check template exist
160stat($templatepkg);
161unless( -e _ ) {
162 print "\nError: Package description file '$templatepkg' does not exist!\n";
163 Usage();
164}
165
166# Check certifcate preconditions and set default certificate variables if needed
167if (length($certificate)) {
168 unless(length($key)) {
169 print "\nError: Custom certificate key file parameter missing.!\n";
170 Usage();
171 }
172} else {
173 #If no certificate is given, check default options
174 $certtext = "RnD";
175 $certificate = $certpath."rd.cer";
176 $key = $certpath."rd-key.pem";
177
178 stat($certificate);
179 unless( -e _ ) {
180 $certtext = "Self Signed";
181 $certificate = $certpath."selfsigned.cer";
182 $key = $certpath."selfsigned.key";
183 }
184}
185
186# Read the certificates from file to two dimensional array
187my @certificates;
188if (length($certfile)) {
189 open CERTFILE, "<$certfile" or die $!;
190 while(<CERTFILE>){
191 s/#.*//; # ignore comments by erasing them
192 next if /^(\s)*$/; # skip blank lines
193 chomp; # remove trailing newline characters
194 my @certinfo = split(';', $_); # split row to certinfo
195
196 # Trim spaces
197 for(@certinfo) {
198 s/^\s+//;
199 s/\s+$//;
200 }
201
202 # Do some validation
203 unless(scalar(@certinfo) >= 2 && scalar(@certinfo) <= 3 && length($certinfo[0]) && length($certinfo[1]) ) {
204 print "\nError: $certfile line '$_' does not contain valid information!\n";
205 Usage();
206 }
207
208 push @certificates, [@certinfo]; # push data to two dimensional array
209 }
210}
211
212# Remove any existing .sis packages
213unlink $unsigned_sis_name;
214unlink $signed_sis_name;
215unlink $pkgoutput;
216
217# Preprocess PKG
218local $/;
219# read template file
220open( TEMPLATE, $templatepkg) or die "Error '$templatepkg': $!\n";
221$_=<TEMPLATE>;
222close (TEMPLATE);
223
224# replace the PKG variables
225s/\$\(PLATFORM\)/$platform/gm;
226s/\$\(TARGET\)/$target/gm;
227
228#write the output
229open( OUTPUT, ">$pkgoutput" ) or die "Error '$pkgoutput' $!\n";
230print OUTPUT $_;
231close OUTPUT;
232
233if ($preprocessonly) {
234 exit;
235}
236
237# Create SIS.
238system ("makesis $pkgoutput $unsigned_sis_name");
239
240# Sign SIS with certificate info given as an argument.
241system ("signsis $unsigned_sis_name $signed_sis_name $certificate $key $passphrase");
242
243# Check if creating signed SIS Succeeded
244stat($signed_sis_name);
245if( -e _ ) {
246 print ("\nSuccessfully created $signed_sis_name using certificate: $certtext!\n");
247
248 # Sign with additional certificates & keys
249 for my $row ( @certificates ) {
250 # Get certificate absolute file names, relative paths are relative to certfilepath
251 my $abscert = File::Spec->rel2abs( $row->[0], $certfilepath);
252 my $abskey = File::Spec->rel2abs( $row->[1], $certfilepath);
253
254 system ("signsis $signed_sis_name $signed_sis_name $abscert $abskey $row->[2]");
255 print ("\tAdditionally signed the SIS with certificate: $row->[0]!\n");
256 }
257
258 # remove temporary pkg and unsigned sis
259 unlink $pkgoutput;
260 unlink $unsigned_sis_name;
261
262 # Install the sis if requested
263 if ($install) {
264 print ("\nInstalling $signed_sis_name...\n");
265 system ("$signed_sis_name");
266 }
267} else {
268 # Lets leave the generated PKG for problem solving purposes
269 print ("\nSIS creation failed!\n");
270}
271
272
273#end of file
Note: See TracBrowser for help on using the repository browser.