diff --git a/build.sbt b/build.sbt index b66d8d227..79d77d3ac 100644 --- a/build.sbt +++ b/build.sbt @@ -14,6 +14,7 @@ ThisBuild / version := { ThisBuild / scalafmtOnCompile := !(Global / insideCI).value ThisBuild / Test / scalafmtOnCompile := !(Global / insideCI).value ThisBuild / turbo := true +ThisBuild / SettingKey[Boolean]("usePipelining") := true val excludeLint = SettingKey[Set[Def.KeyedInitialize[_]]]("excludeLintKeys") Global / excludeLint := (Global / excludeLint).?.value.getOrElse(Set.empty) @@ -796,6 +797,7 @@ lazy val coreMacrosProj = (project in file("core-macros")) baseSettings :+ (crossScalaVersions := (scala212 :: scala213 :: Nil)), name := "Core Macros", libraryDependencies += "org.scala-lang" % "scala-compiler" % scalaVersion.value, + SettingKey[Boolean]("exportPipelining") := false, mimaSettings, ) @@ -913,6 +915,7 @@ lazy val mainProj = (project in file("main")) sourceManaged in (Compile, generateContrabands) := baseDirectory.value / "src" / "main" / "contraband-scala", testOptions in Test += Tests .Argument(TestFrameworks.ScalaCheck, "-minSuccessfulTests", "1000"), + SettingKey[Boolean]("usePipelining") := false, mimaSettings, mimaBinaryIssueFilters ++= Vector( // New and changed methods on KeyIndex. internal. diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 7a155a0a2..f5aed3be2 100644 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -325,6 +325,7 @@ object Defaults extends BuildCommon { }, turbo :== SysProp.turbo, usePipelining :== SysProp.pipelining, + exportPipelining := usePipelining.value, useScalaReplJLine :== false, scalaInstanceTopLoader := { if (!useScalaReplJLine.value) classOf[org.jline.terminal.Terminal].getClassLoader @@ -389,6 +390,7 @@ object Defaults extends BuildCommon { ) private[sbt] lazy val buildLevelJvmSettings: Seq[Setting[_]] = Seq( + exportPipelining := usePipelining.value, rootPaths := { val app = appConfiguration.value val base = app.baseDirectory.getCanonicalFile @@ -785,7 +787,7 @@ object Defaults extends BuildCommon { scalacOptions := { val old = scalacOptions.value val converter = fileConverter.value - if (usePipelining.value) + if (exportPipelining.value) Vector("-Ypickle-java", "-Ypickle-write", converter.toPath(earlyOutput.value).toString) ++ old else old }, @@ -1941,8 +1943,9 @@ object Defaults extends BuildCommon { val setup: Setup = compileIncSetup.value val useBinary: Boolean = enableBinaryCompileAnalysis.value val analysisResult: CompileResult = compileIncremental.value + val exportP = exportPipelining.value // Save analysis midway if pipelining is enabled - if (analysisResult.hasModified && setup.incrementalCompilerOptions.pipelining) { + if (analysisResult.hasModified && exportP) { val store = MixedAnalyzingCompiler.staticCachedStore(setup.cacheFile.toPath, !useBinary) val contents = AnalysisContents.create(analysisResult.analysis(), analysisResult.setup()) @@ -2079,6 +2082,10 @@ object Defaults extends BuildCommon { val vs = sources.value.toVector map { x => c.toVirtualFile(x.toPath) } + val eo = CompileOutput(c.toPath(earlyOutput.value)) + val eoOpt = + if (exportPipelining.value) Some(eo) + else None CompileOptions.of( cp.toArray, vs.toArray, @@ -2091,7 +2098,7 @@ object Defaults extends BuildCommon { None.toOptional: Optional[NioPath], Some(fileConverter.value).toOptional, Some(reusableStamper.value).toOptional, - Some(CompileOutput(c.toPath(earlyOutput.value))).toOptional, + eoOpt.toOptional, ) }, compilerReporter := { diff --git a/main/src/main/scala/sbt/Keys.scala b/main/src/main/scala/sbt/Keys.scala index 30cfe2425..4885dea22 100644 --- a/main/src/main/scala/sbt/Keys.scala +++ b/main/src/main/scala/sbt/Keys.scala @@ -383,6 +383,7 @@ object Keys { val pushRemoteCacheTo = settingKey[Option[Resolver]]("The resolver to publish remote cache to.") val remoteCachePom = taskKey[File]("Generates a pom for publishing when publishing Maven-style.") val usePipelining = settingKey[Boolean]("Use subproject pipelining for compilation.").withRank(BSetting) + val exportPipelining = settingKey[Boolean]("Product early output so downstream subprojects can do pipelining.").withRank(BSetting) val bspTargetIdentifier = settingKey[BuildTargetIdentifier]("Id for BSP build target.").withRank(DSetting) val bspWorkspace = settingKey[Map[BuildTargetIdentifier, Scope]]("Mapping of BSP build targets to sbt scopes").withRank(DSetting) diff --git a/main/src/main/scala/sbt/internal/ClasspathImpl.scala b/main/src/main/scala/sbt/internal/ClasspathImpl.scala index d9f36cb88..30cf1da0e 100644 --- a/main/src/main/scala/sbt/internal/ClasspathImpl.scala +++ b/main/src/main/scala/sbt/internal/ClasspathImpl.scala @@ -31,15 +31,22 @@ private[sbt] object ClasspathImpl { // we can't reduce the track level. def exportedPicklesTask: Initialize[Task[VirtualClasspath]] = Def.task { - val module = projectID.value - val config = configuration.value - val products = pickleProducts.value - val analysis = compileEarly.value - val xs = products map { _ -> analysis } - for { (f, analysis) <- xs } yield APIMappings - .store(analyzed(f, analysis), apiURL.value) - .put(moduleID.key, module) - .put(configuration.key, config) + // conditional task: do not refactor + if (exportPipelining.value) { + val module = projectID.value + val config = configuration.value + val products = pickleProducts.value + val analysis = compileEarly.value + val xs = products map { _ -> analysis } + for { (f, analysis) <- xs } yield APIMappings + .store(analyzed(f, analysis), apiURL.value) + .put(moduleID.key, module) + .put(configuration.key, config) + } else { + val c = fileConverter.value + val ps = exportedProducts.value + ps.map(attr => attr.map(x => c.toVirtualFile(x.toPath))) + } } def trackedExportedProducts(track: TrackLevel): Initialize[Task[Classpath]] = diff --git a/project/Dependencies.scala b/project/Dependencies.scala index a8b56ed4c..ebeb3a388 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -14,7 +14,7 @@ object Dependencies { private val ioVersion = nightlyVersion.getOrElse("1.4.0-M6") private val lmVersion = sys.props.get("sbt.build.lm.version").orElse(nightlyVersion).getOrElse("1.4.0-M2") - val zincVersion = nightlyVersion.getOrElse("1.4.0-M9") + val zincVersion = nightlyVersion.getOrElse("1.4.0-M10") private val sbtIO = "org.scala-sbt" %% "io" % ioVersion