summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Thiago Macieira <thiago@macieira.org>2013-10-08 17:47:25 -0700
committerGravatar Thiago Macieira <thiago@macieira.org>2013-10-08 23:29:43 -0700
commit2fedb100ca84a94868e33f871e77b6379c3748c9 (patch)
treef6fa3dd9c18cfb0e815e73400c0d4664132c3103
parent57994fa7a19ece18ffbecfabd69216190f62e425 (diff)
downloadsubsurface-2fedb100ca84a94868e33f871e77b6379c3748c9.tar.gz
Add a tool to scan for dependencies on Windows
Similar to ldd on Linux. Signed-off-by: Thiago Macieira <thiago@macieira.org>
-rw-r--r--scripts/win-ldd.pl69
-rw-r--r--subsurface-install.pri15
2 files changed, 79 insertions, 5 deletions
diff --git a/scripts/win-ldd.pl b/scripts/win-ldd.pl
new file mode 100644
index 000000000..8af449a7b
--- /dev/null
+++ b/scripts/win-ldd.pl
@@ -0,0 +1,69 @@
+#!perl
+use strict;
+my %deploy;
+my $objdump = $ENV{objdump} ? $ENV{objdump} : "i686-w64-mingw32-objdump";
+my @searchdirs;
+
+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 $_) {
+ $deploy{$_} = $_;
+ addDependenciesFor($_);
+ }
+}
+
+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";
+}
diff --git a/subsurface-install.pri b/subsurface-install.pri
index 585481f62..b8d73785a 100644
--- a/subsurface-install.pri
+++ b/subsurface-install.pri
@@ -39,11 +39,6 @@ mac {
WINDOWSSTAGING = packaging/windows
deploy.path = $$WINDOWSSTAGING
- for(qtlib, $$list(QtCore QtGui QtNetwork QtWebKit QtSvg QtXml QtDeclarative)) {
- CONFIG(debug, debug|release): deploy.files += $$[QT_INSTALL_BINS]/$${qtlib}d4.dll
- else: deploy.files += $$[QT_INSTALL_BINS]/$${qtlib}4.dll
- }
-
deploy.files += $$marbledir.files $$xslt.files $$doc.files
target.path = $$WINDOWSSTAGING
INSTALLS += deploy target
@@ -53,6 +48,16 @@ mac {
qt_conf.commands += $${nltab}echo \'Plugins=plugins\' >> $@
qt_conf.target = $$PWD/packaging/windows/qt.conf
install.depends += qt_conf
+
+ !win32-msvc* {
+ !equals($$QMAKE_HOST.os, "Windows"): dlls.commands += OBJDUMP=`$(CC) -dumpmachine`-objdump
+ dlls.commands += perl $$PWD/scripts/win-ldd.pl $(DESTDIR_TARGET)
+ dlls.commands += `$(CC) -print-search-dirs | $(SED) -n \'/^libraries: =/{s///;s/:/\\n/g;p;q;}\' | $(SED) -E \'s,/lib/?\\\$\$,/bin,\'`
+ dlls.commands += $$LIBS
+ dlls.commands += | while read name; do $(INSTALL_FILE) \$\$name $$PWD/$$WINDOWSSTAGING; done
+ dlls.depends = $(DESTDIR_TARGET)
+ install.depends += dlls
+ }
} else {
# Linux install rules
# On Linux, we can count on packagers doing the right thing