summaryrefslogtreecommitdiffstats
path: root/mkspecs/features
diff options
context:
space:
mode:
Diffstat (limited to 'mkspecs/features')
-rw-r--r--mkspecs/features/build_pass.prf1
-rw-r--r--mkspecs/features/dbusadaptors.prf41
-rw-r--r--mkspecs/features/dbusinterfaces.prf42
-rw-r--r--mkspecs/features/debug.prf8
-rw-r--r--mkspecs/features/debug_and_release.prf1
-rw-r--r--mkspecs/features/default_post.prf122
-rw-r--r--mkspecs/features/default_pre.prf3
-rw-r--r--mkspecs/features/designer.prf7
-rw-r--r--mkspecs/features/dll.prf2
-rw-r--r--mkspecs/features/egl.prf21
-rw-r--r--mkspecs/features/exclusive_builds.prf100
-rw-r--r--mkspecs/features/help.prf4
-rw-r--r--mkspecs/features/include_source_dir.prf1
-rw-r--r--mkspecs/features/incredibuild_xge.prf11
-rw-r--r--mkspecs/features/lex.prf24
-rw-r--r--mkspecs/features/link_pkgconfig.prf12
-rw-r--r--mkspecs/features/mac/default_post.prf17
-rw-r--r--mkspecs/features/mac/default_pre.prf3
-rw-r--r--mkspecs/features/mac/dwarf2.prf6
-rw-r--r--mkspecs/features/mac/objective_c.prf23
-rw-r--r--mkspecs/features/mac/ppc.prf7
-rw-r--r--mkspecs/features/mac/ppc64.prf7
-rw-r--r--mkspecs/features/mac/rez.prf16
-rw-r--r--mkspecs/features/mac/sdk.prf8
-rw-r--r--mkspecs/features/mac/x86.prf7
-rw-r--r--mkspecs/features/mac/x86_64.prf7
-rw-r--r--mkspecs/features/moc.prf116
-rw-r--r--mkspecs/features/no_debug_info.prf14
-rw-r--r--mkspecs/features/qdbus.prf2
-rw-r--r--mkspecs/features/qt.prf221
-rw-r--r--mkspecs/features/qt_config.prf22
-rw-r--r--mkspecs/features/qt_functions.prf124
-rw-r--r--mkspecs/features/qtestlib.prf4
-rw-r--r--mkspecs/features/qtopia.prf1
-rw-r--r--mkspecs/features/qtopiainc.prf1
-rw-r--r--mkspecs/features/qtopialib.prf2
-rw-r--r--mkspecs/features/qttest_p4.prf23
-rw-r--r--mkspecs/features/release.prf7
-rw-r--r--mkspecs/features/resources.prf29
-rw-r--r--mkspecs/features/shared.prf7
-rw-r--r--mkspecs/features/silent.prf6
-rw-r--r--mkspecs/features/static.prf14
-rw-r--r--mkspecs/features/static_and_shared.prf3
-rw-r--r--mkspecs/features/staticlib.prf1
-rw-r--r--mkspecs/features/symbian/add_mmp_rules.prf33
-rw-r--r--mkspecs/features/symbian/application_icon.prf87
-rw-r--r--mkspecs/features/symbian/armcc_warnings.prf22
-rw-r--r--mkspecs/features/symbian/data_caging_paths.prf80
-rw-r--r--mkspecs/features/symbian/debug.prf1
-rw-r--r--mkspecs/features/symbian/def_files.prf96
-rw-r--r--mkspecs/features/symbian/def_files_disabled.prf13
-rw-r--r--mkspecs/features/symbian/default_post.prf100
-rw-r--r--mkspecs/features/symbian/default_pre.prf2
-rw-r--r--mkspecs/features/symbian/do_not_build_as_thumb.prf13
-rw-r--r--mkspecs/features/symbian/epocallowdlldata.prf1
-rw-r--r--mkspecs/features/symbian/localize_deployment.prf118
-rw-r--r--mkspecs/features/symbian/moc.prf18
-rw-r--r--mkspecs/features/symbian/nested_exceptions.prf4
-rw-r--r--mkspecs/features/symbian/opengl.prf21
-rw-r--r--mkspecs/features/symbian/platform_paths.prf496
-rw-r--r--mkspecs/features/symbian/prepend_includepath.prf14
-rw-r--r--mkspecs/features/symbian/qt.prf13
-rw-r--r--mkspecs/features/symbian/qt_config.prf9
-rw-r--r--mkspecs/features/symbian/release.prf1
-rw-r--r--mkspecs/features/symbian/run_on_phone.prf40
-rw-r--r--mkspecs/features/symbian/sis_targets.prf226
-rw-r--r--mkspecs/features/symbian/stl.prf43
-rw-r--r--mkspecs/features/symbian/stl_off.prf2
-rw-r--r--mkspecs/features/symbian/symbian_building.prf369
-rw-r--r--mkspecs/features/symbian/thread.prf2
-rw-r--r--mkspecs/features/testcase.prf65
-rw-r--r--mkspecs/features/uic.prf117
-rw-r--r--mkspecs/features/uitools.prf14
-rw-r--r--mkspecs/features/unix/bsymbolic_functions.prf6
-rw-r--r--mkspecs/features/unix/dylib.prf1
-rw-r--r--mkspecs/features/unix/gdb_dwarf_index.prf15
-rw-r--r--mkspecs/features/unix/hide_symbols.prf4
-rw-r--r--mkspecs/features/unix/largefile.prf2
-rw-r--r--mkspecs/features/unix/opengl.prf17
-rw-r--r--mkspecs/features/unix/openvg.prf15
-rw-r--r--mkspecs/features/unix/separate_debug_info.prf18
-rw-r--r--mkspecs/features/unix/thread.prf14
-rw-r--r--mkspecs/features/unix/x11.prf1
-rw-r--r--mkspecs/features/unix/x11inc.prf3
-rw-r--r--mkspecs/features/unix/x11lib.prf2
-rw-r--r--mkspecs/features/unix/x11sm.prf2
-rw-r--r--mkspecs/features/use_c_linker.prf5
-rw-r--r--mkspecs/features/vxworks.prf64
-rw-r--r--mkspecs/features/warn_off.prf4
-rw-r--r--mkspecs/features/warn_on.prf5
-rw-r--r--mkspecs/features/win32/console.prf4
-rw-r--r--mkspecs/features/win32/default_post.prf11
-rw-r--r--mkspecs/features/win32/default_pre.prf3
-rw-r--r--mkspecs/features/win32/dumpcpp.prf11
-rw-r--r--mkspecs/features/win32/embed_manifest_dll.prf12
-rw-r--r--mkspecs/features/win32/embed_manifest_exe.prf12
-rw-r--r--mkspecs/features/win32/exceptions.prf5
-rw-r--r--mkspecs/features/win32/exceptions_off.prf5
-rw-r--r--mkspecs/features/win32/ltcg.prf5
-rw-r--r--mkspecs/features/win32/msvc_mp.prf2
-rw-r--r--mkspecs/features/win32/opengl.prf11
-rw-r--r--mkspecs/features/win32/openvg.prf7
-rw-r--r--mkspecs/features/win32/qaxcontainer.prf32
-rw-r--r--mkspecs/features/win32/qaxserver.prf59
-rw-r--r--mkspecs/features/win32/qt_dll.prf1
-rw-r--r--mkspecs/features/win32/rtti.prf3
-rw-r--r--mkspecs/features/win32/rtti_off.prf4
-rw-r--r--mkspecs/features/win32/stl.prf3
-rw-r--r--mkspecs/features/win32/stl_off.prf3
-rw-r--r--mkspecs/features/win32/thread.prf26
-rw-r--r--mkspecs/features/win32/thread_off.prf2
-rw-r--r--mkspecs/features/win32/windows.prf15
-rw-r--r--mkspecs/features/yacc.prf42
113 files changed, 3574 insertions, 0 deletions
diff --git a/mkspecs/features/build_pass.prf b/mkspecs/features/build_pass.prf
new file mode 100644
index 0000000000..6547c97443
--- /dev/null
+++ b/mkspecs/features/build_pass.prf
@@ -0,0 +1 @@
+CONFIG += no_autoqmake
diff --git a/mkspecs/features/dbusadaptors.prf b/mkspecs/features/dbusadaptors.prf
new file mode 100644
index 0000000000..3463d586dd
--- /dev/null
+++ b/mkspecs/features/dbusadaptors.prf
@@ -0,0 +1,41 @@
+qtPrepareTool(QMAKE_QDBUSXML2CPP, qdbusxml2cpp)
+
+for(DBUS_ADAPTOR, $$list($$unique(DBUS_ADAPTORS))) {
+
+ !contains(DBUS_ADAPTOR, .*\\w\\.xml$) {
+ warning("Invalid D-BUS adaptor: '$${DBUS_ADAPTOR}', please use 'com.mydomain.myinterface.xml' instead.")
+ next()
+ }
+
+ DBUS_ADAPTOR_LIST += $${DBUS_ADAPTOR}
+}
+
+dbus_adaptor_header.commands = $$QMAKE_QDBUSXML2CPP -a ${QMAKE_FILE_OUT}: ${QMAKE_FILE_IN}
+dbus_adaptor_header.output_function = dbus_adaptor_header_output
+dbus_adaptor_header.name = DBUSXML2CPP ADAPTOR HEADER ${QMAKE_FILE_IN}
+dbus_adaptor_header.variable_out = DBUS_ADAPTOR_HEADERS
+dbus_adaptor_header.input = DBUS_ADAPTOR_LIST
+
+defineReplace(dbus_adaptor_header_output) {
+ return("$$lower($$section($$list($$basename(1)),.,-2,-2))_adaptor.h")
+}
+
+dbus_adaptor_source.commands = $$QMAKE_QDBUSXML2CPP -i ${QMAKE_FILE_OUT_BASE}.h -a :${QMAKE_FILE_OUT} ${QMAKE_FILE_IN}
+dbus_adaptor_source.output_function = dbus_adaptor_source_output
+dbus_adaptor_source.name = DBUSXML2CPP ADAPTOR SOURCE ${QMAKE_FILE_IN}
+dbus_adaptor_source.variable_out = SOURCES
+dbus_adaptor_source.input = DBUS_ADAPTOR_LIST
+
+load(moc)
+dbus_adaptor_moc.commands = $$moc_header.commands
+dbus_adaptor_moc.output = $$moc_header.output
+dbus_adaptor_moc.depends = $$dbus_adaptor_header.output
+dbus_adaptor_moc.input = DBUS_ADAPTOR_HEADERS
+dbus_adaptor_moc.variable_out = GENERATED_SOURCES
+dbus_adaptor_moc.name = $$moc_header.name
+
+defineReplace(dbus_adaptor_source_output) {
+ return("$$lower($$section($$list($$basename(1)),.,-2,-2))_adaptor.cpp")
+}
+
+QMAKE_EXTRA_COMPILERS += dbus_adaptor_header dbus_adaptor_source dbus_adaptor_moc
diff --git a/mkspecs/features/dbusinterfaces.prf b/mkspecs/features/dbusinterfaces.prf
new file mode 100644
index 0000000000..1828802a44
--- /dev/null
+++ b/mkspecs/features/dbusinterfaces.prf
@@ -0,0 +1,42 @@
+load(moc)
+
+qtPrepareTool(QMAKE_QDBUSXML2CPP, qdbusxml2cpp)
+
+for(DBUS_INTERFACE, $$list($$unique(DBUS_INTERFACES))) {
+
+ !contains(DBUS_INTERFACE, .*\\w\\.xml$) {
+ warning("Invalid D-BUS interface : '$${DBUS_INTERFACE}', please use 'com.mydomain.myinterface.xml' instead.")
+ next()
+ }
+
+ DBUS_INTERFACE_LIST += $${DBUS_INTERFACE}
+}
+
+dbus_interface_header.commands = $$QMAKE_QDBUSXML2CPP -p ${QMAKE_FILE_OUT}: ${QMAKE_FILE_IN}
+dbus_interface_header.output_function = dbus_interface_header_output
+dbus_interface_header.name = DBUSXML2CPP INTERFACE HEADER ${QMAKE_FILE_IN}
+dbus_interface_header.variable_out = DBUS_INTERFACE_HEADERS
+dbus_interface_header.input = DBUS_INTERFACE_LIST
+
+defineReplace(dbus_interface_header_output) {
+ return("$$lower($$section($$list($$basename(1)),.,-2,-2))_interface.h")
+}
+
+dbus_interface_source.commands = $$QMAKE_QDBUSXML2CPP -i ${QMAKE_FILE_OUT_BASE}.h -p :${QMAKE_FILE_OUT} ${QMAKE_FILE_IN}
+dbus_interface_source.output_function = dbus_interface_source_output
+dbus_interface_source.name = DBUSXML2CPP INTERFACE SOURCE ${QMAKE_FILE_IN}
+dbus_interface_source.variable_out = SOURCES
+dbus_interface_source.input = DBUS_INTERFACE_LIST
+
+dbus_interface_moc.commands = $$moc_header.commands
+dbus_interface_moc.output = $$moc_header.output
+dbus_interface_moc.depends = $$dbus_interface_header.output
+dbus_interface_moc.input = DBUS_INTERFACE_HEADERS
+dbus_interface_moc.variable_out = GENERATED_SOURCES
+dbus_interface_moc.name = $$moc_header.name
+
+defineReplace(dbus_interface_source_output) {
+ return("$$lower($$section($$list($$basename(1)),.,-2,-2))_interface.cpp")
+}
+
+QMAKE_EXTRA_COMPILERS += dbus_interface_header dbus_interface_source dbus_interface_moc
diff --git a/mkspecs/features/debug.prf b/mkspecs/features/debug.prf
new file mode 100644
index 0000000000..c1ba1256cf
--- /dev/null
+++ b/mkspecs/features/debug.prf
@@ -0,0 +1,8 @@
+CONFIG -= release
+contains(QT_CONFIG,dwarf2)|dwarf2:load(dwarf2, true)
+QMAKE_CFLAGS += $$QMAKE_CFLAGS_DEBUG
+QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_DEBUG
+QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_OBJECTIVE_CFLAGS_DEBUG
+QMAKE_LFLAGS += $$QMAKE_LFLAGS_DEBUG
+QMAKE_LIBFLAGS += $$QMAKE_LIBFLAGS_DEBUG
+!debug_and_release:fix_output_dirs:fixExclusiveOutputDirs(debug, release)
diff --git a/mkspecs/features/debug_and_release.prf b/mkspecs/features/debug_and_release.prf
new file mode 100644
index 0000000000..ef33789cab
--- /dev/null
+++ b/mkspecs/features/debug_and_release.prf
@@ -0,0 +1 @@
+!macx-xcode:!symbian:addExclusiveBuilds(debug, Debug, release, Release)
diff --git a/mkspecs/features/default_post.prf b/mkspecs/features/default_post.prf
new file mode 100644
index 0000000000..3f93220cc4
--- /dev/null
+++ b/mkspecs/features/default_post.prf
@@ -0,0 +1,122 @@
+QT_BREAKPAD_ROOT_PATH = $$(QT_BREAKPAD_ROOT_PATH)
+!isEmpty(QT_BREAKPAD_ROOT_PATH): \ # quick test first whether requested ...
+ !staticlib:!static:CONFIG(release, debug|release):contains(TEMPLATE, .*(app|lib)): \ # is it applicable?
+ !contains(TARGET, .*phony_target.*): \ # monster hack, you don't really see this here, right? ;)
+ system($$QT_BREAKPAD_ROOT_PATH/qtbreakpadsymbols --breakpad-exists) { # do we really have it?
+ CONFIG += breakpad
+ CONFIG -= no_debug_info separate_debug_info
+ QMAKE_CFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
+ QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO
+ QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
+}
+
+CONFIG(debug, debug|release):load(debug)
+else:load(release)
+debug_and_release:load(debug_and_release)
+incredibuild_xge {
+ CONFIG -= incredibuild_xge
+ CONFIG = incredibuild_xge $$CONFIG
+}
+
+breakpad {
+ !contains(DESTDIR, (/|.:[/\\\\]).*):TARGET_BASEPATH = $${OUT_PWD}/
+ !isEmpty(DESTDIR):TARGET_BASEPATH = $${TARGET_BASEPATH}$${DESTDIR}/
+
+ win32 {
+ TARGET_BASEPATH ~= s,/,\\,
+ contains(TEMPLATE, .*lib) {
+ isEmpty(TARGET_VERSION_EXT):!isEmpty(VERSION) {
+ TARGET_VERSION_EXT = $$section(VERSION, ., 0, 0)
+ isEqual(TARGET_VERSION_EXT, 0):unset(TARGET_VERSION_EXT)
+ }
+ TARGET_EXT = .dll
+ } else {
+ TARGET_EXT = .exe
+ }
+
+ DEBUGFILENAME = $${TARGET_BASEPATH}$${TARGET}$${TARGET_VERSION_EXT}$${TARGET_EXT}
+ PDBFILENAME = $${TARGET_BASEPATH}$${TARGET}$${TARGET_VERSION_EXT}.pdb
+ DEBUGFILENAME ~= s,/,\\,
+ PDBFILENAME ~= s,/,\\,
+ QMAKE_CLEAN += $$PDBFILENAME # for the debug case it is hardcoded in qmake
+ } else {
+ contains(TEMPLATE, .*lib):LIBPREFIX = lib
+
+ macx {
+ equals(TEMPLATE, lib) {
+ lib_bundle {
+ TARGET_BASEPATH = $${TARGET_BASEPATH}$${TARGET}.framework/$${TARGET}
+ } else {
+ TARGET_BASEPATH = $${TARGET_BASEPATH}$${LIBPREFIX}$${TARGET}
+ !plugin {
+ TEMP_VERSION = $$section(VERSION, ., 0, 0)
+ isEmpty(TEMP_VERSION):TEMP_VERSION = 1
+ TARGET_BASEPATH = $${TARGET_BASEPATH}.$${TEMP_VERSION}
+ }
+ TARGET_BASEPATH = $${TARGET_BASEPATH}.$${QMAKE_EXTENSION_SHLIB}
+ }
+ } else {
+ app_bundle {
+ TARGET_BASEPATH = $${TARGET_BASEPATH}$${TARGET}.app/Contents/MacOS/$${TARGET}
+ } else {
+ TARGET_BASEPATH = $${TARGET_BASEPATH}$${TARGET}
+ }
+ }
+ DEBUGFILENAME = $$TARGET_BASEPATH
+ } else {
+ equals(TEMPLATE, lib) {
+ plugin {
+ TARGET_BASEPATH = $${TARGET_BASEPATH}$${LIBPREFIX}$${TARGET}.so
+ } else {
+ TEMP_VERSION = $$VERSION
+ isEmpty(TEMP_VERSION):TEMP_VERSION = 1.0.0
+ TARGET_BASEPATH = $${TARGET_BASEPATH}$${LIBPREFIX}$${TARGET}.so.$${TEMP_VERSION}
+ }
+ } else {
+ TARGET_BASEPATH = $${TARGET_BASEPATH}$${TARGET}
+ }
+ DEBUGFILENAME = $$TARGET_BASEPATH
+ }
+ }
+
+ PROJECTPATH = $$OUT_PWD
+ win32:PROJECTPATH ~= s,/,\\,
+
+ !isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK = $$QMAKE_POST_LINK$$escape_expand(\\n\\t)
+ QMAKE_POST_LINK = $$QMAKE_POST_LINK$$quote($${QT_BREAKPAD_ROOT_PATH}$${QMAKE_DIR_SEP}qtbreakpadsymbols \"$$DEBUGFILENAME\" \"$$PROJECTPATH\")
+ !isEmpty(QMAKE_STRIP):QMAKE_POST_LINK = $$QMAKE_POST_LINK$$escape_expand(\\n\\t)$$quote($$QMAKE_STRIP \"$$DEBUGFILENAME\")
+
+ unset(TARGET_BASEPATH)
+ unset(SYMBOLFILENAME)
+ unset(TARGET_EXT)
+ unset(TARGET_VERSION_EXT)
+ unset(TEMP_VERSION)
+}
+
+QMAKE_INCDIR += $$QMAKE_INCDIR_POST
+QMAKE_LIBDIR += $$QMAKE_LIBDIR_POST
+
+# Let every project have a standard GNU `check' target
+!contains(QMAKE_EXTRA_TARGETS, check) {
+ # `make check' should iterate through all subdirs
+ contains(TEMPLATE, subdirs) {
+ check.CONFIG = recursive
+ check.recurse = $$SUBDIRS
+ check.recurse_target = check
+ }
+ # `make check' should imply building the project
+ else {
+ check.depends = first
+ }
+ QMAKE_EXTRA_TARGETS += check
+}
+
+# Add special translation sources for projects that require them.
+# Note 1: Since lupdate will not parse regular config scopes right, contains checks are used instead.
+# Note 2: Checking for last value of TEMPLATE is used instead of simple contains check because
+# lupdate doesn't respect "-=" variable assignments and therefore always finds "app"
+# as the first value of TEMPLATE variable.
+contains(CONFIG, lupdate_run):contains(CONFIG, localize_deployment) {
+ equals($$list($$last(TEMPLATE)), app): SOURCES += $$[QT_INSTALL_DATA]/mkspecs/common/symbian/appCaptionForTranslation.cpp
+ SOURCES += $$[QT_INSTALL_DATA]/mkspecs/common/symbian/packageNameForTranslation.cpp
+}
diff --git a/mkspecs/features/default_pre.prf b/mkspecs/features/default_pre.prf
new file mode 100644
index 0000000000..2e82f03eb9
--- /dev/null
+++ b/mkspecs/features/default_pre.prf
@@ -0,0 +1,3 @@
+load(exclusive_builds)
+### Qt 5: remove "uic" and "resources" - or add "qt"
+CONFIG = lex yacc warn_on debug uic resources $$CONFIG
diff --git a/mkspecs/features/designer.prf b/mkspecs/features/designer.prf
new file mode 100644
index 0000000000..fa40caab3f
--- /dev/null
+++ b/mkspecs/features/designer.prf
@@ -0,0 +1,7 @@
+QT += xml
+contains(QT_CONFIG, script): QT += script
+qt:load(qt)
+
+plugin:DEFINES += QDESIGNER_EXPORT_WIDGETS
+
+qtAddLibrary(QtDesigner)
diff --git a/mkspecs/features/dll.prf b/mkspecs/features/dll.prf
new file mode 100644
index 0000000000..943ab93def
--- /dev/null
+++ b/mkspecs/features/dll.prf
@@ -0,0 +1,2 @@
+CONFIG += shared
+
diff --git a/mkspecs/features/egl.prf b/mkspecs/features/egl.prf
new file mode 100644
index 0000000000..7e7d098236
--- /dev/null
+++ b/mkspecs/features/egl.prf
@@ -0,0 +1,21 @@
+# On UNIX, we can use config tests to figure out if egl.h is in
+# EGL/egl.h or GLES/egl.h. Sadly, there are no config tests on WinCE
+# so we have to assume that for GLES 1.1 (CL), the EGL header is in
+# GLES/egl.h. We also assume there is no separate libEGL.lib library,
+# so we use the GL library instead.
+
+wince*:contains(QT_CONFIG, opengles1) {
+ INCLUDEPATH += $$QMAKE_INCDIR_OPENGL_ES1
+ LIBS_PRIVATE += $$QMAKE_LIBS_OPENGL_ES1
+ for(p, QMAKE_LIBDIR_OPENGL_ES1) {
+ exists($$p):LIBS_PRIVATE += -L$$p
+ }
+ DEFINES += QT_GLES_EGL
+} else {
+ INCLUDEPATH += $$QMAKE_INCDIR_EGL
+ LIBS_PRIVATE += $$QMAKE_LIBS_EGL
+ LIBS += $$QMAKE_LFLAGS_EGL
+ for(p, QMAKE_LIBDIR_EGL) {
+ exists($$p):LIBS_PRIVATE += -L$$p
+ }
+}
diff --git a/mkspecs/features/exclusive_builds.prf b/mkspecs/features/exclusive_builds.prf
new file mode 100644
index 0000000000..8898c96a43
--- /dev/null
+++ b/mkspecs/features/exclusive_builds.prf
@@ -0,0 +1,100 @@
+# fixExclusiveOutputDirs(1config, 2config)
+# Change all output paths that references 2config to have the string 1config in them
+defineTest(fixExclusiveOutputDirs) {
+ unset(firstBuild)
+ unset(secondBuild)
+ unset(appendFirstBuild)
+ firstBuild = $$1
+ secondBuild = $$2
+ count(ARGS, 2, greaterThan):isEqual($$list($$lower($$3)), false):appendFirstBuild = false
+ else:appendFirstBuild = true
+
+ isEmpty(QMAKE_DIR_REPLACE):QMAKE_DIR_REPLACE += OBJECTS_DIR MOC_DIR RCC_DIR
+ lessThan(firstBuild, $$secondBuild):eval($${firstBuild}_and_$${secondBuild}_target:QMAKE_DIR_REPLACE += DESTDIR)
+ else:eval($${secondBuild}_and_$${firstBuild}_target:QMAKE_DIR_REPLACE += DESTDIR)
+ for(fix, QMAKE_DIR_REPLACE) {
+ isEmpty($$fix)|isEqual($$fix, .) {
+ eval($$fix = $${firstBuild})
+ } else:contains($$list($$first($$fix)), .*$${secondBuild}.*) {
+ eval($$fix ~= s/$${secondBuild}/$${firstBuild}/gi)
+ } else:isEqual(appendFirstBuild, true):!contains($$list($$first($$fix)), .*$${firstBuild}.*) {
+ contains($$list($${first($$fix)}), .*/$):eval($$fix = $${first($$fix)}$${firstBuild})
+ else:eval($$fix = $${first($$fix)}-$${firstBuild})
+ }
+ export($$fix)
+ }
+ return(true)
+}
+
+# addExclusiveBuilds(1config, 1name, 2config, 2name)
+# Adds two BUILDS which are exclusive to each other.
+defineTest(addExclusiveBuilds) {
+ unset(firstBuild)
+ unset(firstBuildName)
+ unset(secondBuild)
+ unset(secondBuildName)
+
+ firstBuild = $$1
+ firstBuildName = $$2
+ secondBuild = $$3
+ secondBuildName = $$4
+
+ contains(TEMPLATE, subdirs) {
+ eval(sub_$${firstBuildName}.target = $$firstBuild)
+ export(sub_$${firstBuildName}.target)
+ eval(sub_$${firstBuildName}.CONFIG = recursive)
+ export(sub_$${firstBuildName}.CONFIG)
+ eval(sub_$${secondBuildName}.target = $$secondBuild)
+ export(sub_$${secondBuildName}.target)
+ eval(sub_$${secondBuildName}.CONFIG = recursive)
+ export(sub_$${secondBuildName}.CONFIG)
+ QMAKE_EXTRA_TARGETS += sub_$${firstBuildName} sub_$${secondBuildName}
+ export(QMAKE_EXTRA_TARGETS)
+ } else:!build_pass {
+ first_BUILDS =
+ second_BUILDS =
+ suffix_BUILDS = Build
+
+ isEmpty(BUILDS): BUILDPERMUTATIONS = $$suffix_BUILDS
+ else: BUILDPERMUTATIONS = $$BUILDS
+
+ for(permutation, BUILDPERMUTATIONS) {
+ permutation ~= s/$${suffix_BUILDS}$//
+ isEmpty(permutation): permutationName =
+ else: permutationName = -$$permutation
+ # Makefile target rule
+ eval($${firstBuildName}$${permutation}.target = $${firstBuild}$$lower($${permutationName}))
+ export($${firstBuildName}$${permutation}.target)
+ # IDE name
+ eval($${firstBuildName}$${permutation}.name = $${firstBuildName}$${permutationName})
+ export($${firstBuildName}$${permutation}.name)
+ # prl import CONFIG option
+ eval($${firstBuildName}$${permutation}.PRL_CONFIG = $${firstBuild}$${permutation})
+ export($${firstBuildName}$${permutation}.PRL_CONFIG)
+ # Individual CONFIG option
+ eval($${firstBuildName}$${permutation}.CONFIG = $${firstBuild} $${firstBuildName}Build $$eval($${permutation}.CONFIG))
+ export($${firstBuildName}$${permutation}.CONFIG)
+
+ eval($${secondBuildName}$${permutation}.target = $${secondBuild}$$lower($${permutationName}))
+ export($${secondBuildName}$${permutation}.target)
+ eval($${secondBuildName}$${permutation}.name = $${secondBuildName}$${permutationName})
+ export($${secondBuildName}$${permutation}.name)
+ eval($${secondBuildName}$${permutation}.PRL_CONFIG = $${secondBuild}$${permutation})
+ export($${secondBuildName}$${permutation}.PRL_CONFIG)
+ eval($${secondBuildName}$${permutation}.CONFIG = $${secondBuild} $${secondBuildName}Build $$eval($${permutation}.CONFIG))
+ export($${secondBuildName}$${permutation}.CONFIG)
+
+ first_BUILDS += $${firstBuildName}$${permutation}
+ second_BUILDS += $${secondBuildName}$${permutation}
+ }
+
+ # A mutual exclusive block.
+ CONFIG($${firstBuild}, $${firstBuild}|$${secondBuild}): BUILDS = $$first_BUILDS $$second_BUILDS
+ else: BUILDS = $$second_BUILDS $$first_BUILDS
+ export(BUILDS)
+ } else {
+ eval($${firstBuildName}Build:fixExclusiveOutputDirs($$firstBuild, $$secondBuild, false))
+ eval($${secondBuildName}Build:fixExclusiveOutputDirs($$secondBuild, $$firstBuild, false))
+ }
+ return(true)
+}
diff --git a/mkspecs/features/help.prf b/mkspecs/features/help.prf
new file mode 100644
index 0000000000..15685e7a57
--- /dev/null
+++ b/mkspecs/features/help.prf
@@ -0,0 +1,4 @@
+INCLUDEPATH = $$QMAKE_INCDIR_QT/QtHelp $$INCLUDEPATH
+QT += xml sql
+
+qtAddLibrary(QtHelp)
diff --git a/mkspecs/features/include_source_dir.prf b/mkspecs/features/include_source_dir.prf
new file mode 100644
index 0000000000..8794998f43
--- /dev/null
+++ b/mkspecs/features/include_source_dir.prf
@@ -0,0 +1 @@
+!equals(_PRO_FILE_PWD_, $$OUT_PWD):INCLUDEPATH *= .
diff --git a/mkspecs/features/incredibuild_xge.prf b/mkspecs/features/incredibuild_xge.prf
new file mode 100644
index 0000000000..97ccc44066
--- /dev/null
+++ b/mkspecs/features/incredibuild_xge.prf
@@ -0,0 +1,11 @@
+contains(TEMPLATE, "vc.*") {
+ EOC = $$escape_expand(\\n\\t)
+
+ # The VCPROJ generator will replace the \r\h with the coded \r\n: 

+ # No other generator understands the \h
+ win32-msvc2*|wince*msvc*: EOC = $$escape_expand(\\r\\h)
+
+ for(xge, INCREDIBUILD_XGE) {
+ $${xge}.commands = Rem IncrediBuild_AllowRemote $$EOC Rem IncrediBuild_OutputFile $$replace($${xge}.output,/,\\) $$EOC $$eval($${xge}.commands)
+ }
+}
diff --git a/mkspecs/features/lex.prf b/mkspecs/features/lex.prf
new file mode 100644
index 0000000000..43d8fbd038
--- /dev/null
+++ b/mkspecs/features/lex.prf
@@ -0,0 +1,24 @@
+#
+# Lex extra-compiler for handling files specified in the LEXSOURCES variable
+#
+
+{
+ lex.name = Lex ${QMAKE_FILE_IN}
+ lex.input = LEXSOURCES
+ lex_included {
+ lex.CONFIG += no_link
+ } else {
+ lex.variable_out = GENERATED_SOURCES
+ }
+ isEmpty(QMAKE_LEXFLAGS_MANGLE):QMAKE_LEXFLAGS_MANGLE = -P${QMAKE_FILE_BASE}
+ QMAKE_LEXEXTRAFLAGS = $$QMAKE_LEXFLAGS
+ !yacc_no_name_mangle:QMAKE_LEXEXTRAFLAGS += $$QMAKE_LEXFLAGS_MANGLE
+
+ lex.commands = $$QMAKE_LEX $$QMAKE_LEXEXTRAFLAGS ${QMAKE_FILE_IN}$$escape_expand(\\n\\t) \
+ $$QMAKE_DEL_FILE $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_lex$${first(QMAKE_EXT_CPP)}$$escape_expand(\\n\\t) \
+ $$QMAKE_MOVE lex.${QMAKE_FILE_BASE}.c $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_lex$${first(QMAKE_EXT_CPP)}$$escape_expand(\\n\\t)
+ lex.output = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_lex$${first(QMAKE_EXT_CPP)}
+
+ silent:lex.commands = @echo Lex ${QMAKE_FILE_IN} && $$lex.commands
+ QMAKE_EXTRA_COMPILERS += lex
+}
diff --git a/mkspecs/features/link_pkgconfig.prf b/mkspecs/features/link_pkgconfig.prf
new file mode 100644
index 0000000000..a3dbd1ffcc
--- /dev/null
+++ b/mkspecs/features/link_pkgconfig.prf
@@ -0,0 +1,12 @@
+# handle pkg-config files
+isEmpty(PKG_CONFIG):PKG_CONFIG = pkg-config # keep consistent with qt_functions.prf too!
+
+for(PKGCONFIG_LIB, $$list($$unique(PKGCONFIG))) {
+ # don't proceed if the .pro asks for a package we don't have!
+ !packagesExist($$PKGCONFIG_LIB):error("Package $$PKGCONFIG_LIB not found")
+
+ QMAKE_CXXFLAGS += $$system($$PKG_CONFIG --cflags $$PKGCONFIG_LIB)
+ QMAKE_CFLAGS += $$system($$PKG_CONFIG --cflags $$PKGCONFIG_LIB)
+ LIBS += $$system($$PKG_CONFIG --libs $$PKGCONFIG_LIB)
+}
+
diff --git a/mkspecs/features/mac/default_post.prf b/mkspecs/features/mac/default_post.prf
new file mode 100644
index 0000000000..273094d4cd
--- /dev/null
+++ b/mkspecs/features/mac/default_post.prf
@@ -0,0 +1,17 @@
+load(default_post)
+!no_objective_c:CONFIG += objective_c
+
+# Pick a suitable default architecture for qmake-based applications.
+# If the Qt package contains one of x86 and x86_64, pick that one. If it
+# contains both then use the compiler default. Make a similiar decision for
+# PowerPC-based systems. Note that this logic assumes that Qt has been
+# configured with an architecture that is usable on the system.
+qt:!isEmpty(QT_CONFIG) {
+ contains(QMAKE_HOST.arch, ppc)|contains(QMAKE_HOST.arch, "Power Macintosh") {
+ !contains(QT_CONFIG, ppc64):contains(QT_CONFIG, ppc):CONFIG += ppc
+ contains(QT_CONFIG, ppc64):!contains(QT_CONFIG, ppc):CONFIG += ppc64
+ } else {
+ !contains(QT_CONFIG, x86_64):contains(QT_CONFIG, x86):CONFIG += x86
+ contains(QT_CONFIG, x86_64):!contains(QT_CONFIG, x86):CONFIG += x86_64
+ }
+}
diff --git a/mkspecs/features/mac/default_pre.prf b/mkspecs/features/mac/default_pre.prf
new file mode 100644
index 0000000000..81e1d061f8
--- /dev/null
+++ b/mkspecs/features/mac/default_pre.prf
@@ -0,0 +1,3 @@
+CONFIG = sdk rez $$CONFIG
+load(default_pre)
+
diff --git a/mkspecs/features/mac/dwarf2.prf b/mkspecs/features/mac/dwarf2.prf
new file mode 100644
index 0000000000..fc055629f8
--- /dev/null
+++ b/mkspecs/features/mac/dwarf2.prf
@@ -0,0 +1,6 @@
+macx-xcode|macx-pbuilder {
+} else {
+ QMAKE_CFLAGS_DEBUG += $$QMAKE_CFLAGS_DWARF2
+ QMAKE_OBJECTIVE_CFLAGS_DEBUG += $$QMAKE_OBJECTIVE_DWARF2
+ QMAKE_CXXFLAGS_DEBUG += $$QMAKE_CXXFLAGS_DWARF2
+}
diff --git a/mkspecs/features/mac/objective_c.prf b/mkspecs/features/mac/objective_c.prf
new file mode 100644
index 0000000000..0f25f41eec
--- /dev/null
+++ b/mkspecs/features/mac/objective_c.prf
@@ -0,0 +1,23 @@
+
+for(source, SOURCES) {
+ contains(source,.*\\.mm?$) {
+ warning(Objective-C source \'$$source\' found in SOURCES but should be in OBJECTIVE_SOURCES)
+ SOURCES -= $$source
+ OBJECTIVE_SOURCES += $$source
+ }
+}
+
+isEmpty(QMAKE_OBJECTIVE_CC):QMAKE_OBJECTIVE_CC = $$QMAKE_CC
+
+OBJECTIVE_C_OBJECTS_DIR = $$OBJECTS_DIR
+isEmpty(OBJECTIVE_C_OBJECTS_DIR):OBJECTIVE_C_OBJECTS_DIR = .
+isEmpty(QMAKE_EXT_OBJECTIVE_C):QMAKE_EXT_OBJECTIVE_C = .mm .m
+
+objective_c.dependency_type = TYPE_C
+objective_c.variables = QMAKE_OBJECTIVE_CFLAGS
+objective_c.commands = $$QMAKE_OBJECTIVE_CC -c $(QMAKE_COMP_QMAKE_OBJECTIVE_CFLAGS) $(DEFINES) $(INCPATH) ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
+objective_c.output = $$OBJECTIVE_C_OBJECTS_DIR/${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)}
+objective_c.input = OBJECTIVE_SOURCES
+objective_c.name = Compile ${QMAKE_FILE_IN}
+silent:objective_c.commands = @echo objective-c ${QMAKE_FILE_IN} && $$objective_c.commands
+QMAKE_EXTRA_COMPILERS += objective_c
diff --git a/mkspecs/features/mac/ppc.prf b/mkspecs/features/mac/ppc.prf
new file mode 100644
index 0000000000..e9169d9aa3
--- /dev/null
+++ b/mkspecs/features/mac/ppc.prf
@@ -0,0 +1,7 @@
+macx-xcode|macx-pbuilder {
+} else {
+ QMAKE_CFLAGS += $$QMAKE_CFLAGS_PPC
+ QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_OBJECTIVE_CFLAGS_PPC
+ QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_PPC
+ QMAKE_LFLAGS += $$QMAKE_LFLAGS_PPC
+}
diff --git a/mkspecs/features/mac/ppc64.prf b/mkspecs/features/mac/ppc64.prf
new file mode 100644
index 0000000000..5a04d5beb3
--- /dev/null
+++ b/mkspecs/features/mac/ppc64.prf
@@ -0,0 +1,7 @@
+macx-xcode|macx-pbuilder {
+} else {
+ QMAKE_CFLAGS += $$QMAKE_CFLAGS_PPC_64
+ QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_OBJECTIVE_CFLAGS_PPC_64
+ QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_PPC_64
+ QMAKE_LFLAGS += $$QMAKE_LFLAGS_PPC_64
+}
diff --git a/mkspecs/features/mac/rez.prf b/mkspecs/features/mac/rez.prf
new file mode 100644
index 0000000000..3defd8685a
--- /dev/null
+++ b/mkspecs/features/mac/rez.prf
@@ -0,0 +1,16 @@
+
+#global defaults
+isEmpty(QMAKE_REZ) {
+ QMAKE_REZ = /Developer/Tools/Rez
+}
+isEmpty(REZ_DIR):REZ_DIR = .
+isEmpty(QMAKE_EXT_REZ):QMAKE_EXT_REZ = .rsrc
+
+rez_source.CONFIG += no_link
+rez_source.dependency_type = TYPE_C
+rez_source.commands = $$QMAKE_REZ ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT} -useDF
+rez_source.output = $$REZ_DIR/${QMAKE_FILE_BASE}$${first(QMAKE_EXT_REZ)}
+rez_source.input = REZ_FILES
+rez_source.name = REZ ${QMAKE_FILE_IN}
+silent:rez_source.commands = @echo rez ${QMAKE_FILE_IN} && $$rez_source.commands
+QMAKE_EXTRA_COMPILERS += rez_source
diff --git a/mkspecs/features/mac/sdk.prf b/mkspecs/features/mac/sdk.prf
new file mode 100644
index 0000000000..5eab94896b
--- /dev/null
+++ b/mkspecs/features/mac/sdk.prf
@@ -0,0 +1,8 @@
+!isEmpty(QMAKE_MAC_SDK) {
+ !macx-xcode:!macx-pbuilder {
+ QMAKE_CFLAGS += -isysroot $$QMAKE_MAC_SDK
+ QMAKE_OBJECTIVE_CFLAGS += -isysroot $$QMAKE_MAC_SDK
+ QMAKE_CXXFLAGS += -isysroot $$QMAKE_MAC_SDK
+ QMAKE_LFLAGS += -Wl,-syslibroot,$$QMAKE_MAC_SDK
+ }
+}
diff --git a/mkspecs/features/mac/x86.prf b/mkspecs/features/mac/x86.prf
new file mode 100644
index 0000000000..a7a9f84274
--- /dev/null
+++ b/mkspecs/features/mac/x86.prf
@@ -0,0 +1,7 @@
+macx-xcode|macx-pbuilder {
+} else {
+ QMAKE_CFLAGS += $$QMAKE_CFLAGS_X86
+ QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_OBJECTIVE_CFLAGS_X86
+ QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_X86
+ QMAKE_LFLAGS += $$QMAKE_LFLAGS_X86
+}
diff --git a/mkspecs/features/mac/x86_64.prf b/mkspecs/features/mac/x86_64.prf
new file mode 100644
index 0000000000..65b6b79651
--- /dev/null
+++ b/mkspecs/features/mac/x86_64.prf
@@ -0,0 +1,7 @@
+macx-xcode|macx-pbuilder {
+} else {
+ QMAKE_CFLAGS += $$QMAKE_CFLAGS_X86_64
+ QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_OBJECTIVE_CFLAGS_X86_64
+ QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_X86_64
+ QMAKE_LFLAGS += $$QMAKE_LFLAGS_X86_64
+}
diff --git a/mkspecs/features/moc.prf b/mkspecs/features/moc.prf
new file mode 100644
index 0000000000..d0b36e41b2
--- /dev/null
+++ b/mkspecs/features/moc.prf
@@ -0,0 +1,116 @@
+
+#global defaults
+qtPrepareTool(QMAKE_MOC, moc)
+isEmpty(MOC_DIR):MOC_DIR = .
+isEmpty(QMAKE_H_MOD_MOC):QMAKE_H_MOD_MOC = moc_
+isEmpty(QMAKE_EXT_CPP_MOC):QMAKE_EXT_CPP_MOC = .moc
+
+# On Windows, put the includes into a .inc file which moc will read, if the project
+# has too many includes. We do this to overcome a command-line limit on Win < XP
+INCLUDETEMP=
+WIN_INCLUDETEMP=
+win32:count($$list($$INCLUDEPATH), 40, >) {
+ INCLUDETEMP = $$MOC_DIR/mocinclude.tmp
+
+ WIN_INCLUDETEMP=$$INCLUDETEMP
+
+ EOC = $$escape_expand(\\n\\t)
+
+ contains(TEMPLATE, "vc.*") {
+ # the VCPROJ generator will replace the \r\h with the coded \r\n: &#x0d;&#x0a;
+ # No other generator understands the \h
+ if(win32-msvc2*|wince*msvc*): EOC = $$escape_expand(\\r\\h)
+ else: EOC = $$escape_expand(\\\\\\n\\t)
+ }
+
+ unset(INCFILELIST)
+ RET =
+ for(incfile, $$list($$INCLUDEPATH)) {
+ INCFILELIST = -I$$incfile
+ isEmpty(RET): RET += @echo $$INCFILELIST> $$WIN_INCLUDETEMP $$EOC
+ else: RET += @echo $$INCFILELIST>> $$WIN_INCLUDETEMP $$EOC
+ }
+ !isEmpty(INCFILELIST):RET += @echo $$INCFILELIST>> $$WIN_INCLUDETEMP $$EOC
+
+ build_pass|isEmpty(BUILDS) {
+ mocinclude.target = $$INCLUDETEMP
+ mocinclude.commands = $$RET
+ QMAKE_EXTRA_TARGETS += mocinclude
+ }
+}
+
+defineReplace(mocCmdBase) {
+ !isEmpty(WIN_INCLUDETEMP) {
+ RET =
+ contains(TEMPLATE, "vc.*") {
+ RET += $$mocinclude.commands
+ }
+ RET += $$QMAKE_MOC $(DEFINES) @$$WIN_INCLUDETEMP $$join(QMAKE_COMPILER_DEFINES, " -D", -D)
+ return($$RET)
+ }
+ return($$QMAKE_MOC $(DEFINES) $(INCPATH) $$join(QMAKE_COMPILER_DEFINES, " -D", -D))
+}
+
+#moc headers
+moc_header.CONFIG = moc_verify
+moc_header.dependency_type = TYPE_C
+moc_header.commands = ${QMAKE_FUNC_mocCmdBase} ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
+moc_header.output = $$MOC_DIR/$${QMAKE_H_MOD_MOC}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_CPP)}
+moc_header.input = HEADERS
+moc_header.variable_out = SOURCES
+moc_header.name = MOC ${QMAKE_FILE_IN}
+!contains(TEMPLATE, "vc.*") {
+ !isEmpty(INCLUDETEMP):moc_header.depends += $$INCLUDETEMP
+}
+silent:moc_header.commands = @echo moc ${QMAKE_FILE_IN} && $$moc_header.commands
+QMAKE_EXTRA_COMPILERS += moc_header
+INCREDIBUILD_XGE += moc_header
+
+#moc sources
+moc_source.CONFIG = no_link moc_verify
+moc_source.dependency_type = TYPE_C
+moc_source.commands = ${QMAKE_FUNC_mocCmdBase} ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
+moc_source.output = $$MOC_DIR/$${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_EXT_CPP_MOC}
+moc_source.input = SOURCES OBJECTIVE_SOURCES
+moc_source.name = MOC ${QMAKE_FILE_IN}
+!contains(TEMPLATE, "vc.*") {
+ !isEmpty(INCLUDETEMP):moc_source.depends += $$INCLUDETEMP
+}
+silent:moc_source.commands = @echo moc ${QMAKE_FILE_IN} && $$moc_source.commands
+QMAKE_EXTRA_COMPILERS += moc_source
+INCREDIBUILD_XGE += moc_source
+
+#make sure we can include these files
+moc_dir_short = $$MOC_DIR
+contains(QMAKE_HOST.os,Windows):moc_dir_short ~= s,^.:,/,
+contains(moc_dir_short, ^[/\\\\].*):INCLUDEPATH += $$MOC_DIR
+else:INCLUDEPATH += $$OUT_PWD/$$MOC_DIR
+
+# Backwards compatibility: Make shadow builds with default MOC_DIR work
+# if the user did not add the source dir explicitly.
+equals(MOC_DIR, .) {
+ CONFIG -= include_source_dir
+ CONFIG = include_source_dir $$CONFIG
+}
+
+#auto depend on moc
+unix:!symbian:!no_mocdepend {
+ moc_source.depends += $$first(QMAKE_MOC)
+ moc_header.depends += $$first(QMAKE_MOC)
+ !contains(TARGET, moc) { #auto build moc
+ isEmpty(QMAKE_MOC_SRC):QMAKE_MOC_SRC = "$(QTDIR)/src/tools/moc"
+ make_moc.target = $$first(QMAKE_MOC)
+ make_moc.commands = (cd $$QMAKE_MOC_SRC && $(MAKE))
+ QMAKE_EXTRA_TARGETS += make_moc
+ }
+}
+
+#generate a mocclean
+build_pass|isEmpty(BUILDS):mocclean.depends = compiler_moc_header_clean compiler_moc_source_clean
+else:mocclean.CONFIG += recursive
+QMAKE_EXTRA_TARGETS += mocclean
+
+#generate a mocables
+build_pass|isEmpty(BUILDS):mocables.depends = compiler_moc_header_make_all compiler_moc_source_make_all
+else:mocables.CONFIG += recursive
+QMAKE_EXTRA_TARGETS += mocables
diff --git a/mkspecs/features/no_debug_info.prf b/mkspecs/features/no_debug_info.prf
new file mode 100644
index 0000000000..e05410d491
--- /dev/null
+++ b/mkspecs/features/no_debug_info.prf
@@ -0,0 +1,14 @@
+
+win32-msvc2*|wince*msvc* {
+ QMAKE_CFLAGS -= -Zi
+ QMAKE_CFLAGS_DEBUG -= -Zi
+ QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO -= -Zi
+ QMAKE_CXXFLAGS -= -Zi
+ QMAKE_CXXFLAGS_DEBUG -= -Zi
+ QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO -= -Zi
+} else {
+ QMAKE_CFLAGS -= -g -ggdb3
+ QMAKE_CXXFLAGS -= -g -ggdb3
+ QMAKE_LFLAGS -= -g -ggdb3
+ QMAKE_LIBFLAGS -= -g -ggdb3
+}
diff --git a/mkspecs/features/qdbus.prf b/mkspecs/features/qdbus.prf
new file mode 100644
index 0000000000..1d8704d3d5
--- /dev/null
+++ b/mkspecs/features/qdbus.prf
@@ -0,0 +1,2 @@
+qtAddLibrary(QtDBus)
+CONFIG += dbusadaptors dbusinterfaces
diff --git a/mkspecs/features/qt.prf b/mkspecs/features/qt.prf
new file mode 100644
index 0000000000..191a449719
--- /dev/null
+++ b/mkspecs/features/qt.prf
@@ -0,0 +1,221 @@
+CONFIG *= moc thread
+
+#handle defines
+win32 {
+ qt_static:DEFINES += QT_NODLL
+ !contains(DEFINES, QT_NODLL) {
+ QT_ENV_DLL = $$(QT_DLL)
+ QT_ENV_NO_DLL = $$(QT_NODLL)
+ isEmpty(QT_ENV_NO_DLL) {
+ shared|!isEmpty(QT_ENV_DLL):DEFINES += QT_DLL
+ }
+ contains(DEFINES, QT_MAKEDLL)|contains(DEFINES, QT_DLL):QMAKE_QT_DLL = 1
+ }
+}
+CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG
+no_keywords:DEFINES += QT_NO_KEYWORDS
+plugin { #Qt plugins
+ static:DEFINES += QT_STATICPLUGIN
+ DEFINES += QT_PLUGIN
+
+ # Triggers both on Qt being configured with -arch boundschecker,
+ # and if you qmake CONFIG+=boundchecker on your plugin project
+ boundschecker|contains(QT_CONFIG,boundschecker) {
+ # This option is added for plugins when Qt is configured for Boundschecker,
+ # since we want Boundschecker to not instrument the qt_plugin_query_verification_data
+ # function, as we call that function without the plugin's dependent DLLs, thus
+ # Boundscheckers instrumentation will fail. The function only returns a const char *,
+ # so no instrumentation is really needed on that function anyways.
+ QMAKE_CFLAGS += /nmignore:*:qt_plugin_query_verification_data
+ QMAKE_CXXFLAGS += /nmignore:*:qt_plugin_query_verification_data
+ }
+}
+
+#handle includes
+INCLUDEPATH = $$QMAKE_INCDIR_QT $$INCLUDEPATH #prepending prevents us from picking up "stale" includes
+win32:INCLUDEPATH += $$QMAKE_INCDIR_QT/ActiveQt
+
+# As order does matter for static libs, we reorder the QT variable here
+TMPLIBS = declarative webkit phonon multimedia dbus testlib script scripttools svg qt3support sql xmlpatterns xml egl opengl openvg gui network core meegographicssystemhelper
+for(QTLIB, $$list($$TMPLIBS)) {
+ contains(QT, $$QTLIB): QT_ORDERED += $$QTLIB
+}
+
+QT_UNKNOWN = $$QT
+QT_UNKNOWN -= $$QT_ORDERED
+QT = $$QT_ORDERED
+for(QTLIB, $$list($$QT_UNKNOWN)) {
+ !contains(TMPLIBS, $$QTLIB):message("Warning: unknown QT: $$QTLIB")
+}
+
+QT_PLUGIN_VERIFY = QTPLUGIN DEPLOYMENT_PLUGIN
+for(QT_CURRENT_VERIFY, $$list($$QT_PLUGIN_VERIFY)) {
+ for(QTPLUG, $$list($$lower($$unique($$QT_CURRENT_VERIFY)))) {
+ qplugin_style =
+ !qt_debug:!qt_release {
+ CONFIG(debug, debug|release):qplugin_style = debug
+ else:qplugin_style = release
+ } else:CONFIG(qt_debug, qt_debug|qt_release) {
+ qplugin_style = debug
+ } else {
+ qplugin_style = release
+ }
+
+ # Check if the plugin is known to Qt. We can use this to determine
+ # the plugin path. Unknown plugins must rely on the default link path.
+ ACCESSIBLEPLUGINS = qtaccessiblewidgets qtaccessiblecompatwidgets
+ CODECPLUGINS = qcncodecs qjpcodecs qkrcodecs qtwcodecs
+ DECORATIONPLUGINS = qdecorationdefault qdecorationwindows
+ GFXDRIVERPLUGINS = qgfxvnc qscreenvfb qgfxsnap qgfxvga16 qgfxmatrox qgfxvoodoo qgfxtransformed qgfxshadowfb
+ IMAGEPLUGINS = qgif qmng qjpeg qsvg
+ INPUTPLUGINS = qimsw-multi
+ MOUSEDRIVERPLUGINS = qtslibmousehandler
+ SQLPLUGINS = qsqldb2 qsqloci qsqltds qsqlodbc qsqlpsql qsqlibase qsqlmysql qsqlite2 qsqlite
+ PHONONPLUGINS = phonon_waveout phonon_ds9
+
+ ALLQTPLUGINS = $$ACCESSIBLEPLUGINS $$CODECPLUGINS $$DECORATIONPLUGINS $$GFXDRIVERPLUGINS $$IMAGEPLUGINS $$INPUTPLUGINS $$MOUSEDRIVERPLUGINS $$SQLPLUGINS $$PHONONPLUGINS
+
+ QT_PLUGINPATH =
+ contains(ALLQTPLUGINS, $$QTPLUG) {
+ # Determine the plugin path
+ contains(ACCESSIBLEPLUGINS, $$QTPLUG): QT_PLUGINPATH = accessible
+ contains(CODECPLUGINS, $$QTPLUG): QT_PLUGINPATH = codecs
+ contains(DECORATIONPLUGINS, $$QTPLUG): QT_PLUGINPATH = decorations
+ contains(GFXDRIVERPLUGINS, $$QTPLUG): QT_PLUGINPATH = gfxdrivers
+ contains(IMAGEPLUGINS, $$QTPLUG): QT_PLUGINPATH = imageformats
+ contains(INPUTPLUGINS, $$QTPLUG): QT_PLUGINPATH = inputmethods
+ contains(MOUSEDRIVERPLUGINS, $$QTPLUG): QT_PLUGINPATH = mousedrivers
+ contains(SQLPLUGINS, $$QTPLUG): QT_PLUGINPATH = sqldrivers
+ contains(PHONONPLUGINS, $$QTPLUG): QT_PLUGINPATH = phonon_backend
+ }
+
+ # Generate the plugin linker line
+ target_qt:isEqual(TARGET, QTPLUG) {
+ warning($$TARGET cannot have a QTPLUGIN of $$QTPLUG)
+ } else {
+ QT_LINKAGE = -l$${QTPLUG}
+ win32 {
+ CONFIG(debug, debug|release):QT_LINKAGE = -l$${QTPLUG}d
+ } else:mac {
+ isEqual(qplugin_style, debug):QT_LINKAGE = -l$${QTPLUG}_debug
+ }
+ }
+
+ # Only link against plugin in static builds
+ isEqual(QT_CURRENT_VERIFY, QTPLUGIN): {
+ !isEmpty(QT_PLUGINPATH): LIBS *= -L$$[QT_INSTALL_PLUGINS]/$$QT_PLUGINPATH
+ LIBS += $$QT_LINKAGE
+ # if the plugin is linked statically there is no need to deploy it
+ DEPLOYMENT_PLUGIN -= $$QT_CURRENT_VERIFY
+ }
+ isEqual(QT_CURRENT_VERIFY, DEPLOYMENT_PLUGIN):shared:wince*: {
+ QT_ITEM =
+ CONFIG(debug, debug|release): QT_ITEM = $${QTPLUG}d4.dll
+ else: QT_ITEM = $${QTPLUG}4.dll
+
+ eval(qt_additional_plugin_$${QTPLUG}.files = $$[QT_INSTALL_PLUGINS]/$${QT_PLUGINPATH}/$${QT_ITEM})
+ eval(qt_additional_plugin_$${QTPLUG}.path = $${QT_PLUGINPATH})
+
+ DEPLOYMENT *= qt_additional_plugin_$${QTPLUG}
+ }
+ isEqual(QT_CURRENT_VERIFY, DEPLOYMENT_PLUGIN):shared:symbian: {
+ QT_ITEM = $${QTPLUG}.dll
+
+ eval(qt_additional_plugin_$${QTPLUG}.files = $${QT_ITEM})
+ eval(qt_additional_plugin_$${QTPLUG}.path = $${QT_PLUGINPATH})
+
+ DEPLOYMENT *= qt_additional_plugin_$${QTPLUG}
+ }
+ }
+}
+#specific module settings
+!isEmpty(QT_BUILD_TREE):QMAKE_LIBDIR = $$QT_BUILD_TREE/lib $$QMAKE_LIBDIR #as above, prepending prevents us from picking up "stale" libs
+QMAKE_LIBDIR += $$QMAKE_LIBDIR_QT
+for(QTLIB, $$list($$lower($$unique(QT)))) {
+ unset(qlib_style)
+ !qt_debug:!qt_release {
+ CONFIG(debug, debug|release):qlib_style = debug
+ else:qlib_style = release
+ } else:CONFIG(qt_debug, qt_debug|qt_release) {
+ qlib_style = debug
+ } else {
+ qlib_style = release
+ }
+
+ unset(qlib)
+ isEqual(QTLIB, gui):qlib = QtGui
+ else:isEqual(QTLIB, network):qlib = QtNetwork
+ else:isEqual(QTLIB, xml):qlib = QtXml
+ else:isEqual(QTLIB, xmlpatterns):qlib = QtXmlPatterns
+ else:isEqual(QTLIB, opengl):qlib = QtOpenGL
+ else:isEqual(QTLIB, openvg):qlib = QtOpenVG
+ else:isEqual(QTLIB, sql):qlib = QtSql
+ else:isEqual(QTLIB, core):qlib = QtCore
+ else:isEqual(QTLIB, canvas):qlib = QtCanvas
+ else:isEqual(QTLIB, qt3support):qlib = Qt3Support
+ else:isEqual(QTLIB, svg):qlib = QtSvg
+ else:isEqual(QTLIB, script):qlib = QtScript
+ else:isEqual(QTLIB, scripttools):qlib = QtScriptTools
+ else:isEqual(QTLIB, testlib):qlib = QtTest
+ else:isEqual(QTLIB, dbus):qlib = QtDBus
+ else:isEqual(QTLIB, phonon) {
+ qlib = phonon
+ INCLUDEPATH += $$QMAKE_INCDIR_QT/phonon_compat
+
+ # The Helix backend requires this. Since we can't let a plugin set it,
+ # we bump the values for all Symbian Phonon plugins.
+ symbian:isEmpty(TARGET.EPOCHEAPSIZE):TARGET.EPOCHEAPSIZE = 0x040000 0x1600000
+
+ } else:isEqual(QTLIB, webkit) {
+ qlib = QtWebKit
+ aix-xlc {
+ # Flags recommended by IBM when using WebKit
+ QMAKE_LFLAGS -= -bmaxdata:0x80000000
+ QMAKE_LFLAGS += -bmaxdata:0xD0000000/dsa
+ }
+ } else:isEqual(QTLIB, declarative):qlib = QtDeclarative
+ else:isEqual(QTLIB, multimedia):qlib = QtMultimedia
+ else:isEqual(QTLIB, meegographicssystemhelper):qlib = QtMeeGoGraphicsSystemHelper
+ else:message("Unknown QT: $$QTLIB"):qlib =
+ !isEmpty(qlib) {
+ target_qt:isEqual(TARGET, qlib) {
+ warning($$TARGET cannot have a QT of $$QTLIB)
+ } else {
+ DEFINES *= $$upper(QT_$${QTLIB}_LIB)
+ isEqual(QTLIB, opengl):CONFIG += opengl
+ isEqual(QTLIB, openvg):CONFIG += openvg
+ isEqual(QTLIB, qt3support):DEFINES *= QT3_SUPPORT
+ isEqual(QTLIB, testlib):CONFIG += console
+ isEqual(QTLIB, dbus):CONFIG += dbusadaptors dbusinterfaces
+
+ qtAddLibrary($$qlib)
+ }
+ }
+}
+
+qt_compat {
+ !qt_compat_no_warning:QTDIR_build:warning(***USE of COMPAT inside of QTDIR!**) #just for us
+ INCLUDEPATH *= $$QMAKE_INCDIR_QT/Qt
+ DEFINES *= QT_COMPAT
+}
+
+wince*:static:gui {
+ QTLIB += qmenu_wce.res
+}
+
+!isEmpty(QT_NAMESPACE):DEFINES *= QT_NAMESPACE=$$QT_NAMESPACE
+mac {
+ !isEmpty(QT_NAMESPACE_MAC_CRC):DEFINES *= QT_NAMESPACE_MAC_CRC=$$QT_NAMESPACE_MAC_CRC
+}
+
+#SIMD defines:
+mmx:DEFINES += QT_HAVE_MMX
+3dnow:DEFINES += QT_HAVE_3DNOW
+sse:DEFINES += QT_HAVE_SSE QT_HAVE_MMXEXT
+sse2:DEFINES += QT_HAVE_SSE2
+sse3:DEFINES += QT_HAVE_SSE3
+ssse3:DEFINES += QT_HAVE_SSSE3
+sse4_1:DEFINES += QT_HAVE_SSE4_1
+sse4_2:DEFINES += QT_HAVE_SSE4_2
+avx:DEFINES += QT_HAVE_AVX
+iwmmxt:DEFINES += QT_HAVE_IWMMXT
diff --git a/mkspecs/features/qt_config.prf b/mkspecs/features/qt_config.prf
new file mode 100644
index 0000000000..de1cac4651
--- /dev/null
+++ b/mkspecs/features/qt_config.prf
@@ -0,0 +1,22 @@
+# This file is loaded by the mkspecs, before .qmake.cache has been loaded.
+# Consequently, we have to do some stunts to get values out of the cache.
+
+exists($$_QMAKE_CACHE_):QMAKE_QT_CONFIG = $$fromfile($$_QMAKE_CACHE_, QMAKE_QT_CONFIG)
+isEmpty(QMAKE_QT_CONFIG)|!exists($$QMAKE_QT_CONFIG) {
+ !isEmpty(QT_BUILD_TREE):QMAKE_QT_CONFIG = $$QT_BUILD_TREE/mkspecs/qconfig.pri
+ else:exists($$_QMAKE_CACHE_):infile($$_QMAKE_CACHE_, QT_BUILD_TREE):QMAKE_QT_CONFIG = $$fromfile($$_QMAKE_CACHE_, QT_BUILD_TREE)/mkspecs/qconfig.pri
+ else:exists($$[QT_INSTALL_DATA]/mkspecs/qconfig.pri):QMAKE_QT_CONFIG = $$[QT_INSTALL_DATA]/mkspecs/qconfig.pri
+}
+!exists($$QMAKE_QT_CONFIG)|!include($$QMAKE_QT_CONFIG, "", true) {
+ debug(1, "Cannot load qconfig.pri!")
+} else {
+ debug(1, "Loaded .qconfig.pri from ($$QMAKE_QT_CONFIG)")
+ for(dir, $$list($$unique($$list($$dirname(QMAKE_QT_CONFIG) \
+ $$split($$list($$[QMAKE_MKSPECS]), $$DIRLIST_SEPARATOR))))) {
+ debug(1, "Loading modules from $${dir}")
+ for(mod, $$list($$files($$dir/modules/qt_*.pri))):include($$mod)
+ }
+}
+
+load(qt_functions)
+
diff --git a/mkspecs/features/qt_functions.prf b/mkspecs/features/qt_functions.prf
new file mode 100644
index 0000000000..5baf7ce2b4
--- /dev/null
+++ b/mkspecs/features/qt_functions.prf
@@ -0,0 +1,124 @@
+defineReplace(qtLibraryTarget) {
+ unset(LIBRARY_NAME)
+ LIBRARY_NAME = $$1
+ mac:!static:contains(QT_CONFIG, qt_framework) {
+ QMAKE_FRAMEWORK_BUNDLE_NAME = $$LIBRARY_NAME
+ export(QMAKE_FRAMEWORK_BUNDLE_NAME)
+ }
+ contains(TEMPLATE, .*lib):CONFIG(debug, debug|release) {
+ !debug_and_release|build_pass {
+ mac:RET = $$member(LIBRARY_NAME, 0)_debug
+ else:win32:RET = $$member(LIBRARY_NAME, 0)d
+ }
+ }
+ isEmpty(RET):RET = $$LIBRARY_NAME
+ return($$RET)
+}
+
+defineTest(qtAddLibrary) {
+ INCLUDEPATH -= $$QMAKE_INCDIR_QT/$$1
+ INCLUDEPATH = $$QMAKE_INCDIR_QT/$$1 $$INCLUDEPATH
+
+ LIB_NAME = $$1
+ unset(LINKAGE)
+ mac {
+ CONFIG(qt_framework, qt_framework|qt_no_framework) { #forced
+ QMAKE_FRAMEWORKPATH *= $${QMAKE_LIBDIR_QT}
+ FRAMEWORK_INCLUDE = $$QMAKE_LIBDIR_QT/$${LIB_NAME}.framework/Headers
+ !qt_no_framework_direct_includes:exists($$FRAMEWORK_INCLUDE) {
+ INCLUDEPATH -= $$FRAMEWORK_INCLUDE
+ INCLUDEPATH = $$FRAMEWORK_INCLUDE $$INCLUDEPATH
+ }
+ LINKAGE = -framework $${LIB_NAME}$${QT_LIBINFIX}
+ } else:!qt_no_framework { #detection
+ for(frmwrk_dir, $$list($$QMAKE_LIBDIR_QT $$QMAKE_LIBDIR $$(DYLD_FRAMEWORK_PATH) /Library/Frameworks)) {
+ exists($${frmwrk_dir}/$${LIB_NAME}.framework) {
+ QMAKE_FRAMEWORKPATH *= $${frmwrk_dir}
+ FRAMEWORK_INCLUDE = $$frmwrk_dir/$${LIB_NAME}.framework/Headers
+ !qt_no_framework_direct_includes:exists($$FRAMEWORK_INCLUDE) {
+ INCLUDEPATH -= $$FRAMEWORK_INCLUDE
+ INCLUDEPATH = $$FRAMEWORK_INCLUDE $$INCLUDEPATH
+ }
+ LINKAGE = -framework $${LIB_NAME}
+ break()
+ }
+ }
+ }
+ }
+ symbian {
+ isEqual(LIB_NAME, QtCore) {
+ #workaround for dependency from f32file.h on e32svr.h which has moved location in symbian3
+ contains(SYMBIAN_VERSION, Symbian3) {
+ INCLUDEPATH *= $$OS_LAYER_SYSTEMINCLUDE
+ }
+ } else:isEqual(LIB_NAME, QtGui) {
+ # Needed for #include <QtGui> because qs60mainapplication.h includes aknapp.h
+ INCLUDEPATH *= $$MW_LAYER_SYSTEMINCLUDE
+ } else:isEqual(LIB_NAME, QtWebKit) {
+ # Needed for because relative inclusion problem in toolchain
+ INCLUDEPATH *= $$QMAKE_INCDIR_QT/QtXmlPatterns
+ INCLUDEPATH *= $$QMAKE_INCDIR_QT/QtNetwork
+ isEmpty(TARGET.CAPABILITY): TARGET.CAPABILITY = NetworkServices
+ isEmpty(TARGET.EPOCHEAPSIZE):TARGET.EPOCHEAPSIZE = 0x20000 0x2000000
+ } else:isEqual(LIB_NAME, QtXmlPatterns) {
+ # Needed for #include <QtXmlPatterns/QtXmlPatterns> because relative inclusion problem in toolchain
+ INCLUDEPATH *= $$QMAKE_INCDIR_QT/QtNetwork
+ } else:isEqual(LIB_NAME, QtNetwork) {
+ isEmpty(TARGET.CAPABILITY): TARGET.CAPABILITY = NetworkServices
+ } else:isEqual(LIB_NAME, QtDeclarative) {
+ isEmpty(TARGET.CAPABILITY): TARGET.CAPABILITY = NetworkServices
+ isEmpty(TARGET.EPOCHEAPSIZE):TARGET.EPOCHEAPSIZE = 0x20000 0x2000000
+ }
+ export(TARGET.EPOCHEAPSIZE)
+ export(TARGET.CAPABILITY)
+ }
+ isEmpty(LINKAGE) {
+ if(!debug_and_release|build_pass):CONFIG(debug, debug|release) {
+ win32:LINKAGE = -l$${LIB_NAME}$${QT_LIBINFIX}d
+ mac:LINKAGE = -l$${LIB_NAME}$${QT_LIBINFIX}_debug
+ }
+ isEmpty(LINKAGE):LINKAGE = -l$${LIB_NAME}$${QT_LIBINFIX}
+ }
+ !isEmpty(QMAKE_LSB) {
+ QMAKE_LFLAGS *= --lsb-libpath=$$$$QMAKE_LIBDIR_QT
+ QMAKE_LFLAGS *= -L/opt/lsb/lib
+ QMAKE_LFLAGS *= --lsb-shared-libs=$${LIB_NAME}$${QT_LIBINFIX}
+ }
+ LIBS += $$LINKAGE
+ export(LIBS)
+ export(INCLUDEPATH)
+ export(QMAKE_FRAMEWORKPATH)
+ export(QMAKE_LFLAGS)
+ return(true)
+}
+
+# variable, default
+defineTest(qtPrepareTool) {
+ isEmpty($$1) {
+ !isEmpty(QT_BUILD_TREE):$$1 = $$QT_BUILD_TREE/bin/$$2
+ else:$$1 = $$[QT_INSTALL_BINS]/$$2
+ }
+ $$1 ~= s,[/\\\\],$$QMAKE_DIR_SEP,
+ contains(QMAKE_HOST.os, Windows):!contains($$1, .*\\.(exe|bat)$) {
+ exists($$eval($$1).bat) {
+ $$1 = $$eval($$1).bat
+ } else {
+ $$1 = $$eval($$1).exe
+ }
+ }
+ export($$1)
+}
+
+defineTest(packagesExist) {
+ # this can't be done in global scope here because qt_functions is loaded
+ # before the .pro is parsed, so if the .pro set PKG_CONFIG, we wouldn't know it
+ # yet. oops.
+ isEmpty(PKG_CONFIG):PKG_CONFIG = pkg-config # keep consistent with link_pkgconfig.prf! too
+
+ for(package, ARGS) {
+ !system($$PKG_CONFIG --exists $$package):return(false)
+ }
+
+ return(true)
+}
+
diff --git a/mkspecs/features/qtestlib.prf b/mkspecs/features/qtestlib.prf
new file mode 100644
index 0000000000..0b1fbee622
--- /dev/null
+++ b/mkspecs/features/qtestlib.prf
@@ -0,0 +1,4 @@
+
+CONFIG += console
+
+qtAddLibrary(QtTest)
diff --git a/mkspecs/features/qtopia.prf b/mkspecs/features/qtopia.prf
new file mode 100644
index 0000000000..7672a8d4a9
--- /dev/null
+++ b/mkspecs/features/qtopia.prf
@@ -0,0 +1 @@
+CONFIG *= qtopiainc qtopialib
diff --git a/mkspecs/features/qtopiainc.prf b/mkspecs/features/qtopiainc.prf
new file mode 100644
index 0000000000..2665da5859
--- /dev/null
+++ b/mkspecs/features/qtopiainc.prf
@@ -0,0 +1 @@
+INCLUDEPATH += $$QMAKE_INCDIR_QTOPIA
diff --git a/mkspecs/features/qtopialib.prf b/mkspecs/features/qtopialib.prf
new file mode 100644
index 0000000000..0c5ccf1ade
--- /dev/null
+++ b/mkspecs/features/qtopialib.prf
@@ -0,0 +1,2 @@
+!isEmpty(QMAKE_LIBDIR_QTOPIA):QMAKE_LIBDIR = $$QMAKE_LIBDIR_QTOPIA
+LIBS += $$QMAKE_LIBS_QTOPIA
diff --git a/mkspecs/features/qttest_p4.prf b/mkspecs/features/qttest_p4.prf
new file mode 100644
index 0000000000..ede96575f3
--- /dev/null
+++ b/mkspecs/features/qttest_p4.prf
@@ -0,0 +1,23 @@
+isEmpty(TEMPLATE):TEMPLATE=app
+CONFIG += qt warn_on console depend_includepath testcase
+
+# x11 is not defined by configure (the following line is copied from gui.pro)
+!win32:!embedded:!qpa:!mac:!symbian:CONFIG += x11
+
+qtAddLibrary(QtTest)
+
+symbian:{
+ TARGET.EPOCHEAPSIZE = 0x100000 0x2000000
+# DEFINES += QTEST_NO_SPECIALIZATIONS
+ TARGET.CAPABILITY="None"
+ RSS_RULES ="group_name=\"QtTests\";"
+}
+
+# prefix test binary with tst_
+!contains(TARGET, ^tst_.*):TARGET = $$join(TARGET,,"tst_")
+
+isEmpty(target.path) {
+ target.path += $$[QT_INSTALL_PREFIX]/tests/qt4/$${TARGET}
+}
+
+INSTALLS += target
diff --git a/mkspecs/features/release.prf b/mkspecs/features/release.prf
new file mode 100644
index 0000000000..2d63c240d0
--- /dev/null
+++ b/mkspecs/features/release.prf
@@ -0,0 +1,7 @@
+CONFIG -= debug
+QMAKE_CFLAGS += $$QMAKE_CFLAGS_RELEASE
+QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_RELEASE
+QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_OBJECTIVE_CFLAGS_RELEASE
+QMAKE_LFLAGS += $$QMAKE_LFLAGS_RELEASE
+QMAKE_LIBFLAGS += $$QMAKE_LIBFLAGS_RELEASE
+!debug_and_release:fix_output_dirs:fixExclusiveOutputDirs(release, debug) \ No newline at end of file
diff --git a/mkspecs/features/resources.prf b/mkspecs/features/resources.prf
new file mode 100644
index 0000000000..a305a4f0eb
--- /dev/null
+++ b/mkspecs/features/resources.prf
@@ -0,0 +1,29 @@
+defined(qtPrepareTool)|load(qt_functions) ### Qt 5: see default_pre.prf
+qtPrepareTool(QMAKE_RCC, rcc)
+
+isEmpty(RCC_DIR):RCC_DIR = .
+isEmpty(QMAKE_RESOURCE_PREFIX):QMAKE_RESOURCE_PREFIX = /tmp/
+isEmpty(QMAKE_MOD_RCC):QMAKE_MOD_RCC = qrc
+
+resource_combine {
+ rcc.CONFIG += combine
+ rcc.output = $$RCC_DIR/$${first(QMAKE_MOD_RCC)}_combined$${first(QMAKE_EXT_CPP)}
+} else {
+ rcc.output = $$RCC_DIR/$${first(QMAKE_MOD_RCC)}_${QMAKE_FILE_BASE}$${first(QMAKE_EXT_CPP)}
+}
+!contains(QMAKE_RESOURCE_FLAGS, -root):!isEmpty(QMAKE_RESOURCE_ROOT):QMAKE_RESOURCE_FLAGS += -root $$QMAKE_RESOURCE_ROOT
+!contains(QMAKE_RESOURCE_FLAGS, -name) {
+ resource_combine {
+ isEmpty(QMAKE_RESOURCE_NAME):!isEmpty(TARGET):QMAKE_RESOURCE_NAME = $$TARGET
+ !isEmpty(QMAKE_RESOURCE_NAME):QMAKE_RESOURCE_FLAGS += -name $$QMAKE_RESOURCE_NAME
+ } else {
+ QMAKE_RESOURCE_FLAGS += -name ${QMAKE_FILE_BASE}
+ }
+}
+rcc.commands = "$$QMAKE_RCC" $$QMAKE_RESOURCE_FLAGS "${QMAKE_FILE_IN}" -o "${QMAKE_FILE_OUT}"
+rcc.depend_command = "$$QMAKE_RCC" -list $$QMAKE_RESOURCE_FLAGS "${QMAKE_FILE_IN}"
+rcc.input = RESOURCES
+rcc.variable_out = SOURCES
+rcc.name = RCC ${QMAKE_FILE_IN}
+silent:rcc.commands = @echo rcc "${QMAKE_FILE_IN}" && $$rcc.commands
+QMAKE_EXTRA_COMPILERS += rcc
diff --git a/mkspecs/features/shared.prf b/mkspecs/features/shared.prf
new file mode 100644
index 0000000000..86efd8e6d8
--- /dev/null
+++ b/mkspecs/features/shared.prf
@@ -0,0 +1,7 @@
+CONFIG -= static
+contains(TEMPLATE, ".*lib"): {
+ CONFIG += dll
+ CONFIG -= staticlib
+ win32:QMAKE_LFLAGS += $$QMAKE_LFLAGS_DLL
+}
+!static_and_shared:fix_output_dirs:fixExclusiveOutputDirs(shared, static)
diff --git a/mkspecs/features/silent.prf b/mkspecs/features/silent.prf
new file mode 100644
index 0000000000..141e6bf9e4
--- /dev/null
+++ b/mkspecs/features/silent.prf
@@ -0,0 +1,6 @@
+!macx-xcode {
+ QMAKE_CC = @echo compiling $< && $$QMAKE_CC
+ QMAKE_CXX = @echo compiling $< && $$QMAKE_CXX
+ !contains(QMAKE_LINK, "@:"):QMAKE_LINK = @echo linking $@ && $$QMAKE_LINK
+ QMAKE_LINK_SHLIB = @echo linking $@ && $$QMAKE_LINK_SHLIB
+}
diff --git a/mkspecs/features/static.prf b/mkspecs/features/static.prf
new file mode 100644
index 0000000000..288852d5df
--- /dev/null
+++ b/mkspecs/features/static.prf
@@ -0,0 +1,14 @@
+CONFIG -= shared dll
+contains(TEMPLATE, ".*lib"):{
+ CONFIG += staticlib
+ unix {
+ QMAKE_CFLAGS += $$QMAKE_CFLAGS_STATIC_LIB
+ QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_STATIC_LIB
+ }
+}
+
+mac {
+ QMAKE_LFLAGS += $$QMAKE_LFLAGS_STATIC_LIB
+}
+
+!static_and_shared:fix_output_dirs:fixExclusiveOutputDirs(static, shared)
diff --git a/mkspecs/features/static_and_shared.prf b/mkspecs/features/static_and_shared.prf
new file mode 100644
index 0000000000..39a9a1f740
--- /dev/null
+++ b/mkspecs/features/static_and_shared.prf
@@ -0,0 +1,3 @@
+!contains(TEMPLATE, subdirs):!macx-xcode:!symbian-abld:!symbian-sbsv2 {
+ addExclusiveBuilds(static, Static, shared, Shared)
+}
diff --git a/mkspecs/features/staticlib.prf b/mkspecs/features/staticlib.prf
new file mode 100644
index 0000000000..4884964a6f
--- /dev/null
+++ b/mkspecs/features/staticlib.prf
@@ -0,0 +1 @@
+CONFIG += static
diff --git a/mkspecs/features/symbian/add_mmp_rules.prf b/mkspecs/features/symbian/add_mmp_rules.prf
new file mode 100644
index 0000000000..7f96b811a2
--- /dev/null
+++ b/mkspecs/features/symbian/add_mmp_rules.prf
@@ -0,0 +1,33 @@
+# Arg1: List of conditions to generate block for
+# Arg2: List of variables containing rules to add
+defineTest(addMMPRules) {
+ unset(myConditions)
+ unset(myVariables)
+ unset(myIfDef)
+
+ myConditions = $$eval($$1) default
+ myVariables = $$eval($$2)
+ myIfDef = if
+
+ for(condition, $$list($$myConditions)) {
+ contains(condition, default) {
+ libBlock = "$${LITERAL_HASH}else"
+ } else {
+ libBlock = "$${LITERAL_HASH}$${myIfDef} defined($${condition})"
+ myIfDef = elif
+ }
+
+ for(var, $$list($$myVariables)) {
+ varVal = $$eval($${var}.$${condition})
+ isEmpty(varVal) {
+ # No value defined for current condition, so use default
+ varVal = $$eval($${var}.default)
+ }
+ !isEmpty(varVal): libBlock += "$$join(varVal,$$escape_expand(\\n))"
+ }
+
+ MMP_RULES += $$libBlock
+ }
+ MMP_RULES += "$${LITERAL_HASH}endif"
+ export(MMP_RULES)
+}
diff --git a/mkspecs/features/symbian/application_icon.prf b/mkspecs/features/symbian/application_icon.prf
new file mode 100644
index 0000000000..d9918bfd5f
--- /dev/null
+++ b/mkspecs/features/symbian/application_icon.prf
@@ -0,0 +1,87 @@
+load(data_caging_paths)
+
+contains(CONFIG, no_icon) {
+ # If no_icon keyword exist, the S60 UI app is just made hidden. This because S60 app FW
+ # requires the registration resource file to exist always
+ contains(QT, gui):contains(CONFIG, qt) {
+ symbian:RSS_RULES += "hidden = KAppIsHidden;"
+ CONFIG -= no_icon
+ }
+}
+
+
+!contains(CONFIG, no_icon) {
+ baseTarget = $$symbianRemoveSpecialCharacters($$basename(TARGET))
+ contains(baseTarget, "^.*\\..*$") {
+ CONFIG += no_icon
+ ICON =
+ warning("Symbian resources do not support '.' character in TARGET, skipping resource generation.")
+ } else {
+ symbian-abld|symbian-sbsv2 {
+ resourceZDir = $$EPOCROOT$$HW_ZDIR$$APP_RESOURCE_DIR
+ regZDir = $$EPOCROOT$$HW_ZDIR$$REG_RESOURCE_IMPORT_DIR
+ } else {
+ contains(DESTDIR, "/.*") {
+ resourceZDir = $$DESTDIR
+ } else:isEmpty(DESTDIR) {
+ resourceZDir = $$OUT_PWD
+ } else {
+ resourceZDir = $$OUT_PWD/$$DESTDIR
+ }
+ regZDir = $$resourceZDir
+ }
+
+ default_resource_deployment.files += $$resourceZDir/$${baseTarget}.rsc
+ default_resource_deployment.path = $$APP_RESOURCE_DIR
+ default_reg_deployment.files += $$regZDir/$${baseTarget}_reg.rsc
+ default_reg_deployment.path = $$REG_RESOURCE_IMPORT_DIR
+
+ !isEmpty(ICON) {
+ !count(ICON, 1) {
+ ICON = $$first(ICON)
+ warning("Only first icon specified in ICON variable is used: $$ICON")
+ }
+
+ # Note: symbian-sbsv2 builds can't utilize extra compiler for mifconv, so ICON handling is done in code
+ !symbian-sbsv2 {
+ # Absolute path required for shadow builds.
+ # However, in older Symbian environments abld toolchain can't handle even moderately long
+ # paths, so don't force absolute there.
+ !symbian-abld:!contains(ICON, "^(/|\\\\|.:).*"):ICON = $$_PRO_FILE_PWD_/$$ICON
+
+ #Makefile: requires paths with backslash
+ ICON_backslashed = $$ICON
+
+ symbian-abld {
+ # ${ZDIR} is defined in Makefile
+ mifIconZDir = ${ZDIR}$$APP_RESOURCE_DIR
+ } else {
+ mifIconZDir = $$resourceZDir
+ }
+
+ # Extra compiler rules for mifconv
+ mifconv.target = $$mifIconZDir/$${baseTarget}.mif
+ contains(QMAKE_HOST.os, "Windows") {
+ ICON_backslashed = $$replace(ICON_backslashed, /, \\)
+ mifconv.target = $$replace(mifconv.target, /, \\)
+ }
+ # Based on: http://www.forum.nokia.com/document/Cpp_Developers_Library
+ # svg-t icons should always use /c32 depth
+ mifconv.commands = mifconv $$mifconv.target /c32 $$ICON_backslashed
+
+ mifconv.depends = $$ICON
+ PRE_TARGETDEPS += $$mifconv.target
+ QMAKE_EXTRA_TARGETS += mifconv
+ QMAKE_CLEAN += $$mifconv.target
+ }
+ # Rules to use generated MIF file from symbian resources
+ RSS_RULES.number_of_icons = $$size(ICON_backslashed)
+
+ RSS_RULES.icon_file = $$APP_RESOURCE_DIR/$${baseTarget}.mif
+
+ default_resource_deployment.files += $$resourceZDir/$${baseTarget}.mif
+ }
+ }
+}
+
+
diff --git a/mkspecs/features/symbian/armcc_warnings.prf b/mkspecs/features/symbian/armcc_warnings.prf
new file mode 100644
index 0000000000..3331bffeef
--- /dev/null
+++ b/mkspecs/features/symbian/armcc_warnings.prf
@@ -0,0 +1,22 @@
+# 68: integer conversion resulted in a change of sign (sounds useful, but it's
+# buggy and is reported even in places where it makes no sense)
+# 111: Statement is unreachable
+# 185: Dynamic initialization in unreachable code
+# 187: use of "=" where "==" may have been intended
+# 191: Type qualifier is meaningless on cast type
+# 368: class "<class>" defines no constructor to initialize the following: <member>
+# (Disabled because there are other ways of assigning besides constructors)
+# 830: function "xxx" has no corresponding operator delete (to be called if an
+# exception is thrown during initialization of an allocated object) (used a
+# lot in 3rd party code)
+# 997: function "xxx" is hidden by "yyy" -- virtual function override intended?
+# (used all over the place in the Symbian SDK)
+# 1293: Assignment in condition
+# 1294: pre-ANSI C style functions declarations (used a lot in 3rd party code)
+# 2874: <variable> may be used before being set (this one sounds useful, but
+# it's output also for class instances, making it useless in practice)
+QMAKE_CFLAGS.ARMCC += --diag_suppress 68,111,185,187,191,368,830,997,1293,1294,2874
+QMAKE_CXXFLAGS.ARMCC += --diag_suppress 68,111,185,187,191,368,830,997,1293,1294,2874
+
+# 6780: <origvis> visibility removed from symbol '<symname>' through <impexp>
+QMAKE_LFLAGS.ARMCC += --diag_suppress 6780
diff --git a/mkspecs/features/symbian/data_caging_paths.prf b/mkspecs/features/symbian/data_caging_paths.prf
new file mode 100644
index 0000000000..7f5420cc88
--- /dev/null
+++ b/mkspecs/features/symbian/data_caging_paths.prf
@@ -0,0 +1,80 @@
+#
+# ==============================================================================
+# Name : data_caging_paths.prf
+# Part of :
+# Interface : Data Caging Path Definitions API for Qt/S60
+# Description : Predefined include paths to be used in the pro-files for the
+# paths related to data caging.
+#
+# Usage examples:
+#
+# # Load these definitions on pro-file if needed:
+# load(data_caging_paths)
+#
+# # These variables are mostly useful when specifying deployment
+#
+# myLib.files = myLib.dll
+# myLib.path = $$SHARED_LIB_DIR
+# DEPLOYMENT += myLib
+#
+# # Note: Do not use $$PLUGINS_DIR or $$PLUGINS_1_DIR to deploy Qt plugins.
+# # $$QT_PUBLIC_PLUGINS_BASE specifies the public base directory for Qt
+# # plugin stubs:
+#
+# myPublicImageFormatPlugin.files = myImageFormat.dll
+# myPublicImageFormatPlugin.path = $$QT_PLUGINS_BASE_DIR/imageformats
+# DEPLOYMENT += myPublicImageFormatPlugin
+#
+# ==============================================================================
+
+exists($${EPOCROOT}epoc32/include/data_caging_paths.prf) {
+
+ # Load platform specific paths
+ load($${EPOCROOT}epoc32/include/data_caging_paths.prf)
+
+} else {
+ # No platform specific paths provided, use default paths
+
+ APPARC_RECOGNISER_RESOURCES_DIR = /resource/apps/registrationresourcefiles
+ APP_BITMAP_DIR = /resource/apps
+ APP_RESOURCE_DIR = /resource/apps
+ BITMAP_DIR = /resource/apps
+ BIOFILE_DIR = /resource/messaging/bif
+ CHARCONV_PLUGIN_DIR = /resource/charconv
+ CONTACTS_RESOURCE_DIR = /resource/cntmodel
+ CTRL_PANEL_RESOURCE_DIR = /resource/controls
+ CONVERTER_PLUGIN_RESOURCE_DIR = /resource/convert
+ ECOM_RESOURCE_DIR = /resource/plugins
+ ERROR_RESOURCE_DIR = /resource/errors
+ PROGRAMS_DIR = /sys/bin
+ FEP_RESOURCES_DIR = /resource/fep
+ HELP_FILE_DIR = /resource/help
+ LOG_ENGINE_RESOURCE_DIR = /resource/logengine
+ MTM_RESOURCE_DIR = /resource/messaging
+ MTM_INFO_FILE_DIR = /resource/messaging/mtm
+ PRINTER_DRIVER_DIR = /resource/printers
+ SHARED_LIB_DIR = /sys/bin
+ UIKLAF_RESOURCE_DIR = /resource/uiklaf
+ WAPPUSH_PLUGIN_RESOURCE_DIR = /resource/messaging/wappush
+ WATCHER_PLUGIN_RESOURCE_DIR = /resource/messaging/watchers
+ RECOGNISERS_DIR = /sys/bin
+ PARSERS_DIR = /sys/bin
+ NOTIFIERS_DIR = /sys/bin
+ PLUGINS_DIR = /sys/bin
+ PLUGINS_1_DIR = /sys/bin
+ RESOURCE_FILES_DIR = /resource
+
+ CA_CERTIFICATES_DIR = /private/101f72a6
+ COMMDB_DIR = /private/100012a5
+ SS_CONFIG_FILE_DIR = /private/101f7989/esock
+ TRUSTED_FONTS_DIR = /private/10003a16/fonts
+ UNTRUSTED_FONT_DIR = /private/10003a16/import/fonts
+ WINDOW_SERVER_INI_DIR = /private/10003b20
+ SKINS_DIR = /private/10207114
+ BOOTDATA_DIR = /resource/bootdata
+}
+
+isEmpty(HW_ZDIR): HW_ZDIR = epoc32/data/z
+isEmpty(REG_RESOURCE_DIR): REG_RESOURCE_DIR = /private/10003a3f/apps
+isEmpty(REG_RESOURCE_IMPORT_DIR): REG_RESOURCE_IMPORT_DIR = /private/10003a3f/import/apps
+isEmpty(APP_PRIVATE_DIR_BASE): APP_PRIVATE_DIR_BASE = /private
diff --git a/mkspecs/features/symbian/debug.prf b/mkspecs/features/symbian/debug.prf
new file mode 100644
index 0000000000..b5afeb6ba6
--- /dev/null
+++ b/mkspecs/features/symbian/debug.prf
@@ -0,0 +1 @@
+QMAKE_LIBDIR += $${EPOCROOT}epoc32/release/armv5/udeb
diff --git a/mkspecs/features/symbian/def_files.prf b/mkspecs/features/symbian/def_files.prf
new file mode 100644
index 0000000000..746de6a242
--- /dev/null
+++ b/mkspecs/features/symbian/def_files.prf
@@ -0,0 +1,96 @@
+# With DEF files enabled, removed exported symbols are treated as errors
+# and there is binary compatibility between successive builds.
+
+CONFIG -= def_files_disabled
+
+# We need a target name without the INFIX'ed part, since DEF files are not infixed.
+equals(QMAKE_TARGET_PRODUCT, Qt4)|equals(QMAKE_TARGET_PRODUCT, QTestLib):clean_TARGET = $$replace(TARGET, "$${QT_LIBINFIX}$", "")
+else:clean_TARGET = $$TARGET
+
+defineTest(qtTestIfDirExists) {
+ contains(QMAKE_HOST.os,Windows) {
+ dirToTest = $$1
+ $$dirToTest ~= s,/,\\,
+ # Windows trick. Test for existence of nul, which every directory has.
+ retValue = $$system("if exist $$dirToTest\\nul echo true")
+ contains(retValue, true):return(true)|return(false)
+ } else {
+ system("test -d $$1"):return(true)|return(false)
+ }
+}
+
+symbian-abld|symbian-sbsv2 {
+ # Firstly, if the MMP_RULES already contain a defBlock variable, don't generate another one
+ # (this bit is slightly magic, because it depends upon everyone creating their DEFFILE statements
+ # in a defBlock variable; but otherwise we have to expand MMP_RULES then scan for the DEFFILE keyword)
+ # Similarly, explicit EXPORTUNFROZEN should block adding defBlock
+ !contains(MMP_RULES, defBlock):!contains(MMP_RULES, EXPORTUNFROZEN) {
+ # Apps are executables on Symbian, so don't have exports, and therefore don't have DEF files
+ # Plugins use standard DEF files, which qmake generates, so shouldn't be using these DEFFILE
+ # statements - they use the qmake generated statements instead
+ # Static libraries obviously don't have DEF files, as they don't take part in dynamic linkage
+ !contains(TEMPLATE, app):!contains(CONFIG, plugin):!contains(CONFIG, staticlib): {
+ !isEmpty(DEF_FILE) {
+ defBlock = \
+ "$${LITERAL_HASH}ifdef WINSCW" \
+ "DEFFILE $$DEF_FILE/bwins/$${clean_TARGET}.def" \
+ "$${LITERAL_HASH}elif defined EABI" \
+ "DEFFILE $$DEF_FILE/eabi/$${clean_TARGET}.def" \
+ "$${LITERAL_HASH}endif"
+ } else:!isEmpty(defFilePath) {
+ defBlock = \
+ "$${LITERAL_HASH}ifdef WINSCW" \
+ "DEFFILE $$defFilePath/bwins/$${clean_TARGET}.def" \
+ "$${LITERAL_HASH}elif defined EABI" \
+ "DEFFILE $$defFilePath/eabi/$${clean_TARGET}.def" \
+ "$${LITERAL_HASH}endif"
+ } else {
+ # If defFilePath is not defined, then put the folders containing the DEF files at the
+ # same level as the .pro (and generated MMP) file(s)
+ defBlock = \
+ "$${LITERAL_HASH}ifdef WINSCW" \
+ "DEFFILE ./bwins/$${clean_TARGET}.def" \
+ "$${LITERAL_HASH}elif defined EABI" \
+ "DEFFILE ./eabi/$${clean_TARGET}.def" \
+ "$${LITERAL_HASH}endif"
+ }
+ MMP_RULES += defBlock
+ }
+ }
+
+} else:contains(TEMPLATE, lib):!contains(CONFIG, static):!contains(CONFIG, staticlib):!contains(CONFIG, plugin) {
+ !isEmpty(DEF_FILE) {
+ defFile = $$DEF_FILE
+ } else {
+ defFile = .
+ }
+ qtTestIfDirExists($$_PRO_FILE_PWD_/$$defFile) {
+ !exists("$$_PRO_FILE_PWD_/$$defFile/eabi") {
+ dirToCreate = $$_PRO_FILE_PWD_/$$defFile/eabi
+ contains(QMAKE_HOST.os,Windows):dirToCreate ~= s,/,\\,
+ system("$$QMAKE_MKDIR $$dirToCreate")
+ }
+ elf2e32FileToAdd = $$_PRO_FILE_PWD_/$$defFile/eabi/$$basename(clean_TARGET)u.def
+ } else {
+ elf2e32FileToAdd = $$_PRO_FILE_PWD_/$$defFile
+ }
+ QMAKE_ELF2E32_FLAGS += "--definput=$$elf2e32FileToAdd"
+
+ symbianObjdir = $$OBJECTS_DIR
+ isEmpty(symbianObjdir):symbianObjdir = .
+
+ freeze_target.target = freeze
+ freeze_target.depends = first
+ # The perl part is to convert to unix line endings and remove comments, which the s60 tools refuse to do.
+ freeze_target.commands = $$QMAKE_COPY $$symbianObjdir/$${TARGET}.def $$elf2e32FileToAdd
+ QMAKE_EXTRA_TARGETS += freeze_target
+} else:contains(TEMPLATE, subdirs) {
+ freeze_target.target = freeze
+ freeze_target.CONFIG = recursive
+ freeze_target.recurse = $$SUBDIRS
+ QMAKE_EXTRA_TARGETS += freeze_target
+} else {
+ freeze_target.target = freeze
+ freeze_target.commands =
+ QMAKE_EXTRA_TARGETS += freeze_target
+}
diff --git a/mkspecs/features/symbian/def_files_disabled.prf b/mkspecs/features/symbian/def_files_disabled.prf
new file mode 100644
index 0000000000..0344911f6d
--- /dev/null
+++ b/mkspecs/features/symbian/def_files_disabled.prf
@@ -0,0 +1,13 @@
+# With DEF files disabled, binary compatibility is broken every time you build
+
+CONFIG -= def_files
+
+# See def_files.prf for reasoning on the slight nastiness of this
+!contains(MMP_RULES, defBlock) {
+ # See def_files.prf for reasoning for excluding target types and configs below
+ !contains(TEMPLATE, app):!contains(CONFIG, plugin):!contains(CONFIG, staticlib): {
+ # with EXPORTUNFROZEN enabled, new exports are included in the dll and dso/lib without
+ # needing to run abld/sbs freeze
+ MMP_RULES *= EXPORTUNFROZEN
+ }
+}
diff --git a/mkspecs/features/symbian/default_post.prf b/mkspecs/features/symbian/default_post.prf
new file mode 100644
index 0000000000..470372eb4a
--- /dev/null
+++ b/mkspecs/features/symbian/default_post.prf
@@ -0,0 +1,100 @@
+load(default_post)
+
+contains(TEMPLATE, ".*app") {
+ contains(CONFIG, stdbinary) {
+ QMAKE_LIBS +=
+ } else:contains(CONFIG,qt) {
+ QMAKE_LIBS += $$QMAKE_LIBS_QT_ENTRY
+ } else {
+ QMAKE_LIBS += $$QMAKE_LIBS_NO_QT_ENTRY
+ }
+
+ contains(DESTDIR, "/.*") {
+ default_bin_deployment.files += $$DESTDIR/$$symbianRemoveSpecialCharacters($$basename(TARGET)).exe
+ } else:isEmpty(DESTDIR) {
+ default_bin_deployment.files += $$OUT_PWD/$$symbianRemoveSpecialCharacters($$basename(TARGET)).exe
+ } else {
+ default_bin_deployment.files += $$OUT_PWD/$$DESTDIR/$$symbianRemoveSpecialCharacters($$basename(TARGET)).exe
+ }
+ default_bin_deployment.path += /sys/bin
+
+ load(application_icon.prf)
+}
+contains(TEMPLATE, lib): {
+ contains(CONFIG, staticlib)|contains(CONFIG, static): {
+ # Static libs should not have LIBRARY statements in S60
+ QMAKE_LIBS =
+ # Static libs do not need def files
+ MMP_RULES -= EXPORTUNFROZEN
+ }
+ contains(CONFIG, plugin):!contains(CONFIG, stdbinary): {
+ # Plugins based on normal libraries have predefined def file
+ MMP_RULES -= EXPORTUNFROZEN
+ }
+} else {
+ # Applications don't need this
+ MMP_RULES -= EXPORTUNFROZEN
+}
+
+isEmpty(TARGET.UID3):TARGET.UID3 = $$generate_uid("$${OUT_PWD}/$${TARGET}")
+isEmpty(TARGET.UID2) {
+ contains(CONFIG, stdbinary) {
+ TARGET.UID2 = 0x20004C45
+ } else {
+ contains(TEMPLATE, app) {
+ contains(QT, gui) {
+ TARGET.UID2 = 0x100039CE
+ } else {
+ TARGET.UID2 = 0
+ }
+ } else:contains(TEMPLATE, lib):!contains(CONFIG, static):!contains(CONFIG, staticlib) {
+ TARGET.UID2 = 0x1000008d
+ }
+ }
+}
+
+# Add dependency to Qt package to all other projects besides Qt libs.
+# Note: Qt libs package with full capabilities has UID3 of 0x2001E61C,
+# while self-signed version typically has temporary UID3 of 0xE001E61C.
+contains(CONFIG, qt):!contains(TARGET.UID3, 0x2001E61C):!contains(TARGET.UID3, 0xE001E61C):isEmpty(QT_LIBINFIX) {
+ qt_pkg_name = Qt
+ pkg_depends_qt += \
+ "; Default dependency to Qt libraries" \
+ "(0x2001E61C), $${QT_MAJOR_VERSION}, $${QT_MINOR_VERSION}, $${QT_PATCH_VERSION}, {$$addLanguageDependentPkgItem(qt_pkg_name)}"
+
+ # Projects linking to webkit need dependency to webkit
+ contains(QT, webkit): {
+ # these can be overridden by mkspecs/modules/qt_webkit.pri
+ isEmpty(QT_WEBKIT_MAJOR_VERSION) {
+ QT_WEBKIT_MAJOR_VERSION = $${QT_MAJOR_VERSION}
+ QT_WEBKIT_MINOR_VERSION = $${QT_MINOR_VERSION}
+ QT_WEBKIT_PATCH_VERSION = $${QT_PATCH_VERSION}
+ }
+
+ webkit_pkg_name = QtWebKit
+ pkg_depends_webkit += \
+ "; Dependency to Qt Webkit" \
+ "(0x200267C2), $${QT_WEBKIT_MAJOR_VERSION}, $${QT_WEBKIT_MINOR_VERSION}, $${QT_WEBKIT_PATCH_VERSION}, {$$addLanguageDependentPkgItem(webkit_pkg_name)}"
+ } else {
+ default_deployment.pkg_prerules -= pkg_depends_webkit
+ }
+} else {
+ default_deployment.pkg_prerules -= pkg_depends_webkit pkg_depends_qt
+}
+
+isEmpty(TARGET.EPOCSTACKSIZE):TARGET.EPOCSTACKSIZE = 0x14000
+isEmpty(TARGET.EPOCHEAPSIZE):TARGET.EPOCHEAPSIZE = 0x020000 0x800000
+
+# Supports Symbian^3 platforms by default and also S60 3.1, 3.2, and 5.0 if built against any of those.
+platform_product_id = S60ProductID
+platform_product_id = $$addLanguageDependentPkgItem(platform_product_id)
+pkg_platform_dependencies = \
+ "; Default HW/platform dependencies" \
+ "[0x20022E6D],0,0,0,{$$platform_product_id}" \
+ "[0x2003A678],0,0,0,{$$platform_product_id}"
+contains(S60_VERSION, 3.1)|contains(S60_VERSION, 3.2)|contains(S60_VERSION, 5.0) {
+ pkg_platform_dependencies += \
+ "[0x102032BE],0,0,0,{$$platform_product_id}" \
+ "[0x102752AE],0,0,0,{$$platform_product_id}" \
+ "[0x1028315F],0,0,0,{$$platform_product_id}"
+}
diff --git a/mkspecs/features/symbian/default_pre.prf b/mkspecs/features/symbian/default_pre.prf
new file mode 100644
index 0000000000..ddb23b3157
--- /dev/null
+++ b/mkspecs/features/symbian/default_pre.prf
@@ -0,0 +1,2 @@
+CONFIG = stl_off $$CONFIG
+load(default_pre)
diff --git a/mkspecs/features/symbian/do_not_build_as_thumb.prf b/mkspecs/features/symbian/do_not_build_as_thumb.prf
new file mode 100644
index 0000000000..91a63c2263
--- /dev/null
+++ b/mkspecs/features/symbian/do_not_build_as_thumb.prf
@@ -0,0 +1,13 @@
+symbian-abld|symbian-sbsv2 {
+ MMP_RULES += ALWAYS_BUILD_AS_ARM
+} else:symbian-armcc {
+ QMAKE_CFLAGS -= --thumb
+ QMAKE_CFLAGS += --arm
+ QMAKE_CXXFLAGS -= --thumb
+ QMAKE_CXXFLAGS += --arm
+} else:symbian-gcce {
+ QMAKE_CFLAGS -= --thumb
+ QMAKE_CFLAGS += -marm -mthumb-interwork -mapcs
+ QMAKE_CXXFLAGS -= --thumb
+ QMAKE_CXXFLAGS += -marm -mthumb-interwork -mapcs
+}
diff --git a/mkspecs/features/symbian/epocallowdlldata.prf b/mkspecs/features/symbian/epocallowdlldata.prf
new file mode 100644
index 0000000000..b336f488fd
--- /dev/null
+++ b/mkspecs/features/symbian/epocallowdlldata.prf
@@ -0,0 +1 @@
+TARGET.EPOCALLOWDLLDATA=1
diff --git a/mkspecs/features/symbian/localize_deployment.prf b/mkspecs/features/symbian/localize_deployment.prf
new file mode 100644
index 0000000000..185c7130c0
--- /dev/null
+++ b/mkspecs/features/symbian/localize_deployment.prf
@@ -0,0 +1,118 @@
+SYMBIAN_LANG.af = 34 #Afrikaans
+SYMBIAN_LANG.sq = 35 #Albanian
+SYMBIAN_LANG.am = 36 #Amharic
+SYMBIAN_LANG.ar = 37 #Arabic
+SYMBIAN_LANG.hy = 38 #Armenian
+SYMBIAN_LANG.eu = 102 #Basque
+SYMBIAN_LANG.bn = 41 #Bengali
+SYMBIAN_LANG.bg = 42 #Bulgarian
+SYMBIAN_LANG.my = 43 #Burmese
+SYMBIAN_LANG.be = 40 #Byelorussian
+SYMBIAN_LANG.ca = 44 #Catalan
+SYMBIAN_LANG.zh = 31 #Chinese
+SYMBIAN_LANG.hr = 45 #Croatian
+SYMBIAN_LANG.cs = 25 #Czech
+SYMBIAN_LANG.da = 07 #Danish
+SYMBIAN_LANG.nl = 18 #Dutch
+SYMBIAN_LANG.en = 01 #English(UK)
+SYMBIAN_LANG.et = 49 #Estonian
+SYMBIAN_LANG.fi = 09 #Finnish
+SYMBIAN_LANG.fr = 02 #French
+SYMBIAN_LANG.gd = 52 #Gaelic
+SYMBIAN_LANG.gl = 103 #Galician
+SYMBIAN_LANG.ka = 53 #Georgian
+SYMBIAN_LANG.de = 03 #German
+SYMBIAN_LANG.el = 54 #Greek
+SYMBIAN_LANG.gu = 56 #Gujarati
+SYMBIAN_LANG.he = 57 #Hebrew
+SYMBIAN_LANG.hi = 58 #Hindi
+SYMBIAN_LANG.hu = 17 #Hungarian
+SYMBIAN_LANG.is = 15 #Icelandic
+SYMBIAN_LANG.id = 59 #Indonesian
+SYMBIAN_LANG.ga = 60 #Irish
+SYMBIAN_LANG.it = 05 #Italian
+SYMBIAN_LANG.ja = 32 #Japanese
+SYMBIAN_LANG.kn = 62 #Kannada
+SYMBIAN_LANG.kk = 63 #Kazakh
+SYMBIAN_LANG.ko = 65 #Korean
+SYMBIAN_LANG.lo = 66 #Laothian
+SYMBIAN_LANG.lv = 67 #Latvian
+SYMBIAN_LANG.lt = 68 #Lithuanian
+SYMBIAN_LANG.mk = 69 #Macedonian
+SYMBIAN_LANG.ms = 70 #Malay
+SYMBIAN_LANG.ml = 71 #Malayalam
+SYMBIAN_LANG.mr = 72 #Marathi
+SYMBIAN_LANG.mo = 73 #Moldavian
+SYMBIAN_LANG.mn = 74 #Mongolian
+SYMBIAN_LANG.nb = 08 #Norwegian
+SYMBIAN_LANG.nn = 75 #Nynorsk
+SYMBIAN_LANG.fa = 50 #Persian
+SYMBIAN_LANG.pl = 27 #Polish
+SYMBIAN_LANG.pt = 13 #Portuguese
+SYMBIAN_LANG.pa = 77 #Punjabi
+SYMBIAN_LANG.ro = 78 #Romanian
+SYMBIAN_LANG.ru = 16 #Russian
+SYMBIAN_LANG.sr = 79 #Serbian
+SYMBIAN_LANG.si = 80 #Singhalese
+SYMBIAN_LANG.sk = 26 #Slovak
+SYMBIAN_LANG.sl = 28 #Slovenian
+SYMBIAN_LANG.so = 81 #Somali
+SYMBIAN_LANG.st = 101 #South Sotho/Sesotho
+SYMBIAN_LANG.es = 04 #Spanish
+SYMBIAN_LANG.sw = 84 #Swahili
+SYMBIAN_LANG.sv = 06 #Swedish
+SYMBIAN_LANG.tl = 39 #Tagalog
+SYMBIAN_LANG.ta = 87 #Tamil
+SYMBIAN_LANG.te = 88 #Telugu
+SYMBIAN_LANG.th = 33 #Thai
+SYMBIAN_LANG.bo = 89 #Tibetan
+SYMBIAN_LANG.ti = 90 #Tigrinya
+SYMBIAN_LANG.tr = 14 #Turkish
+SYMBIAN_LANG.tk = 92 #Turkmen
+SYMBIAN_LANG.uk = 93 #Ukrainian
+SYMBIAN_LANG.ur = 94 #Urdu
+SYMBIAN_LANG.vi = 96 #Vietnamese
+SYMBIAN_LANG.cy = 97 #Welsh
+SYMBIAN_LANG.zu = 98 #Zulu
+
+# Regional dialects
+SYMBIAN_LANG.en_US = 10 #American English
+SYMBIAN_LANG.fr_BE = 21 #Belgian French
+SYMBIAN_LANG.pt_BR = 76 #Brazilian Portuguese
+SYMBIAN_LANG.en_CA = 46 #Canadian English
+SYMBIAN_LANG.fr_CA = 51 #Canadian French
+SYMBIAN_LANG.el_CY = 55 #Cyprus Greek
+SYMBIAN_LANG.tr_CY = 91 #Cyprus Turkish
+SYMBIAN_LANG.en_TW = 157 #English as appropriate for use in Taiwan
+SYMBIAN_LANG.en_HK = 158 #English as appropriate for use in Hong Kong
+SYMBIAN_LANG.en_CN = 159 #English as appropriate for use in the Peoples Republic of China
+SYMBIAN_LANG.en_JP = 160 #English as appropriate for use in Japan
+SYMBIAN_LANG.en_TH = 161 #English as appropriate for use in Thailand
+SYMBIAN_LANG.sv_FI = 85 #Finland Swedish
+SYMBIAN_LANG.zh_HK = 30 #HongKong Chinese
+SYMBIAN_LANG.es_419 = 83 #Latin American Spanish
+SYMBIAN_LANG.en_ZA = 48 #South African English
+SYMBIAN_LANG.fr_CH = 11 #Swiss French
+SYMBIAN_LANG.de_CH = 12 #Swiss German
+SYMBIAN_LANG.it_CH = 61 #Swiss Italian
+SYMBIAN_LANG.zh_TW = 29 #Taiwan Chinese
+
+isEmpty(SYMBIAN_MATCHED_LANGUAGES) {
+ matchSymbianLanguages()
+}
+
+# If there are translations that do not have Symbian language code defined for that exact
+# language + country combination, but have Symbian language code defined for just the language,
+# map the language + country combination to the same value as the plain language.
+for(language, SYMBIAN_UNMAPPED_LANGUAGES) {
+ languageVar = SYMBIAN_LANG.$${language}
+ fallbackLanguageVar = SYMBIAN_LANG.$$eval(SYMBIAN_LANGUAGE_FALLBACK.$$language)
+ $$languageVar = $$eval($$fallbackLanguageVar)
+}
+
+!isEmpty(SYMBIAN_MATCHED_TRANSLATIONS) {
+ # Generate dependencies to .ts files for pkg files
+ template_pkg_target.depends += $$SYMBIAN_MATCHED_TRANSLATIONS
+ installer_pkg_target.depends += $$SYMBIAN_MATCHED_TRANSLATIONS
+ stub_pkg_target.depends += $$SYMBIAN_MATCHED_TRANSLATIONS
+}
diff --git a/mkspecs/features/symbian/moc.prf b/mkspecs/features/symbian/moc.prf
new file mode 100644
index 0000000000..6030944c7d
--- /dev/null
+++ b/mkspecs/features/symbian/moc.prf
@@ -0,0 +1,18 @@
+load(moc)
+
+symbian-abld|symbian-sbsv2 {
+ RET = $$find(MOC_DIR, "(/|^)\\.[^/]+/?$")
+ !isEmpty(RET):{
+ error("Symbian does not support directories starting with a dot. Please set MOC_DIR to a different value in your profile. MOC_DIR: $$MOC_DIR")
+ }
+
+ RET = $$find(RCC_DIR, "(/|^)\\.[^/]+/?$")
+ !isEmpty(RET):{
+ error("Symbian does not support directories starting with a dot. Please set RCC_DIR to a different value in your profile. RCC_DIR: $$RCC_DIR")
+ }
+
+ RET = $$find(OBJECTS_DIR, "(/|^)\\.[^/]+/?$")
+ !isEmpty(RET):{
+ error("Symbian does not support directories starting with a dot. Please set OBJECTS_DIR to a different value in your profile. OBJECTS_DIR: $$OBJECTS_DIR")
+ }
+}
diff --git a/mkspecs/features/symbian/nested_exceptions.prf b/mkspecs/features/symbian/nested_exceptions.prf
new file mode 100644
index 0000000000..defca94d6f
--- /dev/null
+++ b/mkspecs/features/symbian/nested_exceptions.prf
@@ -0,0 +1,4 @@
+# use nested exceptions runtime support for apps
+contains(TEMPLATE, app) {
+ MMP_RULES *= EPOCNESTEDEXCEPTIONS
+}
diff --git a/mkspecs/features/symbian/opengl.prf b/mkspecs/features/symbian/opengl.prf
new file mode 100644
index 0000000000..9a8ab18433
--- /dev/null
+++ b/mkspecs/features/symbian/opengl.prf
@@ -0,0 +1,21 @@
+contains(QT_CONFIG, opengles1) {
+ INCLUDEPATH += $$QMAKE_INCDIR_OPENGL_ES1
+ !isEmpty(QMAKE_LIBDIR_OPENGL_ES1):QMAKE_LIBDIR += $$QMAKE_LIBDIR_OPENGL_ES1
+ target_qt:LIBS_PRIVATE += $$QMAKE_LIBS_OPENGL_ES1_QT
+ else:LIBS += $$QMAKE_LIBS_OPENGL_ES1
+} else:contains(QT_CONFIG, opengles2) {
+ INCLUDEPATH += $$QMAKE_INCDIR_OPENGL_ES2
+ !isEmpty(QMAKE_LIBDIR_OPENGL_ES2):QMAKE_LIBDIR += $$QMAKE_LIBDIR_OPENGL_ES2
+ target_qt:LIBS_PRIVATE += $$QMAKE_LIBS_OPENGL_ES2_QT
+ else:LIBS += $$QMAKE_LIBS_OPENGL_ES2
+} else {
+ INCLUDEPATH += $$QMAKE_INCDIR_OPENGL
+ !isEmpty(QMAKE_LIBDIR_OPENGL):QMAKE_LIBDIR += $$QMAKE_LIBDIR_OPENGL
+ target_qt:LIBS_PRIVATE += $$QMAKE_LIBS_OPENGL_QT
+ else:LIBS += $$QMAKE_LIBS_OPENGL
+}
+
+contains(QT_CONFIG, egl) {
+ !isEmpty(QMAKE_LIBS_EGL): LIBS += $$QMAKE_LIBS_EGL
+}
+
diff --git a/mkspecs/features/symbian/platform_paths.prf b/mkspecs/features/symbian/platform_paths.prf
new file mode 100644
index 0000000000..f19898f188
--- /dev/null
+++ b/mkspecs/features/symbian/platform_paths.prf
@@ -0,0 +1,496 @@
+#
+# ==============================================================================
+# Name : platform_paths.prf
+# Part of :
+# Interface : Platform Path Definitions API for Qt/S60
+# Description : Predefined include paths to be used in the pro-files for the
+# components in the layered model. There is one definition for
+# each layer. The pro-file should use the statement that is
+# intended for the same layer as where the pro-file resides.
+#
+# Usage examples:
+#
+# Note: this file gets automatically added to all Qt/S60 projects
+#
+# Variable usages to add the system include paths
+#
+# The include paths has to be related to the layer in which your SW
+# resides. Thus as an example: a component residing in middleware
+# layer should use the MW specific macro.
+#
+# INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE
+# INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE
+# INCLUDEPATH += $$OS_LAYER_SYSTEMINCLUDE
+#
+# If there is a need to include public headers of some S60 component,
+# various *_EXPORT_PATH macros can be utilized:
+#
+# INCLUDEPATH += $$OS_LAYER_PUBLIC_EXPORT_PATH(somecomponent)
+#
+# Variables related to using various parts of stdapis:
+#
+# To use STLLIB you need to have this in your pro-file:
+#
+# QMAKE_CXXFLAGS.CW *= $$STLLIB_USAGE_CW_FLAGS
+# DEFINES *= $$STLLIB_USAGE_DEFINES
+#
+# Depending on what module you are using from stdapis you need to have
+# one or more of the following variables in your pro-file.
+#
+# INCLUDEPATH += $$OS_LAYER_LIBC_SYSTEMINCLUDE
+# INCLUDEPATH += $$OS_LAYER_GLIB_SYSTEMINCLUDE
+# INCLUDEPATH += $$OS_LAYER_SSL_SYSTEMINCLUDE
+# INCLUDEPATH += $$OS_LAYER_STDCPP_SYSTEMINCLUDE
+# INCLUDEPATH += $$OS_LAYER_BOOST_SYSTEMINCLUDE
+# INCLUDEPATH += $$OS_LAYER_DBUS_SYSTEMINCLUDE
+# INCLUDEPATH += $$OS_LAYER_LIBUTILITY_SYSTEMINCLUDE
+#
+# These paths are primarily meant to be used as is in bld.inf and .mmp
+# files, so they do not contain epocroot when using official symbian
+# toolchains (symbian-abld or symbian-sbsv2).
+# For makefile based mkspecs, epocroot is prepended to all paths for
+# convenience.
+#
+# To use paths defined here in other contexts that require epocroot to be
+# prepended always, such as exists checks, please use prependEpocroot
+# replacement function:
+#
+# exists($$prependEpocroot($$MW_LAYER_PUBLIC_EXPORT_PATH(foobar.h)))
+#
+# ==============================================================================
+
+symbian-abld|symbian-sbsv2 {
+ epocroot_prefix = /
+} else {
+ epocroot_prefix = $${EPOCROOT}
+}
+
+symbian-abld|symbian-sbsv2:exists($${EPOCROOT}epoc32/include/platform_paths.prf) {
+
+ # Symbian does not provide correct profiles for non-mmp based systems, so
+ # we only should get in here with abld and sbsv2.
+
+ # Load platform specific paths
+ load($${EPOCROOT}epoc32/include/platform_paths.prf)
+
+} else {
+
+ # No platform specific paths provided, use default paths
+
+ exists($${EPOCROOT}epoc32/include/mw) { # New SF structure
+
+ # ---------------------------------------
+ # Location, where the applications layer specific public headers are exported
+ # ---------------------------------------
+
+ defineReplace(APP_LAYER_SDK_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/app/$$1)
+ }
+ defineReplace(APP_LAYER_PUBLIC_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/app/$$1)
+ }
+
+ # ---------------------------------------
+ # Location, where the applications layer specific platform headers are exported
+ # ---------------------------------------
+
+ defineReplace(APP_LAYER_DOMAIN_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/platform/app/$$1)
+ }
+ defineReplace(APP_LAYER_PLATFORM_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/platform/app/$$1)
+ }
+
+ # ---------------------------------------
+ # Location, where the middleware layer specific public headers are exported
+ # ---------------------------------------
+
+ defineReplace(MW_LAYER_SDK_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/mw/$$1)
+ }
+ defineReplace(MW_LAYER_PUBLIC_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/mw/$$1)
+ }
+
+ # ---------------------------------------
+ # Location, where the middleware layer specific platform headers are exported
+ # ---------------------------------------
+
+ defineReplace(MW_LAYER_DOMAIN_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/platform/mw/$$1)
+ }
+ defineReplace(MW_LAYER_PLATFORM_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/platform/mw/$$1)
+ }
+
+ # ---------------------------------------
+ # Location, where the os layer specific public headers are exported
+ # ---------------------------------------
+
+ defineReplace(OSEXT_LAYER_SDK_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/$$1)
+ }
+ # WARNING: If the following path changes see the exists() function around line 219
+ defineReplace(OS_LAYER_PUBLIC_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/$$1)
+ }
+
+ # ---------------------------------------
+ # Location, where the os specific platform headers are exported
+ # ---------------------------------------
+
+ defineReplace(OSEXT_LAYER_DOMAIN_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/platform/$$1)
+ }
+ defineReplace(OS_LAYER_PLATFORM_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/platform/$$1)
+ }
+
+ # ---------------------------------------
+ # General comments about the 3 define statements related to include paths:
+ # 1) the /epoc32/include/oem is now defined there for backward compability.
+ # Once the directory is empty, the directory will be removed. However this
+ # enables us to ensure that if you use these define statements => you do
+ # not have to remove the statements later on, when the directory no longer
+ # exists.
+ # 2) These statements should be enough in normal cases. For certain specific
+ # cases you might need to add some specific directory from /epoc32/include
+ # (for instance /epoc32/include/ecom).
+ # In normal cases the include staments in code should be relative to one of
+ # the system include paths, but in certain cases, the included files requires
+ # that the subdirectory is also part of the system include paths.
+ # ---------------------------------------
+
+ # This variable defines the include paths, which are intended to be
+ # used in the pro-files that are part of the applications-layer. It includes all
+ # the needed directories from the /epoc32/include, that are valid ones for the
+ # application-layer components.
+ #
+ # Applications layer is the last one in the list, since most likely the most of
+ # the headers come from middleware or os-layer => thus they are first.
+
+ APP_LAYER_SYSTEMINCLUDE = \
+ $${epocroot_prefix}epoc32/include \
+ $${epocroot_prefix}epoc32/include/mw \
+ $${epocroot_prefix}epoc32/include/platform/mw \
+ $${epocroot_prefix}epoc32/include/platform \
+ $${epocroot_prefix}epoc32/include/app \
+ $${epocroot_prefix}epoc32/include/platform/app \
+ $${epocroot_prefix}epoc32/include/platform/loc \
+ $${epocroot_prefix}epoc32/include/platform/mw/loc \
+ $${epocroot_prefix}epoc32/include/platform/app/loc \
+ $${epocroot_prefix}epoc32/include/platform/loc/sc \
+ $${epocroot_prefix}epoc32/include/platform/mw/loc/sc \
+ $${epocroot_prefix}epoc32/include/platform/app/loc/sc
+
+ # This define statements defines the include paths, which are intended to be
+ # used in the pro-files that are part of the middleware-layer. It includes all
+ # the needed directories from the /epoc32/include, that are valid ones for the
+ # middleware-layer components.
+
+ MW_LAYER_SYSTEMINCLUDE = \
+ $${epocroot_prefix}epoc32/include \
+ $${epocroot_prefix}epoc32/include/mw \
+ $${epocroot_prefix}epoc32/include/platform/mw \
+ $${epocroot_prefix}epoc32/include/platform \
+ $${epocroot_prefix}epoc32/include/platform/loc \
+ $${epocroot_prefix}epoc32/include/platform/mw/loc \
+ $${epocroot_prefix}epoc32/include/platform/loc/sc \
+ $${epocroot_prefix}epoc32/include/platform/mw/loc/sc
+
+ # This define statements defines the include paths, which are intended to be
+ # used in the pro-files that are part of the osextensions-layer. It includes all
+ # the needed directories from the /epoc32/include, that are valid ones for the
+ # os-layer components.
+
+ OS_LAYER_SYSTEMINCLUDE = \
+ $${epocroot_prefix}epoc32/include \
+ $${epocroot_prefix}epoc32/include/platform \
+ $${epocroot_prefix}epoc32/include/platform/loc \
+ $${epocroot_prefix}epoc32/include/platform/loc/sc
+
+ # This define statements defines the include paths, which are intended to be
+ # used in the pro-files that are part of the os-layer. This is intended
+ # to be only used by those components which need to use in their mmp-file either
+ # kern_ext.mmh or nkern_ext.mmh. Reason is that those
+ # 2 files already contain the /epoc32/include as system include path.
+
+ OS_LAYER_KERNEL_SYSTEMINCLUDE = \
+ $${epocroot_prefix}epoc32/include/platform
+
+
+ # ---------------------------------------
+ # Definitions that also define the systeminclude paths for various
+ # part of stdapis. Append to INCLUDEPATH in pro-file.
+ # ---------------------------------------
+
+ OS_LAYER_LIBC_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis) \
+ $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/sys)
+
+ OS_LAYER_GLIB_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/glib-2.0) \
+ $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/glib-2.0/glib) \
+ $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/glib-2.0/gObject)
+
+ OS_LAYER_SSL_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/openssl)
+
+ # stlportv5 is preferred over stlport as it has the throwing version of operator new
+ exists($${EPOCROOT}epoc32/include/stdapis/stlport) \
+ :!exists($${EPOCROOT}epoc32/include/stdapis/stlportv5) {
+ OS_LAYER_STDCPP_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/stlport)
+ } else {
+ OS_LAYER_STDCPP_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/stlportv5)
+ }
+
+ OS_LAYER_BOOST_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/boost)
+
+ OS_LAYER_DBUS_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/dbus-1.0) \
+ $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/dbus-1.0/dbus)
+
+ OS_LAYER_LIBUTILITY_SYSTEMINCLUDE = $$OS_LAYER_PLATFORM_EXPORT_PATH(stdapis/utility)
+
+ } else { # Old pre-SF structure
+
+ # ---------------------------------------
+ # Location, where the applications layer specific public headers are exported
+ # ---------------------------------------
+
+ defineReplace(APP_LAYER_SDK_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/applications/$$1)
+ }
+ defineReplace(APP_LAYER_PUBLIC_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/applications/$$1)
+ }
+
+ # ---------------------------------------
+ # Location, where the applications layer specific platform headers are exported
+ # ---------------------------------------
+
+ defineReplace(APP_LAYER_DOMAIN_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/domain/applications/$$1)
+ }
+ defineReplace(APP_LAYER_PLATFORM_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/domain/applications/$$1)
+ }
+
+ # ---------------------------------------
+ # Location, where the middleware layer specific public headers are exported
+ # ---------------------------------------
+
+ defineReplace(MW_LAYER_SDK_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/middleware/$$1)
+ }
+ defineReplace(MW_LAYER_PUBLIC_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/middleware/$$1)
+ }
+
+ # ---------------------------------------
+ # Location, where the middleware layer specific platform headers are exported
+ # ---------------------------------------
+
+ defineReplace(MW_LAYER_DOMAIN_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/domain/middleware/$$1)
+ }
+ defineReplace(MW_LAYER_PLATFORM_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/domain/middleware/$$1)
+ }
+
+ # ---------------------------------------
+ # Location, where the os layer specific public headers are exported
+ # ---------------------------------------
+
+ defineReplace(OSEXT_LAYER_SDK_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/osextensions/$$1)
+ }
+ # WARNING: If the following path changes see the exists() function around line 430
+ defineReplace(OS_LAYER_PUBLIC_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/osextensions/$$1)
+ }
+
+ # ---------------------------------------
+ # Location, where the os specific platform headers are exported
+ # ---------------------------------------
+
+ defineReplace(OSEXT_LAYER_DOMAIN_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/domain/osextensions/$$1)
+ }
+ defineReplace(OS_LAYER_PLATFORM_EXPORT_PATH) {
+ return ($${epocroot_prefix}epoc32/include/domain/osextensions/$$1)
+ }
+
+ # ---------------------------------------
+ # General comments about the 3 define statements related to include paths:
+ # 1) the /epoc32/include/oem is now defined there for backward compability.
+ # Once the directory is empty, the directory will be removed. However this
+ # enables us to ensure that if you use these define statements => you do
+ # not have to remove the statements later on, when the directory no longer
+ # exists.
+ # 2) These statements should be enough in normal cases. For certain specific
+ # cases you might need to add some specific directory from /epoc32/include
+ # (for instance /epoc32/include/ecom).
+ # In normal cases the include staments in code should be relative to one of
+ # the system include paths, but in certain cases, the included files requires
+ # that the subdirectory is also part of the system include paths.
+ # ---------------------------------------
+
+ # This variable defines the include paths, which are intended to be
+ # used in the pro-files that are part of the applications-layer. It includes all
+ # the needed directories from the /epoc32/include, that are valid ones for the
+ # application-layer components.
+ #
+ # Applications layer is the last one in the list, since most likely the most of
+ # the headers come from middleware or os-layer => thus they are first.
+
+ APP_LAYER_SYSTEMINCLUDE = \
+ $${epocroot_prefix}epoc32/include \
+ $${epocroot_prefix}epoc32/include/oem \
+ $${epocroot_prefix}epoc32/include/middleware \
+ $${epocroot_prefix}epoc32/include/domain/middleware \
+ $${epocroot_prefix}epoc32/include/osextensions \
+ $${epocroot_prefix}epoc32/include/domain/osextensions \
+ $${epocroot_prefix}epoc32/include/applications \
+ $${epocroot_prefix}epoc32/include/domain/applications \
+ $${epocroot_prefix}epoc32/include/domain/osextensions/loc \
+ $${epocroot_prefix}epoc32/include/domain/middleware/loc \
+ $${epocroot_prefix}epoc32/include/domain/applications/loc \
+ $${epocroot_prefix}epoc32/include/domain/osextensions/loc/sc \
+ $${epocroot_prefix}epoc32/include/domain/middleware/loc/sc \
+ $${epocroot_prefix}epoc32/include/domain/applications/loc/sc
+
+ # This define statements defines the include paths, which are intended to be
+ # used in the pro-files that are part of the middleware-layer. It includes all
+ # the needed directories from the /epoc32/include, that are valid ones for the
+ # middleware-layer components.
+
+ MW_LAYER_SYSTEMINCLUDE = \
+ $${epocroot_prefix}epoc32/include \
+ $${epocroot_prefix}epoc32/include/oem \
+ $${epocroot_prefix}epoc32/include/middleware \
+ $${epocroot_prefix}epoc32/include/domain/middleware \
+ $${epocroot_prefix}epoc32/include/osextensions \
+ $${epocroot_prefix}epoc32/include/domain/osextensions \
+ $${epocroot_prefix}epoc32/include/domain/osextensions/loc \
+ $${epocroot_prefix}epoc32/include/domain/middleware/loc \
+ $${epocroot_prefix}epoc32/include/domain/osextensions/loc/sc \
+ $${epocroot_prefix}epoc32/include/domain/middleware/loc/sc
+
+ # This define statements defines the include paths, which are intended to be
+ # used in the pro-files that are part of the osextensions-layer. It includes all
+ # the needed directories from the /epoc32/include, that are valid ones for the
+ # os-layer components.
+
+ OS_LAYER_SYSTEMINCLUDE = \
+ $${epocroot_prefix}epoc32/include \
+ $${epocroot_prefix}epoc32/include/oem \
+ $${epocroot_prefix}epoc32/include/osextensions \
+ $${epocroot_prefix}epoc32/include/domain/osextensions \
+ $${epocroot_prefix}epoc32/include/domain/osextensions/loc \
+ $${epocroot_prefix}epoc32/include/domain/osextensions/loc/sc
+
+ # This define statements defines the include paths, which are intended to be
+ # used in the pro-files that are part of the os-layer. This is intended
+ # to be only used by those components which need to use in their mmp-file either
+ # kern_ext.mmh or nkern_ext.mmh. Reason is that those
+ # 2 files already contain the /epoc32/include as system include path.
+
+ OS_LAYER_KERNEL_SYSTEMINCLUDE = \
+ $${epocroot_prefix}epoc32/include/oem \
+ $${epocroot_prefix}epoc32/include/osextensions \
+ $${epocroot_prefix}epoc32/include/domain/osextensions
+
+
+ # ---------------------------------------
+ # Definitions that also define the systeminclude paths for various
+ # part of stdapis. Append to INCLUDEPATH in pro-file.
+ # ---------------------------------------
+
+ OS_LAYER_LIBC_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis) \
+ $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/sys) \
+ $${epocroot_prefix}epoc32/include/stdapis \
+ $${epocroot_prefix}epoc32/include/stdapis/sys
+
+ OS_LAYER_GLIB_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/glib-2.0) \
+ $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/glib-2.0/glib) \
+ $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/glib-2.0/gObject) \
+ $${epocroot_prefix}epoc32/include/stdapis/glib-2.0 \
+ $${epocroot_prefix}epoc32/include/stdapis/glib-2.0/glib \
+ $${epocroot_prefix}epoc32/include/stdapis/glib-2.0/gObject
+
+ OS_LAYER_SSL_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/openssl) \
+ $${epocroot_prefix}epoc32/include/stdapis/openssl
+
+ # stlportv5 is preferred over stlport as it has the throwing version of operator new
+ OS_LAYER_STDCPP_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/stlportv5) \
+ $${epocroot_prefix}epoc32/include/stdapis/stlportv5
+ exists($${EPOCROOT}epoc32/include/osextensions/stdapis/stlport) \
+ |exists($${EPOCROOT}epoc32/include/stdapis/stlport) {
+ !exists($${EPOCROOT}epoc32/include/osextensions/stdapis/stlportv5) \
+ :!exists($${EPOCROOT}epoc32/include/stdapis/stlportv5) {
+ OS_LAYER_STDCPP_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/stlport) \
+ $${epocroot_prefix}epoc32/include/stdapis/stlport
+ }
+ }
+
+ OS_LAYER_BOOST_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/boost) \
+ $${epocroot_prefix}epoc32/include/stdapis/boost
+
+ OS_LAYER_DBUS_SYSTEMINCLUDE = $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/dbus-1.0) \
+ $$OS_LAYER_PUBLIC_EXPORT_PATH(stdapis/dbus-1.0/dbus) \
+ $${epocroot_prefix}epoc32/include/stdapis/dbus-1.0 \
+ $${epocroot_prefix}epoc32/include/stdapis/dbus-1.0/dbus
+
+ OS_LAYER_LIBUTILITY_SYSTEMINCLUDE = $$OS_LAYER_PLATFORM_EXPORT_PATH(stdapis/utility) \
+ $${epocroot_prefix}epoc32/include/stdapis/utility
+
+ }
+
+ # Definitions common to both structures
+
+ # ---------------------------------------
+ # Definitions to export IBY files to different folders where they will be taken
+ # to ROM image
+ # ---------------------------------------
+
+ defineReplace(CORE_APP_LAYER_IBY_EXPORT_PATH) {
+ return($${epocroot_prefix}epoc32/rom/include/core/app/$$1)
+ }
+ defineReplace(CORE_MW_LAYER_IBY_EXPORT_PATH) {
+ return($${epocroot_prefix}epoc32/rom/include/core/mw/$$1)
+ }
+
+ defineReplace(LANGUAGE_APP_LAYER_IBY_EXPORT_PATH) {
+ return($${epocroot_prefix}epoc32/rom/include/language/app/$$1)
+ }
+ defineReplace(LANGUAGE_MW_LAYER_IBY_EXPORT_PATH) {
+ return($${epocroot_prefix}epoc32/rom/include/language/mw/$$1)
+ }
+
+ defineReplace(CUSTOMER_APP_LAYER_IBY_EXPORT_PATH) {
+ return($${epocroot_prefix}epoc32/rom/include/customer/app/$$1)
+ }
+ defineReplace(CUSTOMER_MW_LAYER_IBY_EXPORT_PATH) {
+ return($${epocroot_prefix}epoc32/rom/include/customer/mw/$$1)
+ }
+
+ defineReplace(CUSTOMER_VARIANT_APP_LAYER_IBY_EXPORT_PATH) {
+ return($${epocroot_prefix}epoc32/rom/include/customervariant/app/$$1)
+ }
+ defineReplace(CUSTOMER_VARIANT_MW_LAYER_IBY_EXPORT_PATH) {
+ return($${epocroot_prefix}epoc32/rom/include/customervariant/mw/$$1)
+ }
+
+ # You need to define the following in pro-file, if you are using the stllib:
+ # QMAKE_CXXFLAGS.CW *= $$STLLIB_USAGE_CW_FLAGS
+ # DEFINES *= $$STLLIB_USAGE_DEFINES
+ STLLIB_USAGE_CW_FLAGS = "-wchar_t on"
+ STLLIB_USAGE_DEFINES = _WCHAR_T_DECLARED
+
+ # Smart prepend of EPOCROOT to a string
+ defineReplace(prependEpocroot) {
+ contains(1, ^$${EPOCROOT}) {
+ return($$1)
+ } else {
+ return($${EPOCROOT}$$replace(1,"^/",))
+ }
+ }
+
+}
diff --git a/mkspecs/features/symbian/prepend_includepath.prf b/mkspecs/features/symbian/prepend_includepath.prf
new file mode 100644
index 0000000000..d9fd4fe46e
--- /dev/null
+++ b/mkspecs/features/symbian/prepend_includepath.prf
@@ -0,0 +1,14 @@
+# Allow .pro files to specify include path(s) to be prepended to the list.
+#
+# This allows the project to override the default ordering, whereby paths
+# relative to $$QMAKE_INCDIR_QT always come first. This ordering can cause
+# problems when both the epoc32/include tree and a Qt include directory
+# contain a header of the same name - in this case, the Qt header is always
+# included by virtue of its path appearing first in the SYSTEMINCLUDE
+# directives in the generated MMP file.
+#
+# To work around this situation, the following line can be added to the .pro
+# file:
+# PREPEND_INCLUDEPATH = /epoc32/include
+#
+INCLUDEPATH = $$PREPEND_INCLUDEPATH $$INCLUDEPATH
diff --git a/mkspecs/features/symbian/qt.prf b/mkspecs/features/symbian/qt.prf
new file mode 100644
index 0000000000..c376b642d1
--- /dev/null
+++ b/mkspecs/features/symbian/qt.prf
@@ -0,0 +1,13 @@
+contains(DEFINES, QT_MAKEDLL)|contains(DEFINES, QT_DLL) {
+ CONFIG *= epocallowdlldata
+}
+
+CONFIG += qtmain
+
+load(qt)
+
+# Workaround for the fact that Gnupoc and Symbian chose different approaches to
+# the letter casing of headers.
+contains(CONFIG, is_using_gnupoc) {
+ INCLUDEPATH += $${PWD}/../../common/symbian/header-wrappers
+}
diff --git a/mkspecs/features/symbian/qt_config.prf b/mkspecs/features/symbian/qt_config.prf
new file mode 100644
index 0000000000..82c18621b7
--- /dev/null
+++ b/mkspecs/features/symbian/qt_config.prf
@@ -0,0 +1,9 @@
+load(qt_config)
+
+!contains(QMAKE_HOST.os, "Windows") {
+ # Test for the existence of lower cased headers, a sign of using Gnupoc.
+ # Note that the qmake "exists" test won't do because it is case insensitive.
+ system("test -f $${EPOCROOT}epoc32/include/akndoc.h") {
+ CONFIG += is_using_gnupoc
+ }
+}
diff --git a/mkspecs/features/symbian/release.prf b/mkspecs/features/symbian/release.prf
new file mode 100644
index 0000000000..8164495c6f
--- /dev/null
+++ b/mkspecs/features/symbian/release.prf
@@ -0,0 +1 @@
+QMAKE_LIBDIR += $${EPOCROOT}epoc32/release/armv5/urel
diff --git a/mkspecs/features/symbian/run_on_phone.prf b/mkspecs/features/symbian/run_on_phone.prf
new file mode 100644
index 0000000000..ba88a662f9
--- /dev/null
+++ b/mkspecs/features/symbian/run_on_phone.prf
@@ -0,0 +1,40 @@
+# make sure we have a sis file and then call 'runonphone' to execute it on the phone
+
+GENERATE_RUN_TARGETS = false
+
+contains(TEMPLATE, app): GENERATE_RUN_TARGETS = true
+else:!equals(DEPLOYMENT, default_deployment) {
+ for(dep_item, $$list($$DEPLOYMENT)) {
+ ### Qt 5: remove .sources, inconsistent with INSTALLS
+ dep_item_sources = $$eval($${dep_item}.files) $$eval($${dep_item}.sources)
+ !isEmpty(dep_item_sources): GENERATE_RUN_TARGETS = true
+ }
+}
+
+equals(GENERATE_RUN_TARGETS, true) {
+ baseTarget = $$symbianRemoveSpecialCharacters($$basename(TARGET))
+ sis_file = $${baseTarget}.sis
+ symbian-abld|symbian-sbsv2 {
+ sis_destdir =
+ } else {
+ sis_destdir = $$DESTDIR
+ isEmpty(sis_destdir):sis_destdir = .
+ !equals(TARGET, "$$baseTarget"):sis_destdir = $$sis_destdir/$$dirname(TARGET)
+ !isEmpty(sis_destdir):!contains(sis_destdir, "[/\\\\]$"):sis_destdir = $${sis_destdir}/
+ contains(QMAKE_HOST.os, "Windows"):sis_destdir = $$replace(sis_destdir, "/", "\\")
+ }
+
+ contains(SYMBIAN_PLATFORMS, "WINSCW"):contains(TEMPLATE, "app") {
+ run_target.target = run
+ run_target.commands = call "$${EPOCROOT}epoc32/release/winscw/udeb/$${baseTarget}.exe" $(QT_RUN_OPTIONS)
+
+ QMAKE_EXTRA_TARGETS += run_target
+ }
+
+ runonphone_target.target = runonphone
+ runonphone_target.depends = sis
+ runonphone_target.commands = runonphone $(QT_RUN_ON_PHONE_OPTIONS) --sis "$${sis_destdir}$${sis_file}"
+ contains(TEMPLATE, "app"):runonphone_target.commands += "$${baseTarget}.exe" $(QT_RUN_OPTIONS)
+
+ QMAKE_EXTRA_TARGETS += runonphone_target
+}
diff --git a/mkspecs/features/symbian/sis_targets.prf b/mkspecs/features/symbian/sis_targets.prf
new file mode 100644
index 0000000000..d0fe881003
--- /dev/null
+++ b/mkspecs/features/symbian/sis_targets.prf
@@ -0,0 +1,226 @@
+# Sis file creation
+GENERATE_SIS_TARGETS = false
+
+contains(TEMPLATE, app): GENERATE_SIS_TARGETS = true
+else:!equals(DEPLOYMENT, default_deployment) {
+ for(dep_item, $$list($$DEPLOYMENT)) {
+ ### Qt 5: remove .sources, inconsistent with INSTALLS
+ dep_item_sources = $$eval($${dep_item}.files) $$eval($${dep_item}.sources)
+ !isEmpty(dep_item_sources): GENERATE_SIS_TARGETS = true
+ }
+}
+
+equals(GENERATE_SIS_TARGETS, true) {
+
+ baseTarget = $$symbianRemoveSpecialCharacters($$basename(TARGET))
+ template_pkg_target.target = $${baseTarget}_template.pkg
+ template_pkg_target.depends += $$_PRO_FILE_
+ template_pkg_target.commands = $(MAKE) -f $(MAKEFILE) qmake
+ installer_pkg_target.target = $${baseTarget}_installer.pkg
+ installer_pkg_target.depends += $$_PRO_FILE_
+ installer_pkg_target.commands = $(MAKE) -f $(MAKEFILE) qmake
+ stub_pkg_target.target = $${baseTarget}_stub.pkg
+ stub_pkg_target.depends += $$_PRO_FILE_
+ stub_pkg_target.commands = $(MAKE) -f $(MAKEFILE) qmake
+ QMAKE_EXTRA_TARGETS += template_pkg_target installer_pkg_target stub_pkg_target
+
+ qtPrepareTool(QMAKE_CREATEPACKAGE, createpackage)
+
+ CREATEPACKAGE_DIR = $$OBJECTS_DIR/createpackage_tmp
+ QMAKE_CLEAN += $$CREATEPACKAGE_DIR/*
+
+ symbian-abld|symbian-sbsv2 {
+ symbian-sbsv2 {
+ CONVERT_GCCE_PARAM = -g
+ } else {
+ CONVERT_GCCE_PARAM =
+ }
+
+ make_cache_name = .make.cache
+ sis_target.target = sis
+ sis_target.commands = $(if $(wildcard $$make_cache_name), \
+ $(MAKE) -f $(MAKEFILE) ok_sis MAKEFILES=$$make_cache_name \
+ , \
+ $(if $(QT_SIS_TARGET), \
+ $(MAKE) -f $(MAKEFILE) ok_sis \
+ , \
+ $(MAKE) -f $(MAKEFILE) fail_sis_nocache \
+ ) \
+ )
+
+ sis_target.depends += $${baseTarget}_template.pkg
+
+ ok_sis_target.target = ok_sis
+ ok_sis_target.commands = $$QMAKE_CREATEPACKAGE $$CONVERT_GCCE_PARAM -t $$CREATEPACKAGE_DIR $(QT_SIS_OPTIONS) $${baseTarget}_template.pkg \
+ $(QT_SIS_TARGET) $(QT_SIS_CERTIFICATE) $(QT_SIS_KEY) $(QT_SIS_PASSPHRASE)
+
+ unsigned_sis_target.target = unsigned_sis
+ unsigned_sis_target.commands = $(if $(wildcard $$make_cache_name), \
+ $(MAKE) -f $(MAKEFILE) ok_unsigned_sis MAKEFILES=$$make_cache_name \
+ , \
+ $(if $(QT_SIS_TARGET), \
+ $(MAKE) -f $(MAKEFILE) ok_unsigned_sis \
+ , \
+ $(MAKE) -f $(MAKEFILE) fail_sis_nocache \
+ ) \
+ )
+
+ unsigned_sis_target.depends += $${baseTarget}_template.pkg
+
+ ok_unsigned_sis_target.target = ok_unsigned_sis
+ ok_unsigned_sis_target.commands = $$QMAKE_CREATEPACKAGE $$CONVERT_GCCE_PARAM -t $$CREATEPACKAGE_DIR $(QT_SIS_OPTIONS) -o $${baseTarget}_template.pkg $(QT_SIS_TARGET)
+
+ target_sis_target.target = $${baseTarget}.sis
+ target_sis_target.commands = $(MAKE) -f $(MAKEFILE) sis
+
+ # The installer_sis target has dependency to sis target, so it will regenerate sis package.
+ # To create smart installer wrapper for for an existing sis package, use ok_installer_sis target directly.
+ installer_sis_target.target = installer_sis
+ installer_sis_target.commands = $(MAKE) -f $(MAKEFILE) ok_installer_sis
+ installer_sis_target.depends = $${baseTarget}_installer.pkg sis
+
+ ok_installer_sis_target.target = ok_installer_sis
+ ok_installer_sis_target.commands = $$QMAKE_CREATEPACKAGE -t $$CREATEPACKAGE_DIR $(QT_SIS_OPTIONS) $${baseTarget}_installer.pkg - \
+ $(QT_SIS_CERTIFICATE) $(QT_SIS_KEY) $(QT_SIS_PASSPHRASE)
+ ok_installer_sis_target.depends = $${baseTarget}_installer.pkg
+
+ unsigned_installer_sis_target.target = unsigned_installer_sis
+ unsigned_installer_sis_target.commands = $(MAKE) -f $(MAKEFILE) ok_unsigned_installer_sis
+ unsigned_installer_sis_target.depends = $${baseTarget}_installer.pkg unsigned_sis
+
+ ok_unsigned_installer_sis_target.target = ok_unsigned_installer_sis
+ ok_unsigned_installer_sis_target.commands = $$QMAKE_CREATEPACKAGE -t $$CREATEPACKAGE_DIR $(QT_SIS_OPTIONS) -o $${baseTarget}_installer.pkg
+ ok_unsigned_installer_sis_target.depends = $${baseTarget}_installer.pkg
+
+ fail_sis_nocache_target.target = fail_sis_nocache
+ fail_sis_nocache_target.commands = "$(error Project has to be built or QT_SIS_TARGET environment variable has to be set before calling 'SIS' target)"
+
+ stub_sis_target.target = stub_sis
+ stub_sis_target.commands = $(if $(wildcard $$make_cache_name), \
+ $(MAKE) -f $(MAKEFILE) ok_stub_sis MAKEFILES=$$make_cache_name \
+ , \
+ $(if $(QT_SIS_TARGET), \
+ $(MAKE) -f $(MAKEFILE) ok_stub_sis \
+ , \
+ $(MAKE) -f $(MAKEFILE) fail_sis_nocache \
+ ) \
+ )
+
+ stub_sis_target.depends += $${baseTarget}_stub.pkg
+
+ ok_stub_sis_target.target = ok_stub_sis
+ ok_stub_sis_target.commands = $$QMAKE_CREATEPACKAGE -t $$CREATEPACKAGE_DIR -s $(QT_SIS_OPTIONS) $${baseTarget}_stub.pkg \
+ $(QT_SIS_TARGET) $(QT_SIS_CERTIFICATE) $(QT_SIS_KEY) $(QT_SIS_PASSPHRASE)
+
+ QMAKE_EXTRA_TARGETS += sis_target \
+ ok_sis_target \
+ unsigned_sis_target \
+ ok_unsigned_sis_target \
+ target_sis_target \
+ installer_sis_target \
+ ok_installer_sis_target \
+ unsigned_installer_sis_target \
+ ok_unsigned_installer_sis_target \
+ fail_sis_nocache_target \
+ stub_sis_target \
+ ok_stub_sis_target
+ # Sbsv2 has its own store_build target which is using flms.
+ !symbian-sbsv2 {
+ contains(QMAKE_HOST.os, "Windows") {
+ shellFixedHash = $${LITERAL_HASH}
+ } else {
+ shellFixedHash = \\$${LITERAL_HASH}
+ }
+ store_build_target.target = store_build
+ store_build_target.commands = \
+ @echo $${shellFixedHash} ============================================================================== > $$make_cache_name \
+ && echo $${shellFixedHash} This file is generated by make and should not be modified by the user >> $$make_cache_name \
+ && echo $${shellFixedHash} Name : $$make_cache_name >> $$make_cache_name \
+ && echo $${shellFixedHash} Part of : lineedits >> $$make_cache_name \
+ && echo $${shellFixedHash} Description : This file is used to cache last build target for >> $$make_cache_name \
+ && echo $${shellFixedHash} make sis target. >> $$make_cache_name \
+ && echo $${shellFixedHash} Version : >> $$make_cache_name \
+ && echo $${shellFixedHash} >> $$make_cache_name \
+ && echo $${shellFixedHash} ============================================================================== >> $$make_cache_name \
+ && echo QT_SIS_TARGET ?= $(QT_SIS_TARGET) >> $$make_cache_name
+
+ QMAKE_EXTRA_TARGETS += store_build_target
+ QMAKE_CLEAN += $$make_cache_name
+ }
+ } else {
+ sis_destdir = $$DESTDIR
+ isEmpty(sis_destdir):sis_destdir = .
+ !equals(TARGET, "$$baseTarget"):sis_destdir = $$sis_destdir/$$dirname(TARGET)
+
+ sis_target.target = sis
+ sis_target.commands = $$QMAKE_CREATEPACKAGE -t $$CREATEPACKAGE_DIR $(QT_SIS_OPTIONS) $${baseTarget}_template.pkg \
+ - $(QT_SIS_CERTIFICATE) $(QT_SIS_KEY) $(QT_SIS_PASSPHRASE)
+ sis_target.depends = first $${baseTarget}_template.pkg
+
+ unsigned_sis_target.target = unsigned_sis
+ unsigned_sis_target.commands = $$QMAKE_CREATEPACKAGE -t $$CREATEPACKAGE_DIR $(QT_SIS_OPTIONS) -o $${baseTarget}_template.pkg
+ unsigned_sis_target.depends = first $${baseTarget}_template.pkg
+
+ target_sis_target.target = $${sis_destdir}/$${baseTarget}.sis
+ target_sis_target.commands = $(MAKE) -f $(MAKEFILE) sis
+
+ installer_sis_target.target = installer_sis
+ installer_sis_target.commands = $(MAKE) -f $(MAKEFILE) ok_installer_sis
+ installer_sis_target.depends = $${baseTarget}_installer.pkg sis
+
+ ok_installer_sis_target.target = ok_installer_sis
+ ok_installer_sis_target.commands = $$QMAKE_CREATEPACKAGE -t $$CREATEPACKAGE_DIR $(QT_SIS_OPTIONS) $${baseTarget}_installer.pkg - \
+ $(QT_SIS_CERTIFICATE) $(QT_SIS_KEY) $(QT_SIS_PASSPHRASE)
+ ok_installer_sis_target.depends = $${baseTarget}_installer.pkg
+
+ unsigned_installer_sis_target.target = unsigned_installer_sis
+ unsigned_installer_sis_target.commands = $$QMAKE_CREATEPACKAGE -t $$CREATEPACKAGE_DIR $(QT_SIS_OPTIONS) -o $${baseTarget}_installer.pkg
+ unsigned_installer_sis_target.depends = $${baseTarget}_installer.pkg unsigned_sis
+
+ !isEmpty(sis_destdir):!equals(sis_destdir, "."):!equals(sis_destdir, "./") {
+ sis_target.commands += && $$QMAKE_MOVE $${baseTarget}.sis $$sis_destdir
+ unsigned_sis_target.commands += && $$QMAKE_MOVE $${baseTarget}_unsigned.sis $$sis_destdir
+ installer_sis_target.commands += && $$QMAKE_MOVE $${baseTarget}_installer.sis $$sis_destdir
+ unsigned_installer_sis_target.commands += && $$QMAKE_MOVE $${baseTarget}_unsigned_installer.sis $$sis_destdir
+ }
+
+ QMAKE_EXTRA_TARGETS += sis_target \
+ unsigned_sis_target \
+ target_sis_target \
+ installer_sis_target \
+ ok_installer_sis_target \
+ unsigned_installer_sis_target
+
+ QMAKE_DISTCLEAN += $${sis_destdir}/$${baseTarget}.sis
+ }
+
+ deploy_target.target = deploy
+ contains(QMAKE_HOST.os, "Windows") {
+ deploy_target.depends = sis
+ deploy_target.commands = call $$target_sis_target.target
+ } else {
+ deploy_target.commands = @echo Deployment not supported in this environment
+ }
+ QMAKE_EXTRA_TARGETS += deploy_target
+
+} else {
+ contains(TEMPLATE, subdirs) {
+ # Enable recursive sis target.
+ sis_target.CONFIG = recursive
+ sis_target.recurse = $$SUBDIRS
+ } else {
+ # Make sure we build everything, since other sis targets in a recursive invocation
+ # may depend on them, even if this one is empty.
+ # In abld/sbsv2, we assume that subdir has been built already, as all builds are recursive.
+ !symbian-abld:!symbian-sbsv2: sis_target.depends = first
+ }
+ sis_target.commands =
+ sis_target.target = sis
+ QMAKE_EXTRA_TARGETS += sis_target
+
+ symbian-abld {
+ # Create dummy store_build target to avoid errors from .mk callbacks during build
+ store_build_target.target = store_build
+ QMAKE_EXTRA_TARGETS += store_build_target
+ }
+}
diff --git a/mkspecs/features/symbian/stl.prf b/mkspecs/features/symbian/stl.prf
new file mode 100644
index 0000000000..1fd5e16e32
--- /dev/null
+++ b/mkspecs/features/symbian/stl.prf
@@ -0,0 +1,43 @@
+CONFIG -= stl_off
+
+# STL usage in S60 requires the "OPTION CW -wchar_t on" mmp statement to be used.
+# This statement is added via $$STLLIB_USAGE_CW_FLAGS variable below.
+# S60 STL documentation instructs to use also "MACRO _WCHAR_T_DECLARED" statement,
+# but QtS60 will not compile if that statement is set.
+
+QMAKE_CXXFLAGS.CW *= $$STLLIB_USAGE_CW_FLAGS
+
+# Path to stlport headers
+INCLUDEPATH += $$OS_LAYER_STDCPP_SYSTEMINCLUDE
+
+# Remove mkspecs/common/symbian/stl-off from beginning of includepath
+# in order to use new and delete operators from STL
+INCLUDEPATH -= $$[QT_INSTALL_DATA]/mkspecs/common/symbian/stl-off
+
+# libstdcppv5 is preferred over libstdcpp as it has/uses the throwing version of operator new
+# STDCPP turns on standard C++ new behaviour (ie. throwing new)
+use_libstdcppv5 = true
+
+# Fall back to old implementation if that is the only one that is found
+exists($${EPOCROOT}epoc32/release/armv5/lib/libstdcpp.dso)|exists($${EPOCROOT}epoc32/release/winscw/udeb/libstdcpp.dll) {
+ !exists($${EPOCROOT}epoc32/release/armv5/lib/libstdcppv5.dso):!exists($${EPOCROOT}epoc32/release/winscw/udeb/libstdcppv5.dll) {
+ use_libstdcppv5 = false
+ }
+}
+
+equals(use_libstdcppv5, true) {
+ LIBS *= -llibstdcppv5.dll
+ symbian-abld|symbian-sbsv2 {
+ MMP_RULES *= "STDCPP"
+ } else {
+ DEFINES *= __SYMBIAN_STDCPP_SUPPORT__
+ LIBS *= -lstdnew.dll
+ }
+} else {
+ LIBS *= -llibstdcpp.dll
+}
+
+# use the runtime support for nested exceptions, if a library is available
+exists($${EPOCROOT}epoc32/release/armv5/urel/usrt_nx_*.lib) {
+ CONFIG += nested_exceptions
+}
diff --git a/mkspecs/features/symbian/stl_off.prf b/mkspecs/features/symbian/stl_off.prf
new file mode 100644
index 0000000000..d5d1c7c30f
--- /dev/null
+++ b/mkspecs/features/symbian/stl_off.prf
@@ -0,0 +1,2 @@
+CONFIG -= stl
+
diff --git a/mkspecs/features/symbian/symbian_building.prf b/mkspecs/features/symbian/symbian_building.prf
new file mode 100644
index 0000000000..8c757077d3
--- /dev/null
+++ b/mkspecs/features/symbian/symbian_building.prf
@@ -0,0 +1,369 @@
+symbian-armcc {
+ QMAKE_CFLAGS += $$QMAKE_CFLAGS.ARMCC
+ QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS.ARMCC
+ QMAKE_LFLAGS += $$QMAKE_LFLAGS.ARMCC
+ # This is to prevent inclusion of the shipped RVCT headers, which are often in the
+ # environment variable RVCTxxINC by default. -J prevents the searching of that location,
+ # but needs a path, so just specify somewhere guaranteed not to contain header files.
+ QMAKE_CFLAGS += -J$${EPOCROOT}epoc32/ignore_this_path
+ QMAKE_CXXFLAGS += -J$${EPOCROOT}epoc32/ignore_this_path
+} else:symbian-gcce {
+ QMAKE_CFLAGS += $$QMAKE_CFLAGS.GCCE
+ QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS.GCCE
+ QMAKE_LFLAGS += $$QMAKE_LFLAGS.GCCE
+}
+
+# We need a target name without the INFIX'ed part, since flags are not infixed.
+equals(QMAKE_TARGET_PRODUCT, Qt4):clean_TARGET = $$replace(TARGET, "$${QT_LIBINFIX}$", "")
+else:clean_TARGET = $$TARGET
+
+# we have some module specific options (defined in qt.prf) lets add them
+!contains(clean_TARGET, ".*[ -/].*"):eval(TMPVAR = \$\$QMAKE_$${clean_TARGET}_CXXFLAGS)
+!isEmpty(TMPVAR):QMAKE_CXXFLAGS += $$TMPVAR
+!contains(clean_TARGET, ".*[ -/].*"):eval(TMPVAR = \$\$QMAKE_$${clean_TARGET}_LFLAGS)
+!isEmpty(TMPVAR) {
+ QMAKE_LFLAGS += $$TMPVAR
+} else :symbian-gcce { # lets provide a simple default. Without elf2e32 complains
+ QMAKE_LFLAGS += -Ttext 0x80000 -Tdata 0x400000
+}
+
+qtPrepareTool(QMAKE_ELF2E32_WRAPPER, elf2e32_qtwrapper)
+
+isEmpty(TARGET.EPOCSTACKSIZE):TARGET.EPOCSTACKSIZE = 0x14000
+isEmpty(TARGET.EPOCHEAPSIZE):TARGET.EPOCHEAPSIZE = 0x020000 0x800000
+epoc_heap_size = $$split(TARGET.EPOCHEAPSIZE, " ")
+epoc_heap_size = $$join(epoc_heap_size, ",")
+
+symbianObjdir=$$OBJECTS_DIR
+isEmpty(symbianObjdir) {
+ symbianObjdir = .
+}
+symbianDestdir=$$DESTDIR
+isEmpty(symbianDestdir) {
+ symbianDestdir = .
+}
+baseTarget = $$symbianRemoveSpecialCharacters($$basename(TARGET))
+!equals(TARGET, "$$baseTarget"):symbianDestdir = $$symbianDestdir/$$dirname(TARGET)
+
+contains(QMAKE_CFLAGS, "--thumb")|contains(QMAKE_CXXFLAGS, "--thumb")|contains(QMAKE_CFLAGS, "-mthumb")|contains(QMAKE_CXXFLAGS, "-mthumb") {
+ DEFINES += __MARM_THUMB__
+}
+
+defineReplace(processSymbianLibrary) {
+ qt_library = $$replace(1, "\\.dll$", ".dso")
+ qt_library = $$replace(qt_library, "^-l", "")
+ isFullName = $$find(qt_library, \\.)
+ isEmpty(isFullName):qt_library="$${qt_library}.dso"
+ return($$qt_library)
+}
+
+# This part turn "-llibc" into "libc.dso", and moves -L entries to QMAKE_LIBDIR.
+libsToProcess = LIBS LIBS_PRIVATE QMAKE_LIBS
+for(libToProcess, libsToProcess) {
+ qt_libraries = $$split($$libToProcess, " ")
+ eval($$libToProcess =)
+ for(qt_library, qt_libraries) {
+ contains(qt_library, "^-L.*") {
+ qt_library = $$replace(qt_library, "^-L", "")
+ QMAKE_LIBDIR += $$qt_library
+ } else {
+ qt_newLib = $$processSymbianLibrary($$qt_library)
+ contains(qt_newLib, ".*\\.dso$")|contains(qt_newLib, ".*\\.lib$"):PRE_TARGETDEPS += $$qt_newLib
+ symbian-gcce:qt_newLib = "-l:$$qt_newLib"
+ eval($$libToProcess *= \$\$qt_newLib)
+ }
+ }
+}
+
+elf2e32_LIBPATH =
+for(libPath, QMAKE_LIBDIR) {
+ elf2e32_LIBPATH += "--libpath=$$libPath"
+}
+
+isEmpty(VERSION) {
+ VERSION = $$QT_VERSION
+}
+
+# Check for version validity.
+!isEmpty(VERSION):!contains(VERSION, "[0-9]+"):!contains(VERSION, "[0-9]+\\.[0-9]+")!contains(VERSION, "[0-9]+(\\.[0-9]+){2}") {
+ error("Invalid VERSION for Symbian: $$VERSION")
+}
+
+splitVersion = $$split(VERSION, ".")
+count(splitVersion, 0) {
+ # Default Symbian version if none is specified.
+ hexVersion = "000a0000"
+ decVersion = "10.0"
+} else {
+ count(splitVersion, 3) {
+ hexVersion = $$system("perl -e \"printf (\\\"%02x\\\", $$member(splitVersion, 0))\"")
+ hexPart2 = $$system("perl -e \"printf (\\\"%02x\\\", $$member(splitVersion, 1))\"")
+ hexPart2 = $$hexPart2$$system("perl -e \"printf (\\\"%02x\\\", $$member(splitVersion, 2))\"")
+ decVersion = $$system("perl -e \"printf (\\\"%1d\\\", 0x$$hexVersion)\"").
+ hexVersion = $$hexVersion$$hexPart2
+ decVersion = $$decVersion$$system("perl -e \"printf (\\\"%d\\\", 0x$$hexPart2)\"")
+
+ !contains(hexVersion, "[0-9a-f]{8}"):hexVersion = "00$${hexVersion}"
+ } else { # app code may have different numbering...
+ hexVersion = $$VERSION
+ decVersion = $$VERSION
+ }
+}
+#error ("hexVersion: $$hexVersion, decVersion: $$decVersion")
+
+intUid3 = $$lower($$replace(TARGET.UID3, "^0x", ""))
+isEmpty(TARGET.SID):TARGET.SID = $$TARGET.UID3
+isEmpty(TARGET.UID2):TARGET.UID2 = 0x00000000
+
+capability = $$replace(TARGET.CAPABILITY, " ", "+")
+capability = $$join(capability, "+")
+capability = $$replace(capability, "\\+-", "-")
+isEmpty(capability): capability = "None"
+capability = "--capability=$$capability"
+
+contains(TEMPLATE, lib):!contains(CONFIG, static):!contains(CONFIG, staticlib) {
+ contains(CONFIG, plugin):QMAKE_ELF2E32_FLAGS += --definput=plugin_commonu.def
+
+ !isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK = $$escape_expand(\\n\\t)$$QMAKE_POST_LINK
+ moveCmd = $$QMAKE_MOVE $$symbianDestdir/$${baseTarget}.dll $$symbianDestdir/$${baseTarget}.sym
+ contains(QMAKE_HOST.os,Windows):moveCmd = $$replace(moveCmd, /, \\)
+ QMAKE_POST_LINK = $$moveCmd \
+ && $$QMAKE_ELF2E32_WRAPPER --version=$$decVersion \
+ --sid=$$TARGET.SID \
+ --uid1=0x10000079 \
+ --uid2=$$TARGET.UID2 \
+ --uid3=$$TARGET.UID3 \
+ --targettype=DLL \
+ --elfinput=$${symbianDestdir}/$${baseTarget}.sym \
+ --output=$${symbianDestdir}/$${baseTarget}.dll \
+ --tmpdso=$${symbianObjdir}/$${baseTarget}.dso \
+ --dso=$${symbianDestdir}/$${baseTarget}.dso \
+ --defoutput=$$symbianObjdir/$${baseTarget}.def \
+ --linkas=\"$${baseTarget}{$${hexVersion}}[$${intUid3}].dll\" \
+ --heap=$$epoc_heap_size \
+ --stack=$$TARGET.EPOCSTACKSIZE \
+ $$elf2e32_LIBPATH \
+ $$capability \
+ $$QMAKE_ELF2E32_FLAGS \
+ $$QMAKE_POST_LINK
+ silent:QMAKE_POST_LINK = @echo postlinking $@ && $$QMAKE_POST_LINK
+ QMAKE_DISTCLEAN += $${symbianDestdir}/$${baseTarget}.sym
+ QMAKE_DISTCLEAN += $${symbianDestdir}/$${baseTarget}.dso
+ QMAKE_CLEAN += $${symbianObjdir}/$${baseTarget}.dso
+ QMAKE_CLEAN += $${symbianObjdir}/$${baseTarget}.def
+
+ symbian-armcc: {
+ LIBS += usrt2_2.lib dfpaeabi.dso dfprvct2_2.dso drtaeabi.dso scppnwdl.dso drtrvct2_2.dso
+ # Quotation unfortunately is different on Windows and unix.
+ contains(QMAKE_HOST.os, Windows) {
+ LIBS += \"h_t__uf.l(switch8.o)\" edllstub.lib \"edll.lib(uc_dll_.o)\"
+ } else {
+ LIBS += h_t__uf.l\\(switch8.o\\) edllstub.lib edll.lib\\(uc_dll_.o\\)
+ }
+ } else :symbian-gcce {
+ LIBS += \
+ -l:edllstub.lib \
+ -l:edll.lib \
+ -l:usrt2_2.lib \
+ -l:dfpaeabi.dso \
+ -l:drtaeabi.dso \
+ -l:scppnwdl.dso \
+ -lsupc++ \
+ -lgcc
+ }
+
+ QMAKE_LFLAGS += --soname \"$${baseTarget}{$${hexVersion}}[$${intUid3}].dll\"
+ DEFINES += __DLL__
+}
+
+contains(TEMPLATE, app):!contains(QMAKE_LINK, "^@:.*") {
+ !isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK = $$escape_expand(\\n\\t)$$QMAKE_POST_LINK
+ moveCmd = $$QMAKE_MOVE $$symbianDestdir/$${baseTarget} $$symbianDestdir/$${baseTarget}.sym
+ contains(QMAKE_HOST.os,Windows):moveCmd = $$replace(moveCmd, /, \\)
+ QMAKE_POST_LINK = $$moveCmd \
+ && $$QMAKE_ELF2E32_WRAPPER --version $$decVersion \
+ --sid=$$TARGET.SID \
+ --uid1=0x1000007a \
+ --uid2=$$TARGET.UID2 \
+ --uid3=$$TARGET.UID3 \
+ --targettype=EXE \
+ --elfinput=$${symbianDestdir}/$${baseTarget}.sym \
+ --output=$${symbianDestdir}/$${baseTarget}.exe \
+ --linkas=\"$${baseTarget}{$${hexVersion}}[$${intUid3}].exe\" \
+ --heap=$$epoc_heap_size \
+ --stack=$$TARGET.EPOCSTACKSIZE \
+ $$elf2e32_LIBPATH \
+ $$capability \
+ $$QMAKE_ELF2E32_FLAGS \
+ && $$QMAKE_COPY "$${symbianDestdir}/$${baseTarget}.exe" "$${symbianDestdir}/$${baseTarget}" \
+ $$QMAKE_POST_LINK
+ silent:QMAKE_POST_LINK = @echo postlinking $@ && $$QMAKE_POST_LINK
+ QMAKE_DISTCLEAN += $${symbianDestdir}/$${baseTarget}.sym
+ QMAKE_DISTCLEAN += $${symbianDestdir}/$${baseTarget}.exe
+ QMAKE_CLEAN += $${symbianDestdir}/$${baseTarget}
+
+ symbian-armcc: {
+ QMAKE_LIBS += usrt2_2.lib dfpaeabi.dso dfprvct2_2.dso drtaeabi.dso scppnwdl.dso drtrvct2_2.dso h_t__uf.l\\(switch8.o\\)
+ QMAKE_LIBS += -leexe.lib\\(uc_exe_.o\\)
+ contains(CONFIG, "qt") {
+ QMAKE_LIBS -= $$QMAKE_LIBS_QT_ENTRY
+ QMAKE_LIBS += $$QMAKE_LIBS_QT_ENTRY
+ } else {
+ QMAKE_LIBS -= $$QMAKE_LIBS_NO_QT_ENTRY
+ QMAKE_LIBS += $$QMAKE_LIBS_NO_QT_ENTRY
+ }
+ } else :symbian-gcce {
+ # notice that we can't merge these as ordering of arguments is important.
+ QMAKE_LIBS += \
+ -l:eexe.lib \
+ -l:usrt2_2.lib
+ contains(CONFIG, "qt") {
+ modified_entry = $$replace(QMAKE_LIBS_QT_ENTRY, "^-l", "-l:")
+ QMAKE_LIBS -= $$modified_entry
+ QMAKE_LIBS += $$modified_entry
+ } else {
+ modified_entry = $$replace(QMAKE_LIBS_NO_QT_ENTRY, "^-l", "-l:")
+ QMAKE_LIBS -= $$modified_entry
+ modified_entry = $$replace(QMAKE_LIBS_NO_QT_ENTRY_GCCE, "^-l", "-l:")
+ QMAKE_LIBS -= $$modified_entry
+ QMAKE_LIBS += $$modified_entry
+ }
+ QMAKE_LIBS += \
+ -l:dfpaeabi.dso \
+ -l:drtaeabi.dso \
+ -l:scppnwdl.dso \
+ -lsupc++ \
+ -lgcc
+ QMAKE_LFLAGS += --shared
+ }
+
+ QMAKE_LFLAGS += --soname \"$${baseTarget}{$${hexVersion}}[$${intUid3}].exe\"
+ DEFINES += __EXE__
+}
+
+# Symbian resource files
+symbian_resources_INCLUDES = $$join(INCLUDEPATH, " -I", "-I")
+symbian_resources_DEFINES = $$join(DEFINES, " -D", "-D")
+symbian_resources_DEFINES += -D__QT_SYMBIAN_RESOURCE__
+symbian_resources_RCC_DIR = $$replace(RCC_DIR, "/$", "")
+symbian_resources_INCLUDES += "-I$$symbian_resources_RCC_DIR"
+
+for(symbian_resource, SYMBIAN_RESOURCES) {
+ symbian_resource = $$basename(symbian_resource)
+ symbian_resource_clean = $$replace(symbian_resource, "\\.rss$", ".rsc")
+ QMAKE_DISTCLEAN += $${symbianDestdir}/$${symbian_resource_clean}
+ symbian_resource_clean = $$replace(symbian_resource, "\\.rss$", ".rpp")
+ QMAKE_CLEAN += $${symbian_resources_RCC_DIR}/$${symbian_resource_clean}
+}
+
+symbianresources.input = SYMBIAN_RESOURCES
+symbianresources.output = $$symbian_resources_RCC_DIR/${QMAKE_FILE_BASE}$${QT_LIBINFIX}.rsg
+symbianresources.commands = cpp -nostdinc -undef \
+ -include $$QMAKE_SYMBIAN_INCLUDES \
+ $$symbian_resources_INCLUDES \
+ $$symbian_resources_DEFINES \
+ ${QMAKE_FILE_NAME} \
+ > $${symbian_resources_RCC_DIR}/${QMAKE_FILE_BASE}.rpp \
+ && rcomp -u -m045,046,047 \
+ -s$${symbian_resources_RCC_DIR}/${QMAKE_FILE_BASE}.rpp \
+ -o$${symbianDestdir}/${QMAKE_FILE_BASE}$${QT_LIBINFIX}.rsc \
+ -h$${symbian_resources_RCC_DIR}/${QMAKE_FILE_BASE}$${QT_LIBINFIX}.rsg \
+ -i${QMAKE_FILE_NAME}
+silent:symbianresources.commands = @echo rcomp $< && $$symbianresources.commands
+symbianresources.dependency_type = TYPE_C
+symbianresources.CONFIG = no_link target_predeps
+
+QMAKE_EXTRA_COMPILERS += symbianresources
+
+# This section generates the rsg and rsc files for symbian.
+contains(TEMPLATE, "app"):!contains(CONFIG, "no_icon") {
+ # Look for extra languages for the resources, and then generate a target for each one.
+ localize_deployment:symbianGenResourceLanguages = $$SYMBIAN_MATCHED_LANGUAGES default
+ else:symbianGenResourceLanguages = default
+ for(language, symbianGenResourceLanguages) {
+ # Special languages get their language number appended to the filename.
+ contains(language, default) {
+ symbianGenResource_DEFINES = $$symbian_resources_DEFINES
+ rpp = $${symbian_resources_RCC_DIR}/$${baseTarget}.rpp
+ rsc = $${symbianDestdir}/$${baseTarget}.rsc
+ rsg = $${symbian_resources_RCC_DIR}/$${baseTarget}.rsg
+ } else {
+ languageNo = $$eval(SYMBIAN_LANG.$$language)
+ symbianGenResource_DEFINES = $$symbian_resources_DEFINES -DLANGUAGE_$${languageNo}
+ rpp = $${symbian_resources_RCC_DIR}/$${baseTarget}_$${languageNo}.rpp
+ rsc = $${symbianDestdir}/$${baseTarget}.r$${languageNo}
+ rsg = $${symbian_resources_RCC_DIR}/$${baseTarget}_$${languageNo}.rsg
+ }
+
+ # Make our own extra target in order to get dependencies for generated
+ # files right. This also avoids the warning about files not found.
+ eval(symbianGenResource_$${language}.target = $$rsg)
+ eval(symbianGenResource_$${language}.commands = cpp -nostdinc -undef \
+ -include $$QMAKE_SYMBIAN_INCLUDES \
+ $$symbian_resources_INCLUDES \
+ $$symbianGenResource_DEFINES \
+ $${baseTarget}.rss \
+ > $$rpp \
+ && rcomp -u -m045,046,047 \
+ -s$$rpp \
+ -o$$rsc \
+ -h$$rsg \
+ -i$${baseTarget}.rss)
+ silent:eval(symbianGenResource_$${language}.commands = @echo rcomp $${baseTarget}.rss && $$eval(symbianGenResource_$${language}.commands))
+ eval(symbianGenResource_$${language}.depends = $${baseTarget}.rss)
+ PRE_TARGETDEPS += $$rsg
+ QMAKE_CLEAN += $$rsg $$rpp
+ QMAKE_DISTCLEAN += $$rsc
+
+ QMAKE_EXTRA_TARGETS += symbianGenResource_$${language}
+
+ # Note that we depend on the base rsg file, even if dealing with a specific language.
+ # hence we don't use $$rsg on the next line.
+ eval(symbianGenRegResource_$${language}.depends = $${baseTarget}_reg.rss $${symbian_resources_RCC_DIR}/$${baseTarget}.rsg)
+ contains(language, default) {
+ rpp = $${symbian_resources_RCC_DIR}/$${baseTarget}_reg.rpp
+ rsc = $${symbianDestdir}/$${baseTarget}_reg.rsc
+ rsg = $${symbian_resources_RCC_DIR}/$${baseTarget}_reg.rsg
+ } else {
+ rpp = $${symbian_resources_RCC_DIR}/$${baseTarget}_reg_$${languageNo}.rpp
+ rsc = $${symbianDestdir}/$${baseTarget}_reg.r$${languageNo}
+ rsg = $${symbian_resources_RCC_DIR}/$${baseTarget}_reg_$${languageNo}.rsg
+ }
+ eval(symbianGenRegResource_$${language}.target = $$rsg)
+ eval(symbianGenRegResource_$${language}.commands = cpp -nostdinc -undef \
+ -include $$QMAKE_SYMBIAN_INCLUDES \
+ $$symbian_resources_INCLUDES \
+ $$symbianGenResource_DEFINES \
+ $${baseTarget}_reg.rss \
+ > $$rpp \
+ && rcomp -u -m045,046,047 \
+ -s$$rpp \
+ -o$$rsc \
+ -h$$rsg \
+ -i$${baseTarget}_reg.rss)
+ silent:eval(symbianGenRegResource_$${language}.commands = @echo rcomp $${baseTarget}_reg.rss && $$eval(symbianGenRegResource_$${language}.commands))
+ PRE_TARGETDEPS += $$rsg
+ QMAKE_CLEAN += $$rsg $$rpp
+ QMAKE_DISTCLEAN += $$rsc
+
+ QMAKE_EXTRA_TARGETS += symbianGenRegResource_$${language}
+ }
+
+ # Trick to get qmake to create the RCC_DIR for us.
+ symbianRccDirCreation.input = SOURCES
+ symbianRccDirCreation.commands =
+ symbianRccDirCreation.output = $${symbian_resources_RCC_DIR}/symbian_resource_dummy
+ symbianRccDirCreation.CONFIG = no_link combine
+
+ QMAKE_EXTRA_COMPILERS += symbianRccDirCreation
+
+ QMAKE_DISTCLEAN += $${baseTarget}.rss \
+ $${baseTarget}_reg.rss \
+ $${baseTarget}.loc
+}
+
+# Generated pkg files
+
+QMAKE_DISTCLEAN += $${baseTarget}_template.pkg \
+ $${baseTarget}_installer.pkg \
+ $${baseTarget}_stub.pkg
diff --git a/mkspecs/features/symbian/thread.prf b/mkspecs/features/symbian/thread.prf
new file mode 100644
index 0000000000..885438ab36
--- /dev/null
+++ b/mkspecs/features/symbian/thread.prf
@@ -0,0 +1,2 @@
+# Symbian behaves like POSIX when it comes to threads.
+include(../unix/thread.prf)
diff --git a/mkspecs/features/testcase.prf b/mkspecs/features/testcase.prf
new file mode 100644
index 0000000000..7a7c9e305a
--- /dev/null
+++ b/mkspecs/features/testcase.prf
@@ -0,0 +1,65 @@
+!contains(TEMPLATE,subdirs) {
+
+check.files =
+check.path = .
+
+# If the test ends up in a different directory, we should cd to that directory.
+# Note that qmake modifies DESTDIR after this file is processed,
+# therefore, testing DESTDIR for emptiness is not sufficient.
+# Also note that in debug-and-release mode we don't want to cd into the debug/release
+# directory (e.g. if the test goes to foo/release/tst_thing.exe, we want to do
+# cd foo && release/tst_thing.exe ).
+MUNGED_DESTDIR=$$DESTDIR
+MUNGED_TARGET=$$TARGET
+win32:debug_and_release {
+ contains(DESTDIR,^release$)|contains(DESTDIR,^debug$):MUNGED_DESTDIR=
+
+ # In debug-and-release mode, the first ../ in TARGET breaks out of the debug/release
+ # subdirectory. However, since make's working directory is already outside of the
+ # debug/release subdirectory, this first ../ should be ignored when deciding if
+ # we have to change directory before running the test.
+ MUNGED_TARGET=$$replace(MUNGED_TARGET,^\\.\\./,)
+}
+!isEmpty(MUNGED_DESTDIR):!contains(MUNGED_DESTDIR,^\\./?):check.commands = cd $(DESTDIR) &&
+contains(MUNGED_TARGET,.*/.*):check.commands = cd $(DESTDIR) &&
+
+# Allow for a custom test runner script
+check.commands += $(TESTRUNNER)
+
+macx {
+ app_bundle: check.commands += ./$(QMAKE_TARGET).app/Contents/MacOS/$(QMAKE_TARGET)
+ else: check.commands += ./$(QMAKE_TARGET)
+}
+else:unix: check.commands += ./$(QMAKE_TARGET)
+else: check.commands += $(DESTDIR_TARGET)
+
+# For Qt/Embedded, run every test app as a QWS server
+embedded: check.commands += -qws
+
+# Allow for custom arguments to tests
+check.commands += $(TESTARGS)
+QMAKE_EXTRA_TARGETS *= check
+
+!debug_and_release|build_pass {
+ check.depends = first
+} else {
+ check.CONFIG = recursive
+ # In debug and release mode, only run the test once.
+ # Run debug if available, release otherwise.
+ debug_and_release {
+ check.target = dummy_check
+ check.recurse_target = check
+ debug {
+ real_check.depends = debug-check
+ real_check.target = check
+ QMAKE_EXTRA_TARGETS += real_check
+ } else {
+ real_check.depends = release-check
+ real_check.target = check
+ QMAKE_EXTRA_TARGETS += real_check
+ }
+ }
+}
+
+}
+
diff --git a/mkspecs/features/uic.prf b/mkspecs/features/uic.prf
new file mode 100644
index 0000000000..74a26833a4
--- /dev/null
+++ b/mkspecs/features/uic.prf
@@ -0,0 +1,117 @@
+defined(qtPrepareTool)|load(qt_functions) ### Qt 5: see default_pre.prf
+qtPrepareTool(QMAKE_UIC3, uic3)
+qtPrepareTool(QMAKE_UIC, uic)
+
+isEmpty(UI_DIR):UI_DIR = .
+isEmpty(UI_SOURCES_DIR):UI_SOURCES_DIR = $$UI_DIR
+isEmpty(UI_HEADERS_DIR):UI_HEADERS_DIR = $$UI_DIR
+isEmpty(QMAKE_MOD_UIC):QMAKE_MOD_UIC = ui_
+
+# Allow FORMS3 to contain old UIC3 forms, while FORMS contains new
+# UIC files in the same project. However, if CONFIG+=uic3 and no
+# FORMS3 is defined, FORMS may only contain old UIC3 files.
+
+!uic3|!isEmpty(FORMS3) {
+ # If we have CONFIG+=uic3 and no FORMS3, then don't do this step,
+ # as UIC3 files don't need a ui_<formname>.h file
+
+ uic.commands = $$QMAKE_UIC ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
+ uic.depend_command = "$$QMAKE_UIC" -d "${QMAKE_FILE_IN}"
+ uic.output = $$UI_HEADERS_DIR/$${QMAKE_MOD_UIC}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_H)}
+ uic.input = FORMS
+ uic.variable_out = GENERATED_FILES
+ uic.CONFIG += no_link target_predeps
+ uic.name = UIC ${QMAKE_FILE_IN}
+ silent:uic.commands = @echo uic ${QMAKE_FILE_IN} && $$uic.commands
+ QMAKE_EXTRA_COMPILERS += uic
+ INCREDIBUILD_XGE += uic
+}
+
+!isEmpty(FORMS)|!isEmpty(FORMS3) {
+ ui_dir_short = $$UI_HEADERS_DIR
+ contains(QMAKE_HOST.os,Windows):ui_dir_short ~= s,^.:,/,
+ contains(ui_dir_short, ^[/\\\\].*):INCLUDEPATH += $$UI_HEADERS_DIR
+ else:INCLUDEPATH += $$OUT_PWD/$$UI_HEADERS_DIR
+}
+
+# Backwards compatibility: Make shadow builds with default UI_DIR work
+# if the user did not add the source dir explicitly.
+equals(UI_DIR, .) {
+ CONFIG -= include_source_dir
+ CONFIG = include_source_dir $$CONFIG
+}
+
+uic3 {
+ isEmpty(FORMS3) {
+ UIC3_FORMS = FORMS
+ !build_pass:message("Project contains CONFIG+=uic3, but no files in FORMS3; UI files in FORMS treated as UIC3 form files.")
+ } else {
+ UIC3_FORMS = FORMS3
+ }
+
+ uic3_decl.commands = $$QMAKE_UIC3 ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
+ uic3_decl.dependency_type = TYPE_UI
+ uic3_decl.output = $$UI_HEADERS_DIR/${QMAKE_FILE_BASE}$${first(QMAKE_EXT_H)}
+ uic3_decl.input = $$UIC3_FORMS
+ uic3_decl.CONFIG += no_link
+ uic3_decl.variable_out = GENERATED_FILES UIC3_HEADERS
+ uic3_decl.name = UIC3 Decl ${QMAKE_FILE_IN}
+ silent:uic3_decl.commands = @echo uic3 ${QMAKE_FILE_IN} && $$uic3_decl.commands
+ QMAKE_EXTRA_COMPILERS += uic3_decl
+
+ uic3_impl.commands = $$QMAKE_UIC3 -impl ${QMAKE_FILE_BASE}$${first(QMAKE_EXT_H)} ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
+ uic3_impl.dependency_type = TYPE_UI
+ uic3_impl.output = $$UI_SOURCES_DIR/${QMAKE_FILE_BASE}$${first(QMAKE_EXT_CPP)}
+ uic3_impl.depends = $$UI_HEADERS_DIR/${QMAKE_FILE_BASE}$${first(QMAKE_EXT_H)}
+ uic3_impl.input = $$UIC3_FORMS
+ uic3_impl.variable_out = GENERATED_SOURCES
+ uic3_impl.name = UIC3 Impl ${QMAKE_FILE_IN}
+ silent:uic3_impl.commands = @echo uic3 -impl ${QMAKE_FILE_IN} && $$uic3_impl.commands
+ QMAKE_EXTRA_COMPILERS += uic3_impl
+
+ ### add a moc step
+ load(moc)
+ uic3_moc.commands = $$moc_header.commands
+ uic3_moc.output = $$moc_header.output
+ uic3_moc.depends = $$UI_HEADERS_DIR/${QMAKE_FILE_BASE}$${first(QMAKE_EXT_H)}
+ uic3_moc.input = UIC3_HEADERS
+ uic3_moc.variable_out = GENERATED_SOURCES
+ uic3_moc.name = $$moc_header.name
+ !contains(TEMPLATE, "vc.*"):!isEmpty(INCLUDETEMP):uic3_moc.depends += $$INCLUDETEMP
+ QMAKE_EXTRA_COMPILERS += uic3_moc
+}
+
+defineReplace(imageCollectionCmd) {
+ unset(EMBEDDED_IMAGES)
+ RET =
+ for(image, $$list($$split(1))) {
+ EMBEDDED_IMAGES += $$image
+ count(EMBEDDED_IMAGES, 5) {
+ isEmpty(RET): RET += echo $$EMBEDDED_IMAGES > $${UI_DIR}/images.tmp $$escape_expand(\\n\\t)
+ else: RET += echo $$EMBEDDED_IMAGES >> $${UI_DIR}/images.tmp $$escape_expand(\\n\\t)
+ unset(EMBEDDED_IMAGES)
+ }
+ }
+ !isEmpty(EMBEDDED_IMAGES):RET += echo $$EMBEDDED_IMAGES >> $${UI_DIR}/images.tmp $$escape_expand(\\n\\t)
+ !isEmpty(RET) {
+ RET += $$QMAKE_UIC3 -embed $$TARGET -f $${UI_DIR}/images.tmp -o $$2 $$escape_expand(\\n\\t)
+ return($$RET)
+ }
+ return($$QMAKE_UIC3 -embed $$TARGET $$1 -o $$2)
+}
+
+image_collection.output = $${UI_DIR}/qmake_image_collection$${first(QMAKE_EXT_CPP)}
+image_collection.variable_out = SOURCES
+image_collection.input = IMAGES
+image_collection.CONFIG += combine
+image_collection.name = UIC3 Image collection in ${QMAKE_FILE_OUT}
+!win32 {
+ image_collection.commands = $$QMAKE_UIC3 -embed $$TARGET ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
+ silent:image_collection.commands = @echo uic3 -embed ${QMAKE_FILE_IN} && $$image_collection.commands
+} else {
+ image_collection.commands = ${QMAKE_FUNC_imageCollectionCmd}
+ silent:image_collection.commands = @echo uic3 -embed $$TARGET -f $${UI_DIR}/images.tmp && $image_collection.commands
+}
+QMAKE_EXTRA_COMPILERS += image_collection
+
+
diff --git a/mkspecs/features/uitools.prf b/mkspecs/features/uitools.prf
new file mode 100644
index 0000000000..65995770de
--- /dev/null
+++ b/mkspecs/features/uitools.prf
@@ -0,0 +1,14 @@
+QT += xml
+qt:load(qt)
+
+# Include the correct version of the UiLoader library
+symbian: QTUITOOLS_LINKAGE = -lQtUiTools.lib
+else: QTUITOOLS_LINKAGE = -lQtUiTools$${QT_LIBINFIX}
+
+CONFIG(debug, debug|release) {
+ mac: QTUITOOLS_LINKAGE = -lQtUiTools$${QT_LIBINFIX}_debug
+ win32: QTUITOOLS_LINKAGE = -lQtUiTools$${QT_LIBINFIX}d
+}
+LIBS += $$QTUITOOLS_LINKAGE
+
+INCLUDEPATH = $$QMAKE_INCDIR_QT/QtUiTools $$INCLUDEPATH
diff --git a/mkspecs/features/unix/bsymbolic_functions.prf b/mkspecs/features/unix/bsymbolic_functions.prf
new file mode 100644
index 0000000000..5a60463e36
--- /dev/null
+++ b/mkspecs/features/unix/bsymbolic_functions.prf
@@ -0,0 +1,6 @@
+
+!staticlib:!static:contains(TEMPLATE, lib) {
+ QMAKE_LFLAGS_SHLIB += $$QMAKE_LFLAGS_BSYMBOLIC_FUNC
+
+ !isEmpty(QMAKE_DYNAMIC_LIST_FILE):QMAKE_LFLAGS_SHLIB += $$QMAKE_LFLAGS_DYNAMIC_LIST$$QMAKE_DYNAMIC_LIST_FILE
+}
diff --git a/mkspecs/features/unix/dylib.prf b/mkspecs/features/unix/dylib.prf
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/mkspecs/features/unix/dylib.prf
@@ -0,0 +1 @@
+
diff --git a/mkspecs/features/unix/gdb_dwarf_index.prf b/mkspecs/features/unix/gdb_dwarf_index.prf
new file mode 100644
index 0000000000..14db4fcf1b
--- /dev/null
+++ b/mkspecs/features/unix/gdb_dwarf_index.prf
@@ -0,0 +1,15 @@
+!CONFIG(separate_debug_info):CONFIG(debug, debug|release):!staticlib:!static:!contains(TEMPLATE, subdirs):!isEmpty(QMAKE_OBJCOPY) {
+
+ QMAKE_GDB_INDEX = { test -z \"$(DESTDIR)\" || cd \"$(DESTDIR)\"; } && \
+ test \$\$(gdb --version | sed -e \'s,[^0-9]\\+\\([0-9]\\)\\.\\([0-9]\\).*,\\1\\2,;q\') -gt 72 && \
+ gdb --nx --batch --quiet -ex \'set confirm off\' -ex \'save gdb-index .\' -ex quit \'$(TARGET)\' && \
+ test -f $(TARGET).gdb-index && \
+ $$QMAKE_OBJCOPY --add-section \'.gdb_index=$(TARGET).gdb-index\' --set-section-flags \'.gdb_index=readonly\' \'$(TARGET)\' \'$(TARGET)\' && \
+ $$QMAKE_DEL_FILE $(TARGET).gdb-index || true
+
+ !isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK = $$escape_expand(\\n\\t)$$QMAKE_POST_LINK
+ QMAKE_POST_LINK = $$QMAKE_GDB_INDEX $$QMAKE_POST_LINK
+
+ silent:QMAKE_POST_LINK = @echo indexing $@ for gdb && $$QMAKE_POST_LINK
+}
+
diff --git a/mkspecs/features/unix/hide_symbols.prf b/mkspecs/features/unix/hide_symbols.prf
new file mode 100644
index 0000000000..4af99c2eac
--- /dev/null
+++ b/mkspecs/features/unix/hide_symbols.prf
@@ -0,0 +1,4 @@
+QMAKE_CFLAGS += $$QMAKE_CFLAGS_HIDESYMS
+QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_HIDESYMS
+QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_OBJECTIVE_CFLAGS_HIDESYMS
+QMAKE_LFLAGS += $$QMAKE_LFLAGS_HIDESYMS
diff --git a/mkspecs/features/unix/largefile.prf b/mkspecs/features/unix/largefile.prf
new file mode 100644
index 0000000000..104d6759a8
--- /dev/null
+++ b/mkspecs/features/unix/largefile.prf
@@ -0,0 +1,2 @@
+DEFINES += _LARGEFILE64_SOURCE _LARGEFILE_SOURCE
+
diff --git a/mkspecs/features/unix/opengl.prf b/mkspecs/features/unix/opengl.prf
new file mode 100644
index 0000000000..74a514915d
--- /dev/null
+++ b/mkspecs/features/unix/opengl.prf
@@ -0,0 +1,17 @@
+contains(QT_CONFIG, opengles1) {
+ INCLUDEPATH += $$QMAKE_INCDIR_OPENGL_ES1
+ !isEmpty(QMAKE_LIBDIR_OPENGL_ES1):QMAKE_LIBDIR += $$QMAKE_LIBDIR_OPENGL_ES1
+ target_qt:LIBS_PRIVATE += $$QMAKE_LIBS_OPENGL_ES1
+ else:LIBS += $$QMAKE_LIBS_OPENGL_ES1
+} else:contains(QT_CONFIG, opengles2) {
+ INCLUDEPATH += $$QMAKE_INCDIR_OPENGL_ES2
+ !isEmpty(QMAKE_LIBDIR_OPENGL_ES2):QMAKE_LIBDIR += $$QMAKE_LIBDIR_OPENGL_ES2
+ target_qt:LIBS_PRIVATE += $$QMAKE_LIBS_OPENGL_ES2
+ else:LIBS += $$QMAKE_LIBS_OPENGL_ES2
+} else {
+ INCLUDEPATH += $$QMAKE_INCDIR_OPENGL
+ !isEmpty(QMAKE_LIBDIR_OPENGL):QMAKE_LIBDIR += $$QMAKE_LIBDIR_OPENGL
+ target_qt:LIBS_PRIVATE += $$QMAKE_LIBS_OPENGL_QT
+ else:LIBS += $$QMAKE_LIBS_OPENGL
+}
+
diff --git a/mkspecs/features/unix/openvg.prf b/mkspecs/features/unix/openvg.prf
new file mode 100644
index 0000000000..29acec18ff
--- /dev/null
+++ b/mkspecs/features/unix/openvg.prf
@@ -0,0 +1,15 @@
+!isEmpty(QMAKE_INCDIR_OPENVG): INCLUDEPATH += $$QMAKE_INCDIR_OPENVG
+!isEmpty(QMAKE_LIBDIR_OPENVG): QMAKE_LIBDIR += -L$$QMAKE_LIBDIR_OPENVG
+!isEmpty(QMAKE_LIBS_OPENVG): LIBS += $$QMAKE_LIBS_OPENVG
+
+contains(QT_CONFIG, egl) {
+ !isEmpty(QMAKE_INCDIR_EGL): INCLUDEPATH += $$QMAKE_INCDIR_EGL
+ !isEmpty(QMAKE_LIBDIR_EGL): LIBS += -L$$QMAKE_LIBDIR_EGL
+ !isEmpty(QMAKE_LIBS_EGL): LIBS += $$QMAKE_LIBS_EGL
+}
+
+contains(QT_CONFIG, openvg_on_opengl) {
+ !isEmpty(QMAKE_INCDIR_OPENGL): INCLUDEPATH += $$QMAKE_INCDIR_OPENGL
+ !isEmpty(QMAKE_LIBDIR_OPENGL): QMAKE_LIBDIR += -L$$QMAKE_LIBDIR_OPENGL
+ !isEmpty(QMAKE_LIBS_OPENGL): LIBS += $$QMAKE_LIBS_OPENGL
+}
diff --git a/mkspecs/features/unix/separate_debug_info.prf b/mkspecs/features/unix/separate_debug_info.prf
new file mode 100644
index 0000000000..8843c6d2a8
--- /dev/null
+++ b/mkspecs/features/unix/separate_debug_info.prf
@@ -0,0 +1,18 @@
+
+!separate_debug_info_nocopy:!staticlib:!static:!contains(TEMPLATE, subdirs):!isEmpty(QMAKE_OBJCOPY) {
+ QMAKE_SEPARATE_DEBUG_INFO = test -z \"$(DESTDIR)\" || cd \"$(DESTDIR)\" ; targ=`basename $(TARGET)`; $$QMAKE_OBJCOPY --only-keep-debug \"\$\$targ\" \"\$\$targ.debug\" && $$QMAKE_OBJCOPY --strip-debug \"\$\$targ\" && $$QMAKE_OBJCOPY --add-gnu-debuglink=\"\$\$targ.debug\" \"\$\$targ\" && chmod -x \"\$\$targ.debug\"
+ QMAKE_INSTALL_SEPARATE_DEBUG_INFO = test -z \"$(DESTDIR)\" || cd \"$(DESTDIR)\" ; $(INSTALL_FILE) `basename $(TARGET)`.debug $(INSTALL_ROOT)/\$\$target_path/
+
+ !isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK = $$escape_expand(\\n\\t)$$QMAKE_POST_LINK
+ QMAKE_POST_LINK = $$QMAKE_SEPARATE_DEBUG_INFO $$QMAKE_POST_LINK
+ silent:QMAKE_POST_LINK = @echo creating $@.debug && $$QMAKE_POST_LINK
+
+ isEmpty(DESTDIR) {
+ target.targets += "`basename $(TARGET)`.debug"
+ QMAKE_DISTCLEAN += "`basename $(TARGET)`.debug"
+ } else {
+ target.targets += "$(DESTDIR)/`basename $(TARGET)`.debug"
+ QMAKE_DISTCLEAN += "$(DESTDIR)/`basename $(TARGET)`.debug"
+ }
+}
+
diff --git a/mkspecs/features/unix/thread.prf b/mkspecs/features/unix/thread.prf
new file mode 100644
index 0000000000..d6df7b6474
--- /dev/null
+++ b/mkspecs/features/unix/thread.prf
@@ -0,0 +1,14 @@
+!isEmpty(QMAKE_CFLAGS_THREAD) {
+ QMAKE_CFLAGS += $$QMAKE_CFLAGS_THREAD
+ QMAKE_EXPORT_CFLAGS += $$QMAKE_CFLAGS_THREAD
+}
+!isEmpty(QMAKE_CXXFLAGS_THREAD) {
+ QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_THREAD
+ QMAKE_EXPORT_CXXFLAGS += $$QMAKE_CXXFLAGS_THREAD
+}
+INCLUDEPATH += $$QMAKE_INCDIR_THREAD
+LIBS += $$QMAKE_LIBS_THREAD
+!isEmpty(QMAKE_LFLAGS_THREAD):QMAKE_LFLAGS += $$QMAKE_LFLAGS_THREAD
+!isEmpty(QMAKE_CC_THREAD):QMAKE_CC = $$QMAKE_CC_THREAD
+!isEmpty(QMAKE_CXX_THREAD):QMAKE_CXX = $$QMAKE_CXX_THREAD
+!isEmpty(QMAKE_LINK_THREAD):QMAKE_LINK = $$QMAKE_LINK_THREAD
diff --git a/mkspecs/features/unix/x11.prf b/mkspecs/features/unix/x11.prf
new file mode 100644
index 0000000000..404ce08d40
--- /dev/null
+++ b/mkspecs/features/unix/x11.prf
@@ -0,0 +1 @@
+CONFIG *= x11lib x11inc
diff --git a/mkspecs/features/unix/x11inc.prf b/mkspecs/features/unix/x11inc.prf
new file mode 100644
index 0000000000..7e11b5bfa0
--- /dev/null
+++ b/mkspecs/features/unix/x11inc.prf
@@ -0,0 +1,3 @@
+INCLUDEPATH += $$QMAKE_INCDIR_X11
+QMAKE_CFLAGS += $$QMAKE_CFLAGS_X11
+QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_X11
diff --git a/mkspecs/features/unix/x11lib.prf b/mkspecs/features/unix/x11lib.prf
new file mode 100644
index 0000000000..b661d53dd9
--- /dev/null
+++ b/mkspecs/features/unix/x11lib.prf
@@ -0,0 +1,2 @@
+!isEmpty(QMAKE_LIBDIR_X11):QMAKE_LIBDIR += $$QMAKE_LIBDIR_X11
+LIBS_PRIVATE += $$QMAKE_LIBS_X11
diff --git a/mkspecs/features/unix/x11sm.prf b/mkspecs/features/unix/x11sm.prf
new file mode 100644
index 0000000000..5176147eb5
--- /dev/null
+++ b/mkspecs/features/unix/x11sm.prf
@@ -0,0 +1,2 @@
+!isEmpty(QMAKE_LIBDIR_X11):QMAKE_LIBDIR += $$QMAKE_LIBDIR_X11
+LIBS_PRIVATE += $$QMAKE_LIBS_X11SM
diff --git a/mkspecs/features/use_c_linker.prf b/mkspecs/features/use_c_linker.prf
new file mode 100644
index 0000000000..e07ce6a3b2
--- /dev/null
+++ b/mkspecs/features/use_c_linker.prf
@@ -0,0 +1,5 @@
+!isEmpty(QMAKE_LINK_C):QMAKE_LINK = $$QMAKE_LINK_C
+!isEmpty(QMAKE_LINK_C_SHLIB) {
+ !isEmpty(QMAKE_LINK_SHLIB_CMD):QMAKE_LINK_SHLIB_CMD ~= s/^$$re_escape($$QMAKE_LINK_SHLIB)$/$$QMAKE_LINK_C_SHLIB/
+ QMAKE_LINK_SHLIB = $$QMAKE_LINK_C_SHLIB
+}
diff --git a/mkspecs/features/vxworks.prf b/mkspecs/features/vxworks.prf
new file mode 100644
index 0000000000..e257cd7ed1
--- /dev/null
+++ b/mkspecs/features/vxworks.prf
@@ -0,0 +1,64 @@
+# VxWorks Munching Feature
+# When compiling C++ sources on VxWorks in kernel mode, all .o files have to
+# be processed by the so-called 'munch' script which will generate
+# additional code for static c'tors and d'tors. The resulting .c file has to
+# be compiled in turn and linked to the executable.
+# This can only been done when linking applications, since the munch script
+# generates a .c file containing static symbols: linking a lib that was
+# already munched to a munched application would lead to duplicate symbols!
+
+isEmpty(VXWORKS_MUNCH_EXT):VXWORKS_MUNCH_EXT = vxm
+isEmpty(VXWORKS_MUNCH_TOOL):VXWORKS_MUNCH_TOOL = $(WIND_BASE)/host/resource/hutils/tcl/munch.tcl
+
+
+!exists($$VXWORKS_MUNCH_TOOL) {
+ error("Could not find VxWorks Munch tool: '$${VXWORKS_MUNCH_TOOL}'. Please set the environment variable WIND_BASE correctly.")
+}
+
+# The following scope is entered for any project that specifies 'shared' as well
+# as for any project specifying neither 'shared', nor 'lib', nor 'staticlib'.
+# This means that for a static build only the executable is munched, while for
+# a shared build, every lib, plugin and executable is munched separately.
+
+shared|!staticlib:!lib {
+ *-dcc {
+ VXWORKS_MUNCH_CMD = targ=`basename $(TARGET)`; \
+ ddump -Ng \"$(TARGET)\" | tclsh $$VXWORKS_MUNCH_TOOL -c $$VXWORKS_ARCH_MUNCH >\"$(OBJECTS_DIR)/\$\${targ}_ctdt.c\" && \
+ $$QMAKE_CC -c $$QMAKE_CFLAGS \"$(OBJECTS_DIR)/\$\${targ}_ctdt.c\" -o \"$(OBJECTS_DIR)/\$\${targ}_ctdt.o\" && \
+ $$QMAKE_LINK $$QMAKE_LFLAGS -X -r5 -r4 \"$(OBJECTS_DIR)/\$\${targ}_ctdt.o\" \"$(TARGET)\" -o \"$(TARGET).munched\" && \
+ mv \"$(TARGET).munched\" \"$(TARGET)\" && \
+ chmod +x \"$(TARGET)\"
+ }
+ *-g++ {
+ VXWORKS_MUNCH_CMD = targ=`basename $(TARGET)`; \
+ nm \"$(DESTDIR)$(TARGET)\" | tclsh $$VXWORKS_MUNCH_TOOL -c $$VXWORKS_ARCH_MUNCH >\"$(OBJECTS_DIR)/\$\${targ}_ctdt.c\" && \
+ $$QMAKE_CC -c $$QMAKE_CFLAGS -fdollars-in-identifiers \"$(OBJECTS_DIR)/\$\${targ}_ctdt.c\" -o \"$(OBJECTS_DIR)/\$\${targ}_ctdt.o\" && \
+ $$QMAKE_LINK $$QMAKE_LFLAGS -nostdlib -Wl,-X -T $(WIND_BASE)/target/h/tool/gnu/ldscripts/link.OUT \"$(OBJECTS_DIR)/\$\${targ}_ctdt.o\" \"$(DESTDIR)$(TARGET)\" -o \"$(DESTDIR)$(TARGET).munched\" && \
+ mv \"$(DESTDIR)$(TARGET).munched\" \"$(DESTDIR)$(TARGET)\" && \
+ chmod +x \"$(DESTDIR)$(TARGET)\"
+ }
+
+ # We need to create a dummy lib.a in case someone links against this lib.
+ # In VxWorks it's the responsibility of the run-time linker ld to resolve
+ # symbols, since there are no real shared libraries for the toolchain linker
+ # to link against.
+
+ shared:contains(TEMPLATE, lib) {
+ VXWORKS_MUNCH_CMD += "&&"
+ VXWORKS_MUNCH_CMD += (atarg=`basename $(TARGET) .so.$${VERSION}`.a ; touch \"$(DESTDIR)\$\${atarg}\")
+ }
+
+ !isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK = $$escape_expand(\\n\\t)$$QMAKE_POST_LINK
+ QMAKE_POST_LINK = $$VXWORKS_MUNCH_CMD$$QMAKE_POST_LINK
+ silent:QMAKE_POST_LINK = @echo creating $@.$$VXWORKS_MUNCH_EXT && $$QMAKE_POST_LINK
+
+ isEmpty(DESTDIR) {
+ target.targets += "`basename $(TARGET)`.$$VXWORKS_MUNCH_EXT"
+ QMAKE_DISTCLEAN += "`basename $(TARGET)`.$$VXWORKS_MUNCH_EXT"
+ } else {
+ target.targets += "$(DESTDIR)/`basename $(TARGET)`.$$VXWORKS_MUNCH_EXT"
+ QMAKE_DISTCLEAN += "$(DESTDIR)/`basename $(TARGET)`.$$VXWORKS_MUNCH_EXT"
+ }
+ *-g++:LIBS += -lgcc
+}
+
diff --git a/mkspecs/features/warn_off.prf b/mkspecs/features/warn_off.prf
new file mode 100644
index 0000000000..e37979c035
--- /dev/null
+++ b/mkspecs/features/warn_off.prf
@@ -0,0 +1,4 @@
+CONFIG -= warn_on
+QMAKE_CFLAGS += $$QMAKE_CFLAGS_WARN_OFF
+QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_WARN_OFF
+QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_OBJECTIVE_CFLAGS_WARN_OFF \ No newline at end of file
diff --git a/mkspecs/features/warn_on.prf b/mkspecs/features/warn_on.prf
new file mode 100644
index 0000000000..7e78a8e0d3
--- /dev/null
+++ b/mkspecs/features/warn_on.prf
@@ -0,0 +1,5 @@
+CONFIG -= warn_off
+QMAKE_CFLAGS += $$QMAKE_CFLAGS_WARN_ON
+QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_WARN_ON
+QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_OBJECTIVE_CFLAGS_WARN_ON
+
diff --git a/mkspecs/features/win32/console.prf b/mkspecs/features/win32/console.prf
new file mode 100644
index 0000000000..8a1725d648
--- /dev/null
+++ b/mkspecs/features/win32/console.prf
@@ -0,0 +1,4 @@
+CONFIG -= windows
+contains(TEMPLATE, ".*app") {
+ QMAKE_LFLAGS += $$QMAKE_LFLAGS_CONSOLE $$QMAKE_LFLAGS_EXE
+}
diff --git a/mkspecs/features/win32/default_post.prf b/mkspecs/features/win32/default_post.prf
new file mode 100644
index 0000000000..a1d8b52da9
--- /dev/null
+++ b/mkspecs/features/win32/default_post.prf
@@ -0,0 +1,11 @@
+!isEmpty(CE_ARCH) {
+ QMAKESPEC_DIR = $$QMAKESPEC
+ exists($$QMAKESPEC_DIR/default_post.prf) {
+ isEmpty(QMAKESPEC_DIR):QMAKESPEC_DIR = $$QMAKESPEC_ORIGINAL
+ !isEmpty(QMAKESPEC_DIR):load($$QMAKESPEC_DIR/default_post.prf)
+ }
+}
+
+# Now load the global default_post
+load(default_post)
+
diff --git a/mkspecs/features/win32/default_pre.prf b/mkspecs/features/win32/default_pre.prf
new file mode 100644
index 0000000000..67891743a5
--- /dev/null
+++ b/mkspecs/features/win32/default_pre.prf
@@ -0,0 +1,3 @@
+CONFIG = rtti_off exceptions_off stl_off incremental_off thread_off windows $$CONFIG
+load(default_pre)
+
diff --git a/mkspecs/features/win32/dumpcpp.prf b/mkspecs/features/win32/dumpcpp.prf
new file mode 100644
index 0000000000..19637998c7
--- /dev/null
+++ b/mkspecs/features/win32/dumpcpp.prf
@@ -0,0 +1,11 @@
+isEmpty(QMAKE_DUMPCPP_NAME) {
+ QMAKE_DUMPCPP_NAME = make_dumpcpp
+}
+
+# auto depend on dumpcpp
+!contains(TARGET, dumpcpp) {
+ isEmpty(QMAKE_DUMPCPP_SRC): QMAKE_DUMPCPP_SRC = "$(QTDIR)/tools/activeqt/dumpcpp"
+ make_dumpcpp.commands = (cd $$QMAKE_DUMPCPP_SRC && $(QMAKE) && $(MAKE))
+ QMAKE_EXTRA_TARGETS += $$QMAKE_DUMPCPP_NAME
+}
+
diff --git a/mkspecs/features/win32/embed_manifest_dll.prf b/mkspecs/features/win32/embed_manifest_dll.prf
new file mode 100644
index 0000000000..cf96ee7017
--- /dev/null
+++ b/mkspecs/features/win32/embed_manifest_dll.prf
@@ -0,0 +1,12 @@
+!if(plugin:no_plugin_manifest):if(win32-msvc2005*|win32-msvc2008*|win32-msvc2010*):!static:equals(TEMPLATE, "lib") {
+ MANIFEST_DIR = $$OBJECTS_DIR
+ isEmpty(MANIFEST_DIR):MANIFEST_DIR = .
+ NOPATH_TARGET = $$TARGET
+ NOPATH_TARGET ~= s,\\\\ , ,q # Remove space escaping (NOPATH_TARGET is quoted)
+ NOPATH_TARGET ~= s,\\\\,/,g # Change to single type separators
+ NOPATH_TARGET ~= s,^(.*/)+,, # Remove all paths
+ QMAKE_LFLAGS += /MANIFEST $$quote(/MANIFESTFILE:\"$${MANIFEST_DIR}\\$${NOPATH_TARGET}.intermediate.manifest\")
+ !isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK = $$escape_expand(\\n\\t)$$QMAKE_POST_LINK
+ QMAKE_POST_LINK = $$quote(mt.exe -nologo -manifest \"$$replace(MANIFEST_DIR,/,\\)\\$${NOPATH_TARGET}.intermediate.manifest\" -outputresource:$(DESTDIR_TARGET);2)$$QMAKE_POST_LINK
+ QMAKE_CLEAN += \"$$replace(MANIFEST_DIR,/,\\)\\$${NOPATH_TARGET}.intermediate.manifest\"
+}
diff --git a/mkspecs/features/win32/embed_manifest_exe.prf b/mkspecs/features/win32/embed_manifest_exe.prf
new file mode 100644
index 0000000000..9bc77029ff
--- /dev/null
+++ b/mkspecs/features/win32/embed_manifest_exe.prf
@@ -0,0 +1,12 @@
+if(win32-msvc2005*|win32-msvc2008*|win32-msvc2010*):equals(TEMPLATE, "app") {
+ MANIFEST_DIR = $$OBJECTS_DIR
+ isEmpty(MANIFEST_DIR):MANIFEST_DIR = .
+ NOPATH_TARGET = $$TARGET
+ NOPATH_TARGET ~= s,\\\\ , ,q # Remove space escaping (NOPATH_TARGET is quoted)
+ NOPATH_TARGET ~= s,\\\\,/,g # Change to single type separators
+ NOPATH_TARGET ~= s,^(.*/)+,, # Remove all paths
+ QMAKE_LFLAGS += /MANIFEST $$quote(/MANIFESTFILE:\"$${MANIFEST_DIR}\\$${NOPATH_TARGET}.intermediate.manifest\")
+ !isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK = $$escape_expand(\\n\\t)$$QMAKE_POST_LINK
+ QMAKE_POST_LINK = $$quote(mt.exe -nologo -manifest \"$$replace(MANIFEST_DIR,/,\\)\\$${NOPATH_TARGET}.intermediate.manifest\" -outputresource:$(DESTDIR_TARGET);1)$$QMAKE_POST_LINK
+ QMAKE_CLEAN += \"$$replace(MANIFEST_DIR,/,\\)\\$${NOPATH_TARGET}.intermediate.manifest\"
+}
diff --git a/mkspecs/features/win32/exceptions.prf b/mkspecs/features/win32/exceptions.prf
new file mode 100644
index 0000000000..786665920f
--- /dev/null
+++ b/mkspecs/features/win32/exceptions.prf
@@ -0,0 +1,5 @@
+CONFIG -= exceptions_off
+QMAKE_CFLAGS *= $$QMAKE_CFLAGS_EXCEPTIONS_ON
+QMAKE_CXXFLAGS *= $$QMAKE_CXXFLAGS_EXCEPTIONS_ON
+QMAKE_LFLAGS *= $$QMAKE_LFLAGS_EXCEPTIONS_ON
+
diff --git a/mkspecs/features/win32/exceptions_off.prf b/mkspecs/features/win32/exceptions_off.prf
new file mode 100644
index 0000000000..9de53d3417
--- /dev/null
+++ b/mkspecs/features/win32/exceptions_off.prf
@@ -0,0 +1,5 @@
+CONFIG -= exceptions
+QMAKE_CFLAGS += $$QMAKE_CFLAGS_EXCEPTIONS_OFF
+QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_EXCEPTIONS_OFF
+QMAKE_LFLAGS += $$QMAKE_LFLAGS_EXCEPTIONS_OFF
+
diff --git a/mkspecs/features/win32/ltcg.prf b/mkspecs/features/win32/ltcg.prf
new file mode 100644
index 0000000000..f6f1299f47
--- /dev/null
+++ b/mkspecs/features/win32/ltcg.prf
@@ -0,0 +1,5 @@
+CONFIG(release, debug|release) {
+ QMAKE_CFLAGS *= $$QMAKE_CFLAGS_LTCG
+ QMAKE_CXXFLAGS *= $$QMAKE_CXXFLAGS_LTCG
+ QMAKE_LFLAGS *= $$QMAKE_LFLAGS_LTCG
+}
diff --git a/mkspecs/features/win32/msvc_mp.prf b/mkspecs/features/win32/msvc_mp.prf
new file mode 100644
index 0000000000..d6dea14db9
--- /dev/null
+++ b/mkspecs/features/win32/msvc_mp.prf
@@ -0,0 +1,2 @@
+QMAKE_CFLAGS += $$QMAKE_CFLAGS_MP
+QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_MP
diff --git a/mkspecs/features/win32/opengl.prf b/mkspecs/features/win32/opengl.prf
new file mode 100644
index 0000000000..3414781c39
--- /dev/null
+++ b/mkspecs/features/win32/opengl.prf
@@ -0,0 +1,11 @@
+# WinCE does not have a platform directory for .prf files, and the
+# win32 directory is searched for .prfs by qmake on WinCE. Ideally
+# there should be a features/wince/opengl.prf which contains the wince
+# block below.
+
+wince* {
+ include(../unix/opengl.prf)
+} else {
+ QMAKE_LIBS += $$QMAKE_LIBS_OPENGL
+ QMAKE_LFLAGS += $$QMAKE_LFLAGS_OPENGL
+}
diff --git a/mkspecs/features/win32/openvg.prf b/mkspecs/features/win32/openvg.prf
new file mode 100644
index 0000000000..0df5b6621a
--- /dev/null
+++ b/mkspecs/features/win32/openvg.prf
@@ -0,0 +1,7 @@
+QMAKE_LIBS += $$QMAKE_LIBS_OPENVG
+QMAKE_LFLAGS += $$QMAKE_LFLAGS_OPENVG
+
+contains(QT_CONFIG, openvg_on_opengl) {
+ QMAKE_LIBS += $$QMAKE_LIBS_OPENGL
+ QMAKE_LFLAGS += $$QMAKE_LFLAGS_OPENGL
+}
diff --git a/mkspecs/features/win32/qaxcontainer.prf b/mkspecs/features/win32/qaxcontainer.prf
new file mode 100644
index 0000000000..34c6dfed42
--- /dev/null
+++ b/mkspecs/features/win32/qaxcontainer.prf
@@ -0,0 +1,32 @@
+!debug_and_release|build_pass {
+ CONFIG(debug, debug|release) {
+ LIBS += -lQAxContainerd
+ } else {
+ LIBS += -lQAxContainer
+ }
+} else {
+ LIBS += -lQAxContainer
+}
+
+qtPrepareTool(QMAKE_DUMPCPP, dumpcpp)
+
+dumpcpp_decl.commands = $$QMAKE_DUMPCPP ${QMAKE_FILE_IN} -o ${QMAKE_FILE_BASE}
+qaxcontainer_compat: dumpcpp_decl.commands += -compat
+dumpcpp_decl.output = ${QMAKE_FILE_BASE}.h
+dumpcpp_decl.input = TYPELIBS
+dumpcpp_decl.variable_out = HEADERS
+dumpcpp_decl.name = DUMP
+dumpcpp_decl.CONFIG += no_link
+dumpcpp_decl.depends = $$QMAKE_DUMPCPP
+
+QMAKE_EXTRA_COMPILERS += dumpcpp_decl
+
+
+dumpcpp_impl.commands = $$QMAKE_DUMPCPP -donothing
+dumpcpp_impl.output = ${QMAKE_FILE_BASE}.cpp
+dumpcpp_impl.input = TYPELIBS
+dumpcpp_impl.variable_out = SOURCES
+dumpcpp_impl.name = CPP
+dumpcpp_impl.depends = $$QMAKE_DUMPCPP ${QMAKE_FILE_BASE}.h
+
+QMAKE_EXTRA_COMPILERS += dumpcpp_impl
diff --git a/mkspecs/features/win32/qaxserver.prf b/mkspecs/features/win32/qaxserver.prf
new file mode 100644
index 0000000000..a6c0869540
--- /dev/null
+++ b/mkspecs/features/win32/qaxserver.prf
@@ -0,0 +1,59 @@
+build_pass:console: {
+ warning("QAxServer applications cannot be console applications.")
+ warning("Remove 'console' from your CONFIG.")
+}
+
+ACTIVEQT_VERSION = $$VERSION
+isEmpty(ACTIVEQT_VERSION):ACTIVEQT_VERSION = 1.0
+
+DEFINES += QAXSERVER
+
+contains(TEMPLATE, "vc.*") {
+ ACTIVEQT_IDC = $${QMAKE_IDC} ### Qt5: remove me
+ qtPrepareTool(ACTIVEQT_IDC, idc)
+ ACTIVEQT_IDL = $${QMAKE_IDL}
+ ACTIVEQT_TARGET = "$(TargetPath)"
+ win32-msvc {
+ ACTIVEQT_NEWLINE = $$escape_expand(\\t)
+ ACTIVEQT_OUTPUT = $(IntDir)/$${TARGET}
+ } else {
+ ACTIVEQT_NEWLINE = $$escape_expand(\\n\\t)
+ ACTIVEQT_OUTPUT = $(IntDir)$${TARGET}
+ }
+ ACTIVEQT_TLBOUT = "$(TargetDir)/$${TARGET}.tlb"
+ GENERATED += $${OBJECTS_DIR}/$${TARGET}.idl $${ACTIVEQT_TLBOUT}
+} else {
+ ACTIVEQT_IDC = -$(IDC)
+ ACTIVEQT_IDL = -$(IDL)
+ ACTIVEQT_NEWLINE = $$escape_expand(\\n\\t)
+ ACTIVEQT_TARGET = $(DESTDIR_TARGET)
+ ACTIVEQT_OUTPUT = $(OBJECTS_DIR)/$${TARGET}
+ isEmpty(DESTDIR) {
+ ACTIVEQT_TLBOUT = $${TARGET}.tlb
+ } else {
+ ACTIVEQT_TLBOUT = $${DESTDIR}/$${TARGET}.tlb
+ }
+}
+
+!qaxserver_no_postlink {
+ !isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK += $$quote($$ACTIVEQT_NEWLINE)
+ QMAKE_POST_LINK += $$quote($$ACTIVEQT_IDC $${ACTIVEQT_TARGET} /idl $${ACTIVEQT_OUTPUT}.idl -version $${ACTIVEQT_VERSION}$${ACTIVEQT_NEWLINE})
+ !isEmpty(RC_FILE) {
+ QMAKE_POST_LINK += $$quote($$ACTIVEQT_IDL "$${ACTIVEQT_OUTPUT}.idl" /nologo /tlb "$${ACTIVEQT_OUTPUT}.tlb"$$ACTIVEQT_NEWLINE)
+ QMAKE_POST_LINK += $$quote($$ACTIVEQT_IDC $${ACTIVEQT_TARGET} /tlb $${ACTIVEQT_OUTPUT}.tlb$$ACTIVEQT_NEWLINE)
+ } else {
+ QMAKE_POST_LINK += $$quote($$ACTIVEQT_IDL "$${ACTIVEQT_OUTPUT}.idl" /nologo /tlb "$${ACTIVEQT_TLBOUT}"$$ACTIVEQT_NEWLINE)
+ message("No rc-file linked into project; type library will be a separate file.")
+ }
+ QMAKE_POST_LINK += $$quote($$ACTIVEQT_IDC $${ACTIVEQT_TARGET} /regserver)
+ QMAKE_CLEAN += $${ACTIVEQT_OUTPUT}.idl $${ACTIVEQT_OUTPUT}.tlb
+}
+
+qt:!target_qt {
+ CONFIG(debug, debug|release) {
+ QMAKE_LIBS_QT_ENTRY = -lQAxServerd
+ } else {
+ QMAKE_LIBS_QT_ENTRY = -lQAxServer
+ }
+ dll:QMAKE_LIBS += $$QMAKE_LIBS_QT_ENTRY
+}
diff --git a/mkspecs/features/win32/qt_dll.prf b/mkspecs/features/win32/qt_dll.prf
new file mode 100644
index 0000000000..f03c0c08c1
--- /dev/null
+++ b/mkspecs/features/win32/qt_dll.prf
@@ -0,0 +1 @@
+CONFIG *= qt
diff --git a/mkspecs/features/win32/rtti.prf b/mkspecs/features/win32/rtti.prf
new file mode 100644
index 0000000000..6d720d2438
--- /dev/null
+++ b/mkspecs/features/win32/rtti.prf
@@ -0,0 +1,3 @@
+CONFIG -= rtti_off
+QMAKE_CFLAGS += $$QMAKE_CFLAGS_RTTI_ON
+QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_RTTI_ON
diff --git a/mkspecs/features/win32/rtti_off.prf b/mkspecs/features/win32/rtti_off.prf
new file mode 100644
index 0000000000..b520bfa8b7
--- /dev/null
+++ b/mkspecs/features/win32/rtti_off.prf
@@ -0,0 +1,4 @@
+CONFIG -= rtti
+QMAKE_CFLAGS += $$QMAKE_CFLAGS_RTTI_OFF
+QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_RTTI_OFF
+DEFINES += QT_NO_DYNAMIC_CAST \ No newline at end of file
diff --git a/mkspecs/features/win32/stl.prf b/mkspecs/features/win32/stl.prf
new file mode 100644
index 0000000000..caf30ef68d
--- /dev/null
+++ b/mkspecs/features/win32/stl.prf
@@ -0,0 +1,3 @@
+CONFIG -= stl_off
+QMAKE_CFLAGS *= $$QMAKE_CFLAGS_STL_ON
+QMAKE_CXXFLAGS *= $$QMAKE_CXXFLAGS_STL_ON
diff --git a/mkspecs/features/win32/stl_off.prf b/mkspecs/features/win32/stl_off.prf
new file mode 100644
index 0000000000..10198c76d7
--- /dev/null
+++ b/mkspecs/features/win32/stl_off.prf
@@ -0,0 +1,3 @@
+CONFIG -= stl
+QMAKE_CFLAGS += $$QMAKE_CFLAGS_STL_OFF
+QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_STL_OFF
diff --git a/mkspecs/features/win32/thread.prf b/mkspecs/features/win32/thread.prf
new file mode 100644
index 0000000000..76354a8200
--- /dev/null
+++ b/mkspecs/features/win32/thread.prf
@@ -0,0 +1,26 @@
+CONFIG -= thread_off
+qt {
+ target_qt:PRL_EXPORT_DEFINES += QT_THREAD_SUPPORT
+ else:DEFINES += QT_THREAD_SUPPORT
+}
+
+# #### These need to go
+debug {
+ contains(DEFINES, QT_DLL) {
+ QMAKE_CFLAGS += $$QMAKE_CFLAGS_MT_DLLDBG
+ QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_MT_DLLDBG
+ } else {
+ QMAKE_CFLAGS += $$QMAKE_CFLAGS_MT_DBG
+ QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_MT_DBG
+ }
+} else {
+ contains(DEFINES, QT_DLL) {
+ QMAKE_CFLAGS += $$QMAKE_CFLAGS_MT_DLL
+ QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_MT_DLL
+ } else {
+ QMAKE_CFLAGS += $$QMAKE_CFLAGS_MT
+ QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_MT
+ }
+}
+
+QMAKE_LIBS += $$QMAKE_LIBS_RTMT
diff --git a/mkspecs/features/win32/thread_off.prf b/mkspecs/features/win32/thread_off.prf
new file mode 100644
index 0000000000..436a2c8166
--- /dev/null
+++ b/mkspecs/features/win32/thread_off.prf
@@ -0,0 +1,2 @@
+CONFIG -= thread
+QMAKE_LIBS += $$QMAKE_LIBS_RT
diff --git a/mkspecs/features/win32/windows.prf b/mkspecs/features/win32/windows.prf
new file mode 100644
index 0000000000..f41db803c9
--- /dev/null
+++ b/mkspecs/features/win32/windows.prf
@@ -0,0 +1,15 @@
+CONFIG -= console
+contains(TEMPLATE, ".*app"){
+ QMAKE_LFLAGS += $$QMAKE_LFLAGS_WINDOWS $$QMAKE_LFLAGS_EXE
+ win32-g++:DEFINES += QT_NEEDS_QMAIN
+ win32-borland:DEFINES += QT_NEEDS_QMAIN
+
+ qt:for(entryLib, $$list($$unique(QMAKE_LIBS_QT_ENTRY))) {
+ isEqual(entryLib, -lqtmain): {
+ CONFIG(debug, debug|release): QMAKE_LIBS += $${entryLib}$${QT_LIBINFIX}d
+ else: QMAKE_LIBS += $${entryLib}$${QT_LIBINFIX}
+ } else {
+ QMAKE_LIBS += $${entryLib}
+ }
+ }
+}
diff --git a/mkspecs/features/yacc.prf b/mkspecs/features/yacc.prf
new file mode 100644
index 0000000000..4d7e0a381b
--- /dev/null
+++ b/mkspecs/features/yacc.prf
@@ -0,0 +1,42 @@
+#
+# Yacc extra-compiler for handling files specified in the YACCSOURCES variable
+#
+
+{
+ yacc_decl.name = Yacc header
+ yacc_decl.input = YACCSOURCES
+ yacc_decl.variable_out = GENERATED_FILES
+
+
+ isEmpty(QMAKE_YACCFLAGS_MANGLE) {
+ QMAKE_YACCFLAGS_MANGLE = -p ${QMAKE_FILE_BASE}
+ QMAKE_YACC_HEADER = y.tab.h
+ QMAKE_YACC_SOURCE = y.tab.c
+ } else {
+ QMAKE_YACCFLAGS_MANGLE ~= s/\\$base/${QMAKE_FILE_BASE}/g #backwards compat
+ QMAKE_YACC_HEADER ~= s/\\$base/${QMAKE_FILE_BASE}/g
+ QMAKE_YACC_SOURCE ~= s/\\$base/${QMAKE_FILE_BASE}/g
+ }
+ QMAKE_YACCDECLFLAGS = $$QMAKE_YACCFLAGS
+ !yacc_no_name_mangle:QMAKE_YACCDECLFLAGS += $$QMAKE_YACCFLAGS_MANGLE
+
+ yacc_decl.commands = \
+ $$QMAKE_YACC $$QMAKE_YACCDECLFLAGS ${QMAKE_FILE_IN}$$escape_expand(\\n\\t) \
+ $$QMAKE_DEL_FILE $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_yacc$${first(QMAKE_EXT_H)} $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_yacc$${first(QMAKE_EXT_CPP)}$$escape_expand(\\n\\t) \
+ $$QMAKE_MOVE $${QMAKE_YACC_HEADER} $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_yacc$${first(QMAKE_EXT_H)}$$escape_expand(\\n\\t) \
+ $$QMAKE_MOVE $${QMAKE_YACC_SOURCE} $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_yacc$${first(QMAKE_EXT_CPP)}$$escape_expand(\\n\\t)
+ yacc_decl.output = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_yacc$${first(QMAKE_EXT_H)}
+
+ silent:yacc_decl.commands = @echo Yacc ${QMAKE_FILE_IN} && $$yacc_decl.commands
+ QMAKE_EXTRA_COMPILERS += yacc_decl
+}
+
+{
+ yacc_impl.name = source for ${QMAKE_FILE_IN}
+ yacc_impl.input = YACCSOURCES
+ yacc_impl.variable_out = GENERATED_SOURCES
+ yacc_impl.commands = $$escape_expand(\\n) # We don't want any commands where, but if command is empty no rules are created
+ yacc_impl.depends = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_yacc$${first(QMAKE_EXT_H)} # Make sure we depend on the step above
+ yacc_impl.output = $${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}_yacc$${first(QMAKE_EXT_CPP)} # Faked output from this step, output really created in step above
+ QMAKE_EXTRA_COMPILERS += yacc_impl
+}