diff options
-rwxr-xr-x | cbt | 2 | ||||
-rw-r--r-- | stage1/Stage1.scala | 6 | ||||
-rw-r--r-- | stage1/resolver.scala | 38 | ||||
-rw-r--r-- | stage2/AdminStage2.scala | 9 | ||||
-rw-r--r-- | stage2/AdminTasks.scala | 23 | ||||
-rw-r--r-- | stage2/BuildBuild.scala | 2 | ||||
-rw-r--r-- | stage2/Lib.scala | 26 | ||||
-rw-r--r-- | stage2/PackageBuild.scala | 4 |
8 files changed, 67 insertions, 43 deletions
@@ -192,7 +192,7 @@ stage1 () { fi log "run CBT and loop if desired. This allows recompiling CBT itself as part of compile looping." $* - if [ "$1" = "admin" ]; then + if [ "$1" = "admin" ] || [ "$2" = "admin" ]; then mainClass=cbt.AdminStage1 else mainClass=cbt.Stage1 diff --git a/stage1/Stage1.scala b/stage1/Stage1.scala index 1aa3f09..7702678 100644 --- a/stage1/Stage1.scala +++ b/stage1/Stage1.scala @@ -67,14 +67,16 @@ abstract class Stage1Base{ logger.stage1("before conditionally running zinc to recompile CBT") if( src.exists(newerThan(_, changeIndicator)) ) { - val stage1Classpath = CbtDependency(logger).dependencyClasspath + val stage1Classpath = CbtDependency()(logger).dependencyClasspath logger.stage1("cbt.lib has changed. Recompiling with cp: " ++ stage1Classpath.string) zinc( true, src, stage2Target, stage1Classpath )( zincVersion = "0.3.9", scalaVersion = constants.scalaVersion ) } logger.stage1(s"[$now] calling CbtDependency.classLoader") logger.stage1(s"[$now] Run Stage2") - val ExitCode(exitCode) = runMain( mainClass, cwd +: args.drop(1).toVector, CbtDependency(logger).classLoader ) + val ExitCode(exitCode) = /*trapExitCode*/{ // this + runMain( mainClass, cwd +: args.drop(1).toVector, CbtDependency()(logger).classLoader ) + } logger.stage1(s"[$now] Stage1 end") System.exit(exitCode) } diff --git a/stage1/resolver.scala b/stage1/resolver.scala index fae5e9d..30f03e2 100644 --- a/stage1/resolver.scala +++ b/stage1/resolver.scala @@ -32,12 +32,13 @@ abstract class Dependency{ def exportedJars: Seq[File] def jars: Seq[File] = exportedJars ++ dependencyJars + def canBeCached = false def cacheDependencyClassLoader = true private object cacheClassLoaderBasicBuild extends Cache[URLClassLoader] def classLoader: URLClassLoader = cacheClassLoaderBasicBuild{ val transitiveClassPath = transitiveDependencies.map{ - case d: MavenDependency => Left(d) + case d if d.canBeCached => Left(d) case d => Right(d) } val buildClassPath = ClassPath.flatten( @@ -95,35 +96,39 @@ abstract class Dependency{ } // TODO: all this hard codes the scala version, needs more flexibility -class ScalaCompiler(logger: Logger) extends MavenDependency("org.scala-lang","scala-compiler",constants.scalaVersion)(logger) -class ScalaLibrary(logger: Logger) extends MavenDependency("org.scala-lang","scala-library",constants.scalaVersion)(logger) -class ScalaReflect(logger: Logger) extends MavenDependency("org.scala-lang","scala-reflect",constants.scalaVersion)(logger) +class ScalaCompilerDependency(version: String)(implicit logger: Logger) extends MavenDependency("org.scala-lang","scala-compiler",version) +class ScalaLibraryDependency (version: String)(implicit logger: Logger) extends MavenDependency("org.scala-lang","scala-library",version) +class ScalaReflectDependency (version: String)(implicit logger: Logger) extends MavenDependency("org.scala-lang","scala-reflect",version) -case class ScalaDependencies(logger: Logger) extends Dependency{ +case class ScalaDependencies(version: String)(implicit val logger: Logger) extends Dependency{ sd => + final val updated = false + override def canBeCached = true def exportedClasspath = ClassPath(Seq()) def exportedJars = Seq[File]() - def dependencies = Seq( new ScalaCompiler(logger), new ScalaLibrary(logger), new ScalaReflect(logger) ) - final val updated = false + def dependencies = Seq( + new ScalaCompilerDependency(version)(logger), + new ScalaLibraryDependency(version)(logger), + new ScalaReflectDependency(version)(logger) + ) } -/* -case class BinaryDependency( path: File, dependencies: Seq[Dependency] ) extends Dependency{ +case class BinaryDependency( path: File, dependencies: Seq[Dependency] )(implicit val logger: Logger) extends Dependency{ + def updated = false def exportedClasspath = ClassPath(Seq(path)) - def exportedJars = Seq[File]() + def exportedJars = Seq[File](path) } -*/ -case class Stage1Dependency(logger: Logger) extends Dependency{ +case class Stage1Dependency()(implicit val logger: Logger) extends Dependency{ def exportedClasspath = ClassPath( Seq(nailgunTarget, stage1Target) ) def exportedJars = Seq[File]() - def dependencies = ScalaDependencies(logger: Logger).dependencies + def dependencies = ScalaDependencies(constants.scalaVersion).dependencies def updated = false // FIXME: think this through, might allow simplifications and/or optimizations } -case class CbtDependency(logger: Logger) extends Dependency{ +case class CbtDependency()(implicit val logger: Logger) extends Dependency{ def exportedClasspath = ClassPath( Seq( stage2Target ) ) def exportedJars = Seq[File]() override def dependencies = Seq( - Stage1Dependency(logger), + Stage1Dependency()(logger), MavenDependency("net.incongru.watchservice","barbary-watchservice","1.0")(logger), MavenDependency("com.lihaoyi","ammonite-repl_2.11.7","0.5.5")(logger), MavenDependency("org.scala-lang.modules","scala-xml_2.11","1.0.5")(logger) @@ -136,10 +141,11 @@ final case class Classifier(name: String) extends ClassifierBase case object javadoc extends ClassifierBase case object sources extends ClassifierBase -case class MavenDependency( groupId: String, artifactId: String, version: String, sources: Boolean = false )(val logger: Logger) +case class MavenDependency( groupId: String, artifactId: String, version: String, sources: Boolean = false )(implicit val logger: Logger) extends ArtifactInfo{ def updated = false + override def canBeCached = true private val groupPath = groupId.split("\\.").mkString("/") def basePath = s"/$groupPath/$artifactId/$version/$artifactId-$version"++(if(sources) "-sources" else "") diff --git a/stage2/AdminStage2.scala b/stage2/AdminStage2.scala index 4120b1c..59f8f7d 100644 --- a/stage2/AdminStage2.scala +++ b/stage2/AdminStage2.scala @@ -1,11 +1,12 @@ package cbt object AdminStage2{ - def main(args: Array[String]) = { - val init = new Init(args.drop(3)) + def main(_args: Array[String]) = { + val args = _args.drop(1).dropWhile(Seq("admin","direct") contains _) + val init = new Init(args) val lib = new Lib(init.logger) - val adminTasks = new AdminTasks(lib, args.drop(3)) + val adminTasks = new AdminTasks(lib, args) new lib.ReflectObject(adminTasks){ def usage: String = "Available methods: " ++ lib.taskNames(subclassType).mkString(" ") - }.callNullary(args.lift(2)) + }.callNullary(args.lift(0)) } } diff --git a/stage2/AdminTasks.scala b/stage2/AdminTasks.scala index 2f7efe1..70b140e 100644 --- a/stage2/AdminTasks.scala +++ b/stage2/AdminTasks.scala @@ -1,12 +1,33 @@ package cbt +import scala.collection.immutable.Seq class AdminTasks(lib: Lib, args: Array[String]){ + implicit val logger: Logger = lib.logger def resolve = { ClassPath.flatten( - args(0).split(",").toVector.map{ + args(1).split(",").toVector.map{ d => val v = d.split(":") new MavenDependency(v(0),v(1),v(2))(lib.logger).classpath } ) } + def amm = ammonite + def ammonite = { + val version = args.lift(1).getOrElse(constants.scalaVersion) + val scalac = new ScalaCompilerDependency( version ) + val d = MavenDependency( + "com.lihaoyi","ammonite-repl_2.11.7",args.lift(1).getOrElse("0.5.6") + ) + // FIXME: this does not work quite yet, throws NoSuchFileException: /ammonite/repl/frontend/ReplBridge$.class + lib.runMain( + "ammonite.repl.Main", Seq(), d.classLoader + ) + } + def scala = { + val version = args.lift(1).getOrElse(constants.scalaVersion) + val scalac = new ScalaCompilerDependency( version ) + lib.runMain( + "scala.tools.nsc.MainGenericRunner", Seq("-cp", scalac.classpath.string), scalac.classLoader + ) + } } diff --git a/stage2/BuildBuild.scala b/stage2/BuildBuild.scala index 9283cdf..5e0f5d3 100644 --- a/stage2/BuildBuild.scala +++ b/stage2/BuildBuild.scala @@ -3,7 +3,7 @@ import java.io.File import scala.collection.immutable.Seq class BuildBuild(context: Context) extends Build(context){ - override def dependencies = Seq( CbtDependency(context.logger) ) ++ super.dependencies + override def dependencies = Seq( CbtDependency()(context.logger) ) ++ super.dependencies def managedBuildDirectory: File = lib.realpath( projectDirectory.parent ) val managedBuild = { val managedContext = context.copy( cwd = managedBuildDirectory ) diff --git a/stage2/Lib.scala b/stage2/Lib.scala index 6f83859..924a6c0 100644 --- a/stage2/Lib.scala +++ b/stage2/Lib.scala @@ -80,35 +80,29 @@ final class Lib(logger: Logger) extends Stage1Lib(logger) with Scaffold{ } def docJar( + scalaVersion: String, sourceFiles: Seq[File], - dependenyClasspath: ClassPath, + dependencyClasspath: ClassPath, apiTarget: File, jarTarget: File, artifactId: String, version: String, compileArgs: Seq[String] ): File = { - // FIXME: get this dynamically somehow, or is this even needed? - val javacp = ClassPath( - "/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/System/Library/Java/Extensions/MRJToolkit.jar".split(":").toVector.map(new File(_)) - ) - mkdir(Path(apiTarget)) if(sourceFiles.nonEmpty){ - System.err.println("creating docs") + val args = Seq( + // FIXME: can we use compiler dependency here? + "-cp", dependencyClasspath.string, // FIXME: does this break for builds that don't have scalac dependencies? + "-d", apiTarget.toString + ) ++ compileArgs ++ sourceFiles.map(_.toString) + logger.lib("creating docs for source files "+args.mkString(", ")) trapExitCode{ redirectOutToErr{ runMain( "scala.tools.nsc.ScalaDoc", - Seq( - // FIXME: can we use compiler dependency here? - "-cp", /*javacp++":"++*/ScalaDependencies(logger).classpath.string ++ ":" ++ dependenyClasspath.string, - "-d", apiTarget.toString - ) ++ compileArgs ++ sourceFiles.map(_.toString), - new URLClassLoader( - ScalaDependencies(logger).classpath ++ javacp, - ClassLoader.getSystemClassLoader - ) + args, + ScalaDependencies(scalaVersion)(logger).classLoader ) } } diff --git a/stage2/PackageBuild.scala b/stage2/PackageBuild.scala index 96c7b6f..b037e7f 100644 --- a/stage2/PackageBuild.scala +++ b/stage2/PackageBuild.scala @@ -14,12 +14,12 @@ abstract class PackageBuild(context: Context) extends Build(context) with Artifa private object cacheSrcJarBasicBuild extends Cache[File] def srcJar: File = cacheSrcJarBasicBuild{ - lib.srcJar(sources, artifactId, version, scalaTarget) + lib.srcJar( sourceFiles, artifactId, version, scalaTarget ) } private object cacheDocBasicBuild extends Cache[File] def docJar: File = cacheDocBasicBuild{ - lib.docJar( sources, dependencyClasspath, apiTarget, jarTarget, artifactId, version, scalacOptions ) + lib.docJar( scalaVersion, sourceFiles, dependencyClasspath, apiTarget, jarTarget, artifactId, version, scalacOptions ) } override def jars = jar +: dependencyJars |