Skip to content

Commit 1becd2d

Browse files
Merge pull request #1531 from alexarchambault/package-python
Make package --python work
2 parents e9402bf + 9c98028 commit 1becd2d

File tree

19 files changed

+148
-49
lines changed

19 files changed

+148
-49
lines changed

build.sc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,12 @@ object dummy extends Module {
181181
Deps.scalafmtCli
182182
)
183183
}
184+
object pythonInterface extends JavaModule with Bloop.Module {
185+
def skipBloop = true
186+
def ivyDeps = Agg(
187+
Deps.pythonInterface
188+
)
189+
}
184190
}
185191

186192
trait BuildMacros extends ScalaCliSbtModule
@@ -664,6 +670,9 @@ trait Cli extends SbtModule with ProtoBuildModule with CliLaunchers
664670
|
665671
|/** Build-time constants. Generated by mill. */
666672
|object Constants {
673+
| def pythonInterfaceOrg = "${Deps.pythonInterface.dep.module.organization.value}"
674+
| def pythonInterfaceName = "${Deps.pythonInterface.dep.module.name.value}"
675+
| def pythonInterfaceVersion = "${Deps.pythonInterface.dep.version}"
667676
| def launcherTypeResourcePath = "${launcherTypeResourcePath.toString}"
668677
| def defaultFilesResourcePath = "$defaultFilesResourcePath"
669678
| def maxAmmoniteScala3Version = "${Scala.maxAmmoniteScala3Version}"

modules/cli/src/main/scala/scala/cli/commands/package0/Package.scala

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package scala.cli.commands.package0
33
import ai.kien.python.Python
44
import caseapp.*
55
import coursier.launcher.*
6+
import dependency.*
67
import packager.config.*
78
import packager.deb.DebianPackage
89
import packager.docker.DockerPackage
@@ -36,7 +37,7 @@ import scala.cli.commands.util.BuildCommandHelpers
3637
import scala.cli.commands.{CommandUtils, ScalaCommand, WatchUtil}
3738
import scala.cli.config.{ConfigDb, Keys}
3839
import scala.cli.errors.ScalaJsLinkingError
39-
import scala.cli.internal.{CachedBinary, ProcUtil, ScalaJsLinker}
40+
import scala.cli.internal.{CachedBinary, Constants, ProcUtil, ScalaJsLinker}
4041
import scala.cli.packaging.{Library, NativeImage}
4142
import scala.util.Properties
4243

@@ -300,7 +301,7 @@ object Package extends ScalaCommand[PackageOptions] with BuildCommandHelpers {
300301

301302
val outputPath = packageType match {
302303
case PackageType.Bootstrap =>
303-
value(bootstrap(build, destPath, value(mainClass), () => alreadyExistsCheck()))
304+
value(bootstrap(build, destPath, value(mainClass), () => alreadyExistsCheck(), logger))
304305
destPath
305306
case PackageType.LibraryJar =>
306307
val content = Library.libraryJar(build)
@@ -391,7 +392,15 @@ object Package extends ScalaCommand[PackageOptions] with BuildCommandHelpers {
391392

392393
case nativePackagerType: PackageType.NativePackagerType =>
393394
val bootstrapPath = os.temp.dir(prefix = "scala-packager") / "app"
394-
value(bootstrap(build, bootstrapPath, value(mainClass), () => alreadyExistsCheck()))
395+
value {
396+
bootstrap(
397+
build,
398+
bootstrapPath,
399+
value(mainClass),
400+
() => alreadyExistsCheck(),
401+
logger
402+
)
403+
}
395404
val sharedSettings = SharedSettings(
396405
sourceAppPath = bootstrapPath,
397406
version = packageOptions.packageVersion,
@@ -627,7 +636,7 @@ object Package extends ScalaCommand[PackageOptions] with BuildCommandHelpers {
627636

628637
val appPath = os.temp.dir(prefix = "scala-cli-docker") / "app"
629638
build.options.platform.value match {
630-
case Platform.JVM => value(bootstrap(build, appPath, mainClass, () => Right(())))
639+
case Platform.JVM => value(bootstrap(build, appPath, mainClass, () => Right(()), logger))
631640
case Platform.JS => buildJs(build, appPath, mainClass, logger)
632641
case Platform.Native =>
633642
val dest = value(buildNative(build, mainClass, logger))
@@ -669,7 +678,8 @@ object Package extends ScalaCommand[PackageOptions] with BuildCommandHelpers {
669678
build: Build.Successful,
670679
destPath: os.Path,
671680
mainClass: String,
672-
alreadyExistsCheck: () => Either[BuildException, Unit]
681+
alreadyExistsCheck: () => Either[BuildException, Unit],
682+
logger: Logger
673683
): Either[BuildException, Unit] = either {
674684
val byteCodeZipEntries = os.walk(build.output)
675685
.filter(os.isFile(_))
@@ -708,10 +718,41 @@ object Package extends ScalaCommand[PackageOptions] with BuildCommandHelpers {
708718
.withOsKind(Properties.isWin)
709719
.callsItself(Properties.isWin)
710720
.withJavaOpts(build.options.javaOptions.javaOpts.toSeq.map(_.value.value))
711-
val params = Parameters.Bootstrap(Seq(loaderContent), mainClass)
721+
val baseParams = Parameters.Bootstrap(Seq(loaderContent), mainClass)
712722
.withDeterministic(true)
713723
.withPreamble(preamble)
714724

725+
val params =
726+
if (build.options.notForBloopOptions.doSetupPython.getOrElse(false)) {
727+
val res = value {
728+
Artifacts.fetch(
729+
Positioned.none(Seq(
730+
dep"${Constants.pythonInterfaceOrg}:${Constants.pythonInterfaceName}:${Constants.pythonInterfaceVersion}"
731+
)),
732+
Nil,
733+
None,
734+
logger,
735+
build.options.finalCache,
736+
None,
737+
Some(_)
738+
)
739+
}
740+
val entries = res.artifacts.map {
741+
case (a, f) =>
742+
val path = os.Path(f)
743+
if (build.options.notForBloopOptions.packageOptions.isStandalone)
744+
ClassPathEntry.Resource(path.last, os.mtime(path), os.read.bytes(path))
745+
else
746+
ClassPathEntry.Url(a.url)
747+
}
748+
val pythonContent = Seq(
749+
ClassLoaderContent(entries)
750+
)
751+
baseParams.addExtraContent("python", pythonContent).withPython(true)
752+
}
753+
else
754+
baseParams
755+
715756
value(alreadyExistsCheck())
716757
BootstrapGenerator.generate(params, destPath.toNIO)
717758
ProcUtil.maybeUpdatePreamble(destPath)

modules/cli/src/main/scala/scala/cli/commands/publish/Publish.scala

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ object Publish extends ScalaCommand[PublishOptions] with BuildCommandHelpers {
7070
publishParams: PublishParamsOptions,
7171
sharedPublish: SharedPublishOptions,
7272
publishRepo: PublishRepositoryOptions,
73-
sharedPython: SharedPythonOptions,
7473
scalaSigning: PgpScalaSigningOptions,
7574
mainClass: MainClassOptions,
7675
ivy2LocalLike: Option[Boolean]
@@ -156,10 +155,7 @@ object Publish extends ScalaCommand[PublishOptions] with BuildCommandHelpers {
156155
useJvm = scalaSigning.forceJvmSigningCli,
157156
javaArgs = scalaSigning.signingCliJavaArg
158157
)
159-
),
160-
python = sharedPython.python,
161-
pythonSetup = sharedPython.pythonSetup,
162-
scalaPyVersion = sharedPython.scalaPyVersion
158+
)
163159
)
164160
)
165161
}
@@ -191,7 +187,6 @@ object Publish extends ScalaCommand[PublishOptions] with BuildCommandHelpers {
191187
options.publishParams,
192188
options.sharedPublish,
193189
options.publishRepo,
194-
options.sharedPython,
195190
options.signingCli,
196191
options.mainClass,
197192
options.ivy2LocalLike

modules/cli/src/main/scala/scala/cli/commands/publish/PublishLocal.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ object PublishLocal extends ScalaCommand[PublishLocalOptions] {
3737
options.publishParams,
3838
options.sharedPublish,
3939
PublishRepositoryOptions(),
40-
options.sharedPython,
4140
options.scalaSigning,
4241
options.mainClass,
4342
None

modules/cli/src/main/scala/scala/cli/commands/publish/PublishLocalOptions.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ final case class PublishLocalOptions(
2626
publishParams: PublishParamsOptions = PublishParamsOptions(),
2727
@Recurse
2828
sharedPublish: SharedPublishOptions = SharedPublishOptions(),
29-
@Recurse
30-
sharedPython: SharedPythonOptions = SharedPythonOptions(),
3129
@Recurse
3230
scalaSigning: PgpScalaSigningOptions = PgpScalaSigningOptions(),
3331
) extends HasSharedOptions

modules/cli/src/main/scala/scala/cli/commands/publish/PublishOptions.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ final case class PublishOptions(
2121
publishRepo: PublishRepositoryOptions = PublishRepositoryOptions(),
2222
@Recurse
2323
sharedPublish: SharedPublishOptions = SharedPublishOptions(),
24-
@Recurse
25-
sharedPython: SharedPythonOptions = SharedPythonOptions(),
2624
@Recurse
2725
signingCli: PgpScalaSigningOptions = PgpScalaSigningOptions(),
2826

modules/cli/src/main/scala/scala/cli/commands/repl/Repl.scala

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,6 @@ object Repl extends ScalaCommand[ReplOptions] {
7878
ammoniteVersionOpt = ammoniteVersion.map(_.trim).filter(_.nonEmpty),
7979
ammoniteArgs = ammoniteArg
8080
),
81-
python = sharedPython.python,
82-
pythonSetup = sharedPython.pythonSetup,
83-
scalaPyVersion = sharedPython.scalaPyVersion,
8481
addRunnerDependencyOpt = baseOptions.notForBloopOptions.addRunnerDependencyOpt
8582
.orElse(Some(false))
8683
)

modules/cli/src/main/scala/scala/cli/commands/repl/SharedReplOptions.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ final case class SharedReplOptions(
1919
watch: SharedWatchOptions = SharedWatchOptions(),
2020
@Recurse
2121
compileCross: CrossOptions = CrossOptions(),
22-
@Recurse
23-
sharedPython: SharedPythonOptions = SharedPythonOptions(),
2422

2523
@Group("Repl")
2624
@Tag(tags.restricted)

modules/cli/src/main/scala/scala/cli/commands/run/Run.scala

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,6 @@ object Run extends ScalaCommand[RunOptions] with BuildCommandHelpers {
8989
),
9090
notForBloopOptions = baseOptions.notForBloopOptions.copy(
9191
runWithManifest = options.sharedRun.useManifest,
92-
python = options.sharedRun.sharedPython.python,
93-
pythonSetup = options.sharedRun.sharedPython.pythonSetup,
94-
scalaPyVersion = options.sharedRun.sharedPython.scalaPyVersion,
9592
addRunnerDependencyOpt = baseOptions.notForBloopOptions.addRunnerDependencyOpt.orElse {
9693
runMode(options) match {
9794
case _: RunMode.Spark | RunMode.HadoopJar =>

modules/cli/src/main/scala/scala/cli/commands/run/SharedRunOptions.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ final case class SharedRunOptions(
2525
compileCross: CrossOptions = CrossOptions(),
2626
@Recurse
2727
mainClass: MainClassOptions = MainClassOptions(),
28-
@Recurse
29-
sharedPython: SharedPythonOptions = SharedPythonOptions(),
3028
@Group("Run")
3129
@Hidden
3230
@Tag(tags.experimental)

0 commit comments

Comments
 (0)