diff options
Diffstat (limited to 'mkspecs/features/symbian/symbian_building.prf')
-rw-r--r-- | mkspecs/features/symbian/symbian_building.prf | 369 |
1 files changed, 369 insertions, 0 deletions
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 |