subsurface/scripts/win-ldd.pl
Dirk Hohndel 6c15647858 Allow cross-building 64 bit binaries for Windows
This also makes sure that we package the Qt5 translations, not the Qt4
translations.

There was an odd issue that somehow a 32bit search path ended up being
used by win-dll which resulted in the wrong DLLs being packaged.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2014-08-02 15:08:22 -07:00

95 lines
1.8 KiB
Perl

#!perl
use strict;
my %deploy;
my $objdump = $ENV{objdump} ? $ENV{objdump} : "objdump";
my @searchdirs;
my @systemdirs;
if ($ENV{PATH} =~ "x86_64") {
@systemdirs = (qr|^c:/windows|i, qr|^c:/winnt|i, qr|^/c/windows|i, qr|^/c/winnt|, qr|^/usr/i686|);
} else {
@systemdirs = (qr|^c:/windows|i, qr|^c:/winnt|i, qr|^/c/windows|i, qr|^/c/winnt|);
}
sub addDependenciesFor($) {
open OBJDUMP, "-|", $objdump, "-p", $_[0] or die;
while (<OBJDUMP>) {
last if /^The Import Tables/;
}
while (<OBJDUMP>) {
next unless /DLL Name: (.*)/;
$deploy{$1} = 0 unless defined($deploy{$1});
last if /^\w/;
}
close OBJDUMP;
}
sub findMissingDependencies {
for my $name (keys %deploy) {
next if $deploy{$name};
my $path;
for my $dir (@searchdirs) {
my $fpath = "$dir/$name";
my $lcfpath = "$dir/" . lc($name);
if (-e $fpath) {
$path = $fpath;
} elsif (-e $lcfpath) {
$path = $lcfpath;
} else {
next;
}
addDependenciesFor($path);
last;
}
$path = "/missing/file" unless $path;
$deploy{$name} = $path;
}
}
for (@ARGV) {
s/^-L//;
next if /^-/;
if (-d $_) {
push @searchdirs, $_;
} elsif (-f $_) {
# Add $_'s path to the search list too
my $dirname = $_;
$dirname =~ s,/[^/]+$,,;
unshift @searchdirs, $dirname;
$deploy{$_} = $_;
addDependenciesFor($_);
}
}
# Append PATH to @searchdirs
@searchdirs = (@searchdirs, split(/:/, $ENV{PATH}));
# Remove system dirs from @searchdirs
@searchdirs = grep {
my $sys = 0;
for my $rx (@systemdirs) {
if ($_ =~ $rx) {
$sys = 1;
last;
}
}
!$sys;
} @searchdirs;
while (1) {
findMissingDependencies();
my $i = 0;
while (my ($name, $path) = each(%deploy)) {
next if $path;
++$i;
last;
}
last if $i == 0;
}
for (sort values %deploy) {
next if $_ eq "/missing/file";
print "$_\n";
}