sbtからbuildrに乗り換え中

今作っているscalaのlwjglのプログラムはビルドにsbtを使っていたのだけど、
開発マシンをUbuntuに乗り換えたのを機に、ビルドツールもbuildrに乗り換えてみる。


まず、buildr自身のインストールなのだが、javarubyをブリッジするrjbのインストールが
わりと厄介。Ubuntuでさくっとできたが、Windowsではうまくいかなかった。
JRubyを使うのがいいかもしれぬ。


乗り換え前はこんな感じ

project
+bulid.xml
+src
  App.scala
  +trigonal
      +hogehoge.scala
      +fugafuag.java

まずbuildfileを生成する。

# どけとく
$ mv build.xml ..
# buildrの流儀にファイルを配置しなおす
$ mkdir -p src/main/{scala,java}
# 木構造を維持してscalaとjavaのソースをわけた

# 雛形生成。buildfileが無い状態でbuildrとすると雛形を作成できる
$ buildr
To use Buildr you need a buildfile. Do you want me to create one?:
1. From directory structure
2. Cancel
# 1を選択した

# 趣味で先頭を大文字に
$ mv buildfile Buildfile

ビルドする

$ build compile

# lwjglが見つからないのでエラーいっぱい

どうやらArtifactsとやらを理解する必要があるようだ
http://buildr.apache.org/artifacts.html

ローカルリポジトリ

Maven2 互換で~/.m2に作られる。

$ find .m2
.m2
.m2/repository
.m2/repository/org
.m2/repository/org/apache
.m2/repository/org/apache/ant
.m2/repository/org/apache/ant/ant-launcher
.m2/repository/org/apache/ant/ant-launcher/1.8.0
.m2/repository/org/apache/ant/ant-launcher/1.8.0/ant-launcher-1.8.0.jar
.m2/repository/org/apache/ant/ant-launcher/1.8.0/ant-launcher-1.8.0.pom
.m2/repository/org/apache/ant/ant-trax
.m2/repository/org/apache/ant/ant-trax/1.8.0
.m2/repository/org/apache/ant/ant-trax/1.8.0/ant-trax-1.8.0.jar
.m2/repository/org/apache/ant/ant-trax/1.8.0/ant-trax-1.8.0.pom
.m2/repository/org/apache/ant/ant
.m2/repository/org/apache/ant/ant/1.8.0
.m2/repository/org/apache/ant/ant/1.8.0/ant-1.8.0.jar
.m2/repository/org/apache/ant/ant/1.8.0/ant-1.8.0.pom
.m2/repository/org/scala-lang
.m2/repository/org/scala-lang/scala-library
.m2/repository/org/scala-lang/scala-library/2.7.7
.m2/repository/org/scala-lang/scala-library/2.7.7/scala-library-2.7.7.pom
.m2/repository/org/scala-lang/scala-library/2.7.7/scala-library-2.7.7.jar
.m2/repository/org/scala-lang/scala-compiler
.m2/repository/org/scala-lang/scala-compiler/2.7.7
.m2/repository/org/scala-lang/scala-compiler/2.7.7/scala-compiler-2.7.7.jar
.m2/repository/org/scala-lang/scala-compiler/2.7.7/scala-compiler-2.7.7.pom
.m2/repository/org/scala-tools
.m2/repository/org/scala-tools/vscaladoc
.m2/repository/org/scala-tools/vscaladoc/1.2-SNAPSHOT
.m2/repository/org/scala-tools/vscaladoc/1.2-SNAPSHOT/vscaladoc-1.2-SNAPSHOT.jar
.m2/repository/org/scala-tools/vscaladoc/1.2-SNAPSHOT/vscaladoc-1.2-SNAPSHOT.pom

とりあえずcompileとおった

Buildfile

#Buildr.settings.build['scala.version'] = "2.8.0.Beta1"
Buildr.settings.build['scala.version'] = "2.8.0"
require 'buildr/scala'

# Generated by Buildr 1.4.1, change to your liking
# Version number for this release
VERSION_NUMBER = "1.0.0"
# Group identifier for your projects
GROUP = "trigonal"
COPYRIGHT = ""

