From d915335f32f89a18cec097159f39334fe2bcde0d Mon Sep 17 00:00:00 2001 From: Christopher Vogt Date: Thu, 7 Apr 2016 01:50:26 -0400 Subject: cross building and automatic snaphot ids Adds support for cross building for multiple scala versions And for automatically appending -SNAPSHOT to the id, when publishing a snapshot. --- stage2/BasicBuild.scala | 5 ++++- stage2/Lib.scala | 16 +++++++++++----- stage2/PackageBuild.scala | 8 +++++--- stage2/PublishBuild.scala | 7 ++++++- stage2/Stage2.scala | 19 ++++++++++++++++--- stage2/mixins.scala | 2 +- 6 files changed, 43 insertions(+), 14 deletions(-) (limited to 'stage2') diff --git a/stage2/BasicBuild.scala b/stage2/BasicBuild.scala index 2b49c93..9f9dbdc 100644 --- a/stage2/BasicBuild.scala +++ b/stage2/BasicBuild.scala @@ -29,8 +29,11 @@ class Build(val context: Context) extends Dependency with TriggerLoop with SbtDe // ========== meta data ========== - def scalaVersion: String = constants.scalaVersion + def defaultScalaVersion: String = constants.scalaVersion + final def scalaVersion = context.scalaVersion getOrElse defaultScalaVersion final def scalaMajorVersion: String = lib.scalaMajorVersion(scalaVersion) + def crossScalaVersions: Seq[String] = Seq(scalaVersion, "2.10.6") + def copy(context: Context) = lib.copy(this.getClass, context).asInstanceOf[Build] def zincVersion = "0.3.9" def dependencies: Seq[Dependency] = Seq( diff --git a/stage2/Lib.scala b/stage2/Lib.scala index dbd6108..cebdb92 100644 --- a/stage2/Lib.scala +++ b/stage2/Lib.scala @@ -24,6 +24,11 @@ final class Lib(logger: Logger) extends Stage1Lib(logger) with Scaffold{ val buildClassName = "Build" val buildBuildClassName = "BuildBuild" + def copy(cls: Class[_], context: Context) = + cls + .getConstructor(classOf[Context]) + .newInstance(context) + /** Loads Build for given Context */ def loadDynamic(context: Context, default: Context => Build = new Build(_)): Build = { context.logger.composition( context.logger.showInvocation("Build.loadDynamic",context) ) @@ -53,16 +58,16 @@ final class Lib(logger: Logger) extends Stage1Lib(logger) with Scaffold{ } } - def srcJar(sourceFiles: Seq[File], artifactId: String, version: String, jarTarget: File): Option[File] = { + def srcJar(sourceFiles: Seq[File], artifactId: String, scalaMajorVersion: String, version: String, jarTarget: File): Option[File] = { lib.jarFile( - jarTarget ++ ("/"++artifactId++"-"++version++"-sources.jar"), + jarTarget ++ ("/"++artifactId++"_"++scalaMajorVersion++"-"++version++"-sources.jar"), sourceFiles ) } - def jar(artifactId: String, version: String, compileTarget: File, jarTarget: File): Option[File] = { + def jar(artifactId: String, scalaMajorVersion: String, version: String, compileTarget: File, jarTarget: File): Option[File] = { lib.jarFile( - jarTarget ++ ("/"++artifactId++"-"++version++".jar"), + jarTarget ++ ("/"++artifactId++"_"++scalaMajorVersion++"-"++version++".jar"), Seq(compileTarget) ) } @@ -74,6 +79,7 @@ final class Lib(logger: Logger) extends Stage1Lib(logger) with Scaffold{ apiTarget: File, jarTarget: File, artifactId: String, + scalaMajorVersion: String, version: String, compileArgs: Seq[String], classLoaderCache: ClassLoaderCache @@ -96,7 +102,7 @@ final class Lib(logger: Logger) extends Stage1Lib(logger) with Scaffold{ ) } lib.jarFile( - jarTarget ++ ("/"++artifactId++"-"++version++"-javadoc.jar"), + jarTarget ++ ("/"++artifactId++"_"++scalaMajorVersion++"-"++version++"-javadoc.jar"), Vector(apiTarget) ) } diff --git a/stage2/PackageBuild.scala b/stage2/PackageBuild.scala index 79e54a7..d24bf38 100644 --- a/stage2/PackageBuild.scala +++ b/stage2/PackageBuild.scala @@ -2,23 +2,25 @@ package cbt import java.io.File import scala.collection.immutable.Seq abstract class PackageBuild(context: Context) extends BasicBuild(context) with ArtifactInfo{ + def defaultVersion: String + final def version = context.version getOrElse defaultVersion def `package`: Seq[File] = lib.concurrently( enableConcurrency )( Seq(() => jar, () => docJar, () => srcJar) )( _() ).flatten private object cacheJarBasicBuild extends Cache[Option[File]] def jar: Option[File] = cacheJarBasicBuild{ - compile.flatMap( lib.jar( artifactId, version, _, jarTarget ) ) + compile.flatMap( lib.jar( artifactId, scalaMajorVersion, version, _, jarTarget ) ) } private object cacheSrcJarBasicBuild extends Cache[Option[File]] def srcJar: Option[File] = cacheSrcJarBasicBuild{ - lib.srcJar( sourceFiles, artifactId, version, scalaTarget ) + lib.srcJar( sourceFiles, artifactId, scalaMajorVersion, version, scalaTarget ) } private object cacheDocBasicBuild extends Cache[Option[File]] def docJar: Option[File] = cacheDocBasicBuild{ - lib.docJar( scalaVersion, sourceFiles, dependencyClasspath, apiTarget, jarTarget, artifactId, version, scalacOptions, context.classLoaderCache ) + lib.docJar( scalaVersion, sourceFiles, dependencyClasspath, apiTarget, jarTarget, artifactId, scalaMajorVersion, version, scalacOptions, context.classLoaderCache ) } override def jars = jar.toVector ++ dependencyJars diff --git a/stage2/PublishBuild.scala b/stage2/PublishBuild.scala index e4e8fd7..6b85b22 100644 --- a/stage2/PublishBuild.scala +++ b/stage2/PublishBuild.scala @@ -36,6 +36,11 @@ abstract class PublishBuild(context: Context) extends PackageBuild(context){ final protected def releaseFolder = s"/${groupId.replace(".","/")}/$artifactId/$version/" def snapshotUrl = new URL("https://oss.sonatype.org/content/repositories/snapshots") def releaseUrl = new URL("https://oss.sonatype.org/service/local/staging/deploy/maven2") - def publishSnapshot: Unit = lib.publishSnapshot(sourceFiles, pom +: `package`, snapshotUrl ++ releaseFolder ) + override def copy(context: Context) = super.copy(context).asInstanceOf[PublishBuild] + def publishSnapshot: Unit = { + val snapshotBuild = copy( context.copy(version = Some(version+"-SNAPSHOT")) ) + val files = snapshotBuild.pom +: snapshotBuild.`package` + lib.publishSnapshot(sourceFiles, files, snapshotUrl ++ releaseFolder ) + } def publishSigned: Unit = lib.publishSigned(sourceFiles, pom +: `package`, releaseUrl ++ releaseFolder ) } diff --git a/stage2/Stage2.scala b/stage2/Stage2.scala index ddadfb6..fa41d79 100644 --- a/stage2/Stage2.scala +++ b/stage2/Stage2.scala @@ -15,8 +15,9 @@ object Stage2 extends Stage2Base{ logger.stage2(s"Stage2 start") val loop = args.args.lift(0) == Some("loop") val direct = args.args.lift(0) == Some("direct") + val cross = args.args.lift(0) == Some("cross") - val taskIndex = if (loop || direct) { + val taskIndex = if (loop || direct || cross) { 1 } else { 0 @@ -27,6 +28,18 @@ object Stage2 extends Stage2Base{ val first = lib.loadRoot( context ) val build = first.finalBuild + def call(build: Build) = { + if(cross){ + build.crossScalaVersions.foreach{ + v => new lib.ReflectBuild( + build.copy(context.copy(scalaVersion = Some(v))) + ).callNullary(task) + } + } else { + new lib.ReflectBuild(build).callNullary(task) + } + } + val res = if (loop) { // TODO: this should allow looping over task specific files, like test files as well @@ -45,10 +58,10 @@ object Stage2 extends Stage2Base{ case file if triggerFiles.exists(file.toString startsWith _.toString) => val build = lib.loadDynamic(context) logger.loop(s"Re-running $task for " ++ build.projectDirectory.toString) - new lib.ReflectBuild(build).callNullary(task) + call(build) } } else { - new lib.ReflectBuild(build).callNullary(task) + call(build) } logger.stage2(s"Stage2 end") diff --git a/stage2/mixins.scala b/stage2/mixins.scala index 4dedd09..fcffd97 100644 --- a/stage2/mixins.scala +++ b/stage2/mixins.scala @@ -5,7 +5,7 @@ import java.io._ trait Test extends Build{ lazy val testedBuild = BuildDependency( projectDirectory.parent ) override def dependencies = Seq( testedBuild ) ++ super.dependencies - override def scalaVersion = testedBuild.build.scalaVersion + override def defaultScalaVersion = testedBuild.build.scalaVersion } trait Sbt extends Build{ override def sources = Seq( projectDirectory ++ "/src/main/scala" ) -- cgit v1.2.3