Scalaのtrunkをビルドする
「あばばばばばばばば」
この記事は、Scala Advent Calendar jp 2010 : ATNDの17日目です。
今日は、Scalaそれ自身をソースからコンパイルする方法を紹介します。やりかたは簡単で、Scalaのソースコードを持ってきて、antコマンドでビルドするだけです。
Scalaのソースコードはsvnでホストされてますが、githubにもmirrorがあります。こちらから落とすのがよいでしょう。svnが許されるのはゼロ年代までだよねーキャハハ!!
じゃあ、git cloneでソースコードを取得して……antでビルドです。簡単っしょ?sbtも使えます。ただし、コンパイルにはメモリを1.5Gほど消費します。core i5/8G/SSDのMBPでビルドに10分かかりました。
$ git clone https://github.com/scala/scala.git $ cd scala $ ant
で、このbuild.xmlはSABBUSと呼ばれていて、コンパイラとSDKをそれぞれにコンパイルでき、自前でビルドしたコンパイラを次のコンパイル時に利用できる用になってます。詳しくはREADME嫁。
せっかく自前でビルドするので、ちょっと文法を変えてみました。try-catch-finalyの代わりにRuby風のbegin-ensureに変更します。こんなパッチを当ててコンパイル。
diff --git a/src/compiler/scala/tools/nsc/symtab/StdNames.scala b/src/compiler/scala/tools/nsc/symtab/StdNames.scala index 22be96b..6c7147e 100644 --- a/src/compiler/scala/tools/nsc/symtab/StdNames.scala +++ b/src/compiler/scala/tools/nsc/symtab/StdNames.scala @@ -90,7 +90,7 @@ trait StdNames extends reflect.generic.StdNames with NameManglers { final val EXTENDSkw: NameType = "extends" final val FALSEkw: NameType = "false" final val FINALkw: NameType = "final" - final val FINALLYkw: NameType = "finally" + final val FINALLYkw: NameType = "ensure" final val FORkw: NameType = "for" final val FORSOMEkw: NameType = "forSome" final val IFkw: NameType = "if" @@ -113,7 +113,7 @@ trait StdNames extends reflect.generic.StdNames with NameManglers { final val THROWkw: NameType = "throw" final val TRAITkw: NameType = "trait" final val TRUEkw: NameType = "true" - final val TRYkw: NameType = "try" + final val TRYkw: NameType = "begin" final val TYPEkw: NameType = "type" final val VALkw: NameType = "val" final val VARkw: NameType = "var"
ビルドされたRuntimeはbuild/packにあるので、build/pack/bin/scalaコマンドでREPLを起動。ちゃんとbuild numberが変わってますね。
begin-ensureで例外処理!
2.9から入るparallel collectionも入ってますね。STMはまだみたいです。
ってことで、みんなでScalaのtrunk追いかけようぜ?