@@ -29,14 +29,10 @@ import org.scalanative.bindgen.Bindgen
2929 * Keys are defined in [[ScalaNativeBindgenPlugin.autoImport ]].
3030 *
3131 * - `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.
3633 * - `target in nativeBindgen`: Output folder of the generated code.
3734 * - `version in nativeBindgen`: Version of the `scala-native-bindgen`
3835 * to use when automatically downloading the executable.
39- * - `nativeBindgenLink`: Name of library to be linked.
4036 * - `nativeBindgen`: Generate Scala Native bindings.
4137 *
4238 * @example
@@ -49,62 +45,65 @@ import org.scalanative.bindgen.Bindgen
4945object ScalaNativeBindgenPlugin extends AutoPlugin {
5046
5147 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+ )
5255 val ScalaNativeBindgen = config(" scala-native-bindgen" ).hide
5356 val nativeBindgenPath =
5457 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" )
6261 }
6362 import autoImport ._
6463
6564 override def requires = plugins.JvmPlugin
6665
6766 override def projectSettings : Seq [Setting [_]] =
6867 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
103105 }
104-
105- artifactFile
106- }
107- )
106+ )
108107
109108 private implicit class BindgenOps (val bindgen : Bindgen ) extends AnyVal {
110109 def maybe [T ](opt : Option [T ], f : Bindgen => T => Bindgen ): Bindgen =
@@ -123,29 +122,30 @@ object ScalaNativeBindgenPlugin extends AutoPlugin {
123122 def nativeBindgenScopedSettings (conf : Configuration ): Seq [Setting [_]] =
124123 inConfig(conf)(
125124 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 },
133127 target in nativeBindgen := sourceManaged.value / " sbt-scala-native-bindgen" ,
134128 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+ }
149149 }
150150 ))
151151}
0 commit comments