aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--nailgun_launcher/BuildStage1Result.java15
-rw-r--r--nailgun_launcher/NailgunLauncher.java25
-rw-r--r--stage1/Stage1.scala39
-rw-r--r--stage1/cbt.scala8
4 files changed, 60 insertions, 27 deletions
diff --git a/nailgun_launcher/BuildStage1Result.java b/nailgun_launcher/BuildStage1Result.java
new file mode 100644
index 0000000..312871d
--- /dev/null
+++ b/nailgun_launcher/BuildStage1Result.java
@@ -0,0 +1,15 @@
+package cbt;
+public class BuildStage1Result{
+ public Boolean changed;
+ public ClassLoader classLoader;
+ public String stage1Classpath;
+ public String nailgunClasspath;
+ public String compatibilityClasspath;
+ public BuildStage1Result( Boolean changed, ClassLoader classLoader, String stage1Classpath, String nailgunClasspath, String compatibilityClasspath ){
+ this.changed = changed;
+ this.classLoader = classLoader;
+ this.stage1Classpath = stage1Classpath;
+ this.nailgunClasspath = nailgunClasspath;
+ this.compatibilityClasspath = compatibilityClasspath;
+ }
+}
diff --git a/nailgun_launcher/NailgunLauncher.java b/nailgun_launcher/NailgunLauncher.java
index 6639218..dede00b 100644
--- a/nailgun_launcher/NailgunLauncher.java
+++ b/nailgun_launcher/NailgunLauncher.java
@@ -44,8 +44,8 @@ public class NailgunLauncher{
res
.classLoader
.loadClass("cbt.Stage1")
- .getMethod( "getBuild", Object.class, Boolean.class )
- .invoke(null, context, res.changed);
+ .getMethod( "getBuild", Object.class, BuildStage1Result.class )
+ .invoke(null, context, res);
}
public static void main( String[] args ) throws Throwable {
@@ -92,13 +92,13 @@ public class NailgunLauncher{
.loadClass("cbt.Stage1")
.getMethod(
"run",
- String[].class, File.class, File.class, Boolean.class,
- File.class, Long.class, ConcurrentHashMap.class, ConcurrentHashMap.class
+ String[].class, File.class, File.class, BuildStage1Result.class,
+ Long.class, ConcurrentHashMap.class, ConcurrentHashMap.class
)
.invoke(
null,
- (Object) args, new File(cache), new File(CBT_HOME), res.changed,
- new File(compatibilityTarget), start, classLoaderCache.keys, classLoaderCache.values
+ (Object) args, new File(cache), new File(CBT_HOME), res,
+ start, classLoaderCache.keys, classLoaderCache.values
)
);
} catch (java.lang.reflect.InvocationTargetException e) {
@@ -186,15 +186,10 @@ public class NailgunLauncher{
return new BuildStage1Result(
changed,
- stage1classLoader
+ stage1classLoader,
+ stage1Classpath,
+ nailgunClasspath,
+ compatibilityTarget
);
}
}
-class BuildStage1Result{
- Boolean changed;
- ClassLoader classLoader;
- BuildStage1Result( Boolean changed, ClassLoader classLoader ){
- this.changed = changed;
- this.classLoader = classLoader;
- }
-}
diff --git a/stage1/Stage1.scala b/stage1/Stage1.scala
index 79bf1d5..81b008f 100644
--- a/stage1/Stage1.scala
+++ b/stage1/Stage1.scala
@@ -56,17 +56,16 @@ object Stage1{
a.lastModified > b.lastModified
}
- def getBuild( _context: java.lang.Object, _cbtChanged: java.lang.Boolean ) = {
+ def getBuild( _context: java.lang.Object, buildStage1: BuildStage1Result ) = {
val context = _context.asInstanceOf[Context]
val logger = new Logger( context.enabledLoggers, context.start )
val (changed, classLoader) = buildStage2(
- context.compatibilityTarget,
+ buildStage1,
ClassLoaderCache(
logger,
context.permanentKeys,
context.permanentClassLoaders
),
- _cbtChanged,
context.cbtHome,
context.cache
)
@@ -74,11 +73,11 @@ object Stage1{
classLoader
.loadClass("cbt.Stage2")
.getMethod( "getBuild", classOf[java.lang.Object], classOf[java.lang.Boolean] )
- .invoke(null, context, (_cbtChanged || changed): java.lang.Boolean)
+ .invoke(null, context, (buildStage1.changed || changed): java.lang.Boolean)
}
def buildStage2(
- compatibilityTarget: File, classLoaderCache: ClassLoaderCache, _cbtChanged: Boolean, cbtHome: File, cache: File
+ buildStage1: BuildStage1Result, classLoaderCache: ClassLoaderCache, cbtHome: File, cache: File
): (Boolean, ClassLoader) = {
import classLoaderCache.logger
@@ -91,11 +90,11 @@ object Stage1{
stage2.listFiles ++ (stage2 ++ "/plugins").listFiles
).toVector.filter(_.isFile).filter(_.toString.endsWith(".scala"))
- val cbtHasChanged = _cbtChanged || lib.needsUpdate(stage2sourceFiles, stage2StatusFile)
+ val cbtHasChanged = buildStage1.changed || lib.needsUpdate(stage2sourceFiles, stage2StatusFile)
val cls = this.getClass.getClassLoader.loadClass("cbt.NailgunLauncher")
- val cbtDependency = CbtDependency(cbtHasChanged, mavenCache, nailgunTarget, stage1Target, stage2Target, compatibilityTarget)
+ val cbtDependency = CbtDependency(cbtHasChanged, mavenCache, nailgunTarget, stage1Target, stage2Target, new File(buildStage1.compatibilityClasspath))
logger.stage1("Compiling stage2 if necessary")
compile(
@@ -111,6 +110,23 @@ object Stage1{
logger.stage1(s"calling CbtDependency.classLoader")
if( cbtHasChanged && classLoaderCache.persistent.containsKey( cbtDependency.classpath.string ) ) {
classLoaderCache.persistent.remove( cbtDependency.classpath.string )
+ } else {
+ assert(
+ buildStage1.compatibilityClasspath === cbtDependency.stage1Dependency.compatibilityDependency.classpath.string,
+ "compatibility classpath different from NailgunLauncher"
+ )
+ assert(
+ buildStage1.stage1Classpath === cbtDependency.stage1Dependency.classpath.string,
+ "stage1 classpath different from NailgunLauncher"
+ )
+ assert(
+ classLoaderCache.persistent.containsKey( cbtDependency.stage1Dependency.compatibilityDependency.classpath.string ),
+ "cbt unchanged, expected compatibility classloader to be cached"
+ )
+ assert(
+ classLoaderCache.persistent.containsKey( cbtDependency.stage1Dependency.classpath.string ),
+ "cbt unchanged, expected stage1/nailgun classloader to be cached"
+ )
}
val stage2ClassLoader = cbtDependency.classLoader(classLoaderCache)
@@ -144,8 +160,7 @@ object Stage1{
_args: Array[String],
cache: File,
cbtHome: File,
- _cbtChanged: java.lang.Boolean,
- compatibilityTarget: File,
+ buildStage1: BuildStage1Result,
start: java.lang.Long,
classLoaderCacheKeys: ConcurrentHashMap[String,AnyRef],
classLoaderCacheValues: ConcurrentHashMap[AnyRef,ClassLoader]
@@ -159,9 +174,9 @@ object Stage1{
classLoaderCacheKeys,
classLoaderCacheValues
)
-
- val (cbtHasChanged, classLoader) = buildStage2( compatibilityTarget, classLoaderCache, _cbtChanged, cbtHome, cache )
+
+ val (cbtHasChanged, classLoader) = buildStage2( buildStage1, classLoaderCache, cbtHome, cache )
val stage2Args = Stage2Args(
new File( args.args(0) ),
@@ -171,7 +186,7 @@ object Stage1{
classLoaderCache = classLoaderCache,
cache,
cbtHome,
- compatibilityTarget
+ new File(buildStage1.compatibilityClasspath)
)
logger.stage1(s"Run Stage2")
diff --git a/stage1/cbt.scala b/stage1/cbt.scala
index c08a5f3..bf82556 100644
--- a/stage1/cbt.scala
+++ b/stage1/cbt.scala
@@ -5,6 +5,11 @@ import java.net._
import java.util.concurrent.ConcurrentHashMap
object `package`{
+ implicit class TypeInferenceSafeEquals[T](value: T){
+ /** if you don't manually upcast, this will catch comparing different types */
+ def ===(other: T) = value == other
+ }
+
val mavenCentral = new URL("https://repo1.maven.org/maven2")
val jcenter = new URL("https://jcenter.bintray.com")
def bintray(owner: String) = new URL(s"https://dl.bintray.com/$owner/maven") // FIXME: url encode owner
@@ -30,6 +35,9 @@ object `package`{
}
implicit class BuildInterfaceExtensions(build: BuildInterface){
import build._
+ // TODO: if every build has a method triggers a callback if files change
+ // then we wouldn't need this and could provide this method from a
+ // plugin rather than hard-coding trigger files stuff in cbt
def triggerLoopFiles: Seq[File] = triggerLoopFilesArray.to
def crossScalaVersions: Seq[String] = crossScalaVersionsArray.to
}