Skip to content

Commit 21c3a8a

Browse files
committed
Pass java options to new package
1 parent 7305250 commit 21c3a8a

File tree

5 files changed

+89
-5
lines changed

5 files changed

+89
-5
lines changed

modules/cli-options/src/main/scala/scala/cli/commands/PackageOptions.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ final case class PackageOptions(
1010
shared: SharedOptions = SharedOptions(),
1111
@Recurse
1212
watch: SharedWatchOptions = SharedWatchOptions(),
13+
@Recurse
14+
java: SharedJavaOptions = SharedJavaOptions(),
1315
@Recurse
1416
compileCross: CompileCrossOptions = CompileCrossOptions(),
1517
@Recurse

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

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,8 @@ object Package extends ScalaCommand[PackageOptions] {
5353
// FIXME mainClass encoding has issues with special chars, such as '-'
5454

5555
val logger = options.shared.logger
56-
val initialBuildOptions = options.finalBuildOptions.orExit(logger)
56+
val initialBuildOptions = buildOptions(options)
5757
val threads = BuildThreads.create()
58-
5958
val compilerMaker = options.compilerMaker(threads)
6059
val docCompilerMakerOpt = options.docCompilerMakerOpt
6160

@@ -136,6 +135,16 @@ object Package extends ScalaCommand[PackageOptions] {
136135
}
137136
}
138137

138+
def buildOptions(options: PackageOptions) = {
139+
val finalBuildOptions = options.finalBuildOptions.orExit(options.shared.logger)
140+
val buildOptions = finalBuildOptions.copy(javaOptions =
141+
finalBuildOptions.javaOptions.copy(javacOptions =
142+
finalBuildOptions.javaOptions.javacOptions ++ options.java.allJavaOpts
143+
)
144+
)
145+
buildOptions
146+
}
147+
139148
private def doPackage(
140149
logger: Logger,
141150
outputOpt: Option[String],
@@ -166,7 +175,7 @@ object Package extends ScalaCommand[PackageOptions] {
166175
case (_, _) if build.options.notForBloopOptions.packageOptions.isDockerEnabled =>
167176
for (basePackageType <- basePackageTypeOpt)
168177
Left(new MalformedCliInputError(
169-
s"Unsuported package type: $basePackageType for Docker."
178+
s"Unsupported package type: $basePackageType for Docker."
170179
))
171180
Right(PackageType.Docker)
172181
case (_, Platform.JS) =>
@@ -175,7 +184,7 @@ object Package extends ScalaCommand[PackageOptions] {
175184
yield
176185
if (validPackageScalaJS.contains(basePackageType)) Right(basePackageType)
177186
else Left(new MalformedCliInputError(
178-
s"Unsuported package type: $basePackageType for Scala.js."
187+
s"Unsupported package type: $basePackageType for Scala.js."
179188
))
180189
validatedPackageType.getOrElse(Right(PackageType.Js))
181190
case (_, Platform.Native) =>
@@ -184,7 +193,7 @@ object Package extends ScalaCommand[PackageOptions] {
184193
yield
185194
if (validPackageScalaNative.contains(basePackageType)) Right(basePackageType)
186195
else Left(new MalformedCliInputError(
187-
s"Unsuported package type: $basePackageType for Scala Native."
196+
s"Unsupported package type: $basePackageType for Scala Native."
188197
))
189198
validatedPackageType.getOrElse(Right(PackageType.Native))
190199
case _ => Right(basePackageTypeOpt.getOrElse(PackageType.Bootstrap))
@@ -652,6 +661,7 @@ object Package extends ScalaCommand[PackageOptions] {
652661
val preamble = Preamble()
653662
.withOsKind(Properties.isWin)
654663
.callsItself(Properties.isWin)
664+
.withJavaOpts(build.options.javaOptions.javacOptions)
655665
val params = Parameters.Bootstrap(Seq(loaderContent), mainClass)
656666
.withDeterministic(true)
657667
.withPreamble(preamble)

modules/integration/src/test/scala/scala/cli/integration/PackageTestDefinitions.scala

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -766,4 +766,74 @@ abstract class PackageTestDefinitions(val scalaVersionOpt: Option[String])
766766
expect(mainClasses == Set(scalaFile1, scalaFile2, s"$scriptsDir.${scriptName}_sc"))
767767
}
768768
}
769+
770+
test("pass java options") {
771+
val fileName = "Hello.scala"
772+
val destFile = if (Properties.isWin) "hello.bat" else "hello"
773+
val (fooProp, barProp) = ("abc", "xyz")
774+
val inputs = TestInputs(
775+
Seq(
776+
os.rel / fileName ->
777+
s"""object Hello {
778+
| def main(args: Array[String]): Unit =
779+
| println(s"$${sys.props("foo")}$${sys.props("bar")}")
780+
|}
781+
|""".stripMargin
782+
)
783+
)
784+
inputs.fromRoot { root =>
785+
os.proc(
786+
TestUtil.cli,
787+
"package",
788+
fileName,
789+
"-o",
790+
destFile,
791+
"--java-prop",
792+
s"foo=$fooProp",
793+
"--java-opt",
794+
s"-Dbar=$barProp",
795+
"-f"
796+
).call(cwd = root)
797+
val output = os.proc(root / destFile).call(cwd = root).out.text().trim
798+
expect(output == s"$fooProp$barProp")
799+
}
800+
}
801+
802+
def javaOptionsDockerTest(): Unit = {
803+
val fileName = "Hello.scala"
804+
val imageName = "hello"
805+
val (fooProp, barProp) = ("abc", "xyz")
806+
val inputs = TestInputs(
807+
Seq(
808+
os.rel / fileName ->
809+
s"""object Hello {
810+
| def main(args: Array[String]): Unit =
811+
| println(s"$${sys.props("foo")}$${sys.props("bar")}")
812+
|}
813+
|""".stripMargin
814+
)
815+
)
816+
inputs.fromRoot { root =>
817+
os.proc(
818+
TestUtil.cli,
819+
"package",
820+
fileName,
821+
"--docker",
822+
"--docker-image-repository",
823+
imageName,
824+
"--java-prop",
825+
s"foo=$fooProp",
826+
"--java-opt",
827+
s"-Dbar=$barProp",
828+
"-f"
829+
).call(cwd = root)
830+
val output = os.proc("docker", "run", imageName).call(cwd = root).out.text().trim
831+
expect(output == s"$fooProp$barProp")
832+
}
833+
}
834+
835+
if (Properties.isLinux)
836+
test("pass java options to docker") {
837+
javaOptionsDockerTest()
838+
}
769839
}

website/docs/reference/cli-options.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -645,6 +645,7 @@ Binary directory
645645
## Java options
646646

647647
Available in commands:
648+
- [`package`](./commands.md#package)
648649
- [`console` / `repl`](./commands.md#console)
649650
- [`run`](./commands.md#run)
650651
- [`shebang`](./commands.md#shebang)

website/docs/reference/commands.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ Accepts options:
176176
- [dependency](./cli-options.md#dependency-options)
177177
- [directories](./cli-options.md#directories-options)
178178
- [help group](./cli-options.md#help-group-options)
179+
- [java](./cli-options.md#java-options)
179180
- [jvm](./cli-options.md#jvm-options)
180181
- [logging](./cli-options.md#logging-options)
181182
- [main class](./cli-options.md#main-class-options)

0 commit comments

Comments
 (0)