summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-01-27 22:49:18 -0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-01-27 22:49:18 -0800
commitff319e9314dac149d361daea87c89b2b9d7ebb08 (patch)
treee176eefee629ea8edfcfb4f3d848c4809c2716b6
parente754ec7d9eafdf13f9a34248295e19d309c7eba4 (diff)
downloadmill-ff319e9314dac149d361daea87c89b2b9d7ebb08.tar.gz
mill-ff319e9314dac149d361daea87c89b2b9d7ebb08.tar.bz2
mill-ff319e9314dac149d361daea87c89b2b9d7ebb08.zip
Make `idea` task configure the root module to have IntelliJ properly handle the `build.sc` file
-rw-r--r--build.sbt27
-rwxr-xr-xbuild.sc29
-rwxr-xr-xci/test3.sh8
-rwxr-xr-xci/test_all.sh2
-rw-r--r--core/src/mill/modules/Jvm.scala4
-rw-r--r--readme.md2
-rw-r--r--scalalib/src/mill/scalalib/GenIdea.scala61
7 files changed, 96 insertions, 37 deletions
diff --git a/build.sbt b/build.sbt
index 2868a731..fa6ee4d5 100644
--- a/build.sbt
+++ b/build.sbt
@@ -167,8 +167,23 @@ lazy val scalaworker: Project = project
)
)
-(javaOptions in scalalib) := bridgeProps.value.toSeq ++ scalaWorkerProps.value
+def genTask(m: Project) = Def.task{
+ Seq((packageBin in (m, Compile)).value, (packageSrc in (m, Compile)).value) ++
+ (externalDependencyClasspath in (m, Compile)).value.map(_.data)
+}
+(javaOptions in scalalib) := {
+ bridgeProps.value.toSeq ++
+ scalaWorkerProps.value ++
+ Seq("-DMILL_BUILD_LIBRARIES=" +
+ (
+ genTask(moduledefs).value ++
+ genTask(core).value ++
+ genTask(scalalib).value ++
+ genTask(scalajslib).value
+ ).mkString(",")
+ )
+}
lazy val scalajslib = project
.dependsOn(scalalib % "compile->compile;test->test")
.settings(
@@ -257,12 +272,12 @@ lazy val bin = project
outputStrategy in (Test, run) := Some(StdoutOutput),
mainClass in (Test, run) := Some("mill.Main"),
baseDirectory in (Test, run) := (baseDirectory in (Compile, run)).value / ".." / "..",
+ javaOptions in (Test, run) := {
+ (javaOptions in (scalalib, Compile)).value ++
+ scalaWorkerProps.value
+ },
assemblyOption in assembly := {
- val extraArgs = (
- bridgeProps.value ++
- jsbridgeProps.value ++
- scalaWorkerProps.value
- ).mkString(" ")
+ val extraArgs = (javaOptions in (Test, run)).value.mkString(" ")
(assemblyOption in assembly).value.copy(
prependShellScript = Some(
Seq(
diff --git a/build.sc b/build.sc
index 5bb7030e..a5eaba44 100755
--- a/build.sc
+++ b/build.sc
@@ -115,17 +115,30 @@ object scalalib extends MillModule {
def moduleDeps = Seq(core)
def bridgeCompiles = mill.define.Task.traverse(bridges.items)(_._2.compile)
+
+ def genTask(m: ScalaModule) = T.task{
+ Seq(m.jar(), m.sourcesJar()) ++
+ m.externalCompileDepClasspath() ++
+ m.externalCompileDepSources()
+ }
+
def testArgs = T{
val bridgeVersions = bridges.items.map(_._1.head.toString)
- val bridgeArgs = for((version, compile) <- bridgeVersions.zip(bridgeCompiles()))
- yield {
- val underscored = version.replace('.', '_')
- val key = s"MILL_COMPILER_BRIDGE_$underscored"
- val value = compile.classes.path
- s"-D$key=$value"
- }
- scalaworker.testArgs() ++ bridgeArgs
+ val bridgeArgs =
+ for((version, compile) <- bridgeVersions.zip(bridgeCompiles()))
+ yield s"-DMILL_COMPILER_BRIDGE_${version.replace('.', '_')}=${compile.classes.path}"
+
+
+ val genIdeaArgs =
+ genTask(moduledefs)() ++
+ genTask(core)() ++
+ genTask(scalalib)() ++
+ genTask(scalajslib)()
+
+ scalaworker.testArgs() ++
+ bridgeArgs ++
+ Seq("-DMILL_BUILD_LIBRARIES=" + genIdeaArgs.map(_.path).mkString(","))
}
}
diff --git a/ci/test3.sh b/ci/test3.sh
index b10da68d..5b3b1a28 100755
--- a/ci/test3.sh
+++ b/ci/test3.sh
@@ -13,7 +13,7 @@ target/bin/mill devAssembly
# Second build & run tests using Mill
-out/devAssembly/dest --all {core,scalalib,scalajslib}.test devAssembly
-out/devAssembly/dest integration.test mill.integration.AmmoniteTests
-out/devAssembly/dest integration.test "mill.integration.{AcyclicTests,BetterFilesTests,JawnTests}"
-out/devAssembly/dest devAssembly
+out/devAssembly/dest/out.jar --all {core,scalalib,scalajslib}.test devAssembly
+out/devAssembly/dest/out.jar integration.test mill.integration.AmmoniteTests
+out/devAssembly/dest/out.jar integration.test "mill.integration.{AcyclicTests,BetterFilesTests,JawnTests}"
+out/devAssembly/dest/out.jar devAssembly
diff --git a/ci/test_all.sh b/ci/test_all.sh
index 558f76d6..74b6d203 100755
--- a/ci/test_all.sh
+++ b/ci/test_all.sh
@@ -12,4 +12,4 @@ sbt core/test scalalib/test scalajslib/test integration/test bin/test:assembly
target/bin/mill --all {core,scalalib,scalajslib,integration}.test devAssembly
# Second build & run tests using Mill
-out/devAssembly/dest --all {core,scalalib,scalajslib,integration}.test devAssembly \ No newline at end of file
+out/devAssembly/dest/out.jar --all {core,scalalib,scalajslib,integration}.test devAssembly \ No newline at end of file
diff --git a/core/src/mill/modules/Jvm.scala b/core/src/mill/modules/Jvm.scala
index d9abff86..fc1a1665 100644
--- a/core/src/mill/modules/Jvm.scala
+++ b/core/src/mill/modules/Jvm.scala
@@ -162,7 +162,7 @@ object Jvm {
def createJar(inputPaths: Agg[Path], mainClass: Option[String] = None)
(implicit ctx: Ctx.DestCtx): PathRef = {
- val outputPath = ctx.dest
+ val outputPath = ctx.dest / "out.jar"
rm(outputPath)
mkdir(outputPath/up)
@@ -200,7 +200,7 @@ object Jvm {
mainClass: Option[String] = None,
prependShellScript: String = "")
(implicit ctx: Ctx.DestCtx): PathRef = {
- val outputPath = ctx.dest
+ val outputPath = ctx.dest / "out.jar"
rm(outputPath)
if(inputPaths.nonEmpty) {
diff --git a/readme.md b/readme.md
index 794ba567..5552e402 100644
--- a/readme.md
+++ b/readme.md
@@ -313,7 +313,7 @@ sbt bin/test:assembly
target/bin/mill devAssembly
# Build Mill executable using the Mill executable generated by Mill itself
-out/devAssembly/dest devAssembly
+out/devAssembly/dest/out.jar devAssembly
```
Eventually, as Mill stabilizes, we will get rid of the SBT build entirely and
diff --git a/scalalib/src/mill/scalalib/GenIdea.scala b/scalalib/src/mill/scalalib/GenIdea.scala
index 45475368..a6551535 100644
--- a/scalalib/src/mill/scalalib/GenIdea.scala
+++ b/scalalib/src/mill/scalalib/GenIdea.scala
@@ -28,8 +28,11 @@ object GenIdea {
def xmlFileLayout[T](evaluator: Evaluator[T], rootModule: mill.Module): Seq[(RelPath, scala.xml.Node)] = {
+ val modules = rootModule.millInternal.segmentsToModules.values
+ .collect{ case x: scalalib.ScalaModule => (x.millModuleSegments, x)}
+ .toSeq
- val modules = rootModule.millInternal.segmentsToModules.values.collect{case x: scalalib.ScalaModule => (x.millModuleSegments, x)}.toSeq
+ val buildLibraryPaths = Agg.from(sys.props("MILL_BUILD_LIBRARIES").split(',').map(Path(_)).distinct)
val resolved = for((path, mod) <- modules) yield {
val Seq(resolvedCp: Loose.Agg[PathRef], resolvedSrcs: Loose.Agg[PathRef]) =
@@ -40,19 +43,9 @@ object GenIdea {
}
val moduleLabels = modules.map(_.swap).toMap
- val fixedFiles = Seq(
- Tuple2(".idea"/"misc.xml", miscXmlTemplate()),
- Tuple2(
- ".idea"/"modules.xml",
- allModulesXmlTemplate(
- for((path, mod) <- modules)
- yield moduleName(path)
- )
- ),
- Tuple2(".idea_modules"/"root.iml", rootXmlTemplate())
- )
- val allResolved = resolved.flatMap(_._2).distinct
+
+ val allResolved = resolved.flatMap(_._2) ++ buildLibraryPaths
val minResolvedLength = allResolved.map(_.segments.length).min
val commonPrefix = allResolved.map(_.segments.take(minResolvedLength))
.transpose
@@ -63,12 +56,37 @@ object GenIdea {
.map{p => (p, p.segments.drop(commonPrefix).mkString("_"))}
.toMap
+ val fixedFiles = Seq(
+ Tuple2(".idea"/"misc.xml", miscXmlTemplate()),
+ Tuple2(".idea"/"scala_settings.xml", scalaSettingsTemplate()),
+ Tuple2(
+ ".idea"/"modules.xml",
+ allModulesXmlTemplate(
+ for((path, mod) <- modules)
+ yield moduleName(path)
+ )
+ ),
+ Tuple2(
+ ".idea_modules"/"root.iml",
+ rootXmlTemplate(
+ for(path <- buildLibraryPaths)
+ yield pathToLibName(path)
+ )
+ )
+ )
+
val libraries = allResolved.map{path =>
val url = "jar://" + path + "!/"
val name = pathToLibName(path)
Tuple2(".idea"/'libraries/s"$name.xml", libraryXmlTemplate(name, url))
}
+ val buildLibraries = buildLibraryPaths.map{path =>
+ val url = "jar://" + path + "!/"
+ val name = pathToLibName(path)
+ Tuple2(".idea"/'libraries/s"$name.xml", libraryXmlTemplate(name, url))
+ }
+
val moduleFiles = resolved.map{ case (path, resolvedDeps, mod) =>
val Seq(
resoucesPathRefs: Loose.Agg[PathRef],
@@ -95,7 +113,8 @@ object GenIdea {
)
Tuple2(".idea_modules"/s"${moduleName(path)}.iml", elem)
}
- fixedFiles ++ libraries ++ moduleFiles
+
+ fixedFiles ++ libraries ++ moduleFiles ++ buildLibraries
}
@@ -111,6 +130,14 @@ object GenIdea {
case (sb, Segment.Cross(s)) => sb.append("-").append(s.mkString("-"))
}.mkString.toLowerCase()
+ def scalaSettingsTemplate() = {
+
+ <project version="4">
+ <component name="ScalaProjectSettings">
+ <option name="scFileMode" value="Ammonite" />
+ </component>
+ </project>
+ }
def miscXmlTemplate() = {
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8 (1)" project-jdk-type="JavaSDK">
@@ -136,7 +163,7 @@ object GenIdea {
</component>
</project>
}
- def rootXmlTemplate() = {
+ def rootXmlTemplate(libNames: Strict.Agg[String]) = {
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager">
<output url="file://$MODULE_DIR$/../out"/>
@@ -144,6 +171,10 @@ object GenIdea {
<exclude-output/>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
+ {
+ for(name <- libNames.toSeq.sorted)
+ yield <orderEntry type="library" name={name} level="project" />
+ }
</component>
</module>
}