@@ -121,98 +121,98 @@ private fun NativeImageBuild.setClasspath() {
121121}
122122
123123val macNativeLibraryAmd64 by
124- tasks.registering(NativeImageBuild ::class ) {
125- outputDir = project.layout.buildDirectory.dir(" libs/macos-amd64" )
126- imageName = executableSpec.name.map { " $it -macos-amd64" }
127- mainClass = executableSpec.mainClass
128- amd64()
129- setClasspath()
130- extraNativeImageArgs = listOf (" --shared" )
131-
132- setOutputFiles(" macos-amd64" )
133- }
124+ tasks.registering(NativeImageBuild ::class ) {
125+ outputDir = project.layout.buildDirectory.dir(" libs/macos-amd64" )
126+ imageName = executableSpec.name.map { " $it -macos-amd64" }
127+ mainClass = executableSpec.mainClass
128+ amd64()
129+ setClasspath()
130+ extraNativeImageArgs = listOf (" --shared" )
131+
132+ setOutputFiles(" macos-amd64" )
133+ }
134134
135135val macNativeLibraryAarch64 by
136- tasks.registering(NativeImageBuild ::class ) {
137- outputDir = project.layout.buildDirectory.dir(" libs/macos-aarch64" )
138- imageName = executableSpec.name.map { " $it -macos-aarch64" }
139- mainClass = executableSpec.mainClass
140- aarch64()
141- setClasspath()
142- extraNativeImageArgs = listOf (" --shared" )
143-
144- setOutputFiles(" macos-aarch64" )
145- }
136+ tasks.registering(NativeImageBuild ::class ) {
137+ outputDir = project.layout.buildDirectory.dir(" libs/macos-aarch64" )
138+ imageName = executableSpec.name.map { " $it -macos-aarch64" }
139+ mainClass = executableSpec.mainClass
140+ aarch64()
141+ setClasspath()
142+ extraNativeImageArgs = listOf (" --shared" )
143+
144+ setOutputFiles(" macos-aarch64" )
145+ }
146146
147147val linuxNativeLibraryAmd64 by
148- tasks.registering(NativeImageBuild ::class ) {
149- outputDir = project.layout.buildDirectory.dir(" libs/linux-amd64" )
150- imageName = executableSpec.name.map { " $it -linux-amd64" }
151- mainClass = executableSpec.mainClass
152- amd64()
153- setClasspath()
154- extraNativeImageArgs = listOf (" --shared" )
155-
156- setOutputFiles(" linux-amd64" )
157- }
148+ tasks.registering(NativeImageBuild ::class ) {
149+ outputDir = project.layout.buildDirectory.dir(" libs/linux-amd64" )
150+ imageName = executableSpec.name.map { " $it -linux-amd64" }
151+ mainClass = executableSpec.mainClass
152+ amd64()
153+ setClasspath()
154+ extraNativeImageArgs = listOf (" --shared" )
155+
156+ setOutputFiles(" linux-amd64" )
157+ }
158158
159159val linuxNativeLibraryAarch64 by
160- tasks.registering(NativeImageBuild ::class ) {
161- outputDir = project.layout.buildDirectory.dir(" libs/linux-aarch64" )
162- imageName = executableSpec.name.map { " $it -linux-aarch64" }
163- mainClass = executableSpec.mainClass
164- aarch64()
165- setClasspath()
166-
167- extraNativeImageArgs =
168- listOf (
169- " --shared" ,
170- // Ensure compatibility for kernels with page size set to 4k, 16k and 64k
171- // (e.g. Raspberry Pi 5, Asahi Linux)
172- " -H:PageSize=65536" ,
173- )
174-
175- setOutputFiles(" linux-aarch64" )
176- }
160+ tasks.registering(NativeImageBuild ::class ) {
161+ outputDir = project.layout.buildDirectory.dir(" libs/linux-aarch64" )
162+ imageName = executableSpec.name.map { " $it -linux-aarch64" }
163+ mainClass = executableSpec.mainClass
164+ aarch64()
165+ setClasspath()
166+
167+ extraNativeImageArgs =
168+ listOf (
169+ " --shared" ,
170+ // Ensure compatibility for kernels with page size set to 4k, 16k and 64k
171+ // (e.g. Raspberry Pi 5, Asahi Linux)
172+ " -H:PageSize=65536" ,
173+ )
174+
175+ setOutputFiles(" linux-aarch64" )
176+ }
177177
178178val alpineNativeLibraryAmd64 by
179- tasks.registering(NativeImageBuild ::class ) {
180- outputDir = project.layout.buildDirectory.dir(" libs/alpine-linux-amd64" )
181- imageName = executableSpec.name.map { " $it -alpine-linux-amd64" }
182- mainClass = executableSpec.mainClass
183- amd64()
184- setClasspath()
185-
186- extraNativeImageArgs =
187- listOf (
188- " --shared" ,
189- // TODO(kushal): https://github.com/oracle/graal/issues/3053
190- " --libc=musl" ,
191- )
192-
193- setOutputFiles(" alpine-linux-amd64" )
194- }
179+ tasks.registering(NativeImageBuild ::class ) {
180+ outputDir = project.layout.buildDirectory.dir(" libs/alpine-linux-amd64" )
181+ imageName = executableSpec.name.map { " $it -alpine-linux-amd64" }
182+ mainClass = executableSpec.mainClass
183+ amd64()
184+ setClasspath()
185+
186+ extraNativeImageArgs =
187+ listOf (
188+ " --shared" ,
189+ // TODO(kushal): https://github.com/oracle/graal/issues/3053
190+ " --libc=musl" ,
191+ )
192+
193+ setOutputFiles(" alpine-linux-amd64" )
194+ }
195195
196196val windowsNativeLibraryAmd64 by
197- tasks.registering(NativeImageBuild ::class ) {
198- outputDir = project.layout.buildDirectory.dir(" libs/windows-amd64" )
199- imageName = executableSpec.name.map { " $it -windows-amd64" }
200- mainClass = executableSpec.mainClass
201- amd64()
202- setClasspath()
203- extraNativeImageArgs = listOf (" --shared" , " -Dfile.encoding=UTF-8" )
204-
205- setOutputFiles(" windows-amd64" )
206- }
197+ tasks.registering(NativeImageBuild ::class ) {
198+ outputDir = project.layout.buildDirectory.dir(" libs/windows-amd64" )
199+ imageName = executableSpec.name.map { " $it -windows-amd64" }
200+ mainClass = executableSpec.mainClass
201+ amd64()
202+ setClasspath()
203+ extraNativeImageArgs = listOf (" --shared" , " -Dfile.encoding=UTF-8" )
204+
205+ setOutputFiles(" windows-amd64" )
206+ }
207207
208208val assembleNative by
209- tasks.existing {
210- // TODO(kushal): Remove this later. Only exists to debug output files are in the graph.
211- finalizedBy(tasks.named( " validateNativeLibraryFiles " ) )
212- }
209+ tasks.existing {
210+ // TODO(kushal): Remove this later. Only exists to debug output files are in the graph.
211+ finalizedBy(validateNativeLibraryFilestasks )
212+ }
213213
214214// TODO(kushal): Remove this later. Only exists to debug output files are in the graph.
215- tasks.register( " validateNativeLibraryFiles " ) {
215+ val validateNativeLibraryFilestasks by tasks.registering {
216216 val assembleTasks = mutableSetOf<TaskProvider <NativeImageBuild >>()
217217
218218 when {
@@ -270,3 +270,33 @@ val assembleNativeLinuxAmd64 by tasks.existing { wraps(linuxNativeLibraryAmd64)
270270val assembleNativeAlpineLinuxAmd64 by tasks.existing { wraps(alpineNativeLibraryAmd64) }
271271
272272val assembleNativeWindowsAmd64 by tasks.existing { wraps(windowsNativeLibraryAmd64) }
273+
274+ val macNativeFullLibraryAarch64 by tasks.registering(Exec ::class ) {
275+ dependsOn(macNativeLibraryAarch64)
276+
277+ val sharedLibraryBuildDir = project.layout.buildDirectory.dir(" libs/macos-aarch64" ).get()
278+ val libraryOutputDir = sharedLibraryBuildDir.dir(" full" )
279+ val projectDir = project.layout.projectDirectory.asFile.path
280+
281+ workingDir = libraryOutputDir.asFile
282+
283+ // TODO: Make this portable. For now this is a demonstration using `clang`.
284+ commandLine(" /usr/bin/clang" , " -shared" ,
285+ " -o" , " libpkl.dylib" ,
286+ " $projectDir /src/main/c/libpkl.c" ,
287+ " -I$projectDir /src/main/c" ,
288+ " -I$sharedLibraryBuildDir " ,
289+ " -L$sharedLibraryBuildDir " ,
290+ " -lpkl-macos-aarch64" )
291+ }
292+
293+ val macNativeFullLibraryAarch64Copy by tasks.registering(Exec ::class ) {
294+ dependsOn(macNativeFullLibraryAarch64)
295+
296+ val libraryOutputDir = project.layout.buildDirectory.dir(" libs/macos-aarch64/full" ).get()
297+ val projectDir = project.layout.projectDirectory.asFile.path
298+
299+ workingDir = libraryOutputDir.asFile
300+
301+ commandLine(" cp" , " $projectDir /src/main/c/libpkl.h" , libraryOutputDir)
302+ }
0 commit comments