summaryrefslogtreecommitdiff
path: root/Tools
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-07-16 14:54:25 +0200
committerSimon Hausmann <simon.hausmann@nokia.com>2012-07-23 09:29:21 +0200
commit1de6cd4794bbd5a52189384189a2b8df1848b39b (patch)
tree7b0c8b68b7230f7aff88a11c246319c63c012c67 /Tools
parentb784c69d562e1cce5057f5232320983df585e12a (diff)
downloadqtwebkit-1de6cd4794bbd5a52189384189a2b8df1848b39b.tar.gz
[Qt] MSVC: unresolved external symbol __DllMainCRTStartup@12
https://bugs.webkit.org/show_bug.cgi?id=91229 Reviewed by NOBODY (OOPS!). In order to successfully link a DLL on Windows we need to have at least one object file (or compilation unit). The forward export header files were supposed to be that, but unfortunately the rule in win32/default_post.prf for creating the header files had some bugs, among others that it did an exists() check on the depending static library. At the time qmake is ran those libraries do not exist yet and therefore the corresponding extra compiler rules were never created, resulting in empty OBJECTS/SOURCES. Even without such an exists() check, qmake extra compilers require the files referred to in the .input variable to exist at qmake time. In this case the input files were the static libraries, which do not exist yet. This patch solves this by using a qmake extra target instead of extra compiler, which does not have this limitation. The target is referenced through the extension of GENERATED_SOURCES. The patch also adds a d/_debug suffix for debug builds, do allow for separate symbol exports if necessary. * Scripts/generate-win32-export-forwards: Support multiple input files, i.e. consider the last argument to be the output file and everything else input. * qmake/mkspecs/features/win32/default_post.prf:
Diffstat (limited to 'Tools')
-rw-r--r--Tools/ChangeLog30
-rwxr-xr-xTools/Scripts/generate-win32-export-forwards23
-rw-r--r--Tools/qmake/mkspecs/features/win32/default_post.prf17
3 files changed, 55 insertions, 15 deletions
diff --git a/Tools/ChangeLog b/Tools/ChangeLog
index b3679ece8..6cfa656ef 100644
--- a/Tools/ChangeLog
+++ b/Tools/ChangeLog
@@ -1,3 +1,33 @@
+2012-07-16 Simon Hausmann <simon.hausmann@nokia.com>
+
+ [Qt] MSVC: unresolved external symbol __DllMainCRTStartup@12
+ https://bugs.webkit.org/show_bug.cgi?id=91229
+
+ Reviewed by NOBODY (OOPS!).
+
+ In order to successfully link a DLL on Windows we need to have at least
+ one object file (or compilation unit). The forward export header files were
+ supposed to be that, but unfortunately the rule in win32/default_post.prf for
+ creating the header files had some bugs, among others that it did an exists()
+ check on the depending static library. At the time qmake is ran those libraries
+ do not exist yet and therefore the corresponding extra compiler rules were never
+ created, resulting in empty OBJECTS/SOURCES.
+
+ Even without such an exists() check, qmake extra compilers require the files
+ referred to in the .input variable to exist at qmake time. In this case the input
+ files were the static libraries, which do not exist yet.
+
+ This patch solves this by using a qmake extra target instead of extra
+ compiler, which does not have this limitation. The target is referenced
+ through the extension of GENERATED_SOURCES.
+
+ The patch also adds a d/_debug suffix for debug builds, do allow for separate
+ symbol exports if necessary.
+
+ * Scripts/generate-win32-export-forwards: Support multiple input files, i.e.
+ consider the last argument to be the output file and everything else input.
+ * qmake/mkspecs/features/win32/default_post.prf:
+
2012-07-23 Kent Tamura <tkent@chromium.org>
Rename ENABLE_METER_TAG and ENABLE_PROGRESS_TAG to ENABLE_METER_ELEMENT and ENABLE_PROGRESS_ELEMENT respectively
diff --git a/Tools/Scripts/generate-win32-export-forwards b/Tools/Scripts/generate-win32-export-forwards
index e75b430f4..768b3ba93 100755
--- a/Tools/Scripts/generate-win32-export-forwards
+++ b/Tools/Scripts/generate-win32-export-forwards
@@ -27,22 +27,27 @@ import subprocess
import sys
import re
-dumpBin = subprocess.Popen("dumpbin /directives " + sys.argv[1], stdout=subprocess.PIPE, universal_newlines=True);
+def exportForwardsForLibrary(library):
+ dumpBin = subprocess.Popen("dumpbin /directives " + library, stdout=subprocess.PIPE, universal_newlines=True);
-output, errors = dumpBin.communicate();
+ output, errors = dumpBin.communicate();
+ return output
-exportedSymbolRegexp = re.compile("\s*(?P<symbol>/EXPORT:.+)");
+libraries = sys.argv[1 : len(sys.argv) - 1]
+outputFileName = sys.argv[len(sys.argv) - 1]
+exportedSymbolRegexp = re.compile("\s*(?P<symbol>/EXPORT:.+)");
symbols = set()
-for line in output.splitlines():
- match = exportedSymbolRegexp.match(line)
- if match != None:
- symbols.add(match.group("symbol"))
+for lib in libraries:
+ for line in exportForwardsForLibrary(lib).splitlines():
+ match = exportedSymbolRegexp.match(line)
+ if match != None:
+ symbols.add(match.group("symbol"))
-print "Forwarding %s symbols from static library %s" % (len(symbols), sys.argv[1])
+print "Forwarding %s symbols from %s" % (len(symbols), " ".join(libraries))
-exportFile = open(sys.argv[2], "w")
+exportFile = open(outputFileName, "w")
for symbol in symbols:
exportFile.write("#pragma comment(linker, \"%s\")\n" % symbol);
exportFile.close()
diff --git a/Tools/qmake/mkspecs/features/win32/default_post.prf b/Tools/qmake/mkspecs/features/win32/default_post.prf
index d45d0455e..116556701 100644
--- a/Tools/qmake/mkspecs/features/win32/default_post.prf
+++ b/Tools/qmake/mkspecs/features/win32/default_post.prf
@@ -25,16 +25,21 @@ load(default_post)
shared:contains(TEMPLATE, lib) {
for(target, POST_TARGETDEPS) {
libdep = $$find(target, .*\\.lib)
- exists($$libdep): LIBSWITHEXPORTS += $$libdep
+ !isEmpty(libdep): LIBSWITHEXPORTS += $$libdep
}
}
!isEmpty(LIBSWITHEXPORTS) {
- exportgen.input = LIBSWITHEXPORTS
- exportgen.output = exports_${QMAKE_FILE_BASE}.cpp
- exportgen.commands = python $${ROOT_WEBKIT_DIR}$${QMAKE_DIR_SEP}Tools$${QMAKE_DIR_SEP}Scripts$${QMAKE_DIR_SEP}generate-win32-export-forwards ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT}
- exportgen.variable_out = SOURCES
- QMAKE_EXTRA_COMPILERS += exportgen
+ suffix =
+ CONFIG(debug, debug|release) {
+ win32: suffix = d
+ mac: suffix = _debug
+ }
+ forwarded_exports.target = forwarded-exports$${suffix}.cpp
+ forwarded_exports.commands = python $${ROOT_WEBKIT_DIR}$${QMAKE_DIR_SEP}Tools$${QMAKE_DIR_SEP}Scripts$${QMAKE_DIR_SEP}generate-win32-export-forwards $$LIBSWITHEXPORTS $$forwarded_exports.target
+ forwarded_exports.depends = $$LIBSWITHEXPORTS
+ QMAKE_EXTRA_TARGETS += forwarded_exports
+ GENERATED_SOURCES += $$forwarded_exports.target
}
# To ensure the Qt export macros are set to dllexport