Scalazのscala-native対応

scala-nativeの0.1がリリースされる(maven centralにはもう上がってる)らしいです。


scala-nativeとは、ScalaJVMではなくLLVM使ってJVM以外で動かすやつです。
https://github.com/scala-native/scala-native


さて、というわけで、scalazを早速対応させました。

https://github.com/scalaz/scalaz/pull/1322

そのためのクロスビルドの説明や、対応させた感想をかんたんにメモしておきます。

  • Scala界隈では、すでにscala-jsとクロスビルドしてるプロジェクトがいくつかある => scala-jsとjvmとnativeの3種類でクロスビルドするためのsbt pluginがすでに用意されている https://github.com/scala-native/sbt-crossproject
  • scala-nativeは2017年2月のscala-native version 0.1時点では、Scala 2.11のみのサポートらしい
  • javaのclassは結構使えないものがある(Java8のjava.timeのclass使えなかったので、scalazのビルド少し工夫した)
  • JavaのThread含めたconcurrentのAPIもほとんど使えなそうだった(?) https://github.com/scala-native/scala-native/issues/101
  • sbtから普通のテスト走らせる方法もない https://github.com/scala-native/scala-native/issues/339
  • なので、単に適当にmainを動かすコードだけ追加で書いただけで、scalazの元からあったテストはnativeで全く実行してない。ひとまずmain動けば、対応してないclassがリンクされない、みたいなことは判明するはず?
  • travis-ciならsudo apt-getでいくつかインストールしないといけないけど、scala-native本体やexampleのリポジトリに書いてあるやつをscalazの.travis.ymlにコピペしたら動いた
  • ライブラリのpublish方法は大体scala-jsと同じらしい
  • つまり "org.scalaz" %% "scalaz-core_native0.1_2.11" % "7.3.0-M10" みたいな感じで、nativeのversionがartifact idに入る
  • nirという独自のASTがjarの中に入るのもscala-jsと同じ


とくに強い反対意見なければ、mergeしてリリースします。この最初に出したpull reqはscalaz7.3系だけれど、7.2系の対応はどうしようかな・・・
(scalaz 7.2は、もう少しだけscala-nativeが枯れてからやりたさがある)