diff options
author | Som Snytt <som.snytt@gmail.com> | 2013-04-23 00:58:12 -0700 |
---|---|---|
committer | Som Snytt <som.snytt@gmail.com> | 2013-05-23 01:20:24 -0700 |
commit | 63bd52781faa1192de1c87028d6ac637d535a50e (patch) | |
tree | 84a0fc87f76344a1c68164763e7f4e2c25ec7acd /src/compiler/scala/tools/util/PathResolver.scala | |
parent | 649d5bb3a59326ea8fb7790f6abc948951c73905 (diff) | |
download | scala-63bd52781faa1192de1c87028d6ac637d535a50e.tar.gz scala-63bd52781faa1192de1c87028d6ac637d535a50e.tar.bz2 scala-63bd52781faa1192de1c87028d6ac637d535a50e.zip |
SI-7410 REPL uses improved tools.jar locator
The logic in partest for snooping around for tools.jar
is moved to PathResolver, and ILoop uses it from there.
If JAVA_HOME is toolless, check out java.home.
The use case was that Ubuntu installs with `java` at
version 6 and `javac` at version 7; it's easy to wind
up with JAVA_HOME pointing at the version 6 JRE, as
I discovered. It's confusing when that happens.
In future, partest might run under 7 and fork tests
under 6, but those permutations are downstream.
Diffstat (limited to 'src/compiler/scala/tools/util/PathResolver.scala')
-rw-r--r-- | src/compiler/scala/tools/util/PathResolver.scala | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/util/PathResolver.scala b/src/compiler/scala/tools/util/PathResolver.scala index 863cbc5c1a..fdc0f5a889 100644 --- a/src/compiler/scala/tools/util/PathResolver.scala +++ b/src/compiler/scala/tools/util/PathResolver.scala @@ -39,7 +39,7 @@ object PathResolver { /** Environment variables which java pays attention to so it * seems we do as well. */ - def sourcePathEnv = envOrElse("SOURCEPATH", "") + def sourcePathEnv = envOrElse("SOURCEPATH", "") def javaBootClassPath = propOrElse("sun.boot.class.path", searchForBootClasspath) def javaExtDirs = propOrEmpty("java.ext.dirs") @@ -119,6 +119,50 @@ object PathResolver { ) } + /** Locations discovered by supplemental heuristics. + */ + object SupplementalLocations { + + /** The platform-specific support jar. + * + * Usually this is `tools.jar` in the jdk/lib directory of the platform distribution. + * + * The file location is determined by probing the lib directory under JDK_HOME or JAVA_HOME, + * if one of those environment variables is set, then the lib directory under java.home, + * and finally the lib directory under the parent of java.home. Or, as a last resort, + * search deeply under those locations (except for the parent of java.home, on the notion + * that if this is not a canonical installation, then that search would have little + * chance of succeeding). + */ + def platformTools: Option[File] = { + val jarName = "tools.jar" + def jarPath(path: Path) = (path / "lib" / jarName).toFile + def jarAt(path: Path) = { + val f = jarPath(path) + if (f.isFile) Some(f) else None + } + val jdkDir = { + val d = Directory(jdkHome) + if (d.isDirectory) Some(d) else None + } + def deeply(dir: Directory) = dir.deepFiles find (_.name == jarName) + + val home = envOrSome("JDK_HOME", envOrNone("JAVA_HOME")) map (p => Path(p)) + val install = Some(Path(javaHome)) + + (home flatMap jarAt) orElse (install flatMap jarAt) orElse (install map (_.parent) flatMap jarAt) orElse + (jdkDir flatMap deeply) + } + private def vals = List( + s"platformTools = $platformTools" + ) + override def toString = vals mkString ( + f"object SupplementalLocations {%n ", + f"%n ", + f"%n}" + ) + } + def fromPathString(path: String, context: JavaContext = DefaultJavaContext): JavaClassPath = { // called from scalap val s = new Settings() s.classpath.value = path |