#
# qmake configuration for all symbian mkspecs
#

TEMPLATE		= app
CONFIG			+= prepend_includepath qt warn_on release incremental link_prl sis_targets run_on_phone
QT			+= core gui
QMAKE_INCREMENTAL_STYLE = sublib

DEFINES			+= UNICODE QT_KEYPAD_NAVIGATION QT_SOFTKEYS_ENABLED QT_USE_MATH_H_FLOATS

QMAKE_COMPILER_DEFINES  += SYMBIAN

QMAKE_EXT_OBJ           = .o
QMAKE_EXT_RES           = _res.o
QMAKE_EXTENSION_SHLIB   = dll
QMAKE_EXTENSION_PLUGIN  = dll
QMAKE_EXTENSION_STATICLIB = lib

QMAKE_LEX		= flex
QMAKE_LEXFLAGS		=
QMAKE_YACC		= byacc
QMAKE_YACCFLAGS		= -d
QMAKE_CFLAGS		=
QMAKE_CFLAGS_DEPS	=
QMAKE_CFLAGS_WARN_ON	=
QMAKE_CFLAGS_WARN_OFF	=
QMAKE_CFLAGS_RELEASE	=
QMAKE_CFLAGS_DEBUG	=
QMAKE_CFLAGS_YACC	= -Wno-unused -Wno-parentheses

MMP_OPTION_KEYWORDS = CW ARMCC GCCE
VERSION_FLAGS.ARMCC = ARMCC_4
QMAKE_CXXFLAGS		= $$QMAKE_CFLAGS
# Symbian build system applies -cwd source on the MWCC command line.
# this causes problems with include paths, -cwd include uses the same
# rules for include paths as ARMCC
# This should really be fixed in raptor, as using CXXFLAGS means we pass
# both on the command line and rely on the compiler using the last specified
QMAKE_CXXFLAGS.CW	= -cwd include
QMAKE_CXXFLAGS.ARMCC      = --visibility_inlines_hidden
QMAKE_CXXFLAGS.ARMCC_4  = --import_all_vtbl
QMAKE_CXXFLAGS.GCCE	= -fvisibility-inlines-hidden
QMAKE_CXXFLAGS_DEPS	= $$QMAKE_CFLAGS_DEPS
QMAKE_CXXFLAGS_WARN_ON	= $$QMAKE_CFLAGS_WARN_ON
QMAKE_CXXFLAGS_WARN_OFF	= $$QMAKE_CFLAGS_WARN_OFF
QMAKE_CXXFLAGS_RELEASE	= $$QMAKE_CFLAGS_RELEASE
QMAKE_CXXFLAGS_DEBUG	= $$QMAKE_CFLAGS_DEBUG
QMAKE_CXXFLAGS_YACC	= $$QMAKE_CFLAGS_YACC
QMAKE_CXXFLAGS_THREAD	= $$QMAKE_CFLAGS_THREAD
QMAKE_CXXFLAGS_RTTI_ON	=
QMAKE_CXXFLAGS_RTTI_OFF	=
QMAKE_CXXFLAGS_EXCEPTIONS_ON =
QMAKE_CXXFLAGS_EXCEPTIONS_OFF =

QMAKE_INCDIR		=
QMAKE_INCDIR_QT		= $$[QT_INSTALL_HEADERS]

QMAKE_LFLAGS            =
QMAKE_LFLAGS.ARMCC      =
QMAKE_LFLAGS.GCCE       =
QMAKE_LFLAGS_EXCEPTIONS_ON =
QMAKE_LFLAGS_EXCEPTIONS_OFF =
QMAKE_LFLAGS_RELEASE    =
QMAKE_LFLAGS_DEBUG      =
QMAKE_LFLAGS_CONSOLE    =
QMAKE_LFLAGS_WINDOWS    =
QMAKE_LFLAGS_DLL        =
QMAKE_LINK_OBJECT_MAX   =
QMAKE_LINK_OBJECT_SCRIPT=

