7
7
# This program is free software; you can redistribute it and/or modify
8
8
# it under the terms of the GNU General Public License as published by
9
9
# the Free Software Foundation; either version 2 of the License, or
10
- # (at your option) any later version.
10
+ # (at your option) any later version.
11
11
12
12
#
13
13
# Download OSGeo4W packages
29
29
my $root = " http://download.osgeo.org/osgeo4w" ;
30
30
my $ininame = " setup.ini" ;
31
31
my $arch = " x86_64" ;
32
+ my $signwith ;
33
+ my $signpass ;
32
34
my $help ;
33
35
34
36
my $result = GetOptions(
35
37
" verbose+" => \$verbose ,
36
38
" keep" => \$keep ,
39
+ " signwith=s" => \$signwith ,
40
+ " signpass=s" => \$signpass ,
37
41
" releasename=s" => \$releasename ,
38
42
" version=s" => \$version ,
39
43
" binary=i" => \$binary ,
45
49
" help" => \$help
46
50
);
47
51
52
+ die " certificate not found" if defined $signwith && ! -f $signwith ;
53
+
48
54
pod2usage(1) if $help ;
49
55
50
56
my $wgetopt = $verbose ? " " : " -nv" ;
@@ -265,6 +271,38 @@ sub getDeps {
265
271
chdir " .." ;
266
272
}
267
273
274
+ my ($major , $minor , $patch );
275
+
276
+ open F, " ../../CMakeLists.txt" ;
277
+ while (<F>) {
278
+ if (/ SET\( CPACK_PACKAGE_VERSION_MAJOR "(\d +)"\) / ) {
279
+ $major = $1 ;
280
+ } elsif (/ SET\( CPACK_PACKAGE_VERSION_MINOR "(\d +)"\) / ) {
281
+ $minor = $1 ;
282
+ } elsif (/ SET\( CPACK_PACKAGE_VERSION_PATCH "(\d +)"\) / ) {
283
+ $patch = $1 ;
284
+ } elsif (/ SET\( RELEASE_NAME "(.+)"\) / ) {
285
+ $releasename = $1 unless defined $releasename ;
286
+ }
287
+ }
288
+ close F;
289
+
290
+ $version = " $major .$minor .$patch " unless defined $version ;
291
+
292
+ my ($pmajor ,$pminor ,$ppatch ) = $version =~ / ^(\d +)\. (\d +)\. (\d +)$ / ;
293
+ die " Invalid version $version " unless defined $ppatch ;
294
+
295
+ unless ( defined $binary ) {
296
+ if ( -f " binary$archpostfix -$version " ) {
297
+ open P, " binary$archpostfix -$version " ;
298
+ $binary = <P>;
299
+ close P;
300
+ $binary ++;
301
+ } else {
302
+ $binary = 1;
303
+ }
304
+ }
305
+
268
306
#
269
307
# Create postinstall.bat
270
308
#
@@ -290,7 +328,7 @@ sub getDeps {
290
328
print F " echo OSGEO4W_STARTMENU=%OSGEO4W_STARTMENU%$r " ;
291
329
print F " echo OSGEO4W_DESKTOP=%OSGEO4W_DESKTOP%$r " ;
292
330
print F " PATH %OSGEO4W_ROOT %\\ bin;%PATH%$r " ;
293
- print F " cd %OSGEO4W_ROOT%$r " ;
331
+ print F " cd /d %OSGEO4W_ROOT%$r " ;
294
332
295
333
chdir $unpacked ;
296
334
for my $p (<etc/postinstall/*.bat>) {
@@ -320,7 +358,7 @@ sub getDeps {
320
358
print F " if \" %OSGEO4W_ROOT_MSYS :~1,1%\" ==\" :\" set OSGEO4W_ROOT_MSYS=/%OSGEO4W_ROOT_MSYS :~0,1%/%OSGEO4W_ROOT_MSYS :~3%$r " ;
321
359
print F " echo OSGEO4W_ROOT_MSYS=%OSGEO4W_ROOT_MSYS%$r " ;
322
360
print F " PATH %OSGEO4W_ROOT %\\ bin;%PATH%$r " ;
323
- print F " cd %OSGEO4W_ROOT%$r " ;
361
+ print F " cd /d \" %OSGEO4W_ROOT %\" $r " ;
324
362
325
363
chdir $unpacked ;
326
364
for my $p (<etc/preremove/*.bat>) {
@@ -337,38 +375,6 @@ sub getDeps {
337
375
338
376
close F;
339
377
340
- my ($major , $minor , $patch );
341
-
342
- open F, " ../../CMakeLists.txt" ;
343
- while (<F>) {
344
- if (/ SET\( CPACK_PACKAGE_VERSION_MAJOR "(\d +)"\) / ) {
345
- $major = $1 ;
346
- } elsif (/ SET\( CPACK_PACKAGE_VERSION_MINOR "(\d +)"\) / ) {
347
- $minor = $1 ;
348
- } elsif (/ SET\( CPACK_PACKAGE_VERSION_PATCH "(\d +)"\) / ) {
349
- $patch = $1 ;
350
- } elsif (/ SET\( RELEASE_NAME "(.+)"\) / ) {
351
- $releasename = $1 unless defined $releasename ;
352
- }
353
- }
354
- close F;
355
-
356
- $version = " $major .$minor .$patch " unless defined $version ;
357
-
358
- my ($pmajor ,$pminor ,$ppatch ) = $version =~ / ^(\d +)\. (\d +)\. (\d +)$ / ;
359
- die " Invalid version $version " unless defined $ppatch ;
360
-
361
- unless ( defined $binary ) {
362
- if ( -f " binary$archpostfix -$version " ) {
363
- open P, " binary$archpostfix -$version " ;
364
- $binary = <P>;
365
- close P;
366
- $binary ++;
367
- } else {
368
- $binary = 1;
369
- }
370
- }
371
-
372
378
unless (-d " untgz" ) {
373
379
system " unzip $packages /Untgz.zip" ;
374
380
die " unpacking Untgz.zip failed" if $? ;
@@ -438,29 +444,77 @@ sub getDeps {
438
444
439
445
print " Running NSIS\n " if $verbose ;
440
446
441
- my $cmd = " makensis" ;
442
- $cmd .= " -V$verbose " ;
443
- $cmd .= " -DVERSION_NAME='$releasename '" ;
444
- $cmd .= " -DVERSION_NUMBER='$version '" ;
445
- $cmd .= " -DBINARY_REVISION=$binary " ;
446
- $cmd .= sprintf ( " -DVERSION_INT='%d %02d%02d%02d'" , $pmajor , $pminor , $ppatch , $binary );
447
- $cmd .= sprintf ( " -DQGIS_BASE='$packagename %d .%d '" , $pmajor , $pminor );
448
- $cmd .= " -DINSTALLER_NAME='$packagename -OSGeo4W-$version -$binary -Setup$archpostfix .exe'" ;
449
- $cmd .= " -DDISPLAYED_NAME=\" $packagename '$releasename ' ($version )\" " ;
450
- $cmd .= " -DSHORTNAME='$shortname '" ;
451
- $cmd .= " -DINSTALLER_TYPE=OSGeo4W" ;
452
- $cmd .= " -DPACKAGE_FOLDER=osgeo4w/$unpacked " ;
453
- $cmd .= " -DLICENSE_FILE='$license '" ;
454
- $cmd .= " -DARCH='$arch '" ;
455
- $cmd .= " QGIS-Installer.nsi" ;
447
+ my $installerbase = " $packagename -OSGeo4W-$version -$binary -Setup$archpostfix " ;
448
+
449
+ my $run ;
450
+ my $instdest ;
451
+ unless ($^O =~ / win/i ) {
452
+ $run = " wine " ;
453
+ $instdest = ` winepath -w \$ PWD` ;
454
+ $instdest =~ s /\s +$// ;
455
+ $instdest =~ s /\\ / \\\\ / g ;
456
+ } else {
457
+ $run = " " ;
458
+ $instdest = " ." ;
459
+ }
460
+
456
461
462
+ my $args = " " ;
463
+ $args .= " -V$verbose " ;
464
+ $args .= " -DVERSION_NAME='$releasename '" ;
465
+ $args .= " -DVERSION_NUMBER='$version '" ;
466
+ $args .= " -DBINARY_REVISION=$binary " ;
467
+ $args .= sprintf ( " -DVERSION_INT='%d %02d%02d%02d'" , $pmajor , $pminor , $ppatch , $binary );
468
+ $args .= sprintf ( " -DQGIS_BASE='$packagename %d .%d '" , $pmajor , $pminor );
469
+ $args .= " -DDISPLAYED_NAME=\" $packagename $version '$releasename '\" " ;
470
+ $args .= " -DPACKAGE_FOLDER=osgeo4w/$unpacked " ;
471
+ $args .= " -DLICENSE_FILE='$license '" ;
472
+ $args .= " -DARCH='$arch '" ;
473
+ $args .= " QGIS-Installer.nsi" ;
474
+
475
+ sub sign {
476
+ my $base = shift ;
477
+
478
+ my $cmd = " osslsigncode sign" ;
479
+ $cmd .= " -pkcs12 \" $signwith \" " ;
480
+ $cmd .= " -pass \" $signpass \" " if defined $signpass ;
481
+ $cmd .= " -n \" $packagename $version '$releasename '\" " ;
482
+ $cmd .= " -h sha256" ;
483
+ $cmd .= " -i \" https://qgis.org\" " ;
484
+ $cmd .= " -t \" http://timestamp.digicert.com\" " ;
485
+ $cmd .= " -in \" $base .exe\" " ;
486
+ $cmd .= " $base -signed.exe" ;
487
+ system $cmd ;
488
+ die " signing failed [$cmd ]" if $? ;
489
+
490
+ rename (" $base -signed.exe" , " $base .exe" ) or die " rename failed: $! " ;
491
+ }
492
+
493
+ my $cmd ;
494
+ unlink " makeuinst.exe" ;
495
+ $cmd = " makensis -DINNER=1 -DUNINSTALLERDEST='$instdest ' -DINSTALLER_NAME='makeuinst.exe' $args " ;
457
496
system $cmd ;
458
- die " running nsis failed [$cmd ]" if $? ;
497
+ die " running makensis failed [$cmd ]" if $? ;
498
+ die " makeuinst.exe not created" unless -f " makeuinst.exe" ;
499
+
500
+ unlink " uninstall.exe" ;
501
+ system " ${run} makeuinst.exe" ;
502
+ die " uninstall.exe not created" unless -f " uninstall.exe" ;
503
+ unlink " makeuinst.exe" ;
504
+
505
+ sign " uninstall" if $signwith ;
506
+
507
+ $cmd = " makensis -DINSTALLER_NAME='$installerbase .exe' $args " ;
508
+ system $cmd ;
509
+ die " running makensis failed [$cmd ]" if $? ;
510
+
511
+ sign " $installerbase " if $signwith ;
459
512
460
513
open P, " >osgeo4w/binary$archpostfix -$version " ;
461
514
print P $binary ;
462
515
close P;
463
516
517
+ system " md5sum $installerbase .exe >$installerbase .exe.md5sum" ;
464
518
465
519
__END__
466
520
@@ -476,6 +530,8 @@ =head1 SYNOPSIS
476
530
-verbose increase verbosity
477
531
-releasename=name name of release (defaults to CMakeLists.txt setting)
478
532
-keep don't start with a fresh unpacked directory
533
+ -signwith=cert.p12 optionall sign package with certificate (requires osslsigncode)
534
+ -signpass=password password of certificate
479
535
-version=m.m.p package version (defaults to CMakeLists.txt setting)
480
536
-binary=b binary version of package
481
537
-ininame=filename name of the setup.ini (defaults to setup.ini)
0 commit comments