Skip to content

Commit 6a78cf8

Browse files
authored
Fix #173: Reorganize bindings (#188)
- Move the bindings to the org.scala-native.bindings organization. - Move binding modules under org.scalanative.bindings dropping the per-binding package if only one module is emitted. - Drop the "lib" prefix from the binding artifact name.
1 parent ca580ff commit 6a78cf8

File tree

13 files changed

+62
-56
lines changed

13 files changed

+62
-56
lines changed

bindings/iconv/src/main/scala/org/scalanative/bindgen/bindings/iconv/iconv.scala renamed to bindings/iconv/src/main/scala/org/scalanative/bindings/iconv.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.scalanative.bindgen.bindings.iconv
1+
package org.scalanative.bindings
22

33
import scala.scalanative._
44
import scala.scalanative.native._

bindings/iconv/src/test/scala/org/scalanative/bindgen/bindings/tests/IconvSpec.scala renamed to bindings/iconv/src/test/scala/org/scalanative/bindings/tests/IconvSpec.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
package org.scalanative.bindgen.bindings.iconv.tests
1+
package org.scalanative.bindings.tests
22

33
import org.scalatest.FunSpec
44

55
class IconvSpec extends FunSpec {
66
describe("iconv") {
77
it("should convert back and forth between UTF-8 and ISO-8859-1") {
88
//#usage-example
9-
import org.scalanative.bindgen.bindings.iconv.iconv._
9+
import org.scalanative.bindings.iconv._
1010
import scala.scalanative.native._
1111
import java.nio.charset.Charset
1212

bindings/posix/src/main/scala/org/scalanative/bindgen/bindings/posix/fnmatch.scala renamed to bindings/posix/src/main/scala/org/scalanative/bindings/posix/fnmatch.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.scalanative.bindgen.bindings.posix
1+
package org.scalanative.bindings.posix
22

33
import scala.scalanative._
44
import scala.scalanative.native._

bindings/posix/src/main/scala/org/scalanative/bindgen/bindings/posix/regex.scala renamed to bindings/posix/src/main/scala/org/scalanative/bindings/posix/regex.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.scalanative.bindgen.bindings.posix
1+
package org.scalanative.bindings.posix
22

33
import scala.scalanative._
44
import scala.scalanative.native._

bindings/posix/src/test/scala/org/scalanative/bindgen/bindings/tests/FnmatchSpec.scala renamed to bindings/posix/src/test/scala/org/scalanative/bindings/tests/FnmatchSpec.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.scalanative.bindgen.bindings.tests
1+
package org.scalanative.bindings.tests
22

33
import org.scalatest.FunSpec
44

@@ -7,7 +7,7 @@ class FnmatchSpec extends FunSpec {
77
it("should match patterns") {
88
//#usage-example
99
import scala.scalanative.native._
10-
import org.scalanative.bindgen.bindings.posix.fnmatch._
10+
import org.scalanative.bindings.posix.fnmatch._
1111

1212
assert(fnmatch(c"*.md", c"README.md", 0) == 0)
1313
assert(fnmatch(c"*.[ch]", c"main.h", 0) == 0)

bindings/posix/src/test/scala/org/scalanative/bindgen/bindings/tests/RegexSpec.scala renamed to bindings/posix/src/test/scala/org/scalanative/bindings/tests/RegexSpec.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.scalanative.bindgen.bindings.tests
1+
package org.scalanative.bindings.tests
22

33
import org.scalatest.FunSpec
44

@@ -7,7 +7,7 @@ class RegexSpec extends FunSpec {
77
it("should match regular expressions") {
88
//#usage-example
99
import scala.scalanative.native._
10-
import org.scalanative.bindgen.bindings.posix.regex._
10+
import org.scalanative.bindings.posix.regex._
1111

1212
val reg = stackalloc[regex_t]
1313

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.scalanative.bindgen.bindings.utf8proc
1+
package org.scalanative.bindings
22

33
import scala.scalanative._
44
import scala.scalanative.native._

bindings/utf8proc/src/test/scala/org/scalanative/bindgen/bindings/tests/Utf8procSpec.scala renamed to bindings/utf8proc/src/test/scala/org/scalanative/bindings/tests/Utf8procSpec.scala

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
package org.scalanative.bindgen.bindings.tests
1+
package org.scalanative.bindings.tests
22

33
import org.scalatest.FunSpec
44

55
class Utf8procSpec extends FunSpec {
66
describe("utf8proc") {
77
it("should iterate UTF-8 and count character width") {
88
//#usage-example
9-
import org.scalanative.bindgen.bindings.utf8proc.utf8proc._
9+
import org.scalanative.bindings.utf8proc._
1010
import scala.scalanative.native._
1111

1212
val text = c"Spørge"
@@ -32,7 +32,7 @@ class Utf8procSpec extends FunSpec {
3232
}
3333

3434
it("utf8proc_tolower") {
35-
import org.scalanative.bindgen.bindings.utf8proc.utf8proc._
35+
import org.scalanative.bindings.utf8proc._
3636

3737
val `Ø` = 0x00D8
3838
val `ø` = 0x00F8

build.sbt

+43-37
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,7 @@ lazy val bindings = project("bindings")
212212
libutf8proc
213213
)
214214

215-
lazy val libiconv = bindingProject("iconv")
216-
.configure(binding("iconv.h"))
215+
lazy val libiconv = bindingProject("iconv")("iconv.h")
217216
.settings(
218217
//#sbt-iconv-linking-options
219218
Compile / nativeLinkingOptions ++= {
@@ -230,14 +229,15 @@ lazy val libiconv = bindingProject("iconv")
230229
)
231230

232231
//#sbt-binding-project-multi-header
233-
lazy val libposix = bindingProject("posix")
234-
.configure(binding("fnmatch.h"))
235-
.configure(binding("regex.h"))
232+
lazy val libposix = bindingProject("posix")(
233+
"fnmatch.h",
234+
"regex.h"
235+
)
236236
//#sbt-binding-project-multi-header
237237

238238
//#sbt-binding-project
239-
lazy val libutf8proc = bindingProject("utf8proc")
240-
.configure(binding("utf8proc.h", Some("utf8proc")))
239+
lazy val libutf8proc =
240+
bindingProject("utf8proc", Some("utf8proc"))("utf8proc.h")
241241
//#sbt-binding-project
242242

243243
def project(name: String, plugged: AutoPlugin*) = {
@@ -333,45 +333,51 @@ lazy val bindingsExtraArgs = Try {
333333
s"-I$libDir/clang/$version/include"
334334
}.toOption
335335

336-
def bindingProject(name: String) = {
336+
def bindingProject(name: String, link: Option[String] = None)(
337+
headers: String*) = {
338+
val packagePath = Seq("org", "scalanative", "bindings") ++
339+
(if (headers.length > 1) Seq(name) else Seq.empty)
340+
337341
nativeProject(s"lib$name")
338342
.enablePlugins(ScalaNativeBindgenPlugin)
339343
.in(file(s"bindings/$name"))
340344
.settings(
345+
Keys.name := name,
341346
libraryDependencies += "org.scalatest" %%% "scalatest" % "3.2.0-SNAP10" % Test,
342-
Compile / nativeBindgen / target :=
343-
(Compile / scalaSource).value / "org/scalanative/bindgen/bindings" / name
347+
Compile / nativeBindgen / target := {
348+
packagePath.foldLeft((Compile / scalaSource).value)(_ / _)
349+
}
344350
)
351+
.settings(
352+
headers.flatMap(binding(name, packagePath.mkString("."), link)): _*)
345353
}
346354

347-
def binding(header: String, link: Option[String] = None)(
348-
project: Project): Project = {
349-
val headerFile = file("/usr/include") / header
350-
val libname = project.base.getName
351-
project.settings(
352-
inConfig(Compile)(
355+
def binding(name: String, packageName: String, link: Option[String])(
356+
header: String): Seq[Setting[_]] = {
357+
val includeDirs = Seq("/usr/include", "/usr/local/include")
358+
val headerFiles = includeDirs.map(dir => file(dir) / header).filter(_.exists)
359+
360+
headerFiles.headOption match {
361+
case Some(headerFile) =>
353362
Def.settings(
354-
nativeBindings ++= {
355-
if (headerFile.exists) Seq {
356-
NativeBinding(headerFile)
357-
.name(header.replace(".h", ""))
358-
.packageName(s"org.scalanative.bindgen.bindings.$libname")
359-
.maybe(link, _.link)
360-
.excludePrefix("__")
361-
.extraArgs(bindingsExtraArgs.toSeq: _*)
362-
.extraArgs("-D_POSIX_C_SOURCE")
363-
} else {
364-
Seq.empty
365-
}
363+
organization := "org.scala-native.binding",
364+
Compile / nativeBindings += {
365+
NativeBinding(headerFile)
366+
.name(link.map(_ => name).getOrElse(header.replace(".h", "")))
367+
.packageName(packageName)
368+
.maybe(link, _.link)
369+
.excludePrefix("__")
370+
.extraArgs(bindingsExtraArgs.toSeq: _*)
371+
.extraArgs("-D_POSIX_C_SOURCE")
366372
}
367-
)),
368-
test := (Def.taskDyn {
369-
if (headerFile.exists)
370-
Def.task { (Test / test).value } else
371-
Def.task {
372-
streams.value.log.warn(
373-
s"Skipping $libname tests due to missing header file $headerFile")
373+
)
374+
375+
case None =>
376+
Def.settings(
377+
test := {
378+
streams.value.log
379+
.warn(s"Skipping $name tests due to missing header file <$header>")
374380
}
375-
}).value
376-
)
381+
)
382+
}
377383
}

docs/src/paradox/bindings/iconv.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ For sbt, you can use the following code:
1313

1414
## Example
1515

16-
@@snip [iconv](../../../../bindings/iconv/src/test/scala/org/scalanative/bindgen/bindings/tests/IconvSpec.scala) { #usage-example }
16+
@@snip [iconv](../../../../bindings/iconv/src/test/scala/org/scalanative/bindings/tests/IconvSpec.scala) { #usage-example }
1717

1818
[`iconv.h`]: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/iconv.h.html

docs/src/paradox/bindings/posix.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ Binding objects are available under the package name `
2020

2121
Using `fnmatch.h`:
2222

23-
@@snip [fnmatch](../../../../bindings/posix/src/test/scala/org/scalanative/bindgen/bindings/tests/FnmatchSpec.scala) { #usage-example }
23+
@@snip [fnmatch](../../../../bindings/posix/src/test/scala/org/scalanative/bindings/tests/FnmatchSpec.scala) { #usage-example }
2424

2525
Using `regex.h`:
2626

27-
@@snip [regex](../../../../bindings/posix/src/test/scala/org/scalanative/bindgen/bindings/tests/RegexSpec.scala) { #usage-example }
27+
@@snip [regex](../../../../bindings/posix/src/test/scala/org/scalanative/bindings/tests/RegexSpec.scala) { #usage-example }

docs/src/paradox/bindings/utf8proc.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ To use this binding add the following resolver and dependency:
88

99
## Example
1010

11-
@@snip [iconv](../../../../bindings/utf8proc/src/test/scala/org/scalanative/bindgen/bindings/tests/Utf8procSpec.scala) { #usage-example }
11+
@@snip [utf8proc](../../../../bindings/utf8proc/src/test/scala/org/scalanative/bindings/tests/Utf8procSpec.scala) { #usage-example }
1212

1313
[utf8proc]: https://juliastrings.github.io/utf8proc/doc/

project/ParadoxSupport.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ object ParadoxSupport {
3434
}
3535

3636
def renderBindingDependency(binding: String, printer: Printer): Unit = {
37-
val group = "org.scala-native.bindgen"
38-
val artifactName = s"lib$binding"
37+
val group = "org.scala-native.bindings"
38+
val artifactName = binding
3939
val artifactId = s"${artifactName}_native0.3_${scalaBinaryVersion}"
4040
val bintrayRepo = "http://dl.bintray.com/scala-native-bindgen/maven"
4141

0 commit comments

Comments
 (0)