summaryrefslogtreecommitdiff
path: root/contrib/buildinfo/src/BuildInfo.scala
blob: 0804b9a5dd5b5505f01564c5e580ebe0b57e4011 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package mill.contrib.buildinfo

import mill.T
import mill.api.Logger
import mill.api.PathRef
import mill.scalalib.ScalaModule

trait BuildInfo extends ScalaModule {

  def buildInfoPackageName: Option[String] = None

  def buildInfoObjectName: String = "BuildInfo"

  def buildInfoMembers: T[Map[String, String]] = T {
    Map.empty[String, String]
  }

  def generatedBuildInfo: T[(Seq[PathRef], PathRef)] = T {
    val logger: Logger = T.ctx().log
    val members: Map[String, String] = buildInfoMembers()
    if (members.nonEmpty) {
      val outputFile = T.ctx().dest / "BuildInfo.scala"
      val internalMembers =
        members
          .map {
            case (name, value) => s"""  def ${name} = "${value}""""
          }
          .mkString("\n")
      logger.debug(s"Generating object [${buildInfoPackageName.map(_ + ".").getOrElse("")}${buildInfoObjectName}] with [${members.size}] members to [${outputFile}]")
      os.write(
        outputFile,
        s"""|${buildInfoPackageName.map(packageName => s"package ${packageName}\n").getOrElse("")}
            |object ${buildInfoObjectName} {
            |$internalMembers
            |}""".stripMargin
      )
      (Seq(PathRef(outputFile)), PathRef(T.ctx().dest))
    } else {
      logger.debug("No build info member defined, skipping code generation")
      (Seq.empty[PathRef], PathRef(T.ctx().dest))
    }
  }

  override def generatedSources = T {
    val (_, destPathRef) = generatedBuildInfo()
    super.generatedSources() :+ destPathRef
  }

}