From f32e8063133bbfb3e2d4b9057c6bdb93e5cb0c4a Mon Sep 17 00:00:00 2001 From: Kristian Nedrevold-Hansen Date: Wed, 18 Dec 2024 12:50:09 +0100 Subject: [PATCH] Add support for defining the application/library type of scala-native projects --- config/src/bloop/config/Config.scala | 13 ++++++- config/src/bloop/config/ConfigCodecs.scala | 40 ++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/config/src/bloop/config/Config.scala b/config/src/bloop/config/Config.scala index eff3a15..a6254b3 100644 --- a/config/src/bloop/config/Config.scala +++ b/config/src/bloop/config/Config.scala @@ -227,7 +227,8 @@ object Config { linkStubs: Boolean, check: Boolean, dump: Boolean, - output: Option[Path] + output: Option[Path], + @unroll buildTarget: Option[NativeBuildTarget] = None ) extends PlatformConfig object NativeConfig { @@ -236,6 +237,16 @@ object Config { // FORMAT: ON } + sealed abstract class NativeBuildTarget(val id: String) + object NativeBuildTarget { + case object Application extends NativeBuildTarget("application") + case object LibraryDynamic extends NativeBuildTarget("dynamic") + case object LibraryStatic extends NativeBuildTarget("static") + + val All: List[String] = + List(Application.id, LibraryDynamic.id, LibraryStatic.id) + } + case class NativeOptions(linker: List[String], compiler: List[String]) object NativeOptions { val empty: NativeOptions = NativeOptions(Nil, Nil) diff --git a/config/src/bloop/config/ConfigCodecs.scala b/config/src/bloop/config/ConfigCodecs.scala index c9552fc..b127b90 100644 --- a/config/src/bloop/config/ConfigCodecs.scala +++ b/config/src/bloop/config/ConfigCodecs.scala @@ -204,6 +204,46 @@ object ConfigCodecs { } } + implicit val codecNativBuildTarget + : JsonValueCodec[Config.NativeBuildTarget] = { + new JsonValueCodec[Config.NativeBuildTarget] { + val nullValue: Config.NativeBuildTarget = + null.asInstanceOf[Config.NativeBuildTarget] + def encodeValue(x: Config.NativeBuildTarget, out: JsonWriter): Unit = { + val str = x match { + case Config.NativeBuildTarget.Application => + Config.NativeBuildTarget.Application.id + case Config.NativeBuildTarget.LibraryDynamic => + Config.NativeBuildTarget.LibraryDynamic.id + case Config.NativeBuildTarget.LibraryStatic => + Config.NativeBuildTarget.LibraryStatic.id + } + out.writeVal(str) + } + def decodeValue( + in: JsonReader, + default: Config.NativeBuildTarget + ): Config.NativeBuildTarget = + if (in.isNextToken('"')) { + in.rollbackToken() + in.readString(null) match { + case Config.NativeBuildTarget.Application.id => + Config.NativeBuildTarget.Application + case Config.NativeBuildTarget.LibraryDynamic.id => + Config.NativeBuildTarget.LibraryDynamic + case Config.NativeBuildTarget.LibraryStatic.id => + Config.NativeBuildTarget.LibraryStatic + case _ => + in.decodeError( + s"Expected build target ${Config.NativeBuildTarget.All.mkString("'", "', '", "'")}" + ) + } + } else { + in.rollbackToken() + nullValue + } + } + } implicit val codecJvmConfig: JsonValueCodec[Config.JvmConfig] = JsonCodecMaker.makeWithRequiredCollectionFields[Config.JvmConfig]