diff options
author | Thiago Macieira <thiago@macieira.org> | 2013-10-08 17:47:25 -0700 |
---|---|---|
committer | Thiago Macieira <thiago@macieira.org> | 2013-10-08 23:29:43 -0700 |
commit | 2fedb100ca84a94868e33f871e77b6379c3748c9 (patch) | |
tree | f6fa3dd9c18cfb0e815e73400c0d4664132c3103 | |
parent | 57994fa7a19ece18ffbecfabd69216190f62e425 (diff) | |
download | subsurface-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.pl | 69 | ||||
-rw-r--r-- | subsurface-install.pri | 15 |
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 |