[gdal] 03/05: Update gdal-symbols.pl to also generate symbols files for new architectures.
Bas Couwenberg
sebastic at xs4all.nl
Fri Nov 7 20:39:30 UTC 2014
This is an automated email from the git hooks/post-receive script.
sebastic-guest pushed a commit to branch experimental
in repository gdal.
commit eac5b1e6b78a7ad00228e64fa14621c1d1e388f2
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date: Fri Nov 7 20:19:32 2014 +0100
Update gdal-symbols.pl to also generate symbols files for new architectures.
---
debian/changelog | 2 +
debian/gdal-symbols.pl | 744 +++++++++++++++++++++++++++++++++++--------------
2 files changed, 535 insertions(+), 211 deletions(-)
diff --git a/debian/changelog b/debian/changelog
index bd1d3df..679c11c 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -4,6 +4,8 @@ gdal (1.11.1+dfsg-1~exp2) UNRELEASED; urgency=medium
* Update symbols for amd64, armel, armhf, i386, mips, mipsel, powerpc,
s390x & sparc.
* Don't exclude libhdf4-alt-dev from build dependencies on ppc64.
+ * Update gdal-symbols.pl to also generate symbols files for new
+ architectures.
-- Bas Couwenberg <sebastic at xs4all.nl> Sat, 25 Oct 2014 01:13:07 +0200
diff --git a/debian/gdal-symbols.pl b/debian/gdal-symbols.pl
index eda4643..0a32cbd 100755
--- a/debian/gdal-symbols.pl
+++ b/debian/gdal-symbols.pl
@@ -52,6 +52,7 @@ my %cfg = (
no_diff => 0,
no_prompt => 0,
yes => 0,
+ clean => 0,
verbose => 0,
help => 0,
);
@@ -72,6 +73,7 @@ my $result = GetOptions(
'no-diff' => \$cfg{no_diff},
'no-prompt' => \$cfg{no_prompt},
'y|yes' => \$cfg{yes},
+ 'c|clean' => \$cfg{clean},
'v|verbose' => \$cfg{verbose},
'h|help' => \$cfg{help},
);
@@ -93,10 +95,11 @@ if(!$result || $cfg{help} || !$cfg{package} || !$cfg{debian}) {
print "-H, --sha512sum <PATH> Path to sha512sum ($cfg{sha512sum})\n";
print "-D, --pkgdir <PATH> Path to downloaded packages ($cfg{pkgdir})\n";
print "-d, --debian <PATH> Path to debian/ directory ($cfg{debian})\n";
+ print "-f, --force Force writing into existing package directory\n";
print " --no-diff Don't display diff for new symbols files\n";
print " --no-prompt Don't prompt to select symbols, update manually\n";
print "-y, --yes Default to yes on prompts\n";
- print "-f, --force Force writing into existing package directory\n";
+ print "-c, --clean Clean up temorary files after processing\n";
print "-v, --verbose Enable verbose output\n";
print "-h, --help Display this usage information\n";
@@ -156,8 +159,11 @@ if(-e $cfg{pkgdir} && !$cfg{force}) {
$cfg{debian} .= '/' if(substr($cfg{debian}, -1, 1) ne '/');
$cfg{pkgdir} .= '/' if(substr($cfg{pkgdir}, -1, 1) ne '/');
+my @versions = get_versions(%cfg);
+
if(!$cfg{version} || $cfg{version} eq 'latest') {
- $cfg{version} = latest_snapshot();
+ $cfg{version} = $versions[-1];
+
if(!$cfg{version}) {
print "Error: Failed to determine latest version for: $cfg{package}\n";
exit 1;
@@ -166,20 +172,31 @@ if(!$cfg{version} || $cfg{version} eq 'latest') {
my %symbols = ();
-download_packages();
-unpack_packages();
-create_new_symbols();
-create_patch_files();
-patch_files();
-split_files();
-compare_symbols();
-#create_complete_symbols();
+# Get binary packages for all architectures
+download_packages(%cfg);
+unpack_packages(%cfg);
+
+# Update symbols files for existing architectures
+create_new_symbols(%cfg);
+create_new_patch_files(%cfg);
+patch_new_files(%cfg);
+split_new_files(%cfg);
+compare_new_symbols(%cfg);
+
+# Create symbols files for new architectures
+new_architecture_symbols(%cfg);
+
+clean_temp_files(%cfg) if($cfg{clean});
+
+exit 0;
################################################################################
# Subroutines
-sub latest_snapshot {
- my $url = 'http://snapshot.debian.org/mr/binary/'.uri_escape($cfg{package}).'/';
+sub get_versions {
+ my (%args) = @_;
+
+ my $url = 'http://snapshot.debian.org/mr/binary/'.uri_escape($args{package}).'/';
my $req = HTTP::Request->new(GET => $url);
print "Retrieving URL: $url ... " if($cfg{verbose});
@@ -204,7 +221,7 @@ sub latest_snapshot {
print "\n" if($cfg{verbose});
- return $versions[-1];
+ return @versions;
}
else {
print "Failed!\n" if($cfg{verbose});
@@ -216,22 +233,30 @@ sub latest_snapshot {
}
sub download_packages {
- my $dir = $cfg{pkgdir};
+ my (%args) = @_;
- if(!-e $cfg{pkgdir} || $cfg{force}) {
- print "Downloading binary packages for: $cfg{package}, version: $cfg{version}, into: $cfg{pkgdir}\n";
+ my $dir = $args{pkgdir};
+
+ if(!-e $args{pkgdir} || $args{force}) {
+ if($cfg{verbose}) {
+ print "Downloading binary packages for: $args{package}";
+ print ", version: $args{version}" if($args{version});
+ print ", architecture: $args{architecture}" if($args{architecture});
+ print ", into: $args{pkgdir}\n";
+ }
my @cmd = ();
push @cmd, $cfg{debsnap};
- push @cmd, ('--destdir', $cfg{pkgdir});
- push @cmd, '--force' if($cfg{force});
- push @cmd, '--verbose' if($cfg{verbose});
+ push @cmd, ('--destdir', $args{pkgdir});
+ push @cmd, '--force' if($args{force});
+ push @cmd, '--verbose' if($args{verbose});
push @cmd, '--binary';
- push @cmd, $cfg{package};
- push @cmd, $cfg{version};
+ push @cmd, ('--architecture', $args{architecture}) if($args{architecture});
+ push @cmd, $args{package};
+ push @cmd, $args{version} if($args{version} && $args{version} ne 'all');
- print "Exec: @cmd\n" if($cfg{verbose});
+ print "Exec: @cmd\n" if($cfg{verbose});
my $exit = system(@cmd) >> 8;
if($exit != 0) {
@@ -248,7 +273,9 @@ sub download_packages {
}
sub unpack_packages {
- my $dir = $cfg{pkgdir};
+ my (%args) = @_;
+
+ my $dir = $args{pkgdir};
if(-r $dir && -w $dir) {
print "Extracting downloaded packages...\n" if($cfg{verbose});
@@ -256,7 +283,7 @@ sub unpack_packages {
opendir(DIR, $dir) || die "Error: Cannot open directory: $dir ($!)";
while(readdir DIR) {
# libgdal1h_1.10.1+dfsg-1_amd64.deb
- if(/^($cfg{package})_(\S+)_(\S+)\.deb$/) {
+ if(/^($args{package})_(\S+)_(\S+)\.deb$/) {
my $pkg = $1;
my $version = $2;
my $arch = $3;
@@ -264,7 +291,7 @@ sub unpack_packages {
my $pkgdir = $dir.$pkg.'_'.$version.'_'.$arch.'/';
next if($arch eq 'common');
- next if($version ne $cfg{version} && $cfg{version} ne 'all');
+ next if($version ne $args{version} && $args{version} ne 'all');
next if(-r $pkgdir);
# dpkg-deb -R libgdal1h_1.10.1+dfsg-1_amd64.deb libgdal1h_1.10.1+dfsg-1_amd64
@@ -283,7 +310,7 @@ sub unpack_packages {
print "Error: Command failed: @cmd ($exit)\n";
exit $exit;
}
- }
+ }
}
closedir DIR;
@@ -295,71 +322,16 @@ sub unpack_packages {
}
}
-sub create_complete_symbols {
- my $dir = $cfg{debian};
-
- if(-r $dir && -w $dir) {
- my $file = $dir.$cfg{package}.'.symbols.common';
- if(!-r $file) {
- print "Error: Cannot read common symbols file: $file\n";
- return;
- }
-
- print "Reading common symbols file: $file\n" if($cfg{verbose});
-
- my $common = read_file($file);
-
- opendir(DIR, $dir) || die "Error: Cannot open directory: $dir ($!)";
- while(readdir DIR) {
- # libgdal1h.symbols.amd64
- if(/^$cfg{package}.symbols.(\S+)$/) {
- my $arch = $1;
-
- next if($arch eq 'common');
- next if($arch =~ /\.(new|diff|filt|patch|c\+\+|common|complete)$/);
-
- my $file = $dir.$_;
-
- print "Reading $arch symbols file: $file\n" if($cfg{verbose});
-
- my $data = '';
- foreach(read_file($file)) {
- # #include "libgdal1h.symbols.common"
- if(/^#include "$cfg{package}.symbols.common"\s*$/) {
- print "Including common symbols\n" if($cfg{verbose});
-
- $data .= $common;
- }
- else {
- $data .= $_;
- }
- }
-
- $file .= '.complete';
-
- print "Saving complete symbols file: $file\n" if($cfg{verbose});
-
- write_file($file, $data);
-
- print "\n" if($cfg{verbose});
- }
- }
- closedir DIR;
- }
- else {
- print "Error: Cannot read/write directory: $dir\n";
- return;
- }
-}
-
sub create_new_symbols {
- my $dir = $cfg{debian};
+ my (%args) = @_;
+
+ my $dir = $args{debian};
if(-r $dir && -w $dir) {
opendir(DIR, $dir) || die "Error: Cannot open directory: $dir ($!)";
while(readdir DIR) {
# libgdal1h.symbols.amd64
- if(/^($cfg{package}).symbols.(\S+)$/) {
+ if(/^($args{package}).symbols.(\S+)$/) {
my $pkg = $1;
my $arch = $2;
my $file = $dir.$_;
@@ -370,7 +342,7 @@ sub create_new_symbols {
my $version = '';
my $library = '';
- my $pkg_dir = $cfg{pkgdir};
+ my $pkg_dir = $args{pkgdir};
if(-r $pkg_dir) {
print "Looking for $arch under: $pkg_dir\n" if($cfg{verbose});
@@ -381,12 +353,12 @@ sub create_new_symbols {
print "Package directory: $_\n" if($cfg{verbose});
$version = $1;
-
- next if($version ne $cfg{version});
- $version =~ s/(\+dfsg\d*)?-\d+(\~\w+)?$//;
+ next if($version ne $args{version});
- $library = find_library($pkg_dir.$_.'/usr/lib/');
+ $version = upstream_version($version);
+
+ $library = find_library(%args, dir => $pkg_dir.$_.'/usr/lib/');
last;
}
@@ -400,7 +372,7 @@ sub create_new_symbols {
}
if(!$version) {
- print "Error: Cannot determine package version!\n";
+ print "Error: Cannot determine library version!\n";
print "\n" if($cfg{verbose});
next;
}
@@ -457,7 +429,12 @@ sub create_new_symbols {
write_file($filt, $data);
print "\n" if($cfg{verbose});
- }
+
+ $symbols{$arch}{file} = $file;
+ $symbols{$arch}{new} = $output;
+ $symbols{$arch}{diff} = $diff;
+ $symbols{$arch}{filt} = $filt;
+ }
}
closedir DIR;
}
@@ -469,21 +446,23 @@ sub create_new_symbols {
}
sub find_library {
- my $dir = shift;
- my $depth = shift;
+ my (%args) = @_;
+
+ my $dir = $args{dir};
+ my $depth = $args{depth};
$depth = 0 if(!$depth);
my $max_depth = 5;
if($depth == $max_depth) {
- print "Not looking further, maximum depth reached: $depth\n";
+ print "Not looking further, maximum depth reached: $depth\n" if($args{verbose});
return;
}
my $library = '';
if(-r $dir) {
- print "Reading directory: $dir\n" if($cfg{verbose});
+ print "Reading directory: $dir\n" if($args{verbose});
opendir(my $dh, $dir) || die "Error: Cannot open directory: $dir ($!)";
while(readdir $dh) {
@@ -492,7 +471,7 @@ sub find_library {
my $entry = $dir.$_;
if(-d $entry) {
- $library = find_library($entry.'/', $depth+1);
+ $library = find_library(%args, dir => $entry.'/', depth => $depth+1);
}
elsif(-f $entry && $entry =~ /\.so\.\d+\.\d+/) {
$library = $entry;
@@ -501,7 +480,7 @@ sub find_library {
}
closedir $dh;
- print "Library: $library\n" if($cfg{verbose});
+ print "Library: $library\n" if($args{verbose});
}
else {
print "Error: Cannot read directory: $dir\n";
@@ -511,16 +490,18 @@ sub find_library {
return $library;
}
-sub create_patch_files {
+sub create_new_patch_files {
+ my (%args) = @_;
+
# Create c++filt symbols files
- my $dir = $cfg{debian};
+ my $dir = $args{debian};
if(-r $dir && -w $dir) {
opendir(DIR, $dir) || die "Error: Cannot open directory: $dir ($!)";
while(readdir DIR) {
# libgdal1h.symbols.amd64
- if(/^($cfg{package}).symbols.(\S+)$/) {
+ if(/^($args{package}).symbols.(\S+)$/) {
my $pkg = $1;
my $arch = $2;
my $file = $dir.$_;
@@ -536,59 +517,24 @@ sub create_patch_files {
if(-r $diff_file && -r $new_file && -r $filt_file) {
# Mark C++ symbols
- my @cmd = (
- $cfg{diff},
- '-u',
- $new_file,
- $filt_file,
- );
-
- my $data = '';
- my $old = '';
- my $new = '';
- my $tmp = '';
-
- foreach(`@cmd`) {
- # --- debian/libgdal1h.symbols.amd64.new 2013-12-14 00:18:32.000000000 +0100
- if(/^\-\-\- (\S+\s+\d{4}.*?\S)\s*$/) {
- $old = $1;
-
- $_ = '';
- }
- # +++ debian/libgdal1h.symbols.amd64.new.filt 2013-12-14 01:44:01.000000000 +0100
- elsif(/^\+\+\+ (\S+\s+\d{4}.*?\S)\s*$/) {
- $new = $1;
-
- $_ = '--- '. $new."\n"
- . '+++ '. $old."\n"
- ;
- }
- # + VRTSourcedRasterBand::ComputeRasterMinMax(int, double*)@GDAL_1.8 1.10.1
- elsif(/^\+ (.*?) (\d+\.\d+\.\d+\S*)\s*$/) {
- # ignore
- $_ = '+ (c++)"'.$1.'" '.$2." 1\n";
- }
- # + VRTSourcedRasterBand::ComputeRasterMinMax(int, double*)@GDAL_1.8 1.10.1 1
- elsif(/^\+ (.*?) (\d+\.\d+\.\d+\S*)(\s+\d+)\s*$/) {
- # ignore
- $_ = '+ (c++)"'.$1.'" '.$2.$3."\n";
- }
-
- $data .= $_;
- }
+ create_patch_file(
+ %args,
+ file1 => $new_file,
+ file2 => $filt_file,
+ patch => $patch_file,
+ );
- print "Saving rewritten patch: $patch_file\n" if($cfg{verbose});
-
- write_file($patch_file, $data);
+ $symbols{$arch}{patch} = $patch_file;
}
else {
print "Error: Cannot read all files: $diff_file, $new_file, $filt_file\n";
- print `ls -l $diff_file $new_file $filt_file`;
next;
}
}
}
closedir DIR;
+
+ print "\n" if($cfg{verbose});
}
else {
print "Error: Cannot read/write directory: $dir\n";
@@ -596,16 +542,70 @@ sub create_patch_files {
}
}
-sub patch_files {
+sub create_patch_file {
+ my (%args) = @_;
+
+ return if(!$args{file1});
+ return if(!$args{file2});
+ return if(!$args{patch});
+
+ my @cmd = (
+ $cfg{diff},
+ '-u',
+ $args{file1},
+ $args{file2},
+ );
+
+ my $data = '';
+ my $old = '';
+ my $new = '';
+
+ foreach(`@cmd`) {
+ # --- debian/libgdal1h.symbols.amd64.new 2013-12-14 00:18:32.000000000 +0100
+ if(/^\-\-\- (\S+\s+\d{4}.*?\S)\s*$/) {
+ $old = $1;
+
+ $_ = '';
+ }
+ # +++ debian/libgdal1h.symbols.amd64.new.filt 2013-12-14 01:44:01.000000000 +0100
+ elsif(/^\+\+\+ (\S+\s+\d{4}.*?\S)\s*$/) {
+ $new = $1;
+
+ $_ = '--- '. $new."\n"
+ . '+++ '. $old."\n"
+ ;
+ }
+ # + VRTSourcedRasterBand::ComputeRasterMinMax(int, double*)@GDAL_1.8 1.10.1
+ elsif(/^\+ (.*?) (\d+\.\d+\.\d+\S*)\s*$/) {
+ # ignore
+ $_ = '+ (c++)"'.$1.'" '.$2." 1\n";
+ }
+ # + VRTSourcedRasterBand::ComputeRasterMinMax(int, double*)@GDAL_1.8 1.10.1 1
+ elsif(/^\+ (.*?) (\d+\.\d+\.\d+\S*)(\s+\d+)\s*$/) {
+ # ignore
+ $_ = '+ (c++)"'.$1.'" '.$2.$3."\n";
+ }
+
+ $data .= $_;
+ }
+
+ print "Saving rewritten patch: $args{patch}\n" if($cfg{verbose});
+
+ write_file($args{patch}, $data);
+}
+
+sub patch_new_files {
+ my (%args) = @_;
+
# Apply c++filt symbols patches
- my $dir = $cfg{debian};
+ my $dir = $args{debian};
if(-r $dir && -w $dir) {
opendir(DIR, $dir) || die "Error: Cannot open directory: $dir ($!)";
while(readdir DIR) {
# libgdal1h.symbols.amd64
- if(/^($cfg{package}).symbols.(\S+)$/) {
+ if(/^($args{package}).symbols.(\S+)$/) {
my $pkg = $1;
my $arch = $2;
my $file = $dir.$_;
@@ -621,31 +621,12 @@ sub patch_files {
if(-r $diff_file && -r $new_file && -r $filt_file && -r $patch_file) {
# Mark C++ symbols
- my @cmd = (
- $cfg{patch},
- '-p1',
- '-i'.$patch_file,
- $new_file,
+ patch_file(
+ %args,
+ patch => $patch_file,
+ file => $new_file,
);
- print "Exec: @cmd\n" if($cfg{verbose});
-
- my $exit = system(@cmd) >> 8;
- if($exit != 0) {
- print "Error: Command failed: @cmd ($exit)\n";
- exit $exit;
- }
-
- @cmd = ('rm', $patch_file);
-
- print "Exec: @cmd\n" if($cfg{verbose});
-
- $exit = system(@cmd) >> 8;
- if($exit != 0) {
- print "Error: Command failed: @cmd ($exit)\n";
- exit $exit;
- }
-
print "\n" if($cfg{verbose});
}
else {
@@ -664,16 +645,37 @@ sub patch_files {
}
}
-sub split_files {
+sub patch_file {
+ my (%args) = @_;
+
+ my @cmd = (
+ $cfg{patch},
+ '-p1',
+ '-i'.$args{patch},
+ $args{file},
+ );
+
+ print "Exec: @cmd\n" if($cfg{verbose});
+
+ my $exit = system(@cmd) >> 8;
+ if($exit != 0) {
+ print "Error: Command failed: @cmd ($exit)\n";
+ exit $exit;
+ }
+}
+
+sub split_new_files {
+ my (%args) = @_;
+
# Split common and C++ symbols into seperate files.
- my $dir = $cfg{debian};
+ my $dir = $args{debian};
if(-r $dir && -w $dir) {
opendir(DIR, $dir) || die "Error: Cannot open directory: $dir ($!)";
while(readdir DIR) {
# libgdal1h.symbols.amd64
- if(/^($cfg{package}).symbols.(\S+)$/) {
+ if(/^($args{package}).symbols.(\S+)$/) {
my $pkg = $1;
my $arch = $2;
my $file = $dir.$_;
@@ -689,23 +691,13 @@ sub split_files {
if(-r $diff_file && -r $new_file && -r $filt_file && !-r $patch_file) {
print "Splitting files for: $file\n" if($cfg{verbose});
- my $common = '';
- my $cplus = '';
+ my ($common, $cplus) = split_file(
+ %args,
+ file => $new_file,
+ );
- foreach(read_file($new_file)) {
- if(/\(c\+\+\)/ || !/^ /) {
- $cplus .= $_;
- }
- else {
- $common .= $_;
- }
- }
-
- my $common_file = $new_file.'.common';
- my $cplus_file = $new_file.'.c++';
-
- write_file($common_file, $common);
- write_file($cplus_file, $cplus);
+ $symbols{$arch}{common} = $common;
+ $symbols{$arch}{cplus} = $cplus;
}
else {
print "Error: Cannot read all files: $diff_file, $new_file, $filt_file, $patch_file\n";
@@ -723,14 +715,44 @@ sub split_files {
}
}
-sub compare_symbols {
- my $dir = $cfg{debian};
+sub split_file {
+ my (%args) = @_;
+
+ return if(!$args{file});
+
+ if(-r $args{file}) {
+ my $common = '';
+ my $cplus = '';
+
+ foreach(read_file($args{file})) {
+ if(/\(c\+\+\)/ || !/^ /) {
+ $cplus .= $_;
+ }
+ else {
+ $common .= $_;
+ }
+ }
+
+ my $common_file = $args{file}.'.common';
+ my $cplus_file = $args{file}.'.c++';
+
+ write_file($common_file, $common);
+ write_file($cplus_file, $cplus);
+
+ return ($common_file, $cplus_file);
+ }
+}
+
+sub compare_new_symbols {
+ my (%args) = @_;
+
+ my $dir = $args{debian};
if(-r $dir && -w $dir) {
my %checksum = ();
my $arch = 'common';
- my $file = $dir.$cfg{package}.'.symbols.'.$arch;
+ my $file = $dir.$args{package}.'.symbols.'.$arch;
print "Comparing symbols for: $file\n" if($cfg{verbose});
@@ -753,7 +775,7 @@ sub compare_symbols {
opendir(DIR, $dir) || die "Error: Cannot open directory: $dir ($!)";
while(readdir DIR) {
# libgdal1h.symbols.amd64.new.common
- if(/^($cfg{package}).symbols.(\S+).new.common$/) {
+ if(/^($args{package}).symbols.(\S+).new.common$/) {
my $pkg2 = $1;
my $arch2 = $2;
my $file2 = $dir.$_;
@@ -785,18 +807,18 @@ sub compare_symbols {
foreach my $file2 (@different) {
my $old = $file;
my $new = $file2;
-
+
my @cmd = (
$cfg{diff},
'-u',
$old,
$new,
);
-
+
print "Exec: @cmd\n" if($cfg{verbose});
-
+
my $exit = system(@cmd) >> 8;
-
+
print "Exit: $exit\n" if($cfg{verbose});
}
}
@@ -850,7 +872,7 @@ sub compare_symbols {
opendir(DIR, $dir) || die "Error: Cannot open directory: $dir ($!)";
while(readdir DIR) {
# libgdal1h.symbols.amd64
- if(/^($cfg{package}).symbols.(\S+)$/) {
+ if(/^($args{package}).symbols.(\S+)$/) {
my $pkg = $1;
my $arch = $2;
my $file = $dir.$_;
@@ -879,21 +901,21 @@ sub compare_symbols {
else {
if(!$cfg{no_diff}) {
my @cmd = (
- $cfg{diff},
- '-u',
+ $cfg{diff},
+ '-u',
$old,
$new,
);
-
+
print "Exec: @cmd\n" if($cfg{verbose});
-
+
my $exit = system(@cmd) >> 8;
-
+
print "Exit: $exit\n" if($cfg{verbose});
-
+
print `@cmd | diffstat`;
}
-
+
print "New $arch symbols different from the current symbols, update required!\n" if($cfg{verbose});
if(!$cfg{no_prompt}) {
@@ -906,11 +928,11 @@ sub compare_symbols {
$help,
$default,
);
-
+
if($result) {
my $file1 = $new;
my $file2 = $old;
-
+
if(-r $file1 && -w $file2) {
print "Copy: $file1 -> $file2\n" if($cfg{verbose});
@@ -927,13 +949,11 @@ sub compare_symbols {
}
}
}
-
+
print "\n" if($cfg{verbose});
}
}
closedir DIR;
-
- print "\n" if($cfg{verbose});
}
else {
print "Error: Cannot read/write directory: $dir\n";
@@ -942,3 +962,305 @@ sub compare_symbols {
}
}
+sub parse_symbols {
+ my (%args) = @_;
+
+ return if (!$args{file} || !-r $args{file});
+
+ my %symbols = ();
+
+ foreach(read_file($args{file})) {
+ # BSBClose at GDAL_1.8 1.8.0
+ if(/^ (\S+)\s+(\d+\S+\d+)\s*$/) {
+ my $symbol = $1;
+ my $version = $2;
+
+ $symbols{$symbol}{version} = $version;
+ }
+ # libgdal.so.1 libgdal1h #MINVER#
+ # | libgdal1h #MINVER#, libgdal.so.1-1.11.1
+ # #include "libgdal1h.symbols.common"
+ # (c++)"PamGetProxy(char const*)@GDAL_1.8" 1.8.0 1
+ elsif(/^ (\S+)\s+(\d+\S+\d+)\s*(\d+)\s*$/) {
+ my $symbol = $1;
+ my $version = $2;
+ my $template = $3;
+
+ $symbols{$symbol}{version} = $version;
+ $symbols{$symbol}{template} = $template;
+ }
+ }
+
+ return \%symbols;
+}
+
+sub compare_common_symbols {
+ my (%args) = @_;
+
+ return if(!$args{arch} || !$symbols{$args{arch}}{common} || !$symbols{common}{file});
+
+ if(!$symbols{common}{symbols}) {
+ $symbols{common}{symbols} = parse_symbols(%args, file => $symbols{common}{file});
+ }
+
+ $symbols{$args{arch}}{symbols} = parse_symbols(%args, file => $symbols{$args{arch}}{common});
+
+ print "Comparing symbols between $symbols{common}{file} and $symbols{$args{arch}}{common}...\n" if($cfg{verbose});
+
+ my %compare = ();
+
+ foreach my $symbol (sort keys %{$symbols{common}{symbols}}) {
+ $compare{$symbol}{old} = $symbols{common}{symbols}{$symbol};
+ }
+ foreach my $symbol (sort keys %{$symbols{$args{arch}}{symbols}}) {
+ $compare{$symbol}{new} = $symbols{$args{arch}}{symbols}{$symbol};
+ }
+
+ my $changes = 0;
+
+ foreach my $symbol (sort keys %compare) {
+ if(!$compare{$symbol}{old} || !$compare{$symbol}{new}) {
+ if(!$compare{$symbol}{old}) {
+ print "Symbol not in old: $symbol ($symbols{common}{file})\n" if($cfg{verbose});
+ }
+ if(!$compare{$symbol}{new}) {
+ print "Symbol not in new: $symbol ($symbols{$args{arch}}{common})\n" if($cfg{verbose});
+ }
+
+ $changes++;
+ }
+ }
+
+ return $changes;
+}
+
+sub new_architecture_symbols {
+ my (%args) = @_;
+
+ my $dir = $args{pkgdir};
+
+ if(-r $dir && -w $dir) {
+ print "Creating symbols files for new architectures...\n" if($cfg{verbose});
+
+ my $new = 0;
+
+ opendir(my $DIR, $dir) || die "Error: Cannot open directory: $dir ($!)";
+ while(readdir $DIR) {
+ # libgdal1h_1.10.1+dfsg-1_amd64.deb
+ if(/^($args{package})_(\S+)_(\S+)\.deb$/) {
+ my $pkg = $1;
+ my $version = $2;
+ my $arch = $3;
+ my $file = $dir.$_;
+ my $pkgdir = $dir.$pkg.'_'.$version.'_'.$arch.'/';
+
+ my $upstream_version = upstream_version($version);
+
+ next if($symbols{$arch});
+
+ # download all previous versions
+ download_packages(%args, architecture => $arch, version => 'all');
+
+ # unpack all previous versions
+ unpack_packages(%args, architecture => $arch, version => 'all');
+
+ # generate symbols for all versions
+ foreach my $version (@versions) {
+ my $library = '';
+
+ my $pkg_dir = $args{pkgdir};
+ if(-r $pkg_dir) {
+ my $dir = $pkg_dir.$pkg.'_'.$version.'_'.$arch.'/';
+ if(!-r $dir) {
+ print "Warning: Cannot read package directory: $dir\n";
+ next;
+ }
+
+ $library = find_library(%args, dir => $dir.'/usr/lib/', verbose => 0);
+ }
+ else {
+ print "Warning: Cannot read package directory: $pkg_dir\n";
+ print "\n" if($cfg{verbose});
+ next;
+ }
+
+ if(!$library) {
+ print "Warning: Cannot find library!\n";
+ print "\n" if($cfg{verbose});
+ next;
+ }
+
+ my $upstream_version = upstream_version($version);
+
+ my $file = $args{debian}.$pkg.'.symbols.'.$arch;
+ my $diff = $file.'.diff';
+
+ # dpkg-gensymbols -plibgdal1h -aarmel -v1.10.1 -Odebian/libgdal1h.symbols.armel -ebinary-libgdal1h/libgdal1h_1.10.1+dfsg-1_armel/usr/lib/libgdal.so.1.17.1
+
+ my @cmd = (
+ $cfg{gensymbols},
+ '-p'.$pkg,
+ '-a'.$arch,
+ '-v'.$upstream_version,
+ '-O'.$file,
+ '-e'.$library,
+ );
+
+ print "Exec: @cmd > $diff 2>&1\n" if($cfg{verbose});
+
+ `@cmd > $diff 2>&1`;
+
+ $symbols{$arch}{file} = $file;
+ $symbols{$arch}{diff} = $diff;
+ }
+
+ # Mark C++ symbols using c++filt
+ if($symbols{$arch}{file}) {
+ # cat debian/libgdal1h.symbols.armel | c++filt > debian/libgdal1h.symbols.armel.filt
+
+ my $filt = $symbols{$arch}{file}.'.filt';
+
+ print "Exec: cat $symbols{$arch}{file} | $cfg{cppfilt} > $filt 2>&1\n" if($cfg{verbose});
+
+ `cat $symbols{$arch}{file} | $cfg{cppfilt} > $filt 2>&1`;
+
+ # libgdal.so.1 libgdal1h #MINVER#
+ # | libgdal1h #MINVER#, libgdal.so.1-1.10.1
+ # #include "libgdal1h.symbols.common"
+
+ my $data = '';
+
+ my $upstream_version = upstream_version($versions[-1]);
+
+ my $i = 0;
+ foreach(read_file($filt)) {
+ if($i == 0 && /^ /) {
+ $_ = "#include \"${pkg}.symbols.common\"\n" . $_;
+ $_ = "| ${pkg} #MINVER#, libgdal.so.1-$upstream_version\n" . $_;
+
+ $i++;
+ }
+
+ $data .= $_;
+ }
+
+ write_file($filt, $data);
+
+ print "\n" if($cfg{verbose});
+
+ $symbols{$arch}{filt} = $filt;
+ }
+
+ # Create & apply patch file for enhanced C++ symbols
+ if($symbols{$arch}{file} && $symbols{$arch}{filt}) {
+ my $patch_file = $symbols{$arch}{file}.'.patch';
+
+ create_patch_file(
+ %args,
+ file1 => $symbols{$arch}{file},
+ file2 => $symbols{$arch}{filt},
+ patch => $patch_file,
+ );
+
+ patch_file(
+ %args,
+ patch => $patch_file,
+ file => $symbols{$arch}{file},
+ );
+
+ $symbols{$arch}{patch} = $patch_file;
+ }
+
+ # split common & C++ symbols
+ if($symbols{$arch}{file} && $symbols{$arch}{filt} && $symbols{$arch}{patch}) {
+ my ($common, $cplus) = split_file(
+ %args,
+ file => $symbols{$arch}{file},
+ );
+
+ $symbols{$arch}{common} = $common;
+ $symbols{$arch}{cplus} = $cplus;
+ }
+
+ # compare with existing common symbols
+ if($symbols{$arch}{file} && $symbols{$arch}{common} && $symbols{$arch}{cplus}) {
+ if(!$symbols{common}{file}) {
+ $symbols{common}{file} = $args{debian}.$args{package}.'.symbols.common';
+ }
+
+ my $changes = compare_common_symbols(
+ %args,
+ arch => $arch,
+ );
+
+ if(!$changes) {
+ print "Current common symbols are identical to the $arch common symbols, no update required.\n" if($cfg{verbose});
+
+ # Replace architecture symbols file with C++ symbols only
+
+ my $file1 = $symbols{$arch}{cplus};
+ my $file2 = $symbols{$arch}{file};
+
+ if(-r $file1 && -w $file2) {
+ print "Copy: $file1 -> $file2\n" if($cfg{verbose});
+
+ copy($file1, $file2) || die "Error: Failed to copy $file1 to $file2 ($!)\n";
+ }
+ else {
+ print "Warning: Cannot read $file1 and/or write $file2\n";
+ next;
+ }
+ }
+ else {
+ print "New $arch common symbols different from the current common symbols, update required!\n" if($cfg{verbose});
+ }
+ }
+
+ $new++;
+
+ print "\n" if($cfg{verbose});
+ }
+ }
+ closedir $DIR;
+
+ print "No new architectures found.\n" if(!$new && $cfg{verbose});
+ }
+ else {
+ print "Error: Cannot read/write directory: $dir\n";
+ return;
+ }
+}
+
+sub clean_temp_files {
+ my (%args) = @_;
+
+ print "Removing files:\n" if($cfg{verbose});
+
+ my $i = 0;
+ foreach my $arch (sort keys %symbols) {
+ next if($arch eq 'common');
+
+ foreach my $key (sort keys %{$symbols{$arch}}) {
+ next if($key eq 'file' || $key eq 'symbols' || !-r $symbols{$arch}{$key});
+
+ print " $symbols{$arch}{$key}" if($cfg{verbose});
+
+ unlink($symbols{$arch}{$key}) || die "Error: Failed to unlink: $symbols{$arch}{$key} ($!)";
+ }
+
+ $i++;
+
+ print "\n" if($cfg{verbose});
+ }
+
+ print "\n" if($cfg{verbose});
+}
+
+sub upstream_version {
+ my $version = shift;
+
+ $version =~ s/(\+dfsg\d*)?-\d+(\~\w+)?(\+b\d+)?$//;
+
+ return $version;
+}
+
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/gdal.git
More information about the Pkg-grass-devel
mailing list