Skip to content

Commit b60c19a

Browse files
Release 0.4.8 (#23)
* Sync with Scala Native 0.4.8 * Setup env in CI * Run scalafmt
1 parent e63d691 commit b60c19a

File tree

12 files changed

+146
-37
lines changed

12 files changed

+146
-37
lines changed

.github/workflows/CI.yml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,19 @@ jobs:
77
fail-fast: false
88
matrix:
99
OS: [ubuntu-22.04, windows-2022]
10-
scala: [2.12.15, 2.13.8, 3.2.0]
10+
scala: [2.12.17, 2.13.10, 3.2.1]
1111
steps:
1212
- uses: actions/checkout@v2
1313
- uses: olafurpg/setup-scala@v13
14+
- name: Set env Linux
15+
if: ${{ startsWith(matrix.OS, 'ubuntu') }}
16+
run: |
17+
export LLVM_BIN=$(dirname $(readlink -f /usr/bin/clang))
18+
echo "LLVM_BIN=${LLVM_BIN}" >> $GITHUB_ENV
19+
1420
- name: Test
1521
run: >
16-
sbt 'set cli/scalaVersion := "${{matrix.scala}}"'
17-
+cli/test
18-
+cliScriptedTests/scripted
22+
sbt 'set cli/scalaVersion := "${{matrix.scala}}"'
23+
+cli/test
24+
+cliScriptedTests/scripted
1925
shell: bash

build.sbt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
val crossScalaVersions212 = (13 to 16).map("2.12." + _)
2-
val crossScalaVersions213 = (4 to 8).map("2.13." + _)
3-
val crossScalaVersions3 = (0 to 3).map("3.1." + _) ++ (0 to 0).map("3.2." + _)
1+
val crossScalaVersions212 = (13 to 17).map("2.12." + _)
2+
val crossScalaVersions213 = (4 to 10).map("2.13." + _)
3+
val crossScalaVersions3 = (0 to 3).map("3.1." + _) ++ (0 to 1).map("3.2." + _)
44
val publishScalaVersions =
55
Seq(crossScalaVersions212, crossScalaVersions213).map(_.last) ++ Seq("3.1.3")
66

@@ -51,7 +51,7 @@ val cliAssemblyJarName = settingKey[String]("Name of created assembly jar")
5151
inThisBuild(
5252
Def.settings(
5353
organization := "org.scala-native",
54-
scalaNativeVersion := "0.4.7",
54+
scalaNativeVersion := "0.4.8",
5555
version := scalaNativeVersion.value,
5656
scalaVersion := crossScalaVersions212.last,
5757
crossScalaVersions := publishScalaVersions,
@@ -71,7 +71,8 @@ inThisBuild(
7171
)
7272
),
7373
resolvers += Resolver.sonatypeRepo("snapshots"),
74-
resolvers += Resolver.mavenCentral
74+
resolvers += Resolver.mavenCentral,
75+
resolvers += Resolver.defaultLocal
7576
)
7677
)
7778
val cliPackLibJars =

cli/src/main/scala/scala/scalanative/cli/ScalaNativeLd.scala

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package scala.scalanative.cli
22

3-
import scala.scalanative.build.Build
3+
import scala.scalanative.build._
44
import scala.scalanative.util.Scope
55
import scala.scalanative.cli.utils.ConfigConverter
6-
import scala.scalanative.cli.options.LinkerOptions
7-
import scala.scalanative.cli.options.BuildInfo
8-
import scala.scalanative.cli.options.ConfigOptions
9-
import scala.scalanative.cli.options.NativeConfigOptions
6+
import scala.scalanative.cli.options._
107