QMAKE_LIBS		= -llibc -llibm -leuser -llibdl
QMAKE_LIBS_CORE         = $$QMAKE_LIBS -lefsrv -lhal -lbafl -lapparc
QMAKE_LIBS_CFBSBITMAP   = -lfbscli -lbitgdi -lgdi
QMAKE_LIBS_GUI          = $$QMAKE_LIBS_CORE $$QMAKE_LIBS_CFBSBITMAP -lws32 -lapgrfx -lcone -leikcore -lmediaclientaudio -lcentralrepository
QMAKE_LIBS_NETWORK      = 
QMAKE_LIBS_EGL          = -llibEGL
QMAKE_LIBS_OPENGL       = -llibGLESv2
QMAKE_LIBS_OPENGL_ES1   = -llibGLESv1_CM
QMAKE_LIBS_OPENGL_ES2   = -llibGLESv2
QMAKE_LIBS_OPENGL_QT     = $$QMAKE_LIBS_OPENGL $$QMAKE_LIBS_CFBSBITMAP -lcone -lws32
QMAKE_LIBS_OPENGL_ES1_QT = $$QMAKE_LIBS_OPENGL_ES1 $$QMAKE_LIBS_CFBSBITMAP -lcone -lws32
QMAKE_LIBS_OPENGL_ES2_QT = $$QMAKE_LIBS_OPENGL_ES2 $$QMAKE_LIBS_CFBSBITMAP -lcone -lws32
QMAKE_LIBS_OPENVG       = $$QMAKE_LIBS_CFBSBITMAP -llibOpenVG
QMAKE_LIBS_THREAD       = -llibpthread
QMAKE_LIBS_COMPAT       = 
QMAKE_LIBS_S60          = -lavkon -leikcoctl

exists($${EPOCROOT}epoc32/include/platform/mw/akntranseffect.h) {
    QMAKE_LIBS_S60 += -lgfxtrans
}

exists($${EPOCROOT}epoc32/include/platform/sgresource/sgimage.h) {
    QMAKE_LIBS_OPENVG += -lsgresource
    QMAKE_LIBS_OPENGL_QT += -lsgresource
    QMAKE_LIBS_OPENGL_ES1_QT += -lsgresource
    QMAKE_LIBS_OPENGL_ES2_QT += -lsgresource
}

contains(QMAKE_HOST.os,Windows) {
    QMAKE_COPY           = copy /y
    QMAKE_COPY_DIR       = xcopy /s /q /y /i
    QMAKE_MOVE           = move
    QMAKE_DEL_FILE       = del /q 2> NUL
    QMAKE_MKDIR          = mkdir
    QMAKE_DEL_DIR        = rmdir
    QMAKE_DEL_TREE       = rmdir /s /q
    QMAKE_CHK_DIR_EXISTS = if not exist

    QMAKE_MOC            = $$[QT_INSTALL_BINS]\\moc.exe
    QMAKE_UIC            = $$[QT_INSTALL_BINS]\\uic.exe
    QMAKE_IDC            = $$[QT_INSTALL_BINS]\\idc.exe
} else {
    QMAKE_COPY           = cp
    QMAKE_COPY_DIR       = cp -r
    QMAKE_MOVE           = mv
    QMAKE_DEL_FILE       = rm -f
    QMAKE_MKDIR          = mkdir -p
    QMAKE_DEL_DIR        = rmdir
    QMAKE_DEL_TREE       = rm -rf
    QMAKE_CHK_DIR_EXISTS = test -d

    QMAKE_MOC            = $$[QT_INSTALL_BINS]/moc
    QMAKE_UIC            = $$[QT_INSTALL_BINS]/uic
    QMAKE_IDC            = $$[QT_INSTALL_BINS]/idc
}

QMAKE_IDL		  = midl
QMAKE_ZIP		  = zip -r -9
QMAKE_UNZIP               = unzip -o

QMAKE_WRITE_DEFAULT_RC    = 1

QMAKE_TAR                 = tar -cf
QMAKE_GZIP                = gzip -9f

QT_ARCH               = symbian

load(qt_config)

QMAKE_LIBS_QT_ENTRY     = -lqtmain$${QT_LIBINFIX}.lib
QMAKE_LIBS_NO_QT_ENTRY  = -llibcrt0.lib
QMAKE_LIBS_NO_QT_ENTRY_GCCE  = -llibcrt0_gcce.lib

