Skip to content

Commit 11b0ec7

Browse files
Publish doc JARs too
1 parent 204f796 commit 11b0ec7

File tree

19 files changed

+332
-113
lines changed

19 files changed

+332
-113
lines changed

modules/build/src/main/scala/scala/build/Build.scala

Lines changed: 125 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ object Build {
138138
logger: Logger,
139139
buildClient: BloopBuildClient,
140140
compiler: ScalaCompiler,
141+
docCompilerOpt: Option[ScalaCompiler],
141142
crossBuilds: Boolean,
142143
buildTests: Boolean,
143144
partial: Option[Boolean]
@@ -169,9 +170,16 @@ object Build {
169170
case _ =>
170171
}
171172

173+
final case class NonCrossBuilds(
174+
main: Build,
175+
testOpt: Option[Build],
176+
docOpt: Option[Build],
177+
testDocOpt: Option[Build]
178+
)
179+
172180
def doBuild(
173181
overrideOptions: BuildOptions
174-
): Either[BuildException, (Build, Option[Build])] = either {
182+
): Either[BuildException, NonCrossBuilds] = either {
175183

176184
val baseOptions = overrideOptions.orElse(sharedOptions)
177185
val scopedSources = value(crossSources.scopedSources(baseOptions))
@@ -191,7 +199,8 @@ object Build {
191199
def doBuildScope(
192200
options: BuildOptions,
193201
sources: Sources,
194-
scope: Scope
202+
scope: Scope,
203+
actualCompiler: ScalaCompiler = compiler
195204
): Either[BuildException, Build] =
196205
either {
197206
val sources0 = sources.withVirtualDir(inputs0, scope, options)
@@ -212,7 +221,7 @@ object Build {
212221
scope,
213222
logger,
214223
buildClient,
215-
compiler,
224+
actualCompiler,
216225
buildTests,
217226
partial
218227
)
@@ -221,44 +230,70 @@ object Build {
221230
}
222231

223232
val mainBuild = value(doBuildScope(mainOptions, mainSources, Scope.Main))
233+
val mainDocBuildOpt = docCompilerOpt match {
234+
case None => None
235+
case Some(docCompiler) =>
236+
Some(value(doBuildScope(
237+
mainOptions,
238+
mainSources,
239+
Scope.Main,
240+
actualCompiler = docCompiler
241+
)))
242+
}
224243

225-
val testBuildOpt =
244+
def testBuildOpt(doc: Boolean = false) = either {
226245
if (buildTests) {
227-
val testBuild = value {
228-
mainBuild match {
229-
case s: Build.Successful =>
230-
val extraTestOptions = BuildOptions(
231-
classPathOptions = ClassPathOptions(
232-
extraClassPath = Seq(s.output)
233-
)
234-
)
235-
val testOptions0 = extraTestOptions.orElse(testOptions)
236-
doBuildScope(testOptions0, testSources, Scope.Test)
237-
case _ =>
238-
Right(Build.Cancelled(
239-
inputs,
240-
sharedOptions,
241-
Scope.Test,
242-
"Parent build failed or cancelled"
243-
))
244-
}
246+
val actualCompilerOpt =
247+
if (doc) docCompilerOpt
248+
else Some(compiler)
249+
actualCompilerOpt match {
250+
case None => None
251+
case Some(actualCompiler) =>
252+
val testBuild = value {
253+
mainBuild match {
254+
case s: Build.Successful =>
255+
val extraTestOptions = BuildOptions(
256+
classPathOptions = ClassPathOptions(
257+
extraClassPath = Seq(s.output)
258+
)
259+
)
260+
val testOptions0 = extraTestOptions.orElse(testOptions)
261+
doBuildScope(
262+
testOptions0,
263+
testSources,
264+
Scope.Test,
265+
actualCompiler = actualCompiler
266+
)
267+
case _ =>
268+
Right(Build.Cancelled(
269+
inputs,
270+
sharedOptions,
271+
Scope.Test,
272+
"Parent build failed or cancelled"
273+
))
274+
}
275+
}
276+
Some(testBuild)
245277
}
246-
Some(testBuild)
247278
}
248279
else None
280+
}
249281

282+
val testBuildOpt0 = value(testBuildOpt())
250283
doPostProcess(mainBuild, inputs0, Scope.Main)
251-
for (testBuild <- testBuildOpt)
284+
for (testBuild <- testBuildOpt0)
252285
doPostProcess(testBuild, inputs0, Scope.Test)
253286

254-
(mainBuild, testBuildOpt)
287+
val docTestBuildOpt0 = value(testBuildOpt(doc = true))
288+
289+
NonCrossBuilds(mainBuild, testBuildOpt0, mainDocBuildOpt, docTestBuildOpt0)
255290
}
256291

257-
def buildScopes(): Either[BuildException, (Build, Seq[Build], Option[Build], Seq[Build])] =
292+
def buildScopes(): Either[BuildException, Builds] =
258293
either {
259-
val (mainBuild, testBuild) = value(doBuild(BuildOptions()))
294+
val nonCrossBuilds = value(doBuild(BuildOptions()))
260295

261-
val (extraMainBuilds: Seq[Build], extraTestBuilds: Seq[Build]) =
296+
val (extraMainBuilds, extraTestBuilds, extraDocBuilds, extraDocTestBuilds) =
262297
if (crossBuilds) {
263298
val extraBuilds = value {
264299
val maybeBuilds = crossOptions.map(doBuild)
@@ -267,21 +302,31 @@ object Build {
267302
.sequence
268303
.left.map(CompositeBuildException(_))
269304
}
270-
(extraBuilds.map(_._1), extraBuilds.flatMap(_._2))
305+
(
306+
extraBuilds.map(_.main),
307+
extraBuilds.flatMap(_.testOpt),
308+
extraBuilds.flatMap(_.docOpt),
309+
extraBuilds.flatMap(_.testDocOpt)
310+
)
271311
}
272312
else
273-
(Nil, Nil)
313+
(Nil, Nil, Nil, Nil)
274314

275-
(mainBuild, extraMainBuilds, testBuild, extraTestBuilds)
315+
Builds(
316+
Seq(nonCrossBuilds.main) ++ nonCrossBuilds.testOpt.toSeq,
317+
Seq(extraMainBuilds, extraTestBuilds),
318+
nonCrossBuilds.docOpt.toSeq ++ nonCrossBuilds.testDocOpt.toSeq,
319+
Seq(extraDocBuilds, extraDocTestBuilds)
320+
)
276321
}
277322

278-
val (mainBuild, extraBuilds, testBuildOpt, extraTestBuilds) = value(buildScopes())
323+
val builds = value(buildScopes())
279324

280-
copyResourceToClassesDir(mainBuild)
281-
for (testBuild <- testBuildOpt)
325+
copyResourceToClassesDir(builds.main)
326+
for (testBuild <- builds.get(Scope.Test))
282327
copyResourceToClassesDir(testBuild)
283328

284-
Builds(Seq(mainBuild) ++ testBuildOpt.toSeq, Seq(extraBuilds, extraTestBuilds))
329+
builds
285330
}
286331

287332
private def copyResourceToClassesDir(build: Build) = build match {
@@ -399,6 +444,7 @@ object Build {
399444
inputs: Inputs,
400445
options: BuildOptions,
401446
compilerMaker: ScalaCompilerMaker,
447+
docCompilerMakerOpt: Option[ScalaCompilerMaker],
402448
logger: Logger,
403449
crossBuilds: Boolean,
404450
buildTests: Boolean,
@@ -416,16 +462,39 @@ object Build {
416462
buildClient,
417463
logger
418464
) { compiler =>
419-
build(
420-
inputs = inputs,
421-
options = options,
422-
logger = logger,
423-
buildClient = buildClient,
424-
compiler = compiler,
425-
crossBuilds = crossBuilds,
426-
buildTests = buildTests,
427-
partial = partial
428-
)
465+
docCompilerMakerOpt match {
466+
case None =>
467+
build(
468+
inputs = inputs,
469+
options = options,
470+
logger = logger,
471+
buildClient = buildClient,
472+
compiler = compiler,
473+
docCompilerOpt = None,
474+
crossBuilds = crossBuilds,
475+
buildTests = buildTests,
476+
partial = partial
477+
)
478+
case Some(docCompilerMaker) =>
479+
docCompilerMaker.withCompiler(
480+
inputs.workspace / Constants.workspaceDirName,
481+
classesDir0, // ???
482+
buildClient,
483+
logger
484+
) { docCompiler =>
485+
build(
486+
inputs = inputs,
487+
options = options,
488+
logger = logger,
489+
buildClient = buildClient,
490+
compiler = compiler,
491+
docCompilerOpt = Some(docCompiler),
492+
crossBuilds = crossBuilds,
493+
buildTests = buildTests,
494+
partial = partial
495+
)
496+
}
497+
}
429498
}
430499
}
431500

@@ -445,6 +514,7 @@ object Build {
445514
inputs: Inputs,
446515
options: BuildOptions,
447516
compilerMaker: ScalaCompilerMaker,
517+
docCompilerMakerOpt: Option[ScalaCompilerMaker],
448518
logger: Logger,
449519
crossBuilds: Boolean,
450520
buildTests: Boolean,
@@ -464,6 +534,12 @@ object Build {
464534
buildClient,
465535
logger
466536
)
537+
val docCompilerOpt = docCompilerMakerOpt.map(_.create(
538+
inputs.workspace / Constants.workspaceDirName,
539+
classesDir0,
540+
buildClient,
541+
logger
542+
))
467543

468544
def run() = {
469545
try {
@@ -473,6 +549,7 @@ object Build {
473549
logger,
474550
buildClient,
475551
compiler,
552+
docCompilerOpt,
476553
crossBuilds = crossBuilds,
477554
buildTests = buildTests,
478555
partial = partial
@@ -724,7 +801,7 @@ object Build {
724801

725802
val projectChanged = compiler.prepareProject(project, logger)
726803

727-
if (projectChanged && os.isDir(classesDir0)) {
804+
if (compiler.usesClassDir && projectChanged && os.isDir(classesDir0)) {
728805
logger.debug(s"Clearing $classesDir0")
729806
os.list(classesDir0).foreach { p =>
730807
logger.debug(s"Removing $p")
@@ -770,7 +847,7 @@ object Build {
770847
)
771848
}
772849

773-
if (projectChanged && os.isDir(classesDir0)) {
850+
if (compiler.usesClassDir && projectChanged && os.isDir(classesDir0)) {
774851
logger.debug(s"Clearing $classesDir0")
775852
os.list(classesDir0).foreach { p =>
776853
logger.debug(s"Removing $p")
@@ -965,6 +1042,7 @@ object Build {
9651042
logger,
9661043
buildClient,
9671044
compiler,
1045+
None,
9681046
crossBuilds = false,
9691047
buildTests = buildTests,
9701048
partial = None

modules/build/src/main/scala/scala/build/Builds.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ import scala.build.options.Scope
44

55
final case class Builds(
66
builds: Seq[Build],
7-
crossBuilds: Seq[Seq[Build]]
7+
crossBuilds: Seq[Seq[Build]],
8+
docBuilds: Seq[Build],
9+
docCrossBuilds: Seq[Seq[Build]]
810
) {
911
def main: Build =
1012
get(Scope.Main).getOrElse {
@@ -22,4 +24,7 @@ final case class Builds(
2224
}
2325
.map(b => b.crossKey -> b)
2426
.toMap
27+
28+
def allDoc: Seq[Build] =
29+
docBuilds ++ docCrossBuilds.flatten
2530
}

modules/build/src/main/scala/scala/build/compiler/ScalaCompiler.scala

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,39 @@ trait ScalaCompiler {
1313
logger: Logger
1414
): Boolean
1515
def shutdown(): Unit
16+
17+
def usesClassDir: Boolean = true
18+
}
19+
20+
object ScalaCompiler {
21+
final case class IgnoreScala2(compiler: ScalaCompiler) extends ScalaCompiler {
22+
private def ignore(
23+
project: Project,
24+
logger: Logger
25+
): Boolean = {
26+
val scalaVer = project.scalaCompiler.scalaVersion
27+
val isScala2 = scalaVer.startsWith("2.")
28+
logger.debug(s"Ignoring compilation for Scala version $scalaVer")
29+
isScala2
30+
}
31+
32+
def jvmVersion: Option[Positioned[Int]] =
33+
compiler.jvmVersion
34+
def prepareProject(
35+
project: Project,
36+
logger: Logger
37+
): Boolean =
38+
ignore(project, logger) ||
39+
compiler.prepareProject(project, logger)
40+
def compile(
41+
project: Project,
42+
logger: Logger
43+
): Boolean =
44+
ignore(project, logger) ||
45+
compiler.compile(project, logger)
46+
def shutdown(): Unit =
47+
compiler.shutdown()
48+
override def usesClassDir: Boolean =
49+
compiler.usesClassDir
50+
}
1651
}

modules/build/src/main/scala/scala/build/compiler/ScalaCompilerMaker.scala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,17 @@ trait ScalaCompilerMaker {
3838
// format: on
3939
}
4040
}
41+
42+
object ScalaCompilerMaker {
43+
final case class IgnoreScala2(compilerMaker: ScalaCompilerMaker) extends ScalaCompilerMaker {
44+
def create(
45+
workspace: os.Path,
46+
classesDir: os.Path,
47+
buildClient: BuildClient,
48+
logger: Logger
49+
): ScalaCompiler =
50+
ScalaCompiler.IgnoreScala2(
51+
compilerMaker.create(workspace, classesDir, buildClient, logger)
52+
)
53+
}
54+
}

0 commit comments

Comments
 (0)