Coastline@Devdiv.net
转载请注明出处
相信在mmp中如何区分SDK平台版本,是很多朋友想做到的吧,遗憾的是到目前为止,还没有找到解决方案。
近日和同事提及这个问题的时候,我说可以用makefile来做,只是我对makefile的语法一知半解,一时也不想折腾了。同事Harry哥哥是Linux牛人,他说他来搞,结果很快就搞出来了。呵呵,所以这个解决方案很大程度上是他的功劳。我只是整理了一下代为发帖和大家分享。
下面介绍原理和步骤:
Epoc32\include\variant\下,有一个hrh文件(不同SDK版本可能这个hrh文件名也不同),里面定义了该SDK所使用的宏。本来如果Symbian想得周到一点的话,他大可以在这个hrh中放置一枚每个SDK唯一的宏,可是他没有这么做。现在我们就是要代替他做这个工作,一旦有了唯一的宏,我们就能在mmp中利用这个宏来区分5版了。
我们利用makefile检查SDK的安装路径,如果包含"S60_5th"字串,则判断为第五版SDK,虽说这个判断逻辑不是100%正确,但对于实际情况已经足够准确了,我想没有哪个家伙会闲得蛋疼把S60_5th这个字串也改了吧。
如果是第五版SDK,则在symbian_os.hrh中追加一个宏,这个宏就能在mmp中使用了。
思路就是这样。
1.从你第五版SDK的Epoc32\include\variant\下拷贝symbian_os.hrh文件至工程的bld.inf所处目录(一般都是group目录),并改名为symbian_os_mod.hrh以示区分。
编辑这个symbian_os_mod.hrh文件,在最后加上
/**
* modified by Coastline
* you can use the following macro to determine S60_5th in mmp
*/
#ifndef S60_5TH
#define S60_5TH
#endif
2.在bld.inf所处目录新建DetermineSDKVersion,mk文件,内容如下:
# ============================================================================
# Name : DetermineSDKVersion.mk
# Part of :
# Author : Coastline
# Description:
# ============================================================================
do_nothing :
@rem do_nothing
MAKMAKE : do_nothing
BLD : do_nothing
ifeq (S60_5th,$(findstring S60_5th, $(EPOCROOT)))
@echo ----------symbian_os.hrh replaced----------
copy symbian_os_mod.hrh $(EPOCROOT)\epoc32\include\variant\symbian_os.hrh
endif
CLEAN : do_nothing
LIB : do_nothing
CLEANLIB : do_nothing
RESOURCE : do_nothing
FINAL : do_nothing
3.在bld.inf中加上下面两行:
PRJ_MMPFILES
gnumakefile DetermineSDKVersion.mk
注,这两行最好放在你实际所使用的mmp之前。
4.可以在项目的mmp中使用S60_5TH这个宏:
#ifdef S60_5TH
LIBRARY OOXX.lib
#else
LIBRARY XXOO.lib
#endif
接下来分别使用五版、三版SDK编译看看,是不是可以啦,从此不用在切换SDK后手工在mmp中改动了,爽。
5.对于某些有洁癖的程序员哥哥,可以改进那个makefile,在CLEAN 分支对hrh文件作还原操作。不过这显然没有什么必要。