You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

180 lines
5.5 KiB

  1. /* Note: This file is shared among many projects. Avoid putting project-specific things here. */
  2. import sbt._
  3. import sbt.Keys._
  4. import Helpers._
  5. object BasicSettings extends AutoPlugin with BasicSettings {
  6. override def projectSettings = basicSettings
  7. }
  8. trait BasicSettings extends ProjectSettings { st: SettingTemplate =>
  9. /* Overridable flags */
  10. lazy val optimize = boolFlag("OPTIMIZE") orElse boolFlag("OPTIMISE") getOrElse defaultOptimize
  11. lazy val optimizeGlobal = boolFlag("OPTIMIZE_GLOBAL") getOrElse defaultOptimizeGlobal
  12. lazy val optimizeWarn = boolFlag("OPTIMIZE_WARNINGS") getOrElse false
  13. lazy val disableAsserts = boolFlag("DISABLE_ASSERTIONS") getOrElse defaultDisableAssertions
  14. lazy val noFatalWarn = boolFlag("NO_FATAL_WARNINGS") getOrElse false
  15. lazy val deprecation = boolFlag("NO_DEPRECATION") map (!_) getOrElse true
  16. lazy val inlineWarn = boolFlag("INLINE_WARNINGS") getOrElse defaultWarnInline
  17. lazy val debug = boolFlag("DEBUGGER") getOrElse false
  18. lazy val debugPort = intFlag("DEBUGGER_PORT", 5050)
  19. lazy val debugSuspend = boolFlag("DEBUGGER_SUSPEND") getOrElse true
  20. lazy val unusedWarn = boolFlag("UNUSED_WARNINGS") getOrElse defaultWarnUnused
  21. lazy val importWarn = boolFlag("IMPORT_WARNINGS") getOrElse defaultWarnImport
  22. lazy val findbugsHtml = boolFlag("FINDBUGS_HTML") getOrElse !isJenkins
  23. lazy val newBackend = boolFlag("NEW_BCODE_BACKEND") getOrElse defaultNewBackend
  24. lazy val noBuildDocs = boolFlag("NO_SBT_DOCS").getOrElse(false) && !isJenkins
  25. lazy val basicSettings = new Def.SettingList(
  26. buildMetadata ++
  27. Seq (
  28. organization := buildOrganization,
  29. organizationName := buildOrganizationName,
  30. organizationHomepage := buildOrganizationUrl.orElse(if (githubOrgPageFallback) Some(githubOrgPage) else None),
  31. scalaVersion := buildScalaVersion,
  32. crossScalaVersions := buildScalaVersions,
  33. autoAPIMappings := true,
  34. updateOptions := updateOptions.value.withCachedResolution(cachedResolution),
  35. parallelExecution := parallelBuild,
  36. evictionWarningOptions in update :=
  37. EvictionWarningOptions.default.withWarnTransitiveEvictions(false).withWarnDirectEvictions(false).withWarnScalaVersionEviction(false)
  38. ) ++ (
  39. if (noBuildDocs) {
  40. Seq(sources in (Compile, doc) := Seq.empty)
  41. } else {
  42. Seq.empty
  43. }
  44. ) ++ (
  45. if (autoAddCompileOptions) {
  46. addScalacOptions() ++ addJavacOptions()
  47. } else {
  48. Seq.empty
  49. }
  50. ) ++ (
  51. if (sonatypeResolver) {
  52. /* Many OSS projects push here and then appear in Maven Central later */
  53. Seq(resolvers += Resolver.sonatypeRepo("releases"))
  54. } else {
  55. Seq.empty
  56. }
  57. )
  58. )
  59. lazy val buildScalaVersions = buildScalaVersion +: extraScalaVersions
  60. def basicScalacOptions = Def.derive {
  61. scalacOptions ++= {
  62. var options = Seq.empty[String]
  63. val sv = sver.value
  64. options :+= "-Xlint"
  65. options :+= "-Xfatal-warnings"
  66. options :+= "-unchecked"
  67. options :+= "-feature"
  68. if (deprecation) {
  69. options :+= "-deprecation"
  70. }
  71. if (unusedWarn) {
  72. options :+= "-Ywarn-unused"
  73. }
  74. if (importWarn) {
  75. options :+= "-Ywarn-unused-import"
  76. }
  77. if (!sv.requireJava8) {
  78. options :+= "-target:jvm-" + minimumJavaVersion
  79. }
  80. if (sv.backend == SupportsNewBackend && newBackend) {
  81. options :+= "-Ybackend:GenBCode"
  82. }
  83. if (disableAsserts) {
  84. options :+= "-Xdisable-assertions"
  85. }
  86. options
  87. }
  88. }
  89. def optimizationScalacOptions(optim: Boolean = optimize) = Def.derive {
  90. scalacOptions ++= {
  91. var options = Seq.empty[String]
  92. val sv = sver.value
  93. val fos = forceOldInlineSyntax.value
  94. if (optim) {
  95. def doNewWarn(): Unit = {
  96. if (optimizeWarn) {
  97. options :+= "-opt-warnings:_"
  98. }
  99. }
  100. if (sv.backend == NewBackend && !fos) {
  101. options :+= "-opt:l:inline"
  102. val inlineFrom = {
  103. var patterns = Seq.empty[String]
  104. if (optimizeGlobal) {
  105. patterns :+= "**"
  106. } else {
  107. patterns :+= "<sources>"
  108. }
  109. patterns ++= inlinePatterns
  110. patterns
  111. }
  112. options :+= inlineFrom.mkString("-opt-inline-from:", ":", "")
  113. doNewWarn()
  114. } else if (sv.backend == NewBackend && fos || sv.backend == SupportsNewBackend && newBackend) {
  115. if (optimizeGlobal) {
  116. options :+= "-opt:l:classpath"
  117. } else {
  118. options :+= "-opt:l:project"
  119. }
  120. doNewWarn()
  121. } else {
  122. options :+= "-optimize"
  123. if (optimizeWarn) {
  124. options :+= "-Yinline-warnings"
  125. }
  126. }
  127. }
  128. options
  129. }
  130. }
  131. def addScalacOptions(optim: Boolean = optimize) = new Def.SettingList(Seq(
  132. basicScalacOptions,
  133. optimizationScalacOptions(optim),
  134. scalacOptions ++= extraScalacOptions
  135. ))
  136. def addJavacOptions() = Def.derive {
  137. javacOptions ++= {
  138. val sv = SVer(scalaBinaryVersion.value)
  139. var options = Seq.empty[String]
  140. if (sv.requireJava8) {
  141. options ++= Seq[String](
  142. "-target", "11",
  143. "-source", "11"
  144. )
  145. } else {
  146. options ++= Seq[String](
  147. "-target", minimumJavaVersion,
  148. "-source", minimumJavaVersion
  149. )
  150. }
  151. options
  152. }
  153. }
  154. private[this] lazy val githubOrgPage = url(s"https://github.com/${githubOrganization}")
  155. }