Merge pull request #1799 from indrajitr/cross-source

Enable cross-version support for Scala sources.
This commit is contained in:
eugene yokota 2015-02-02 13:09:54 -05:00
commit 1a3062ed10
6 changed files with 38 additions and 5 deletions

View File

@ -181,7 +181,7 @@ object Defaults extends BuildCommon {
sourceManaged <<= configSrcSub(sourceManaged), sourceManaged <<= configSrcSub(sourceManaged),
scalaSource := sourceDirectory.value / "scala", scalaSource := sourceDirectory.value / "scala",
javaSource := sourceDirectory.value / "java", javaSource := sourceDirectory.value / "java",
unmanagedSourceDirectories := Seq(scalaSource.value, javaSource.value), unmanagedSourceDirectories := makeCrossSources(scalaSource.value, javaSource.value, scalaBinaryVersion.value, crossPaths.value),
unmanagedSources <<= collectFiles(unmanagedSourceDirectories, includeFilter in unmanagedSources, excludeFilter in unmanagedSources), unmanagedSources <<= collectFiles(unmanagedSourceDirectories, includeFilter in unmanagedSources, excludeFilter in unmanagedSources),
watchSources in ConfigGlobal <++= unmanagedSources, watchSources in ConfigGlobal <++= unmanagedSources,
managedSourceDirectories := Seq(sourceManaged.value), managedSourceDirectories := Seq(sourceManaged.value),
@ -241,6 +241,14 @@ object Defaults extends BuildCommon {
derive(compilersSetting), derive(compilersSetting),
derive(scalaBinaryVersion := binaryScalaVersion(scalaVersion.value)) derive(scalaBinaryVersion := binaryScalaVersion(scalaVersion.value))
)) ))
def makeCrossSources(scalaSrcDir: File, javaSrcDir: File, sv: String, cross: Boolean): Seq[File] = {
if (cross)
Seq(scalaSrcDir.getParentFile / s"${scalaSrcDir.name}-$sv", scalaSrcDir, javaSrcDir)
else
Seq(scalaSrcDir, javaSrcDir)
}
def makeCrossTarget(t: File, sv: String, sbtv: String, plugin: Boolean, cross: Boolean): File = def makeCrossTarget(t: File, sv: String, sbtv: String, plugin: Boolean, cross: Boolean): File =
{ {
val scalaBase = if (cross) t / ("scala-" + sv) else t val scalaBase = if (cross) t / ("scala-" + sv) else t
@ -948,7 +956,7 @@ object Defaults extends BuildCommon {
@deprecated("Settings now split into AutoPlugins.", "0.13.2") @deprecated("Settings now split into AutoPlugins.", "0.13.2")
lazy val projectBaseSettings: Seq[Setting[_]] = projectCore ++ runnerSettings ++ paths ++ baseClasspaths ++ baseTasks ++ compileBase ++ disableAggregation lazy val projectBaseSettings: Seq[Setting[_]] = projectCore ++ runnerSettings ++ paths ++ baseClasspaths ++ baseTasks ++ compileBase ++ disableAggregation
// These are project level settings that MUST be on every project. // These are project level settings that MUST be on every project.
lazy val coreDefaultSettings: Seq[Setting[_]] = lazy val coreDefaultSettings: Seq[Setting[_]] =
projectCore ++ disableAggregation ++ Seq( projectCore ++ disableAggregation ++ Seq(
// Missing but core settings // Missing but core settings
@ -1111,8 +1119,8 @@ object Classpaths {
projectResolver <<= projectResolverTask, projectResolver <<= projectResolverTask,
projectDependencies <<= projectDependenciesTask, projectDependencies <<= projectDependenciesTask,
// TODO - Is this the appropriate split? Ivy defines this simply as // TODO - Is this the appropriate split? Ivy defines this simply as
// just project + library, while the JVM plugin will define it as // just project + library, while the JVM plugin will define it as
// having the additional sbtPlugin + autoScala magikz. // having the additional sbtPlugin + autoScala magikz.
allDependencies := { allDependencies := {
projectDependencies.value ++ libraryDependencies.value projectDependencies.value ++ libraryDependencies.value
}, },

View File

@ -106,7 +106,7 @@ object Keys {
val cacheDirectory = SettingKey[File]("cache-directory", "Directory used for caching task data.", BMinusSetting) val cacheDirectory = SettingKey[File]("cache-directory", "Directory used for caching task data.", BMinusSetting)
val cleanFiles = SettingKey[Seq[File]]("clean-files", "The files to recursively delete during a clean.", BSetting) val cleanFiles = SettingKey[Seq[File]]("clean-files", "The files to recursively delete during a clean.", BSetting)
val cleanKeepFiles = SettingKey[Seq[File]]("clean-keep-files", "Files to keep during a clean.", CSetting) val cleanKeepFiles = SettingKey[Seq[File]]("clean-keep-files", "Files to keep during a clean.", CSetting)
val crossPaths = SettingKey[Boolean]("cross-paths", "If true, enables cross paths, which distinguish output directories for cross-building.", ASetting) val crossPaths = SettingKey[Boolean]("cross-paths", "If true, enables cross paths, which distinguish input and output directories for cross-building.", ASetting)
val taskTemporaryDirectory = SettingKey[File]("task-temporary-directory", "Directory used for temporary files for tasks that is deleted after each task execution.", DSetting) val taskTemporaryDirectory = SettingKey[File]("task-temporary-directory", "Directory used for temporary files for tasks that is deleted after each task execution.", DSetting)
// Generators // Generators

View File

@ -0,0 +1,3 @@
object B {
def show(what: String): String = s"String interpolation is ${what.toUpperCase}!"
}

View File

@ -0,0 +1,3 @@
object B {
def show(what: String): String = "String interpolation is " + what.toUpperCase
}

View File

@ -0,0 +1,3 @@
class A {
def show(what: String): String = B.show(what)
}

View File

@ -0,0 +1,16 @@
# A.scala needs B.scala, it won't be in source list
> ++2.11.4
-> compile
# A.scala needs B.scala, it would be in source list
> ++2.10.4
> compile
# A.scala needs B.scala, it would be in source list
> ++2.9.3
> compile
# Injecting the wrong B.scala in source list
$ copy-file src/main/scala-2.10/B.scala src/main/scala-2.9.3/B.scala
> ++2.9.3
-> compile