scala-nativeの0.1がリリースされる(maven centralにはもう上がってる)らしいです。
scala-nativeとは、ScalaをJVMではなく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が枯れてからやりたさがある)