科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道利用perl脚本帮助编译多环境下的多个symbian工程

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

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

作者: 来源:CSDN 2007年11月26日

关键字: Symbian PERL

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

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

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

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

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

    首先把自己的工程组织在一个目录下,比如\project\test1\, \project\test2\下面包含symbian的那堆目录groupincsrc什么的,假定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 = "\\Symbian\\7.0s\\Series60_v20\\";
$S60_61 = "\\Symbian\\6.1\\Series60\\";
 
#
#
判断下参数数量,不对就打help
#
if (@ARGV < 1) {
         print ("Not enough argument\r\n");
         disHelp();
}
#
#
第一个参数是编译平台我一般就用armithumb,不对就打help出来
#
$buildType = @ARGV[0];
if ($buildType cmp "armi" && $buildType cmp "thumb") {
         print ("wrong argument : $buildType\r\n");
         disHelp();
}
#
#
再加个参数-c表示是否先clean一下
#
$cleanFlag = @ARGV[1];
if ($cleanFlag cmp "-c" && $cleanFlag cmp "") {
         print ("wrong argument : $cleanFlag\r\n");
         disHelp();
}
#
#
开始循环编译所有的编译
#
for my $item (@projectList) {
         #
如果是test1就换成6.1的环境
         if ($item eq "test1") {
                   changeEnvTo61();
         }
         else {
                   changeEnvTo70();
         }

         #如果有-cclean一下
         if ($cleanFlag eq "-c") {
                   print "#--------------------------------------------------------------#\r\n";
                   print "             start to clean $item               \r\n";
                   print "#--------------------------------------------------------------#\r\n";
                   system ("\\project\\$item\\group\\abld clean $buildType urel");
         }      
         print "#--------------------------------------------------------------#\r\n";
         print "             start to build $item               \r\n";
         print "#--------------------------------------------------------------#\r\n";
         system ("\\project\\$item\\group\\abld build $buildType urel");
}

#设置环境变量为6.1
sub changeEnvTo61()
{
         use Env qw(EPOCROOT);
         undef $EPOCROOT;
         $EPOCROOT .= $S60_61;
         print ("change EPOCROOT = $EPOCROOT\r\n");
}

#设置环境变量为7.0
sub changeEnvTo70()
{
         use Env qw(EPOCROOT);
         undef $EPOCROOT;
         $EPOCROOT .= $S60_70;
         print ("change EPOCROOT = $EPOCROOT\r\n");
}

#help
sub disHelp()
{
         print "test.pl [CPU] [OPTION]\r\n";
         print "[CPU]:\r\n";
         print "      armi\r\n";
         print "      thumb\r\n";
         print "[OPTION]:\r\n";
         print "      -c : clean project first\r\n";
         close (stderr);
         exit(0);
}
#
关闭stderr重定向
close (stderr);

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

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章