LWJGL_URL='http://downloads.sourceforge.net/project/java-game-lib/Official%20Releases/LWJGL%202.5/lwjgl-2.5.zip'
LWJGL='org.lwjgl:lwjgl:jar:2.5'
LWJGL_UTIL='org.lwjgl:lwjgl-util:jar:2.5'
SPECS=[LWJGL, LWJGL_UTIL]

# Specify Maven 2.0 remote repositories here, like this:
repositories.remote << "http://www.ibiblio.org/maven2/"

desc "The Trigonal project"
define "trigonal" do

  project.version = VERSION_NUMBER
  project.group = GROUP
  manifest["Implementation-Vendor"] = COPYRIGHT
  compile.with SPECS
  package(:jar)

  lwjgl_zip=download('target/lwjgl-2.5.zip'=>LWJGL_URL)
  extracted=unzip('target/lwjgl-2.5'=>lwjgl_zip).from_path('lwjgl-2.5').include('jar/*')

  lwjgl_jar=file('target/lwjgl-2.5/lwjgl-2.5/jar/lwjgl.jar')
  lwjgl=artifact(LWJGL).from(lwjgl_jar)

  lwjgl_util_jar=file('target/lwjgl-2.5/lwjgl-2.5/jar/lwjgl_util.jar')
  lwjgl_util=artifact(LWJGL_UTIL).from(lwjgl_util_jar)
end

残りは、コンパイルされたクラスを実行するところ。

実行できた

Buildfile

#Buildr.settings.build['scala.version'] = "2.8.0.Beta1"
Buildr.settings.build['scala.version'] = "2.8.0"
require 'buildr/scala'

# Generated by Buildr 1.4.1, change to your liking
# Version number for this release
VERSION_NUMBER = "1.0.0"
# Group identifier for your projects
GROUP = "trigonal"
COPYRIGHT = ""

LWJGL_URL='http://downloads.sourceforge.net/project/java-game-lib/Official%20Releases/LWJGL%202.5/lwjgl-2.5.zip'
LWJGL='org.lwjgl:lwjgl:jar:2.5'
LWJGL_UTIL='org.lwjgl:lwjgl-util:jar:2.5'
SCALA_LIB='org.scala-lang:scala-library:jar:2.8.0'
SPECS=[LWJGL, LWJGL_UTIL]

# Specify Maven 2.0 remote repositories here, like this:
repositories.remote << "http://www.ibiblio.org/maven2/"

desc "The Trigonal project"
define "trigonal" do

  project.version = VERSION_NUMBER
  project.group = GROUP
  manifest["Implementation-Vendor"] = COPYRIGHT
  compile.with SPECS
  package(:jar)

  task :extract do
    lwjgl_zip=download('target/lwjgl-2.5.zip'=>LWJGL_URL)
    extracted=unzip('target/lwjgl-2.5'=>lwjgl_zip)
    extracted.from_path('lwjgl-2.5').include('jar/*')
    extracted.from_path('lwjgl-2.5').include('native/linux/*')
    extracted.target.invoke
  end

  lwjgl_jar=file('target/lwjgl-2.5/jar/lwjgl.jar'=>:extract)
  lwjgl=artifact(LWJGL).from(lwjgl_jar)

  lwjgl_util_jar=file('target/lwjgl-2.5/jar/lwjgl_util.jar'=>:extract)
  lwjgl_util=artifact(LWJGL_UTIL).from(lwjgl_util_jar)

  task :run => [compile, :extract] do
    cp = Buildr.artifacts(SPECS+[SCALA_LIB]).each(&:invoke).map(&:name).join(File::PATH_SEPARATOR)
    lib="target/lwjgl-2.5/native/linux"
    cmd="java -cp target/classes:#{cp} -Djava.library.path=#{lib} App miku/miku01.mqo"
    p cmd
    system cmd
  end
end

jniのsoにパスを通す一般的なやり方(LD_LIBRARY_PATHもしくはjava.library.path)がわからなかったのでベタに書いた。
以上で、jdkとbuildrがインストールされていれば必要なファイル(scala-2.8やlwjgl-2.5など)を自動的にダウンロードして、適当に展開・配置してクラスパスを通してコンパイル・実行するプロジェクトができた。
これで、Scalaでの開発を再開できる。
しかし、Buildrの情報少なかった。
本家サイトを丹念に読めばだいたいわかるのだが、お手軽サンプルをコピペでポンといかないので少し難航した。