diff --git a/src/main/scala/com/github/pjfanning/pekkobuild/PekkoCorePlugin.scala b/src/main/scala/com/github/pjfanning/pekkobuild/PekkoCorePlugin.scala new file mode 100644 index 0000000..ed48ed1 --- /dev/null +++ b/src/main/scala/com/github/pjfanning/pekkobuild/PekkoCorePlugin.scala @@ -0,0 +1,17 @@ +package com.github.pjfanning.pekkobuild + +import sbt._ + +object PekkoCorePlugin extends AutoPlugin { + + override def trigger: PluginTrigger = allRequirements + + object autoImport extends PekkoCoreSettings + + import autoImport._ + + override lazy val globalSettings = Seq( + pekkoCoreProject := false + ) + +} diff --git a/src/main/scala/com/github/pjfanning/pekkobuild/PekkoCoreSettings.scala b/src/main/scala/com/github/pjfanning/pekkobuild/PekkoCoreSettings.scala new file mode 100644 index 0000000..a322d19 --- /dev/null +++ b/src/main/scala/com/github/pjfanning/pekkobuild/PekkoCoreSettings.scala @@ -0,0 +1,8 @@ +package com.github.pjfanning.pekkobuild + +import sbt._ + +trait PekkoCoreSettings { + lazy val pekkoCoreProject: SettingKey[Boolean] = settingKey("Whether this is the core Pekko project or a Pekko" + + " module. Defaults to false") +} diff --git a/src/main/scala/com/github/pjfanning/pekkobuild/PekkoInlinePlugin.scala b/src/main/scala/com/github/pjfanning/pekkobuild/PekkoInlinePlugin.scala new file mode 100644 index 0000000..f4ccc2d --- /dev/null +++ b/src/main/scala/com/github/pjfanning/pekkobuild/PekkoInlinePlugin.scala @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * license agreements; and to You under the Apache License, version 2.0: + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * This file is part of the Apache Pekko project, derived from Akka. + */ + +package com.github.pjfanning.pekkobuild + +import com.github.pjfanning.pekkobuild.PekkoCorePlugin.autoImport.pekkoCoreProject +import sbt.plugins.JvmPlugin +import sbt._ +import sbt.Keys._ + +object PekkoInlinePlugin extends AutoPlugin { + override def trigger: PluginTrigger = allRequirements + + override def requires: Plugins = JvmPlugin && PekkoCorePlugin + + object autoImport extends PekkoInlineSettings + + import autoImport._ + + private def flagsForScala2(coreProject: Boolean) = { + val baseInlineFlags = Seq( + "-opt-inline-from:<sources>", + "-opt:l:inline" + ) + + if (coreProject) + baseInlineFlags ++ Seq( + // Since the Pekko core project doesn't allow for mixing of different versions, + // i.e. you cannot mix pekko-actor 1.0.0 with pekko-streams 1.0.1 at runtime + // its safe to do inter sbt project inlining. + "-opt-inline-from:org.apache.pekko.**" + ) + else baseInlineFlags ++ Seq( + // These are safe to inline even across modules since they are + // wrappers for cross compilation that is stable within Pekko core. + "-opt-inline-from:org.apache.pekko.dispatch.internal.SameThreadExecutionContext**", + "-opt-inline-from:org.apache.pekko.util.OptionConverters**", + "-opt-inline-from:org.apache.pekko.util.FutureConverters**", + "-opt-inline-from:org.apache.pekko.util.FunctionConverters**", + "-opt-inline-from:org.apache.pekko.util.PartialFunction**", + "-opt-inline-from:org.apache.pekko.util.JavaDurationConverters**" + ) + } + + // Optimizer not yet available for Scala3, see https://docs.scala-lang.org/overviews/compiler-options/optimizer.html + private val flagsForScala3 = Seq() + + override lazy val globalSettings = Seq( + pekkoInlineEnabled := !sys.props.contains("pekko.no.inline") + ) + + override lazy val projectSettings = Seq(Compile / scalacOptions ++= { + if (pekkoInlineEnabled.value) { + CrossVersion.partialVersion(scalaVersion.value) match { + case Some((2, n)) if n == 12 | n == 13 => + flagsForScala2(pekkoCoreProject.value) + case Some((3, _)) => + flagsForScala3 + } + } else Seq.empty + }) +} diff --git a/src/main/scala/com/github/pjfanning/pekkobuild/PekkoInlineSettings.scala b/src/main/scala/com/github/pjfanning/pekkobuild/PekkoInlineSettings.scala new file mode 100644 index 0000000..675f19a --- /dev/null +++ b/src/main/scala/com/github/pjfanning/pekkobuild/PekkoInlineSettings.scala @@ -0,0 +1,8 @@ +package com.github.pjfanning.pekkobuild + +import sbt.{SettingKey, settingKey} + +trait PekkoInlineSettings { + lazy val pekkoInlineEnabled: SettingKey[Boolean] = settingKey("Whether to enable the Scala 2 inliner for Pekko modules." + + "Defaults to pekko.no.inline property") +}