RednaxelaFX 发表于 2013-1-27 05:44:01

把吉里吉里3 revision 3419中Risse的部分build了出来测试

把吉里吉里3 revision 3419中Risse的部分build了出来测试

吉里吉里3官网
需要kirikiri3源代码的,请在官网查找其SVN repository的地址。

嘛,吉里吉里3已经在revision 3419持续了几天。11月10日更新到revision 3414时,Dee氏把渐渐变得难以控制的Rina GDS代码给删了,然后这几天在慢慢摸索Rina该如何继续开发。看来最近的开发方向主要集中在Rina上,而Risse部分在上个月底之后就一直没怎么改动。于是想build一下现有的Risse部分,看看现在的实现的完成度有多高。

==================================================================

Build的过程

开发环境:
kirikiri3-buildenv-2007-08-10.zip(包括MinGW 5.1.3,MSYS-1.0.11等。具体查看这里)
Ruby 1.8.6-26 Release Candidate 2
TortoiseSVN 1.4.5, Build 10425 - 32 Bit

安装包总大小:158 MB
安装后总大小:181 MB

MinGW和MSYS我原本也有装,不过要调整到跟Dee氏用的能兼容总觉得好麻烦,干脆直接用那个all-in-one的开发环境包了。

Build目标:
kirikiri3 trunk revision 3419

源代码大小:481 MB(包括SVN文件)
占用空间:1.10 GB (包括SVN文件)

源代码中所有外部依赖都包含在SVN中,也不用分别去获取。比吉里吉里2的开发轻松多了。

Ok,把开发环境展开,配置好,马上来试试build。

首先要把外部依赖都build出来,包括Boost、Boehm GC、libogg、zlib等一堆。可是一开始build到gc那部分就囧了。某个makefile里有这么一句:
svn export src src_temp || cp -pR src src_temp
我装的是TortoiseSVN,在命令行没有"svn"这个命令可用,当然就执行了后半部分的cp。一碰到SVN的那些.svn隐藏目录,这个cp就会失败。我想来想去没想出什么好办法解决,一怒,把整个repository跟SVN断开连接,也就是把那些.svn目录都删除掉,马上就OK了。
build外部依赖的过程大概用了3个小时吧。最后总算等到了那句"all done.",唉。以前不知道为什么连这些外部依赖也总是不能顺利build完。至少这次bjam的build完全没出错,一看到bjam成功build出来我就松了口气。

然后尝试去build一下吉里吉里3的核心部分。在src\core目录里现在基本上只有risse目录是能build完的。貌似因为Rina还没完成,所以src\core\base里的东西也没有被make。也好,反正我要的就是Risse部分。把Risse给build出来,得到librisse.a。

然后来到tests\rissetest目录,把测试Risse用的外壳程序给build出来。得到rissetest.exe。

这些都做完后,来看看吉里吉里3的工作区已经变到多大了:
整个k3目录:大小 4.54 GB;占用 4.68 GB。
其中build_output\bin目录:大小 348 MB。
其中rissetest.exe文件:大小 23.7 MB。

这大小真够夸张的……难怪Dee氏在build指引中写了“要是有10G的剩余空间应该就没什么问题了吧” T T
build的过程用有用到-DDEBUG参数,不知道要是不加debug参数,然后加上优化参数(例如-O2)会怎样呢。

==================================================================

测试过程

要运行rissetest.exe,必须附带两个外部dll:
gc.dll - Boehm GC
mingwm10.dll - MinGW的一个运行时