118
object ScalaNativeLd {
129

@@ -22,6 +19,7 @@ object ScalaNativeLd {
2219

2320
ConfigOptions.set(this)
2421
NativeConfigOptions.set(this)
22+
OptimizerConfigOptions.set(this)
2523

2624
note("Logger options:")
2725
opt[Unit]("verbose")
@@ -50,7 +48,11 @@ object ScalaNativeLd {
5048
}
5149

5250
def runLd(options: LinkerOptions) = {
53-
if (options.config.main.isEmpty) {
51+
val needsMain = options.nativeConfig.buildTarget match {
52+
case BuildTarget.Application => true
53+
case _: BuildTarget.Library => false
54+
}
55+
if (needsMain && options.config.main.isEmpty) {
5456
println("Required option not specified: --main")
5557
sys.exit(1)
5658
} else {
@@ -59,7 +61,7 @@ object ScalaNativeLd {
5961
ignoredArgs.foreach { arg =>
6062
println(s"Unrecognised argument: ${arg}")
6163
}
62-
val main = options.config.main.get
64+
val main = options.config.main
6365
val buildOptionsMaybe = ConfigConverter.convert(options, main, classpath)
6466

6567
buildOptionsMaybe match {

cli/src/main/scala/scala/scalanative/cli/options/ConfigOptions.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ object ConfigOptions {
1616
.valueName("<main>")
1717
.optional()
1818
.action((x, c) => c.copy(config = c.config.copy(main = Some(x))))
19-
.text("Required main class.")
19+
.text("Main class - entry point for application")
2020
parser
2121
.opt[String]('o', "outpath")
2222
.valueName("<output-path>")

cli/src/main/scala/scala/scalanative/cli/options/LinkerOptions.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ case class LinkerOptions(
44
classpath: List[String] = Nil,
55
config: ConfigOptions = ConfigOptions(),
66
nativeConfig: NativeConfigOptions = NativeConfigOptions(),
7+
optimizerConifg: OptimizerConfigOptions = OptimizerConfigOptions(),
78
verbose: Int = 0
89
)

cli/src/main/scala/scala/scalanative/cli/options/NativeConfigOptions.scala

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@ package scala.scalanative.cli.options
22

33
import scopt.OptionParser
44

5-
import scala.scalanative.build.LTO
6-
import scala.scalanative.build.Mode
7-
import scala.scalanative.build.GC
5+
import scala.scalanative.build._
86
import scala.scalanative.cli.utils.NativeConfigParserImplicits._
97

108
case class NativeConfigOptions(
119
mode: Mode = Mode.debug,
10+
buildTarget: BuildTarget = BuildTarget.application,
1211
lto: LTO = LTO.none,
1312
gc: GC = GC.immix,
1413
linkStubs: Boolean = false,
@@ -34,6 +33,16 @@ object NativeConfigOptions {
3433
.optional()
3534
.action((x, c) => c.copy(nativeConfig = c.nativeConfig.copy(mode = x)))
3635
.text("Scala Native compilation mode. [debug]")
36+
parser
37+
.opt[BuildTarget]("build-target")
38+
.valueName(
39+
"<build-target> (application, library-dynamic or library-static)"
40+
)
41+
.optional()
42+
.action((x, c) =>
43+
c.copy(nativeConfig = c.nativeConfig.copy(buildTarget = x))
44+
)
45+
.text("Scala Native build target. [application]")
3746
parser
3847
.opt[LTO]("lto")
3948
.valueName("<mode> (none, thin or full)")
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package scala.scalanative.cli.options
2+
3+
import scopt.OptionParser
4+
5+
case class OptimizerConfigOptions(
6+
maxInlineDepth: Option[Int] = None,
7+
maxCallerSize: Option[Int] = None,
8+
maxInlineSize: Option[Int] = None
9+
)
10+
11+
object OptimizerConfigOptions {
12+
def set(parser: OptionParser[LinkerOptions]) = {
13+
def update(c: LinkerOptions)(
14+
fn: OptimizerConfigOptions => OptimizerConfigOptions
15+
) =
16+
c.copy(optimizerConifg = fn(c.optimizerConifg))
17+
parser.note("Optimizer options:")
18+
parser
19+
.opt[Int]("max-inline-depth")
20+
.optional()
21+
.action((x, c) => update(c)(_.copy(maxInlineDepth = Some(x))))
22+
.text("Maximal number of allowed nested inlines.")
23+
parser
24+
.opt[Int]("max-caller-size")
25+
.optional()
26+
.action((x, c) => update(c)(_.copy(maxCallerSize = Some(x))))
27+
.text(
28+
"Maximal size (number of instructions) of the caller method which can accept inlines."
29+
)
30+
parser
31+
.opt[Int]("max-inline-size")
32+
.optional()
33+
.action((x, c) => update(c)(_.copy(maxInlineSize = Some(x))))
34+
.text(
35+
"Maximal size (number of instructions) of the inlined method."
36+
)
37+
}
38+
}

cli/src/main/scala/scala/scalanative/cli/utils/ConfigConverter.scala

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
package scala.scalanative.cli.utils
22

3-
import scala.scalanative.build.Config
4-
import scala.scalanative.build.NativeConfig
5-
import scala.scalanative.build.Discover
3+
import scala.scalanative.build._
64
import java.nio.file.Paths
75
import java.nio.file.Path
86
import scala.util.Try
9-
import scala.scalanative.cli.options.LinkerOptions
7+
import scala.scalanative.cli.options._
108

119
case class BuildOptions(
1210
config: Config,
1311
outpath: Path
1412
)
1513

1614
object ConfigConverter {
17-
1815
def convert(
1916
options: LinkerOptions,
2017
main: String,
2118
classpath: Seq[String]
19+
): Either[Throwable, BuildOptions] = convert(options, Some(main), classpath)
20+
21+
def convert(
22+
options: LinkerOptions,
23+
main: Option[String],
24+
classpath: Seq[String]
2225
): Either[Throwable, BuildOptions] = {
2326
if (classpath.isEmpty) {
2427
Left(
@@ -68,26 +71,36 @@ object ConfigConverter {
6871
.withCompileOptions(options.nativeConfig.compileOption)
6972
.withLinkingOptions(options.nativeConfig.linkingOption)
7073
.withLinktimeProperties(ltp)
74+
.withBuildTarget(options.nativeConfig.buildTarget)
75+
.withOptimizerConfig(generateOptimizerConfig(options.optimizerConifg))
76+
}
77+
78+
private def generateOptimizerConfig(
79+
options: OptimizerConfigOptions
80+
): OptimizerConfig = {
81+
val c0 = OptimizerConfig.empty
82+
val c1 = options.maxInlineDepth.foldLeft(c0)(_.withMaxInlineDepth(_))
83+
val c2 = options.maxCallerSize.foldLeft(c1)(_.withMaxCallerSize(_))
84+
val c3 = options.maxInlineSize.foldLeft(c2)(_.withMaxInlineSize(_))
85+
c3
7186
}
7287

7388
private def generateConfig(
7489
options: LinkerOptions,
75-
main: String,
90+
main: Option[String],
7691
classPath: Seq[String]
7792
): Either[Throwable, Config] = {
7893
for {
7994
nativeConfig <- generateNativeConfig(options)
8095
classPath <- Try(parseClassPath(classPath)).toEither
8196
} yield {
82-
val config = Config.empty
97+
val baseConfig = Config.empty
8398
.withWorkdir(Paths.get(options.config.workdir).toAbsolutePath())
8499
.withCompilerConfig(nativeConfig)
85100
.withClassPath(classPath)
86-
.withMainClass(main)
101+
.withLogger(new FilteredLogger(options.verbose))
87102

88-
val verbosity = options.verbose
89-
val logger = new FilteredLogger(verbosity)
90-
config.withLogger(logger)
103+
main.foldLeft(baseConfig)(_.withMainClass(_))
91104
}
92105
}
93106

cli/src/main/scala/scala/scalanative/cli/utils/NativeConfigParserImplicits.scala

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package scala.scalanative.cli.utils
22

3-
import scala.scalanative.build.LTO
4-
import scala.scalanative.build.GC
5-
import scala.scalanative.build.Mode
3+
import scala.scalanative.build._
64

75
object NativeConfigParserImplicits {
86

@@ -30,4 +28,12 @@ object NativeConfigParserImplicits {
3028
case "release-full" => Mode.releaseFull
3129
case other => throw new IllegalArgumentException(other)
3230
}
31+
32+
implicit val buildTargetRead: scopt.Read[BuildTarget] =
33+
scopt.Read.reads {
34+
case "application" | "app" | "default" => BuildTarget.application
35+
case "library-dynamic" | "library-shared" => BuildTarget.libraryDynamic
36+
case "library-static" => BuildTarget.libraryStatic
37+
case other => throw new IllegalArgumentException(other)
38+
}
3339
}

cli/src/sbt-test/integration/cli/test

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,12 @@ $ mkdir native-dir
2727
> runCli --outpath target/out6 -v -v --workdir native-dir --dump --main Main
2828
$ exists native-dir/optimized.hnir
2929
$ exists target/out6
30+
31+
# -- Build dynamic library
32+
> runCli --outpath target/out7 --build-target=library-dynamic
33+
$ exists target/out7
34+
35+
# -- Build static library
36+
> runCli --outpath target/out8 --build-target=library-static
37+
$ exists target/out8
38+

0 commit comments

Comments
 (0)