Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update native config to support more configuration options #104

Merged
merged 3 commits into from
Jan 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 89 additions & 2 deletions config/src/bloop/config/Config.scala
Original file line number Diff line number Diff line change
Expand Up @@ -228,15 +228,102 @@ object Config {
check: Boolean,
dump: Boolean,
output: Option[Path],
@unroll buildTarget: Option[NativeBuildTarget] = None
@unroll buildTarget: Option[NativeBuildTarget] = None,
@unroll sanitizer: Option[NativeSanitizer] = None,
@unroll nativeModeAndLTO: NativeModeAndLTO = NativeModeAndLTO.empty,
@unroll nativeFlags: NativeFlags = NativeFlags.empty,
@unroll nativeResourcePatterns: NativeResourcePatterns =
NativeResourcePatterns.empty,
@unroll serviceProviders: Map[String, List[String]] = Map.empty,
@unroll baseName: String = "",
@unroll nativeOptimizerConfig: Option[NativeOptimizerConfig] = None
) extends PlatformConfig

object NativeConfig {
// FORMAT: OFF
val empty: NativeConfig = NativeConfig("", LinkerMode.Debug, "", None, emptyPath, emptyPath, Nil, NativeOptions.empty, false, false, false, None)
val empty: NativeConfig = NativeConfig("", LinkerMode.Debug, "", None, emptyPath, emptyPath, Nil, NativeOptions.empty, false, false, false, None, None, None, NativeModeAndLTO.empty, NativeFlags.empty, NativeResourcePatterns.empty, Map.empty, "", None)
// FORMAT: ON
}

case class NativeModeAndLTO(
nativeLinkerReleaseMode: Option[NativeLinkerReleaseMode],
lto: Option[NativeLTO]
)

object NativeModeAndLTO {
def empty: NativeModeAndLTO = NativeModeAndLTO(None, None)
}
case class NativeResourcePatterns(
resourceIncludePatterns: List[String],
resourceExcludePatterns: List[String]
)

object NativeResourcePatterns {
def empty: NativeResourcePatterns =
NativeResourcePatterns(List("**"), List.empty)
}

case class NativeFlags(
checkFatalWarnings: Boolean,
checkFeatures: Boolean,
optimize: Boolean,
useIncrementalCompilation: Boolean,
embedResources: Boolean,
multithreading: Option[Boolean] = None
)

object NativeFlags {
def empty = NativeFlags(
checkFatalWarnings = false,
checkFeatures = false,
optimize = true,
useIncrementalCompilation = true,
embedResources = false,
multithreading = None
)
}

case class NativeOptimizerConfig(
maxInlineDepth: Int,
maxCallerSize: Int,
maxCalleeSize: Int,
smallFunctionSize: Int
)

sealed abstract class NativeSanitizer(val id: String)
object NativeSanitizer {
case object AddressSanitizer extends NativeSanitizer("address")
case object ThreadSanitizer extends NativeSanitizer("thread")
case object UndefinedBehaviourSanitizer extends NativeSanitizer("undefined")

val All: List[String] =
List(
AddressSanitizer.id,
ThreadSanitizer.id,
UndefinedBehaviourSanitizer.id
)
}

sealed abstract class NativeLTO(val id: String)
object NativeLTO {
case object None extends NativeLTO("none")
case object Thin extends NativeLTO("none")
case object Full extends NativeLTO("none")

val All: List[String] =
List(None.id, Thin.id, Full.id)
}

sealed abstract class NativeLinkerReleaseMode(val id: String)
object NativeLinkerReleaseMode {
case object ReleaseFast extends NativeLinkerReleaseMode("release-fast")
case object ReleaseSize extends NativeLinkerReleaseMode("release-size")
case object ReleaseFull extends NativeLinkerReleaseMode("release-full")

val All: List[String] =
List(ReleaseFast.id, ReleaseSize.id, ReleaseFull.id)
}

sealed abstract class NativeBuildTarget(val id: String)
object NativeBuildTarget {
case object Application extends NativeBuildTarget("application")
Expand Down
142 changes: 142 additions & 0 deletions config/src/bloop/config/ConfigCodecs.scala
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,130 @@ object ConfigCodecs {
}
}

implicit val codecNativeLTO: JsonValueCodec[Config.NativeLTO] = {
new JsonValueCodec[Config.NativeLTO] {
val nullValue: Config.NativeLTO =
null.asInstanceOf[Config.NativeLTO]
def encodeValue(x: Config.NativeLTO, out: JsonWriter): Unit = {
val str = x match {
case Config.NativeLTO.None =>
Config.NativeLTO.None.id
case Config.NativeLTO.Thin =>
Config.NativeLTO.Thin.id
case Config.NativeLTO.Full =>
Config.NativeLTO.Full.id
}
out.writeVal(str)
}
def decodeValue(
in: JsonReader,
default: Config.NativeLTO
): Config.NativeLTO =
if (in.isNextToken('"')) {
in.rollbackToken()
in.readString(null) match {
case Config.NativeLTO.None.id =>
Config.NativeLTO.None
case Config.NativeLTO.Thin.id =>
Config.NativeLTO.Thin
case Config.NativeLTO.Full.id =>
Config.NativeLTO.Full
case _ =>
in.decodeError(
s"Expected build target ${Config.NativeLTO.All.mkString("'", "', '", "'")}"
)
}
} else {
in.rollbackToken()
nullValue
}
}
}

