summaryrefslogtreecommitdiff
path: root/CommonBuild.sc
diff options
context:
space:
mode:
Diffstat (limited to 'CommonBuild.sc')
-rw-r--r--CommonBuild.sc94
1 files changed, 94 insertions, 0 deletions
diff --git a/CommonBuild.sc b/CommonBuild.sc
new file mode 100644
index 00000000..a9a4e1a2
--- /dev/null
+++ b/CommonBuild.sc
@@ -0,0 +1,94 @@
+import ammonite.ops._
+import mill._
+import mill.scalalib._
+
+def scalacOptionsVersion(scalaVersion: String): Seq[String] = {
+ Seq() ++ {
+ // If we're building with Scala > 2.11, enable the compile option
+ // switch to support our anonymous Bundle definitions:
+ // https://github.com/scala/bug/issues/10047
+ if (scalaVersion.startsWith("2.11.")) {
+ Seq()
+ } else {
+ Seq(
+ "-Xsource:2.11",
+ "-Ywarn-unused:imports",
+ "-Ywarn-unused:locals"
+ )
+ }
+ }
+}
+
+def javacOptionsVersion(scalaVersion: String): Seq[String] = {
+ Seq() ++ {
+ // Scala 2.12 requires Java 8. We continue to generate
+ // Java 7 compatible code for Scala 2.11
+ // for compatibility with old clients.
+ if (scalaVersion.startsWith("2.11.")) {
+ Seq("-source", "1.7", "-target", "1.7")
+ } else {
+ Seq("-source", "1.8", "-target", "1.8")
+ }
+ }
+}
+
+// Define our own BuildInfo since mill doesn't currently have one.
+trait BuildInfo extends ScalaModule { outer =>
+
+ def buildInfoObjectName: String = "BuildInfo"
+
+ def buildInfoMembers: T[Map[String, String]] = T {
+ Map.empty[String, String]
+ }
+
+ private def generateBuildInfo(outputPath: Path, members: Map[String, String]) = {
+ val outputFile = outputPath / "BuildInfo.scala"
+ val packageName = members.getOrElse("buildInfoPackage", "")
+ val packageDef = if (packageName != "") {
+ s"package ${packageName}"
+ } else {
+ ""
+ }
+ val internalMembers =
+ members
+ .map {
+ case (name, value) => s""" val ${name}: String = "${value}""""
+ }
+ .mkString("\n")
+ write(outputFile,
+ s"""
+ |${packageDef}
+ |case object ${buildInfoObjectName}{
+ |$internalMembers
+ | override val toString: String = {
+ | "buildInfoPackage: %s, version: %s, scalaVersion: %s" format (
+ | buildInfoPackage, version, scalaVersion
+ | )
+ | }
+ |}
+ """.stripMargin)
+ outputPath
+ }
+
+ override def generatedSources = T {
+ super.generatedSources() :+ PathRef(generateBuildInfo(T.ctx().dest, buildInfoMembers()))
+ }
+}
+
+// Define some file filters to exclude unwanted files from created jars.
+type JarFileFilter = (Path, RelPath) => Boolean
+// Exclude any `.DS_Store` files
+val noDS_StoreFiles: JarFileFilter = (p: Path, relPath: RelPath) => {
+ relPath.last != ".DS_Store"
+}
+
+// Exclude non-source files - accept all resource files, but only *.{java,scala} from source paths
+val onlySourceFiles: JarFileFilter = (p: Path, relPath: RelPath) => {
+ p.last == "resources" || (relPath.ext == "scala" || relPath.ext == "java")
+}
+
+// Apply a sequence of file filters - only accept files which satisfy all filters.
+// We expect this to be curried, the resulting file filter passed to createJar()
+def forallFilters(fileFilters: Seq[JarFileFilter])(p: Path, relPath: RelPath): Boolean = {
+ fileFilters.forall(f => f(p, relPath))
+}