Fix libpkl and windows builds (#1799)

* Fix issue where linker can't find object files
* Fix issue where macOS libpkl builds time out due to exhausting host resources
This commit is contained in:
Daniel Chao
2026-07-28 23:32:19 +00:00
committed by GitHub
parent 79dd95c4e6
commit f6107b6e86
2 changed files with 43 additions and 7 deletions
@@ -29,6 +29,7 @@ import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.MapProperty
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.provider.SetProperty
import org.gradle.api.services.BuildService
import org.gradle.api.services.BuildServiceParameters
import org.gradle.api.tasks.ClasspathNormalizer
@@ -37,6 +38,7 @@ import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.OutputDirectories
import org.gradle.api.tasks.OutputFiles
import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.tasks.TaskAction
@@ -53,6 +55,12 @@ abstract class NativeImageBuild : DefaultTask() {
@get:Input abstract val arch: Property<Target.Arch>
/**
* Names of extra directories, relative to the native-image working directory, that should be
* copied into [outputDir] after a successful build.
*/
@get:Input abstract val additionalOutputDirectoryNames: SetProperty<String>
/**
* The main class entrypoint for the executable.
*
@@ -163,12 +171,20 @@ abstract class NativeImageBuild : DefaultTask() {
}
)
} else {
dir.file(libraryName)
val executableName = if (buildInfo.os.isWindows) "${libraryName}.exe" else libraryName
dir.file(executableName)
}
}
)
}
@Suppress("unused")
@OutputDirectories
fun getEffectiveOutputDirectories(): FileCollection =
objectFactory
.fileCollection()
.from(additionalOutputDirectoryNames.map { names -> names.map { outputDir.get().dir(it) } })
@TaskAction
protected fun run() {
val workingDir =
@@ -263,6 +279,15 @@ abstract class NativeImageBuild : DefaultTask() {
}
Files.copy(sourceFile, targetFile, StandardCopyOption.REPLACE_EXISTING)
}
for (dirName in additionalOutputDirectoryNames.get()) {
val sourceDir = workingDir.resolve(dirName).toFile()
if (!sourceDir.exists()) {
throw GradleException("Expected to find directory $dirName in the working dir but didn't")
}
val targetDir = outputDir.get().asFile.resolve(dirName)
targetDir.deleteRecursively()
sourceDir.copyRecursively(targetDir, overwrite = true)
}
}
}
}
+17 -6
View File
@@ -91,18 +91,29 @@ private fun NativeImageBuild.configure(target: Target) {
sharedLibrary = true
val scriptName = if (buildInfo.os.isWindows) "build_windows.bat" else "build_unix.sh"
nativeCompilerPath = projectDir.resolve("scripts/${scriptName}")
if (!buildInfo.os.isWindows) {
// build_unix.sh extracts the object files of every archive it links against into a loose
// `objects/` dir so that `buildStaticLibrary` can merge them into a single, self-contained
// static library.
//
// Don't need to do this for Windows because it produces a merged archive.
additionalOutputDirectoryNames.add("objects")
}
}
val macNativeImageAarch64 =
tasks.register<NativeImageBuild>("macNativeImageAarch64") {
configure(Target.MacosAarch64)
// macOS only supports 16K page size
extraNativeImageArgs =
listOf(
"-H:PageSize=16384",
// increase memory available to native-image
"-J-Xmx32g",
)
extraNativeImageArgs = buildList {
add("-H:PageSize=16384")
if (buildInfo.isCiBuild) {
add("-J-Xmx12g")
add("-H:+DeadlockWatchdogExitOnTimeout")
add("-H:DeadlockWatchdogInterval=10")
}
}
}
val linuxNativeImageAmd64 =