implicit val codecNativeLinkerReleaseMode
: JsonValueCodec[Config.NativeLinkerReleaseMode] = {
new JsonValueCodec[Config.NativeLinkerReleaseMode] {
val nullValue: Config.NativeLinkerReleaseMode =
null.asInstanceOf[Config.NativeLinkerReleaseMode]
def encodeValue(
x: Config.NativeLinkerReleaseMode,
out: JsonWriter
): Unit = {
val str = x match {
case Config.NativeLinkerReleaseMode.ReleaseFast =>
Config.NativeLinkerReleaseMode.ReleaseFast.id
case Config.NativeLinkerReleaseMode.ReleaseSize =>
Config.NativeLinkerReleaseMode.ReleaseSize.id
case Config.NativeLinkerReleaseMode.ReleaseFull =>
Config.NativeLinkerReleaseMode.ReleaseFull.id
}
out.writeVal(str)
}
def decodeValue(
in: JsonReader,
default: Config.NativeLinkerReleaseMode
): Config.NativeLinkerReleaseMode =
if (in.isNextToken('"')) {
in.rollbackToken()
in.readString(null) match {
case Config.NativeLinkerReleaseMode.ReleaseFast.id =>
Config.NativeLinkerReleaseMode.ReleaseFast
case Config.NativeLinkerReleaseMode.ReleaseSize.id =>
Config.NativeLinkerReleaseMode.ReleaseSize
case Config.NativeLinkerReleaseMode.ReleaseFull.id =>
Config.NativeLinkerReleaseMode.ReleaseFull
case _ =>
in.decodeError(
s"Expected build target ${Config.NativeLinkerReleaseMode.All.mkString("'", "', '", "'")}"
)
}
} else {
in.rollbackToken()
nullValue
}
}
}

implicit val codecNativeSanitizer: JsonValueCodec[Config.NativeSanitizer] = {
new JsonValueCodec[Config.NativeSanitizer] {
val nullValue: Config.NativeSanitizer =
null.asInstanceOf[Config.NativeSanitizer]
def encodeValue(x: Config.NativeSanitizer, out: JsonWriter): Unit = {
val str = x match {
case Config.NativeSanitizer.AddressSanitizer =>
Config.NativeSanitizer.AddressSanitizer.id
case Config.NativeSanitizer.ThreadSanitizer =>
Config.NativeSanitizer.ThreadSanitizer.id
case Config.NativeSanitizer.UndefinedBehaviourSanitizer =>
Config.NativeSanitizer.UndefinedBehaviourSanitizer.id
}
out.writeVal(str)
}
def decodeValue(
in: JsonReader,
default: Config.NativeSanitizer
): Config.NativeSanitizer =
if (in.isNextToken('"')) {
in.rollbackToken()
in.readString(null) match {
case Config.NativeSanitizer.AddressSanitizer.id =>
Config.NativeSanitizer.AddressSanitizer
case Config.NativeSanitizer.ThreadSanitizer.id =>
Config.NativeSanitizer.ThreadSanitizer
case Config.NativeSanitizer.UndefinedBehaviourSanitizer.id =>
Config.NativeSanitizer.UndefinedBehaviourSanitizer
case _ =>
in.decodeError(
s"Expected build target ${Config.NativeSanitizer.All.mkString("'", "', '", "'")}"
)
}
} else {
in.rollbackToken()
nullValue
}
}
}

implicit val codecNativBuildTarget
: JsonValueCodec[Config.NativeBuildTarget] = {
new JsonValueCodec[Config.NativeBuildTarget] {
Expand Down Expand Up @@ -250,9 +374,27 @@ object ConfigCodecs {
implicit val codecJsConfig: JsonValueCodec[Config.JsConfig] =
JsonCodecMaker.makeWithRequiredCollectionFields[Config.JsConfig]

implicit val codecNativeOptimizerConfig
: JsonValueCodec[Config.NativeOptimizerConfig] =
JsonCodecMaker
.makeWithRequiredCollectionFields[Config.NativeOptimizerConfig]

implicit val codecNativeConfig: JsonValueCodec[Config.NativeConfig] =
JsonCodecMaker.makeWithRequiredCollectionFields[Config.NativeConfig]

implicit val codecNativeResourcePatterns
: JsonValueCodec[Config.NativeResourcePatterns] =
JsonCodecMaker
.makeWithRequiredCollectionFields[Config.NativeResourcePatterns]

implicit val codecNativeFlags: JsonValueCodec[Config.NativeFlags] =
JsonCodecMaker
.makeWithRequiredCollectionFields[Config.NativeFlags]

implicit val codecNativeModeAndLTO: JsonValueCodec[Config.NativeModeAndLTO] =
JsonCodecMaker
.makeWithRequiredCollectionFields[Config.NativeModeAndLTO]

private case class MainClass(mainClass: Option[String])
private implicit val codecMainClass: JsonValueCodec[MainClass] = {
new JsonValueCodec[MainClass] {
Expand Down
Loading