# we have some module specific options (defined in qt.prf) lets add them !contains(TARGET, ".*[ -].*"):eval(TMPVAR = \$\$QMAKE_$${TARGET}_CXXFLAGS) !isEmpty(TMPVAR):QMAKE_CXXFLAGS += $$TMPVAR !contains(TARGET, ".*[ -].*"):eval(TMPVAR = \$\$QMAKE_$${TARGET}_LFLAGS) !isEmpty(TMPVAR) { QMAKE_LFLAGS += $$TMPVAR } else :linux-gcce { # lets provide a simple default. Without elf2e32 complains QMAKE_LFLAGS += -Ttext 0x80000 -Tdata 0x400000 } symbianObjdir=$$OBJECTS_DIR isEmpty(symbianObjdir) { symbianObjdir = . } symbianDestdir=$$DESTDIR isEmpty(symbianDestdir) { symbianDestdir = . } contains(QMAKE_CFLAGS, "--thumb")|contains(QMAKE_CXXFLAGS, "--thumb")|contains(QMAKE_CFLAGS, "-mthumb")|contains(QMAKE_CXXFLAGS, "-mthumb") { DEFINES += __MARM_THUMB__ } defineReplace(processSymbianLibraries) { library = $$replace(1, "\.dll$", ".dso") library = $$replace(library, "^-l", "") isFullName = $$find(library, \.) isEmpty(isFullName):library="$${library}.dso" linux-gcce { newLIB = "-l:$${library}" } else { newLIB = "$${library}" } contains(library, "\.dso$")|contains(library, ".lib$"):PRE_TARGETDEPS += $$library return($$newLIB) } for(libraries, LIBS) { newLIBS += $$processSymbianLibraries($$libraries) } LIBS = $$newLIBS newLIBS = for(libraries, QMAKE_LIBS) { newLIBS += $$processSymbianLibraries($$libraries) } QMAKE_LIBS = $$newLIBS 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) { !isEmpty(QMAKE_POST_LINK) { # No way to honor the '@' :-( QMAKE_POST_LINK = $$replace(QMAKE_POST_LINK, "^@", "") QMAKE_POST_LINK = && $$QMAKE_POST_LINK } # The tee and grep at the end work around the issue that elf2e32 doesn't return non-null on error. # The comparison of dso files is to avoid extra building of modules that depend on this dso, in # case it has not changed. QMAKE_POST_LINK = $$QMAKE_MOVE $$symbianDestdir/$${TARGET}.dll $$symbianDestdir/$${TARGET}.sym \ && elf2e32 --version=$$decVersion --sid=$$TARGET.SID --uid1=0x10000079 \ --uid2=$$TARGET.UID2 --uid3=$$TARGET.UID3 --dlldata --heap=0x00020000,0x00800000 \ --stack=0x00014000 --fpu=softvfp --targettype=DLL \ --elfinput=$${symbianDestdir}/$${TARGET}.sym --output=$${symbianDestdir}/$${TARGET}.dll \ --dso=$$symbianObjdir/$${TARGET}.dso --defoutput=$$symbianObjdir/$${TARGET}.def \ --unfrozen --linkas=$${TARGET}\\{$${hexVersion}\\}\\[$${intUid3}\\].dll \ --compressionmethod bytepair $$elf2e32_LIBPATH --unpaged $$capability \ $$QMAKE_ELF2E32_FLAGS \ | tee elf2e32.log && test `grep -c 'Error:' elf2e32.log` = 0 && rm elf2e32.log \ && if ! diff -q $${symbianObjdir}/$${TARGET}.dso $${symbianDestdir}/$${TARGET}.dso \ > /dev/null 2>&1; then \ $$QMAKE_COPY $${symbianObjdir}/$${TARGET}.dso $${symbianDestdir}/$${TARGET}.dso; \ fi \ $$QMAKE_POST_LINK QMAKE_DISTCLEAN += $${symbianDestdir}/$${TARGET}.sym QMAKE_DISTCLEAN += $${symbianDestdir}/$${TARGET}.dso QMAKE_CLEAN += $${symbianObjdir}/$${TARGET}.dso QMAKE_CLEAN += $${symbianObjdir}/$${TARGET}.def linux-armcc: { QMAKE_LIBS += -ledllstub.lib -ledll.lib\\(uc_dll_.o\\) } else :linux-gcce { QMAKE_LIBS += \ -l:edll.lib \ -l:usrt2_2.lib \ -l:dfpaeabi.dso \ -l:drtaeabi.dso \ -l:scppnwdl.dso \ -lsupc++ \ -lgcc } QMAKE_LFLAGS += --soname $${TARGET}\\{$${hexVersion}\\}\\[$${intUid3}\\].dll DEFINES += __DLL__ } contains(TEMPLATE, app):!contains(QMAKE_LINK, "^@.*") { !isEmpty(QMAKE_POST_LINK) { # No way to honor the '@' :-( QMAKE_POST_LINK = $$replace(QMAKE_POST_LINK, "^@", "") QMAKE_POST_LINK = && $$QMAKE_POST_LINK } # the tee and grep at the end work around the issue that elf2e32 doesn't return non-null on error QMAKE_POST_LINK = $$QMAKE_MOVE $$symbianDestdir/$${TARGET} $$symbianDestdir/$${TARGET}.sym \ && elf2e32 --version $$decVersion --sid=$$TARGET.SID --uid1=0x1000007a \ --uid2=$$TARGET.UID2 --uid3=$$TARGET.UID3 --dlldata --heap=0x00020000,0x00800000 \ --stack=0x00014000 --fpu=softvfp --targettype=EXE \ --elfinput=$${symbianDestdir}/$${TARGET}.sym --output=$${symbianDestdir}/$${TARGET}.exe \ --unfrozen --linkas=$${TARGET}\\{$${hexVersion}\\}\\[$${intUid3}\\].exe \ --compressionmethod bytepair $$elf2e32_LIBPATH --unpaged $$capability \ $$QMAKE_ELF2E32_FLAGS \ | tee elf2e32.log && test `grep -c 'Error:' elf2e32.log` = 0 && rm elf2e32.log \ && ln "$${symbianDestdir}/$${TARGET}.exe" "$${symbianDestdir}/$$TARGET" \ $$QMAKE_POST_LINK QMAKE_DISTCLEAN += $${symbianDestdir}/$${TARGET}.sym QMAKE_DISTCLEAN += $${symbianDestdir}/$${TARGET}.exe QMAKE_CLEAN += $${symbianDestdir}/$${TARGET} linux-armcc: { 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 $${TARGET}\\{$${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}.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}.rsc \ -h$${symbian_resources_RCC_DIR}/${QMAKE_FILE_BASE}.rsg \ -i${QMAKE_FILE_NAME} symbianresources.dependency_type = TYPE_C symbianresources.CONFIG = no_link target_predeps QMAKE_EXTRA_COMPILERS += symbianresources contains(TEMPLATE, "app"):!contains(CONFIG, "no_icon") { baseTarget = $$basename(TARGET) # If you change this, also see application_icon.prf baseTarget = $$replace(baseTarget, " ",_) # 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 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 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 += $${TARGET}_reg.rss QMAKE_DISTCLEAN += $${symbianDestdir}/$${TARGET}_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 += $${TARGET}.loc } # Generated pkg files QMAKE_DISTCLEAN += $${TARGET}_template.pkg # Pre 2.6.23 Linux kernels have a limit on the environment size that can be passed to # a forked process. We quite easily overstep this boundary when building big projects # on Symbian, and since we depend on running the system() command, this causes the build # to fail. Test here that system() can be successfully run. It is important that this # check happens as late as possible, otherwise it will not be caught. execve_sanity_test = $$system("echo testing") !contains(execve_sanity_test, "testing") { error("Running system() failed. Maybe your kernel is too old? (Linux kernels need at least version 2.6.23)") }