Skip to content

Commit 97bd571

Browse files
committed
Build libpkl.dylib and libpkl.h for users
This is close to a demo of what this could look like.
1 parent cc3184b commit 97bd571

File tree

1 file changed

+108
-78
lines changed

1 file changed

+108
-78
lines changed

libpkl/libpkl.gradle.kts

Lines changed: 108 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -121,98 +121,98 @@ private fun NativeImageBuild.setClasspath() {
121121
}
122122

123123
val 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

135135
val 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

147147
val 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

159159
val 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

178178
val 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

196196
val 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

208208
val 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)
270270
val assembleNativeAlpineLinuxAmd64 by tasks.existing { wraps(alpineNativeLibraryAmd64) }
271271

272272
val 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

Comments
 (0)