操作系统  办公  实用知识  设计  开发  WEB开发  移动开发  数据库  软件工程  网管  安全  管理  信息化  答疑  渠道 

利用perl脚本帮助编译多环境下的多个symbian工程

2008-5-20 网友评论 0 条 点击进入论坛

  有时候在多个平台下需要编译多个应用,自己去一个一个打控制台命令就觉得很麻烦,再加上环境变量的设置那就更麻烦了,特别是symbian这种版本很多的平台控制台命令又特别长的就特别严重。

  symbian手机使用的平台对应的SDK比较典型的几个: SDK1.2 SYMBIAN6.1 nokia NG QD,7650 SDK2.0 SYMBIAN7.0 nokia 6600

  我们开发的程序当然希望所有的手机都能跑,但是在SDK2.0下面编译的界面程序是不能在symbian6.1平台下的跑的,如果你想写一个在S60下都能跑的APP应用,那么就必须要兼容以前的老界面库,你需要在SDK1.2(SDK0.9就不考虑了)的环境下编译这个APP,以便支持QD这类卖得很好又是6.1平台的手机。然而SDK1.2毕竟是老版本,缺少很多API的支持,写EXE类似的程序当然是SDK越新越好,因为调用的是系统底层函数,很少有6.1不支持的(老的SDK只是没有公开这些API)。

  这就涉及到一个环境切换的问题,symbian有提供了一个解决方案,有一个叫environmentswitch.exe东西可以在开发环境之间切换,但是我个人感觉还是麻烦了,不太好用,所以试试了,环境切换其实可以直接通过修改环境变量的方法来解决,SDK安装后会在系统环境变量中加入一个叫EPOCROOT的值,用来指示当前使用的SDK,比如SDK1.2安装后会设置为Symbian.1Series60,而SDK2.0安装后设置为Symbian.0sSeries60_v20,经过测试可以直接修改这个值来达到切换环境的目的。

  另外一个比较麻烦的是有多个APP,DLL或者EXE需要编译,那么可能需要开很多个控制台来输入编译命令,加上参数又多,真是麻烦啊且很容易搞错了。所以就用perl来解决这两个问题吧,perl我不熟,只是为了解决这个小问题学了下,高手见笑了。

  首先把自己的工程组织在一个目录下,比如projecttest1, projecttest2下面包含symbian的那堆目录groupinc,src什么的,假定test1需要用SDK1.2环境编译,test2需要用SDK2.0编译,然后开始写脚本。#! ./perl

  use Win32;

  #

  #这里是把stderr的输出重定向到当前目录下的err.txt中去(编译连接错误多了在控制台中看得眼花,当然你一直在IDE中编译不存在这个问题,如果是做移植这个方法我觉得还是很有用处)#

  open (stderr, ">err.txt") || die ("open stderr failed");

  #

  #工程表#

  @projectList = ('test1',

  'test2');

  #

  #环境变量初值#

  $S60_70 = "Symbian7.0sSeries60_v20";

  $S60_61 = "Symbian6.1Series60";

  

  #

  #判断下参数数量,不对就打help

  #

  if (@ARGV <1) {

  print ("Not enough argumentrn");

  disHelp();

  }

  #

  #第一个参数是编译平台我一般就用armi和thumb,不对就打help出来#

  $buildType = @ARGV[0];

  if ($buildType cmp "armi" &&$buildType cmp "thumb") {

  print ("wrong argument : $buildTypern");

  disHelp();

  }

  #

  #再加个参数-c表示是否先clean一下#

  $cleanFlag = @ARGV[1];

  if ($cleanFlag cmp "-c" &&$cleanFlag cmp "") {

  print ("wrong argument : $cleanFlagrn");

  disHelp();

  }

  #

  #开始循环编译所有的编译#

  for my $item (@projectList) {

  #如果是test1就换成6.1的环境 if ($item eq "test1") {

  changeEnvTo61();

  }

  else {

  changeEnvTo70();

  }

  #如果有-c先clean一下 if ($cleanFlag eq "-c") {

  print "#--------------------------------------------------------------#rn";

  print " start to clean $item rn";

  print "#--------------------------------------------------------------#rn";

  system ("project$itemgroupabld clean $buildType urel");

  }

  print "#--------------------------------------------------------------#rn";

  print " start to build $item rn";

  print "#--------------------------------------------------------------#rn";

  system ("project$itemgroupabld build $buildType urel");

  }

  #设置环境变量为6.1的sub changeEnvTo61()

  {

  use Env qw(EPOCROOT);

  undef $EPOCROOT;

  $EPOCROOT .= $S60_61;

  print ("change EPOCROOT = $EPOCROOTrn");

  }

  #设置环境变量为7.0的sub changeEnvTo70()

  {

  use Env qw(EPOCROOT);

  undef $EPOCROOT;

  $EPOCROOT .= $S60_70;

  print ("change EPOCROOT = $EPOCROOTrn");

  }

  #help

  sub disHelp()

  {

  print "test.pl [CPU] [OPTION]rn";

  print "[CPU]:rn";

  print " armirn";

  print " thumbrn";

  print "[OPTION]:rn";

  print " -c : clean project firstrn";

  close (stderr);

  exit(0);

  }

  #关闭stderr重定向close (stderr);

  到这就结束了,控制台中输入perl test.pl armi –c就可以先clean再编译这两个工程了,如果还嫌麻烦,再写个build.bat里面写上一句话perl test.pl %1 %2,调用的时候build armi –c就可以了,比以前打的命令少多了。

已有 0 位对此文章感兴趣的网友发布了看法    
我来评两句 登录邮箱: 密码:
  匿名发表
今日推荐
技术文库(共有 46732 篇文章)
操作系统
办公软件
实用知识
网络管理
软件开发
WEB开发
软件工程
数据库
设计在线
信息安全
行业信息化
管理信息化
重点推荐
电子杂志订阅
点击电子杂志名称查看样刊
输入E-mail地址即可订阅
E-mail