# List of languages that have a Symbian language code mapping provided in localize_deployment.prf
SYMBIAN_SUPPORTED_LANGUAGES = \
    af sq am ar hy bn bg my be ca \
    hr cs da nl en et fi fr gd ka \
    de el gu he hi hu is id ga it \
    ja kn kk ko lo lv lt mk ms ml \
    mr mo mn nb pl pt pa ro ru sr \
    si sk sl so es sw sv tl ta te \
    th bo ti tr tk uk ur vi cy zu \
    nn eu zh gl fa st en_us fr_be \
    pt_br en_ca fr_ca el_cy tr_cy \
    en_tw en_hk en_cn en_jp en_th \
    sv_fi zh_hk es_419 en_za fr_ch \
    de_ch it_ch zh_tw en_in

SYMBIAN_LANGUAGES_WITH_TWO_CODES = ms id

# These directories must match what configure uses for QT_INSTALL_PLUGINS and QT_INSTALL_IMPORTS
QT_PLUGINS_BASE_DIR = /resource/qt$${QT_LIBINFIX}/plugins
QT_IMPORTS_BASE_DIR = /resource/qt$${QT_LIBINFIX}/imports

load(symbian/platform_paths)

# If environment.prf is provided by platform, load that.
# It is used for platform specific variable settings, such as SYMBIAN_VERSION.
exists($${EPOCROOT}epoc32/tools/qt/mkspecs/features/environment.prf) {
    load($${EPOCROOT}epoc32/tools/qt/mkspecs/features/environment.prf)
}

