sn-vcpkg
vcpkgのScala Native用ラッパー
Scala NativeのVCPKGだからsn-vcpkg
vcpkg: C++用のライブラリ管理ツール。要するにnpmとかのあれ
sbtプラグイン、millプラグイン、そしてCLIツールとして提供されている CLIツールとして使う
code:sh
インストールするとsn-vcpkgがPATHに生える
sn-vcpkgはサブコマンドとしてscala-cliがある
以下のように書くと、(Cの)依存ライブラリが解決され、--から先がscala-cliに渡される
code:sh
λ sn-vcpkg scala-cli 依存ライブラリ 依存ライブラリ ... -- --power package -o out main.scala
code:例.sh
λ sn-vcpkg scala-cli openssl -- --power package -o out hello.scala
code:hello.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:
_ <- IO.println("running server")
s <- EmberServerBuilder
.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 ( )
この例ではリンカにmoldを使っているので入れておくこと
するとoutが出力される
code:sh
λ ldd out
動的実行ファイルではありません
sn-vcpkgが勝手に依存性を解決し、リンカに渡してくれたので環境を汚さずにstatic buildができた