mirror of https://github.com/sbt/sbt.git
run task convenience constructors, (re)source generator hooks
This commit is contained in:
parent
7837e1a37b
commit
ca405e9783
|
|
@ -22,10 +22,9 @@ package sbt
|
||||||
|
|
||||||
import Types._
|
import Types._
|
||||||
import Path._
|
import Path._
|
||||||
import GlobFilter._
|
|
||||||
import Keys._
|
import Keys._
|
||||||
|
|
||||||
object Defaults
|
object Defaults extends BuildCommon
|
||||||
{
|
{
|
||||||
def configSrcSub(key: ScopedSetting[File]): Initialize[File] = (key, configuration) { (src, conf) => src / nameForSrc(conf.name) }
|
def configSrcSub(key: ScopedSetting[File]): Initialize[File] = (key, configuration) { (src, conf) => src / nameForSrc(conf.name) }
|
||||||
def nameForSrc(config: String) = if(config == "compile") "main" else config
|
def nameForSrc(config: String) = if(config == "compile") "main" else config
|
||||||
|
|
@ -58,6 +57,8 @@ object Defaults
|
||||||
fork :== false,
|
fork :== false,
|
||||||
javaOptions :== Nil,
|
javaOptions :== Nil,
|
||||||
sbtPlugin :== false,
|
sbtPlugin :== false,
|
||||||
|
sourceGenerators :== Nil,
|
||||||
|
resourceGenerators :== Nil,
|
||||||
crossPaths :== true,
|
crossPaths :== true,
|
||||||
classpathTypes := Set("jar", "bundle"),
|
classpathTypes := Set("jar", "bundle"),
|
||||||
aggregate :== Aggregation.Enabled,
|
aggregate :== Aggregation.Enabled,
|
||||||
|
|
@ -100,8 +101,9 @@ object Defaults
|
||||||
javaSource <<= sourceDirectory / "java",
|
javaSource <<= sourceDirectory / "java",
|
||||||
unmanagedSourceDirectories <<= Seq(scalaSource, javaSource).join,
|
unmanagedSourceDirectories <<= Seq(scalaSource, javaSource).join,
|
||||||
unmanagedSources <<= collectFiles(unmanagedSourceDirectories, sourceFilter, defaultExcludes in unmanagedSources),
|
unmanagedSources <<= collectFiles(unmanagedSourceDirectories, sourceFilter, defaultExcludes in unmanagedSources),
|
||||||
managedSourceDirectories :== Nil,
|
managedSourceDirectories <<= Seq(sourceManaged).join,
|
||||||
managedSources <<= collectFiles(managedSourceDirectories, sourceFilter, defaultExcludes in managedSources),
|
managedSources <<= generate(sourceGenerators),
|
||||||
|
sourceDirectories <<= Classpaths.concatSettings(unmanagedSourceDirectories, managedSourceDirectories),
|
||||||
sources <<= Classpaths.concat(unmanagedSources, managedSources)
|
sources <<= Classpaths.concat(unmanagedSources, managedSources)
|
||||||
)
|
)
|
||||||
lazy val resourceConfigPaths = Seq(
|
lazy val resourceConfigPaths = Seq(
|
||||||
|
|
@ -111,7 +113,8 @@ object Defaults
|
||||||
managedResourceDirectories <<= Seq(resourceManaged).join,
|
managedResourceDirectories <<= Seq(resourceManaged).join,
|
||||||
resourceDirectories <<= Classpaths.concatSettings(unmanagedResourceDirectories, managedResourceDirectories),
|
resourceDirectories <<= Classpaths.concatSettings(unmanagedResourceDirectories, managedResourceDirectories),
|
||||||
unmanagedResources <<= (unmanagedResourceDirectories, defaultExcludes in unmanagedResources) map unmanagedResourcesTask,
|
unmanagedResources <<= (unmanagedResourceDirectories, defaultExcludes in unmanagedResources) map unmanagedResourcesTask,
|
||||||
managedResources <<= (definedSbtPlugins, resourceManaged) map writePluginsDescriptor,
|
resourceGenerators <+= (definedSbtPlugins, resourceManaged) map writePluginsDescriptor,
|
||||||
|
managedResources <<= generate(resourceGenerators),
|
||||||
resources <<= Classpaths.concat(managedResources, unmanagedResources)
|
resources <<= Classpaths.concat(managedResources, unmanagedResources)
|
||||||
)
|
)
|
||||||
lazy val outputConfigPaths = Seq(
|
lazy val outputConfigPaths = Seq(
|
||||||
|
|
@ -124,7 +127,7 @@ object Defaults
|
||||||
(srcs,b,f,excl) => (srcs +++ b * (f -- excl)).getFiles
|
(srcs,b,f,excl) => (srcs +++ b * (f -- excl)).getFiles
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
def compileBase = Seq(
|
def compileBase = Seq(
|
||||||
classpathOptions in GlobalScope :== ClasspathOptions.auto,
|
classpathOptions in GlobalScope :== ClasspathOptions.auto,
|
||||||
compileOrder in GlobalScope :== CompileOrder.Mixed,
|
compileOrder in GlobalScope :== CompileOrder.Mixed,
|
||||||
|
|
@ -167,6 +170,8 @@ object Defaults
|
||||||
watch <<= watchSetting
|
watch <<= watchSetting
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def generate(generators: ScopedSetting[Seq[Task[Seq[File]]]]): Initialize[Task[Seq[File]]] = generators {_.join.map(_.flatten) }
|
||||||
|
|
||||||
def inAllConfigurations[T](key: ScopedTask[T]): Initialize[Task[Seq[T]]] = (state, thisProjectRef) flatMap { (state, ref) =>
|
def inAllConfigurations[T](key: ScopedTask[T]): Initialize[Task[Seq[T]]] = (state, thisProjectRef) flatMap { (state, ref) =>
|
||||||
val structure = Project structure state
|
val structure = Project structure state
|
||||||
val configurations = Project.getProject(ref, structure).toList.flatMap(_.configurations)
|
val configurations = Project.getProject(ref, structure).toList.flatMap(_.configurations)
|
||||||
|
|
@ -335,15 +340,16 @@ object Defaults
|
||||||
import DefaultParsers._
|
import DefaultParsers._
|
||||||
InputTask( TaskData(discoveredMainClasses)(runMainParser)(Nil) ) { result =>
|
InputTask( TaskData(discoveredMainClasses)(runMainParser)(Nil) ) { result =>
|
||||||
(classpath, scalaRun, streams, result) map { case (cp, runner, s, (mainClass, args)) =>
|
(classpath, scalaRun, streams, result) map { case (cp, runner, s, (mainClass, args)) =>
|
||||||
runner.run(mainClass, data(cp), args, s.log) foreach error
|
toError(runner.run(mainClass, data(cp), args, s.log))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def runTask(classpath: ScopedTask[Classpath], mainClassTask: ScopedTask[Option[String]], scalaRun: ScopedSetting[ScalaRun]): Initialize[InputTask[Unit]] =
|
def runTask(classpath: ScopedTask[Classpath], mainClassTask: ScopedTask[Option[String]], scalaRun: ScopedSetting[ScalaRun]): Initialize[InputTask[Unit]] =
|
||||||
InputTask(_ => complete.Parsers.spaceDelimited("<arg>")) { result =>
|
inputTask { result =>
|
||||||
(classpath, mainClassTask, scalaRun, streams, result) map { (cp, main, runner, s, args) =>
|
(classpath, mainClassTask, scalaRun, streams, result) map { (cp, main, runner, s, args) =>
|
||||||
val mainClass = main getOrElse error("No main class detected.")
|
val mainClass = main getOrElse error("No main class detected.")
|
||||||
runner.run(mainClass, data(cp), args, s.log) foreach error
|
toError(runner.run(mainClass, data(cp), args, s.log))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -476,7 +482,6 @@ object Defaults
|
||||||
object Classpaths
|
object Classpaths
|
||||||
{
|
{
|
||||||
import Path._
|
import Path._
|
||||||
import GlobFilter._
|
|
||||||
import Keys._
|
import Keys._
|
||||||
import Scope.ThisScope
|
import Scope.ThisScope
|
||||||
import Defaults._
|
import Defaults._
|
||||||
|
|
@ -811,13 +816,13 @@ object Classpaths
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// support earlier launchers
|
// try/catch for supporting earlier launchers
|
||||||
def bootIvyHome(app: xsbti.AppConfiguration): Option[File] =
|
def bootIvyHome(app: xsbti.AppConfiguration): Option[File] =
|
||||||
try { Option(app.provider.scalaProvider.launcher.ivyHome) }
|
try { Option(app.provider.scalaProvider.launcher.ivyHome) }
|
||||||
catch { case _: NoSuchMethodError => None }
|
catch { case _: NoSuchMethodError => None }
|
||||||
}
|
}
|
||||||
|
|
||||||
trait BuildExtra
|
trait BuildExtra extends BuildCommon
|
||||||
{
|
{
|
||||||
import Defaults._
|
import Defaults._
|
||||||
|
|
||||||
|
|
@ -839,13 +844,6 @@ trait BuildExtra
|
||||||
seq( art, pkgd )
|
seq( art, pkgd )
|
||||||
}
|
}
|
||||||
|
|
||||||
implicit def globFilter(expression: String): NameFilter = GlobFilter(expression)
|
|
||||||
implicit def richAttributed(s: Seq[Attributed[File]]): RichAttributed = new RichAttributed(s)
|
|
||||||
final class RichAttributed private[sbt](s: Seq[Attributed[File]])
|
|
||||||
{
|
|
||||||
def files: Seq[File] = Build data s
|
|
||||||
}
|
|
||||||
|
|
||||||
def seq(settings: Setting[_]*): SettingsDefinition = new Project.SettingList(settings)
|
def seq(settings: Setting[_]*): SettingsDefinition = new Project.SettingList(settings)
|
||||||
implicit def settingsDefinitionToSeq(sd: SettingsDefinition): Seq[Setting[_]] = sd.settings
|
implicit def settingsDefinitionToSeq(sd: SettingsDefinition): Seq[Setting[_]] = sd.settings
|
||||||
|
|
||||||
|
|
@ -863,4 +861,27 @@ trait BuildExtra
|
||||||
|
|
||||||
private[this] def external(file: Initialize[File], iScala: Initialize[Option[IvyScala]])(make: (File, Option[IvyScala], Boolean) => ModuleSettings): Setting[Task[ModuleSettings]] =
|
private[this] def external(file: Initialize[File], iScala: Initialize[Option[IvyScala]])(make: (File, Option[IvyScala], Boolean) => ModuleSettings): Setting[Task[ModuleSettings]] =
|
||||||
moduleSettings <<= ((file zip iScala) zipWith ivyValidate.identity) { case ((f, is), v) => task { make(f, is, v) } }
|
moduleSettings <<= ((file zip iScala) zipWith ivyValidate.identity) { case ((f, is), v) => task { make(f, is, v) } }
|
||||||
|
|
||||||
|
def runInputTask(config: Configuration, mainClass: String, baseArguments: String*): Initialize[InputTask[Unit]] =
|
||||||
|
inputTask { result =>
|
||||||
|
(fullClasspath in config, runner in (config, run), streams, result) map { (cp, r, s, args) =>
|
||||||
|
toError(r.run(mainClass, data(cp), baseArguments ++ args, s.log))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
def runTask(config: Configuration, mainClass: String, arguments: String*): Initialize[Task[Unit]] =
|
||||||
|
(fullClasspath in config, runner in (config, run), streams) map { (cp, r, s) =>
|
||||||
|
toError(r.run(mainClass, data(cp), arguments, s.log))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
trait BuildCommon
|
||||||
|
{
|
||||||
|
def inputTask[T](f: TaskKey[Seq[String]] => Initialize[Task[T]]): Initialize[InputTask[T]] = InputTask(_ => complete.Parsers.spaceDelimited("<arg>"))(f)
|
||||||
|
|
||||||
|
implicit def globFilter(expression: String): NameFilter = GlobFilter(expression)
|
||||||
|
implicit def richAttributed(s: Seq[Attributed[File]]): RichAttributed = new RichAttributed(s)
|
||||||
|
final class RichAttributed private[sbt](s: Seq[Attributed[File]])
|
||||||
|
{
|
||||||
|
def files: Seq[File] = Build data s
|
||||||
|
}
|
||||||
|
def toError(o: Option[String]): Unit = o foreach error
|
||||||
}
|
}
|
||||||
|
|
@ -92,6 +92,10 @@ object Keys
|
||||||
val cleanKeepFiles = SettingKey[Seq[File]]("clean-keep-files", "Files to keep during a clean.")
|
val cleanKeepFiles = SettingKey[Seq[File]]("clean-keep-files", "Files to keep during a clean.")
|
||||||
val crossPaths = SettingKey[Boolean]("cross-paths", "If true, enables cross paths, which distinguish output directories for cross-building.")
|
val crossPaths = SettingKey[Boolean]("cross-paths", "If true, enables cross paths, which distinguish output directories for cross-building.")
|
||||||
|
|
||||||
|
// Generators
|
||||||
|
val sourceGenerators = SettingKey[Seq[Task[Seq[File]]]]("source-generators", "List of tasks that generate sources.")
|
||||||
|
val resourceGenerators = SettingKey[Seq[Task[Seq[File]]]]("resource-generators", "List of tasks that generate resources.")
|
||||||
|
|
||||||
// compile/doc keys
|
// compile/doc keys
|
||||||
val autoCompilerPlugins = SettingKey[Boolean]("auto-compiler-plugins", "If true, enables automatically generating -Xplugin arguments to the compiler based on the classpath for the " + CompilerPlugin.name + " configuration.")
|
val autoCompilerPlugins = SettingKey[Boolean]("auto-compiler-plugins", "If true, enables automatically generating -Xplugin arguments to the compiler based on the classpath for the " + CompilerPlugin.name + " configuration.")
|
||||||
val maxErrors = SettingKey[Int]("max-errors", "The maximum number of errors, such as compile errors, to list.")
|
val maxErrors = SettingKey[Int]("max-errors", "The maximum number of errors, such as compile errors, to list.")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue