diff --git a/docs/modules/ROOT/pages/large/multi-file-builds.adoc b/docs/modules/ROOT/pages/large/multi-file-builds.adoc index d40b940ed24..4b94d0aee2d 100644 --- a/docs/modules/ROOT/pages/large/multi-file-builds.adoc +++ b/docs/modules/ROOT/pages/large/multi-file-builds.adoc @@ -9,8 +9,5 @@ include::partial$example/large/multi/10-multi-file-builds.adoc[] include::partial$example/large/multi/11-helper-files.adoc[] -== Legacy `.sc` extension - -include::partial$example/large/multi/12-helper-files-sc.adoc[] diff --git a/example/large/multi/11-helper-files/build.mill b/example/large/multi/11-helper-files/build.mill index 1fde0fa661c..a2714f56d6e 100644 --- a/example/large/multi/11-helper-files/build.mill +++ b/example/large/multi/11-helper-files/build.mill @@ -5,8 +5,7 @@ package build import $packages._ import mill._, scalalib._ -import $file.foo.versions -import $file.util.MyModule +import foo.versions object `package` extends RootModule with MyModule { def forkEnv = Map( diff --git a/example/large/multi/11-helper-files/foo/package.mill b/example/large/multi/11-helper-files/foo/package.mill index a28fe0a29ce..d18830cde26 100644 --- a/example/large/multi/11-helper-files/foo/package.mill +++ b/example/large/multi/11-helper-files/foo/package.mill @@ -1,10 +1,9 @@ package build.foo import mill._, scalalib._ -import $file.util -import $file.foo.versions.myProjectVersion -object `package` extends RootModule with build_.util.MyModule { +import versions.myProjectVersion +object `package` extends RootModule with build.MyModule { def forkEnv = Map( - "MY_SCALA_VERSION" -> util.myScalaVersion, + "MY_SCALA_VERSION" -> build.myScalaVersion, "MY_PROJECT_VERSION" -> myProjectVersion ) } diff --git a/example/large/multi/13-helper-files-mill-scala/build.mill.scala b/example/large/multi/12-helper-files-mill-scala/build.mill.scala similarity index 91% rename from example/large/multi/13-helper-files-mill-scala/build.mill.scala rename to example/large/multi/12-helper-files-mill-scala/build.mill.scala index 35ce38e6611..e5b74ab429f 100644 --- a/example/large/multi/13-helper-files-mill-scala/build.mill.scala +++ b/example/large/multi/12-helper-files-mill-scala/build.mill.scala @@ -1,13 +1,11 @@ package build import $packages._ import mill._, scalalib._ -import $file.foo.versions -import $file.util.MyModule object `package` extends RootModule with MyModule { def forkEnv = Map( "MY_SCALA_VERSION" -> build.scalaVersion(), - "MY_PROJECT_VERSION" -> versions.myProjectVersion + "MY_PROJECT_VERSION" -> build.foo.myProjectVersion ) } ///** See Also: util.mill.scala */ diff --git a/example/large/multi/12-helper-files-mill-scala/foo/package.mill.scala b/example/large/multi/12-helper-files-mill-scala/foo/package.mill.scala new file mode 100644 index 00000000000..5dc502277a2 --- /dev/null +++ b/example/large/multi/12-helper-files-mill-scala/foo/package.mill.scala @@ -0,0 +1,8 @@ +package build.foo +import mill._, scalalib._ +object `package` extends RootModule with build.MyModule { + def forkEnv = Map( + "MY_SCALA_VERSION" -> build.myScalaVersion, + "MY_PROJECT_VERSION" -> myProjectVersion + ) +} diff --git a/example/large/multi/12-helper-files-sc/foo/src/Foo.scala b/example/large/multi/12-helper-files-mill-scala/foo/src/Foo.scala similarity index 100% rename from example/large/multi/12-helper-files-sc/foo/src/Foo.scala rename to example/large/multi/12-helper-files-mill-scala/foo/src/Foo.scala diff --git a/example/large/multi/13-helper-files-mill-scala/foo/versions.mill.scala b/example/large/multi/12-helper-files-mill-scala/foo/versions.mill.scala similarity index 100% rename from example/large/multi/13-helper-files-mill-scala/foo/versions.mill.scala rename to example/large/multi/12-helper-files-mill-scala/foo/versions.mill.scala diff --git a/example/large/multi/12-helper-files-sc/src/Main.scala b/example/large/multi/12-helper-files-mill-scala/src/Main.scala similarity index 100% rename from example/large/multi/12-helper-files-sc/src/Main.scala rename to example/large/multi/12-helper-files-mill-scala/src/Main.scala diff --git a/example/large/multi/13-helper-files-mill-scala/util.mill.scala b/example/large/multi/12-helper-files-mill-scala/util.mill.scala similarity index 100% rename from example/large/multi/13-helper-files-mill-scala/util.mill.scala rename to example/large/multi/12-helper-files-mill-scala/util.mill.scala diff --git a/example/large/multi/12-helper-files-sc/build.sc b/example/large/multi/12-helper-files-sc/build.sc deleted file mode 100644 index e82973e3353..00000000000 --- a/example/large/multi/12-helper-files-sc/build.sc +++ /dev/null @@ -1,35 +0,0 @@ -// To ease the migration from Mill 0.11.x, the older `.sc` file extension is also supported -// for Mill build files, and the `package` declaration is optional in such files. Note that -// this means that IDE support using `.sc` files will not be as good as IDE support using the -// current `.mill` extension with `package` declaration, so you should use `.mill` whenever -// possible - -import mill._, scalalib._ -import $packages._ -import $file.foo.versions -import $file.util, util.MyModule - -object `package` extends RootModule with MyModule { - def forkEnv = T { - Map( - "MY_SCALA_VERSION" -> build.scalaVersion(), - "MY_PROJECT_VERSION" -> versions.myProjectVersion - ) - } -} - -/** See Also: util.sc */ -/** See Also: foo/package.sc */ -/** See Also: foo/versions.sc */ - -/** Usage - -> ./mill run -Main Env build.util.myScalaVersion: 2.13.14 -Main Env build.foo.versions.myProjectVersion: 0.0.1 - -> ./mill foo.run -Foo Env build.util.myScalaVersion: 2.13.14 -Foo Env build.foo.versions.myProjectVersion: 0.0.1 - -*/ diff --git a/example/large/multi/12-helper-files-sc/foo/package.sc b/example/large/multi/12-helper-files-sc/foo/package.sc deleted file mode 100644 index 15c0e1ab727..00000000000 --- a/example/large/multi/12-helper-files-sc/foo/package.sc +++ /dev/null @@ -1,9 +0,0 @@ -import mill._, scalalib._ -import $file.^.util -import $file.versions, versions.myProjectVersion -object `package` extends RootModule with build_.util.MyModule { - def forkEnv = Map( - "MY_SCALA_VERSION" -> util.myScalaVersion, - "MY_PROJECT_VERSION" -> myProjectVersion - ) -} diff --git a/example/large/multi/12-helper-files-sc/foo/versions.sc b/example/large/multi/12-helper-files-sc/foo/versions.sc deleted file mode 100644 index 002f35f1335..00000000000 --- a/example/large/multi/12-helper-files-sc/foo/versions.sc +++ /dev/null @@ -1 +0,0 @@ -def myProjectVersion = "0.0.1" diff --git a/example/large/multi/12-helper-files-sc/util.sc b/example/large/multi/12-helper-files-sc/util.sc deleted file mode 100644 index dca710e79d8..00000000000 --- a/example/large/multi/12-helper-files-sc/util.sc +++ /dev/null @@ -1,7 +0,0 @@ -import mill._, scalalib._ - -def myScalaVersion = "2.13.14" - -trait MyModule extends ScalaModule { - def scalaVersion = myScalaVersion -} diff --git a/example/large/multi/13-helper-files-mill-scala/foo/package.mill.scala b/example/large/multi/13-helper-files-mill-scala/foo/package.mill.scala deleted file mode 100644 index a28fe0a29ce..00000000000 --- a/example/large/multi/13-helper-files-mill-scala/foo/package.mill.scala +++ /dev/null @@ -1,10 +0,0 @@ -package build.foo -import mill._, scalalib._ -import $file.util -import $file.foo.versions.myProjectVersion -object `package` extends RootModule with build_.util.MyModule { - def forkEnv = Map( - "MY_SCALA_VERSION" -> util.myScalaVersion, - "MY_PROJECT_VERSION" -> myProjectVersion - ) -} diff --git a/example/large/multi/13-helper-files-mill-scala/foo/src/Foo.scala b/example/large/multi/13-helper-files-mill-scala/foo/src/Foo.scala deleted file mode 100644 index 08fe8028aac..00000000000 --- a/example/large/multi/13-helper-files-mill-scala/foo/src/Foo.scala +++ /dev/null @@ -1,8 +0,0 @@ -package foo - -object Foo { - def main(args: Array[String]): Unit = { - println("Foo Env build.util.myScalaVersion: " + sys.env("MY_SCALA_VERSION")) - println("Foo Env build.foo.versions.myProjectVersion: " + sys.env("MY_PROJECT_VERSION")) - } -} diff --git a/example/large/multi/13-helper-files-mill-scala/src/Main.scala b/example/large/multi/13-helper-files-mill-scala/src/Main.scala deleted file mode 100644 index f8e6fdfa68f..00000000000 --- a/example/large/multi/13-helper-files-mill-scala/src/Main.scala +++ /dev/null @@ -1,6 +0,0 @@ -object Main { - def main(args: Array[String]): Unit = { - println("Main Env build.util.myScalaVersion: " + sys.env("MY_SCALA_VERSION")) - println("Main Env build.foo.versions.myProjectVersion: " + sys.env("MY_PROJECT_VERSION")) - } -} diff --git a/runner/src/mill/runner/CodeGen.scala b/runner/src/mill/runner/CodeGen.scala index 6a588295615..05f9a37ed71 100644 --- a/runner/src/mill/runner/CodeGen.scala +++ b/runner/src/mill/runner/CodeGen.scala @@ -51,10 +51,10 @@ object CodeGen { } .distinct - val pkg = packageSegments.drop(1).dropRight(1) + val pkgSegments = packageSegments.drop(1).dropRight(1) def pkgSelector0(pre: Option[String], s: Option[String]) = - (pre ++ pkg ++ s).map(backtickWrap).mkString(".") + (pre ++ pkgSegments ++ s).map(backtickWrap).mkString(".") def pkgSelector2(s: Option[String]) = s"_root_.${pkgSelector0(Some(globalPackagePrefix), s)}" val (childSels, childAliases0) = childNames .map { c => @@ -67,7 +67,7 @@ object CodeGen { }.unzip val childAliases = childAliases0.mkString("\n") - val pkgLine = s"package ${pkgSelector0(Some(globalPackagePrefix), None)}" + val pkg = pkgSelector0(Some(globalPackagePrefix), None) val aliasImports = Seq( // `$file` as an alias for `build_` to make usage of `import $file` when importing @@ -87,7 +87,7 @@ object CodeGen { val parts = if (!isBuildScript) { - s"""$pkgLine + s"""package $pkg |$aliasImports |object ${backtickWrap(scriptPath.last.split('.').head)} { |$markerComment @@ -103,11 +103,16 @@ object CodeGen { scriptPath, scriptFolderPath, childAliases, - pkgLine, + pkg, aliasImports, scriptCode, markerComment, - parser + parser, + scriptSources + .map(_.path) + .filter(_ != scriptPath) + .filter(p => (p / os.up) == (scriptPath / os.up)) + .map(_.last.split('.').head) ) } @@ -124,19 +129,25 @@ object CodeGen { scriptPath: os.Path, scriptFolderPath: os.Path, childAliases: String, - pkgLine: String, + pkg: String, aliasImports: String, scriptCode: String, markerComment: String, - parser: MillScalaParser + parser: MillScalaParser, + siblingScripts: Seq[String] ) = { val segments = scriptFolderPath.relativeTo(projectRoot).segments - val prelude = { + val exportSiblingScripts = + siblingScripts.map(s => s"export $pkg.${backtickWrap(s)}.*").mkString("\n") + + val importSiblingScripts = siblingScripts + .map(s => s"import $pkg.${backtickWrap(s)}.*").mkString("\n") + + val prelude = s"""import MillMiscInfo._ |import _root_.mill.main.TokenReaders.given, _root_.mill.api.JsonFormatters.given |""".stripMargin - } val miscInfo = if (segments.nonEmpty) subfolderMiscInfo(scriptFolderPath, segments) @@ -196,23 +207,32 @@ object CodeGen { newScriptCode = objectData.name.applyTo(newScriptCode, wrapperObjectName) newScriptCode = objectData.obj.applyTo(newScriptCode, "abstract class") - s"""$pkgLine + s"""package $pkg |$miscInfo |$aliasImports + |$importSiblingScripts |$prelude |$markerComment |$newScriptCode |object $wrapperObjectName extends $wrapperObjectName { | ${childAliases.linesWithSeparators.mkString(" ")} + | $exportSiblingScripts | ${millDiscover(segments.nonEmpty)} |}""".stripMargin case None => - s"""$pkgLine + s"""package $pkg |$miscInfo |$aliasImports + |$importSiblingScripts |$prelude - |${topBuildHeader(segments, scriptFolderPath, millTopLevelProjectRoot, childAliases)} + |${topBuildHeader( + segments, + scriptFolderPath, + millTopLevelProjectRoot, + childAliases, + exportSiblingScripts + )} |$markerComment |$scriptCode |}""".stripMargin @@ -263,7 +283,8 @@ object CodeGen { segments: Seq[String], scriptFolderPath: os.Path, millTopLevelProjectRoot: os.Path, - childAliases: String + childAliases: String, + exportSiblingScripts: String ): String = { val extendsClause = if (segments.nonEmpty) s"extends _root_.mill.main.SubfolderModule " @@ -277,8 +298,9 @@ object CodeGen { // path dependent types no longer match, e.g. for TokenReaders of custom types. // perhaps we can patch mainargs to substitute prefixes when summoning TokenReaders? // or, add an optional parameter to Discover.apply to substitute the outer class? - s"""object ${wrapperObjectName} extends $wrapperObjectName { + s"""object ${wrapperObjectName} extends $wrapperObjectName { | ${childAliases.linesWithSeparators.mkString(" ")} + | $exportSiblingScripts | ${millDiscover(segments.nonEmpty)} |} |abstract class $wrapperObjectName $extendsClause { this: $wrapperObjectName.type =>