mkspecs/features/symbian/symbian_building.prf
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 04 Oct 2010 01:19:32 +0300
changeset 37 758a864f9613
parent 33 3e2da88830cd
permissions -rw-r--r--
Revision: 201037 Kit: 201039

linux-armcc {
    QMAKE_CFLAGS += $$QMAKE_CFLAGS.ARMCC
    QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS.ARMCC
} else:linux-gcce {
    QMAKE_CFLAGS += $$QMAKE_CFLAGS.GCCE
    QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS.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 :linux-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)
}

qt_libraries = $$split(LIBS, " ")
LIBS =
for(qt_library, qt_libraries) {
    qt_newLib = $$processSymbianLibrary($$qt_library)
    contains(qt_newLib, ".*\\.dso$")|contains(qt_newLib, ".*\\.lib$"):PRE_TARGETDEPS += $$qt_newLib
    linux-gcce:qt_newLib = "-l:$$qt_newLib"
    LIBS += $$qt_newLib
}

qt_libraries = $$split(QMAKE_LIBS, " ")
QMAKE_LIBS =
for(qt_library, qt_libraries) {
    qt_newLib = $$processSymbianLibrary($$qt_library)
    contains(qt_newLib, ".*\\.dso$")|contains(qt_newLib, ".*\\.lib$"):PRE_TARGETDEPS += $$qt_newLib
    linux-gcce:qt_newLib = "-l:$$qt_newLib"
    QMAKE_LIBS += $$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("sh -c 'printf %02x $$member(splitVersion, 0)'")
        hexPart2 = $$system("sh -c 'printf %02x $$member(splitVersion, 1)'")"
        hexPart2 = $$hexPart2$$system("sh -c 'printf %02x $$member(splitVersion, 2)'")"
        decVersion = $$system("sh -c 'printf %1d 0x$$hexVersion'").
        hexVersion = $$hexVersion$$hexPart2
        decVersion = $$decVersion$$system("sh -c '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
    QMAKE_POST_LINK = $$QMAKE_MOVE $$symbianDestdir/$${baseTarget}.dll $$symbianDestdir/$${baseTarget}.sym \
                      && $$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

    linux-armcc: {
        LIBS += usrt2_2.lib dfpaeabi.dso dfprvct2_2.dso drtaeabi.dso scppnwdl.dso drtrvct2_2.dso h_t__uf.l\\(switch8.o\\)
        LIBS += -ledllstub.lib -ledll.lib\\(uc_dll_.o\\)
    } else :linux-gcce {
        LIBS += \
            -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
    QMAKE_POST_LINK = $$QMAKE_MOVE $$symbianDestdir/$${baseTarget} $$symbianDestdir/$${baseTarget}.sym \
                      && $$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}

    linux-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"):contains(QT, "core") { #if linking with QtCore
            QMAKE_LIBS += -lqtmain$${QT_LIBINFIX}.lib
        } else {
            QMAKE_LIBS += -llibcrt0.lib
        }
    } else :linux-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"):contains(QT, "core") { #if linking with QtCore
            QMAKE_LIBS += -l:qtmain$${QT_LIBINFIX}.lib
        } else {
            QMAKE_LIBS += -l:libcrt0_gcce.lib
        }
        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
linux-armcc: {
    SYMBIAN_RVCT22INC=$$(RVCT22INC)
    !isEmpty(SYMBIAN_RVCT22INC):symbian_resources_INCLUDES = -I$${SYMBIAN_RVCT22INC}
}
symbian_resources_INCLUDES = $$replace(symbian_resources_INCLUDES, ",", " -I")
symbian_resources_INCLUDES += $$join(INCLUDEPATH, " -I", "-I")
symbian_resources_DEFINES = $$join(DEFINES, " -D", "-D")
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 \
                            $$symbian_resources_INCLUDES \
                            $$symbian_resources_DEFINES \
                            ${QMAKE_FILE_NAME} \
                            -o $${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

contains(TEMPLATE, "app"):!contains(CONFIG, "no_icon") {
    # Make our own extra target in order to get dependencies for generated
    # files right. This also avoids the warning about files not found.
    symbianGenResource.target = $${symbian_resources_RCC_DIR}/$${baseTarget}.rsg
    symbianGenResource.commands = cpp -nostdinc -undef \
                                  $$symbian_resources_INCLUDES \
                                  $$symbian_resources_DEFINES \
                                  $${baseTarget}.rss \
                                  -o $${symbian_resources_RCC_DIR}/$${baseTarget}.rpp \
                                  && rcomp -u -m045,046,047 \
                                  -s$${symbian_resources_RCC_DIR}/$${baseTarget}.rpp \
                                  -o$${symbianDestdir}/$${baseTarget}.rsc \
                                  -h$${symbian_resources_RCC_DIR}/$${baseTarget}.rsg \
                                  -i$${baseTarget}.rss
    silent:symbianGenResource.commands = @echo rcomp $${baseTarget}.rss && $$symbianGenResource.commands
    symbianGenResource.depends = $${baseTarget}.rss
    PRE_TARGETDEPS += $${symbian_resources_RCC_DIR}/$${baseTarget}.rsg
    QMAKE_CLEAN += $${symbian_resources_RCC_DIR}/$${baseTarget}.rsg
    QMAKE_CLEAN += $${symbian_resources_RCC_DIR}/$${baseTarget}.rpp
    QMAKE_DISTCLEAN += $${baseTarget}.rss
    QMAKE_DISTCLEAN += $${symbianDestdir}/$${baseTarget}.rsc

    symbianGenRegResource.target = $${symbian_resources_RCC_DIR}/$${baseTarget}_reg.rsg
    symbianGenRegResource.commands = cpp -nostdinc -undef \
                                     $$symbian_resources_INCLUDES \
                                     $$symbian_resources_DEFINES \
                                     $${baseTarget}_reg.rss \
                                     -o $${symbian_resources_RCC_DIR}/$${baseTarget}_reg.rpp \
                                     && rcomp -u -m045,046,047 \
                                     -s$${symbian_resources_RCC_DIR}/$${baseTarget}_reg.rpp \
                                     -o$${symbianDestdir}/$${baseTarget}_reg.rsc \
                                     -h$${symbian_resources_RCC_DIR}/$${baseTarget}_reg.rsg \
                                     -i$${baseTarget}_reg.rss
    silent:symbianGenRegResource.commands = @echo rcomp $${baseTarget}_reg.rss && $$symbianGenRegResource.commands
    symbianGenRegResource.depends = $${baseTarget}_reg.rss $${symbian_resources_RCC_DIR}/$${baseTarget}.rsg
    PRE_TARGETDEPS += $${symbian_resources_RCC_DIR}/$${baseTarget}_reg.rsg
    QMAKE_CLEAN += $${symbian_resources_RCC_DIR}/$${baseTarget}_reg.rsg
    QMAKE_CLEAN += $${symbian_resources_RCC_DIR}/$${baseTarget}_reg.rpp
    QMAKE_DISTCLEAN += $${baseTarget}_reg.rss
    QMAKE_DISTCLEAN += $${symbianDestdir}/$${baseTarget}_reg.rsc

    # 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_TARGETS += symbianGenResource symbianGenRegResource
    QMAKE_EXTRA_COMPILERS += symbianRccDirCreation

    QMAKE_DISTCLEAN += $${baseTarget}.loc
}

# Generated pkg files

QMAKE_DISTCLEAN += $${baseTarget}_template.pkg
QMAKE_DISTCLEAN += $${baseTarget}_installer.pkg
QMAKE_DISTCLEAN += $${baseTarget}_stub.pkg