diff options
Diffstat (limited to 'mkspecs/features')
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: 
 + # 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 +} |