nix/Scala Native
#nix
#scala
code:hello.scala.sc
//> using scala 3.5.2
println("Hello, World!")
code:sh
nix-shell --pure -p scala-cli which clang --run "scala-cli package --native --native-linking='-static' -o out hello.scala.sc"
ネイティブバイナリ(スタティックリンク)ができた
もうちょい具体的な例で書くか
opensslをstatic linkingする
-p '(openssl.override { static = true; })'のように指定するとライブラリのstatic版がもらえる。
これがないと-staticつきでビルドできない
普通のライブラリは.soファイルをよこすが、static linkingで必要になるのは.aファイル
.aファイルと.soファイル
例えば
code:main.scala
//> using scala 3.5.2
//> using platform scala-native
//> using nativeLinking -fuse-ld=mold -static
//> using nativeVersion 0.4.17
//> using dep "org.http4s::http4s-core::0.23.29"
//> using dep "org.http4s::http4s-ember-server::0.23.29"
//> using dep "org.http4s::http4s-dsl::0.23.29"
//> using deps "com.armanbilge::epollcat::0.1.6"
import cats.effect.{IO, IOApp, ExitCode}
import com.comcast.ip4s._ // for ipv4 and port
import org.http4s.HttpApp
import org.http4s.ember.server.EmberServerBuilder
object Main extends epollcat.EpollApp.Simple:
def run: IOUnit = for {
_ <- IO.println("running server")
s <- EmberServerBuilder
.defaultIO
.withHost(ipv4"0.0.0.0")
.withPort(port"8080")
.withHttpApp(HttpApp.notFound) // なにがなんでもNot Foundを返す
.build
.useForever
.as(ExitCode.Success)
.start
_ <- IO.println("ready")
_ <- s.join
} yield ()
これはlibcryptoが必要になる
(全然関係ないけどmoldリンカ使っている)
code:sh
nix-shell --pure -p '(openssl.override { static = true; })' scala-cli which clang mold --run "scala-cli package -o out main.scala"
こうするとlibcrypto.aがもらえるのでうまくリンクできる
sn-vcpkgとの兼ね合い
sn-vcpkgもパッケージを管理してくれる。
管理したいパッケージが増えてきたらこちらを利用するのも良いかも。
ただしmoldやllvmまわりの環境構築はやってくれないので併用する形になる?