# Try to detect SDK version if it wasn't set by environment.prf
isEmpty(SYMBIAN_VERSION)|isEmpty(S60_VERSION) {
    exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v5.5.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v5.5.sis) {
        isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = 5.5
        isEmpty(S60_VERSION): S60_VERSION = 5.5
    } else {
        exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v5.4.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v5.4.sis) {
            isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = 5.4
            isEmpty(S60_VERSION): S60_VERSION = 5.4
        } else {
            exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v5.3.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v5.3.sis) {
                isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = 5.3
                isEmpty(S60_VERSION): S60_VERSION = 5.3
            } else {
                # The Symbian^3 PDK does not necessarily contain the required sis files.
                # However, libstdcppv5 first appeared in Symbian^3 (S60 5.2), so check for that too.
                exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v5.2.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v5.2.sis)|exists($${EPOCROOT}epoc32/release/armv5/lib/libstdcppv5.dso) {
                    isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = Symbian3
                    isEmpty(S60_VERSION): S60_VERSION = 5.2
                } else {
                    exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v5.1.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v5.1.sis) {
                        isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = Symbian2
                        isEmpty(S60_VERSION): S60_VERSION = 5.1
                    } else {
                        exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v5.0.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v5.0.sis) {
                            isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = 9.4
                            isEmpty(S60_VERSION): S60_VERSION = 5.0
                        } else {
                            exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v3.2.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v3.2.sis) {
                                isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = 9.3
                                isEmpty(S60_VERSION): S60_VERSION = 3.2
                            } else {
                                exists($${EPOCROOT}epoc32/release/winscw/udeb/z/system/install/series60v3.1.sis)|exists($${EPOCROOT}epoc32/data/z/system/install/series60v3.1.sis) {
                                    isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = 9.2
                                    isEmpty(S60_VERSION): S60_VERSION = 3.1
                                } else {
                                    isEmpty(SYMBIAN_VERSION): SYMBIAN_VERSION = Unknown
                                    isEmpty(S60_VERSION): S60_VERSION = Unknown
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

# pkg_depends_webkit, pkg_depends_core, and pkg_platform_dependencies can be removed by developer
# if multiple languages need to be supported by pkg file. In that case the developer should declare
# multiple language compatible dependency statements him/herself.

default_deployment.pkg_prerules += pkg_depends_webkit pkg_depends_qt pkg_platform_dependencies
DEPLOYMENT += default_deployment default_bin_deployment default_resource_deployment default_reg_deployment

defineReplace(symbianRemoveSpecialCharacters) {
    # Produce identical string to what SymbianCommonGenerator::removeSpecialCharacters

    fixedStr = $$1

    fixedStr = $$replace(fixedStr, /,_)
    fixedStr = $$replace(fixedStr, \\\\,_)
    fixedStr = $$replace(fixedStr, " ",_)
    fixedStr = $$replace(fixedStr, :,_)

    return ($$fixedStr)
}

# Determines translations that are Symbian supported
defineTest(matchSymbianLanguages) {
    # Qt language codes for which we need to parse .ts file
    SYMBIAN_MATCHED_LANGUAGES =
    # List of translation files for matched languages
    SYMBIAN_MATCHED_TRANSLATIONS =
    # List of Qt language codes for which we have no mapped Symbian code but we have a fallback code
    # and therefore need to generate a mapping for in localize_deployment.prf.
    # The fallback code means plain language code for languages that have both language and country codes.
    # E.g. the fallback code for language "zh_CN" would be "zh".
    SYMBIAN_UNMAPPED_LANGUAGES =
    # List of handled Qt language codes to avoid duplicate Symbian language codes in case both
    # unmapped language+country combination and its fallback code, or multiple unmapped language+country
    # combinations that have same fallback code are included.
    HANDLED_LANGUAGES =

    # Cannot parse .ts file for language here, so detect it from filename.
    # Allow two and three character language and country codes.
    for(translation, TRANSLATIONS) {
        low_translation = $$lower($$translation)
        language = $$replace(low_translation, "^(.*/)?[^/]+_(([^_]{2,3}_)?[^_]{2,3})\\.ts$", \\2)
        !contains(HANDLED_LANGUAGES, $$language) {
            HANDLED_LANGUAGES += $$language
            # Make sure translation path is absolute or shadow builds will not work
            !contains(translation, "(^/|^\\\\|^.:).*"): translation = $$_PRO_FILE_PWD_/$$translation

            contains(SYMBIAN_SUPPORTED_LANGUAGES, $$language) {
                SYMBIAN_MATCHED_LANGUAGES += $$language
                SYMBIAN_MATCHED_TRANSLATIONS += $$translation
            } else {
                # No direct mapping for specified language found. Check if a fallback language code can be used.
                strippedLanguage = $$replace(language, "_.*$",)
                contains(SYMBIAN_SUPPORTED_LANGUAGES, $$strippedLanguage):!contains(HANDLED_LANGUAGES, $$strippedLanguage) {
                    HANDLED_LANGUAGES += $$strippedLanguage
                    SYMBIAN_UNMAPPED_LANGUAGES += $$language
                    SYMBIAN_MATCHED_LANGUAGES += $$language
                    SYMBIAN_MATCHED_TRANSLATIONS += $$translation
                    SYMBIAN_LANGUAGE_FALLBACK.$$language = $$strippedLanguage
                    export(SYMBIAN_LANGUAGE_FALLBACK.$$language)
                }
            }
        }
    }

    isEmpty(SYMBIAN_MATCHED_LANGUAGES): SYMBIAN_MATCHED_LANGUAGES = en

    export(SYMBIAN_MATCHED_LANGUAGES)
    export(SYMBIAN_MATCHED_TRANSLATIONS)
    export(SYMBIAN_UNMAPPED_LANGUAGES)
}

# Symbian pkg files that define multiple languages require a language specific string to be
# defined for various items, even though the string often needs to be same for all languages.
# This replacement method will generate correct string for such cases based on TRANSLATIONS
# variable.
defineReplace(addLanguageDependentPkgItem) {
    localize_deployment:!isEmpty(TRANSLATIONS):isEmpty(SYMBIAN_MATCHED_LANGUAGES) {
        matchSymbianLanguages()
    }

    pkgItem = $$eval($$1)
    pkgLanguageList =

    for(matchedLanguage, SYMBIAN_MATCHED_LANGUAGES) {
        pkgLanguageList += "\"$$pkgItem\""
        # If the language has two mappings, add the item another time.
        contains(SYMBIAN_LANGUAGES_WITH_TWO_CODES, $$matchedLanguage): pkgLanguageList += "\"$$pkgItem\""
    }

    isEmpty(pkgLanguageList): pkgLanguageList = "\"$$pkgItem\""

    return($$join(pkgLanguageList,",",,))
}

# Sometimes a relative path to original .pro file directory is necessary when doing shadow builds.
defineReplace(relativeProPath) {
    RELATIVE_PRO_FILE_PWD = $$replace(OUT_PWD, "^.:", "")  # Lose drive letter if any
    RELATIVE_PRO_FILE_PWD = $$replace(RELATIVE_PRO_FILE_PWD, "/[^/]*", "../")$$replace(_PRO_FILE_PWD_, "^[^/]*/", "")
    return($$RELATIVE_PRO_FILE_PWD)
}
