@@ -29,14 +29,10 @@ import org.scalanative.bindgen.Bindgen
29
29
* Keys are defined in [[ScalaNativeBindgenPlugin.autoImport ]].
30
30
*
31
31
* - `nativeBindgenPath`: Path to the `scala-native-bindgen` executable.
32
- * - `nativeBindgenHeader`: The C header file to read.
33
- * - `nativeBindgenPackage`: Package of the enclosing object.
34
- * No package by default.
35
- * - `name in nativeBindgen`: Name of the enclosing object.
32
+ * - `nativeBindings`: Settings for each binding to generate.
36
33
* - `target in nativeBindgen`: Output folder of the generated code.
37
34
* - `version in nativeBindgen`: Version of the `scala-native-bindgen`
38
35
* to use when automatically downloading the executable.
39
- * - `nativeBindgenLink`: Name of library to be linked.
40
36
* - `nativeBindgen`: Generate Scala Native bindings.
41
37
*
42
38
* @example
@@ -49,62 +45,65 @@ import org.scalanative.bindgen.Bindgen
49
45
object ScalaNativeBindgenPlugin extends AutoPlugin {
50
46
51
47
object autoImport {
48
+ case class NativeBinding (
49
+ name : String ,
50
+ header : File ,
51
+ packageName : Option [String ],
52
+ link : Option [String ],
53
+ excludePrefix : Option [String ]
54
+ )
52
55
val ScalaNativeBindgen = config(" scala-native-bindgen" ).hide
53
56
val nativeBindgenPath =
54
57
taskKey[File ](" Path to the scala-native-bindgen executable" )
55
- val nativeBindgenHeader = taskKey[File ](" C header file" )
56
- val nativeBindgenPackage =
57
- settingKey[Option [String ]](" Package for the generated code" )
58
- val nativeBindgenLink =
59
- settingKey[Option [String ]](" Name of library to be linked" )
60
- val nativeBindgenExclude = settingKey[Option [String ]](" Exclude prefix" )
61
- val nativeBindgen = taskKey[File ](" Generate Scala Native bindings" )
58
+ val nativeBindings =
59
+ settingKey[Seq [NativeBinding ]](" Configuration for each bindings" )
60
+ val nativeBindgen = taskKey[Seq [File ]](" Generate Scala Native bindings" )
62
61
}
63
62
import autoImport ._
64
63
65
64
override def requires = plugins.JvmPlugin
66
65
67
66
override def projectSettings : Seq [Setting [_]] =
68
67
inConfig(ScalaNativeBindgen )(Defaults .configSettings) ++
69
- nativeBindgenScopedSettings(Compile ) ++
70
- Def .settings(
71
- ivyConfigurations += ScalaNativeBindgen ,
72
- version in nativeBindgen := BuildInfo .version,
73
- libraryDependencies ++= {
74
- artifactName.map { name =>
75
- val bindgenVersion = (version in nativeBindgen).value
76
- val url =
77
- s " ${BuildInfo .projectUrl}/releases/download/v $bindgenVersion/ $name"
78
-
79
- BuildInfo .organization % name % bindgenVersion % ScalaNativeBindgen from (url)
80
- }.toSeq
81
- },
82
- nativeBindgenPath := {
83
- val scalaNativeBindgenUpdate = (update in ScalaNativeBindgen ).value
84
-
85
- val artifactFile = artifactName match {
86
- case None =>
87
- sys.error(
88
- " No downloadable binaries available for your OS, " +
89
- " please provide path via `nativeBindgenPath`" )
90
- case Some (name) =>
91
- scalaNativeBindgenUpdate
92
- .select(artifact = artifactFilter(name = name))
93
- .head
94
- }
95
-
96
- // Set the executable bit on the expected path to fail if it doesn't exist
97
- for (view <- Option (
98
- Files .getFileAttributeView(artifactFile.toPath,
99
- classOf [PosixFileAttributeView ]))) {
100
- val permissions = view.readAttributes.permissions
101
- if (permissions.add(PosixFilePermission .OWNER_EXECUTE ))
102
- view.setPermissions(permissions)
68
+ nativeBindgenScopedSettings(Compile ) ++
69
+ Def .settings(
70
+ ivyConfigurations += ScalaNativeBindgen ,
71
+ version in nativeBindgen := BuildInfo .version,
72
+ libraryDependencies ++= {
73
+ artifactName.map { name =>
74
+ val bindgenVersion = (version in nativeBindgen).value
75
+ val url =
76
+ s " ${BuildInfo .projectUrl}/releases/download/v $bindgenVersion/ $name"
77
+
78
+ BuildInfo .organization % name % bindgenVersion % ScalaNativeBindgen from (url)
79
+ }.toSeq
80
+ },
81
+ nativeBindgenPath := {
82
+ val scalaNativeBindgenUpdate = (update in ScalaNativeBindgen ).value
83
+
84
+ val artifactFile = artifactName match {
85
+ case None =>
86
+ sys.error(
87
+ " No downloadable binaries available for your OS, " +
88
+ " please provide path via `nativeBindgenPath`" )
89
+ case Some (name) =>
90
+ scalaNativeBindgenUpdate
91
+ .select(artifact = artifactFilter(name = name))
92
+ .head
93
+ }
94
+
95
+ // Set the executable bit on the expected path to fail if it doesn't exist
96
+ for (view <- Option (
97
+ Files .getFileAttributeView(artifactFile.toPath,
98
+ classOf [PosixFileAttributeView ]))) {
99
+ val permissions = view.readAttributes.permissions
100
+ if (permissions.add(PosixFilePermission .OWNER_EXECUTE ))
101
+ view.setPermissions(permissions)
102
+ }
103
+
104
+ artifactFile
103
105
}
104
-
105
- artifactFile
106
- }
107
- )
106
+ )
108
107
109
108
private implicit class BindgenOps (val bindgen : Bindgen ) extends AnyVal {
110
109
def maybe [T ](opt : Option [T ], f : Bindgen => T => Bindgen ): Bindgen =
@@ -123,29 +122,30 @@ object ScalaNativeBindgenPlugin extends AutoPlugin {
123
122
def nativeBindgenScopedSettings (conf : Configuration ): Seq [Setting [_]] =
124
123
inConfig(conf)(
125
124
Def .settings(
126
- nativeBindgenHeader := {
127
- sys.error(" nativeBindgenHeader not configured" )
128
- },
129
- nativeBindgenPackage := None ,
130
- nativeBindgenExclude := None ,
131
- sourceGenerators += Def .task { Seq (nativeBindgen.value) },
132
- name in nativeBindgen := " ScalaNativeBindgen" ,
125
+ nativeBindings := Seq .empty,
126
+ sourceGenerators += Def .task { nativeBindgen.value },
133
127
target in nativeBindgen := sourceManaged.value / " sbt-scala-native-bindgen" ,
134
128
nativeBindgen := {
135
- val fileName = (name in nativeBindgen).value + " .scala"
136
- val output = (target in nativeBindgen).value / fileName
137
-
138
- Bindgen ()
139
- .bindgenExecutable(nativeBindgenPath.value)
140
- .header(nativeBindgenHeader.value)
141
- .name((name in nativeBindgen).value)
142
- .maybe(nativeBindgenLink.value, _.link)
143
- .maybe(nativeBindgenPackage.value, _.packageName)
144
- .maybe(nativeBindgenExclude.value, _.excludePrefix)
145
- .generate()
146
- .writeToFile(output)
147
-
148
- output
129
+ val bindgenPath = nativeBindgenPath.value
130
+ val bindings = nativeBindings.value
131
+ val outputDirectory = (target in nativeBindgen).value
132
+
133
+ bindings.map {
134
+ binding =>
135
+ val output = outputDirectory / s " ${binding.name}.scala "
136
+
137
+ Bindgen ()
138
+ .bindgenExecutable(bindgenPath)
139
+ .header(binding.header)
140
+ .name(binding.name)
141
+ .maybe(binding.link, _.link)
142
+ .maybe(binding.packageName, _.packageName)
143
+ .maybe(binding.excludePrefix, _.excludePrefix)
144
+ .generate()
145
+ .writeToFile(output)
146
+
147
+ output
148
+ }
149
149
}
150
150
))
151
151
}
0 commit comments