于是把这3个文件都复制到tests\rissetest目录里,以下面命令开始测试:
for %f in (tests\*.rs) do "rissetest.exe" %f 2> "testlog\%f.testlog.txt" 1>"testlog\%f.result.txt"
这样,所有测试结果都保存到testlog目录中。不过一个个脚本文件+对应结果查看起来也挺麻烦的,所以先把所有原始脚本文件和测试结果都复制到另一个目录里放在一起,然后另外写了个程序来处理这些结果:
C#代码:
using System;using System.IO;using System.Text.RegularExpressions;namespace fx.meta.rissetest{    public sealed class ExtractResult    {      public static void Main( string[ ] args ) {            if ( args.Length < 1 ) {                Usage( );                return;            } // if            bool isPrintContent = args[ 0 ].Contains( "c" );            bool isPrintResult = args[ 0 ].Contains( "r" );            bool isPrintStats = args[ 0 ].Contains( "s" );            switch ( args.Length ) {            case 1:                Console.WriteLine( "Missing dir_path." );                Usage( );                break;            case 2:                ExtractResults( args[ 1 ], null, isPrintContent, isPrintResult, isPrintStats );                break;            case 3:                ExtractResults( args[ 1 ], args[ 2 ], isPrintContent, isPrintResult, isPrintStats );                break;            default:                Console.WriteLine( "Too many arguments." );                Usage( );                break;            } // switch      } // Main      private static void ExtractResults(            string dirname,            string outname,            bool isPrintContent,            bool isPrintResult,            bool isPrintStats ) {            string[ ] filelist = Directory.GetFiles( dirname, "*.rs" );            StreamWriter writer = null;            int fileCount = 0;            int passCount = 0;            try {                if ( outname != null ) {                  writer = File.CreateText( outname );                  Console.SetOut( writer );                }                foreach ( string fname in filelist ) {                  // get script text                  FileInfo fiScript = new FileInfo( fname );                  string content = null;                  using ( StreamReader reader = fiScript.OpenText( ) ) {                        content = reader.ReadToEnd( );                  }                  // get result text                  FileInfo fiResult = new FileInfo( fname + ".result.txt" );                  string result = null;                  using ( StreamReader reader = fiResult.OpenText( ) ) {                        result = reader.ReadToEnd( );                  }                  // extract expected result from script                  MatchCollection matches = Regex.Matches( content, @"//=> (.+)$", RegexOptions.Multiline );                  string expectedResult = null;                  bool passed = false;                  foreach ( Match match in matches ) {                        expectedResult = match.Groups[ 1 ].Captures[ 0 ].Value;                  }                  if ( ( expectedResult != null ) && ( result != null ) && expectedResult.Trim( ).Equals( result.Trim( ) ) ) {                        passed = true;                        passCount++;                  }                  Console.WriteLine( "=========================================" );                  Console.WriteLine( "Risse Test Script No.{0}: {1}", ++fileCount, fname );                  Console.WriteLine( "Test: {0}", ( passed ) ? "Passed" : "Failed" );                  if ( isPrintContent ) {                        Console.WriteLine( "-----------------------------------------" );                        Console.WriteLine( "Test Script: {0}{1}", Environment.NewLine, content );                  }                  if ( isPrintResult ) {                        Console.WriteLine( "-----------------------------------------" );                        Console.WriteLine( "Results: {0}", result );                  }                  Console.WriteLine( "=========================================" );                  Console.WriteLine( );                } // foreach                if ( isPrintStats ) {                  Console.WriteLine( "=========================================" );                  Console.WriteLine( "{0} scripts tested, {1} passed, {2} failed.", fileCount, passCount, fileCount - passCount );                }            } finally {                if ( writer != null )                  writer.Dispose( );            } // try-finally      } // ExtractResults      private static void Usage( ) {            Console.WriteLine( "Usage: ExtractResult.exe -options dir_path " );            Console.WriteLine( "where" );            Console.WriteLine( "\tdir_path is the directory where the *.rs scripts" );            Console.WriteLine( "\tand their correspoding result files are." );            Console.WriteLine( "\tout_path is the output file. Optional." );            Console.WriteLine( "options is one or more of :" );            Console.WriteLine( "\tc - script ontent" );            Console.WriteLine( "\tr - esult" );            Console.WriteLine( "\ts - overall tatistics" );            Console.WriteLine( "The options are case sensitive." );      } // Usage    }}

运行
<div class="quote_title">引用
页: [1]
查看完整版本: 把吉里吉里3 revision 3419中Risse的部分build了出来测试