mirror of
https://github.com/apple/pkl.git
synced 2026-03-28 11:51:58 +01:00
Moving to java.net.http.HttpClient brings many benefits, including HTTP/2 support and the ability to make asynchronous requests. Major additions and changes: - Introduce a lightweight org.pkl.core.http.HttpClient API. This keeps some flexibility and allows to enforce behavior such as setting the User-Agent header. - Provide an implementation that delegates to java.net.http.HttpClient. - Use HttpClient for all HTTP(s) requests across the codebase. This required adding an HttpClient parameter to constructors and factory methods of multiple classes, some of which are public APIs. - Manage CA certificates per HTTP client instead of per JVM. This makes it unnecessary to set JVM-wide system/security properties and default SSLSocketFactory's. - Add executor v2 options to the executor SPI - Add pkl-certs as a new artifact, and remove certs from pkl-commons-cli artifact Each HTTP client maintains its own connection pool and SSLContext. For efficiency reasons, It's best to reuse clients whenever feasible. To avoid memory leaks, clients are not stored in static fields. HTTP clients are expensive to create. For this reason, EvaluatorBuilder defaults to a "lazy" client that creates the underlying java.net.http.HttpClient on the first send (which may never happen).
294 lines
8.6 KiB
Kotlin
294 lines
8.6 KiB
Kotlin
import org.apache.tools.ant.filters.ReplaceTokens
|
|
|
|
plugins {
|
|
kotlin("jvm") // for `src/generator/kotlin`
|
|
pklAllProjects
|
|
pklJavaLibrary
|
|
pklPublishLibrary
|
|
pklNativeBuild
|
|
antlr
|
|
idea
|
|
}
|
|
|
|
val generatorSourceSet = sourceSets.register("generator")
|
|
|
|
sourceSets {
|
|
main {
|
|
java {
|
|
srcDir(file("generated/antlr"))
|
|
}
|
|
}
|
|
}
|
|
|
|
idea {
|
|
module {
|
|
// mark src/main/antlr as source dir
|
|
// mark generated/antlr as generated source dir
|
|
// mark generated/truffle as generated source dir
|
|
sourceDirs = sourceDirs + files("src/main/antlr", "generated/antlr", "generated/truffle")
|
|
generatedSourceDirs = generatedSourceDirs + files("generated/antlr", "generated/truffle")
|
|
}
|
|
}
|
|
|
|
val javaExecutableConfiguration: Configuration = configurations.create("javaExecutable")
|
|
|
|
// workaround for https://github.com/gradle/gradle/issues/820
|
|
configurations.api.get().let { apiConfig ->
|
|
apiConfig.setExtendsFrom(apiConfig.extendsFrom.filter { it.name != "antlr" })
|
|
}
|
|
|
|
dependencies {
|
|
annotationProcessor(libs.truffleDslProcessor)
|
|
annotationProcessor(generatorSourceSet.get().runtimeClasspath)
|
|
|
|
antlr(libs.antlr)
|
|
|
|
compileOnly(libs.jsr305)
|
|
// pkl-core implements pkl-executor's ExecutorSpi, but the SPI doesn't ship with pkl-core
|
|
compileOnly(projects.pklExecutor)
|
|
|
|
implementation(libs.antlrRuntime)
|
|
implementation(libs.truffleApi)
|
|
implementation(libs.graalSdk)
|
|
|
|
implementation(libs.paguro) {
|
|
exclude(group = "org.jetbrains", module = "annotations")
|
|
}
|
|
|
|
implementation(libs.snakeYaml)
|
|
|
|
testImplementation(projects.pklCommonsTest)
|
|
|
|
add("generatorImplementation", libs.javaPoet)
|
|
add("generatorImplementation", libs.truffleApi)
|
|
add("generatorImplementation", libs.kotlinStdLib)
|
|
|
|
javaExecutableConfiguration(project(":pkl-cli", "javaExecutable"))
|
|
}
|
|
|
|
publishing {
|
|
publications {
|
|
named<MavenPublication>("library") {
|
|
pom {
|
|
url.set("https://github.com/apple/pkl/tree/main/pkl-core")
|
|
description.set("""
|
|
Core implementation of the Pkl configuration language.
|
|
Includes Java APIs for embedding the language into JVM applications,
|
|
and for building libraries and tools on top of the language.
|
|
""".trimIndent())
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
tasks.generateGrammarSource {
|
|
maxHeapSize = "64m"
|
|
|
|
// generate only visitor
|
|
arguments = arguments + listOf("-visitor", "-no-listener")
|
|
|
|
// Due to https://github.com/antlr/antlr4/issues/2260,
|
|
// we can't put .g4 files into src/main/antlr/org/pkl/core/parser/antlr.
|
|
// Instead, we put .g4 files into src/main/antlr, adapt output dir below,
|
|
// and use @header directives in .g4 files (instead of setting `-package` argument here)
|
|
// and task makeIntelliJAntlrPluginHappy to fix up the IDE story.
|
|
outputDirectory = file("generated/antlr/org/pkl/core/parser/antlr")
|
|
}
|
|
|
|
tasks.compileJava {
|
|
dependsOn(tasks.generateGrammarSource)
|
|
}
|
|
|
|
tasks.sourcesJar {
|
|
dependsOn(tasks.generateGrammarSource)
|
|
}
|
|
|
|
tasks.generateTestGrammarSource {
|
|
enabled = false
|
|
}
|
|
tasks.named("generateGeneratorGrammarSource") {
|
|
enabled = false
|
|
}
|
|
|
|
// Satisfy expectations of IntelliJ ANTLR plugin,
|
|
// which can't otherwise cope with our ANTLR setup.
|
|
val makeIntelliJAntlrPluginHappy by tasks.registering(Copy::class) {
|
|
dependsOn(tasks.generateGrammarSource)
|
|
into("src/main/antlr")
|
|
from("generated/antlr/org/pkl/core/parser/antlr") {
|
|
include("PklLexer.tokens")
|
|
}
|
|
}
|
|
|
|
tasks.processResources {
|
|
inputs.property("version", buildInfo.pklVersion)
|
|
inputs.property("commitId", buildInfo.commitId)
|
|
|
|
filesMatching("org/pkl/core/Release.properties") {
|
|
val stdlibModules = fileTree("$rootDir/stdlib") {
|
|
include("*.pkl")
|
|
exclude("doc-package-info.pkl")
|
|
}.map { "pkl:" + it.nameWithoutExtension }
|
|
.sortedBy { it.toLowerCase() }
|
|
|
|
filter<ReplaceTokens>("tokens" to mapOf(
|
|
"version" to buildInfo.pklVersion,
|
|
"commitId" to buildInfo.commitId,
|
|
"stdlibModules" to stdlibModules.joinToString(",")
|
|
))
|
|
}
|
|
|
|
into("org/pkl/core/stdlib") {
|
|
from("$rootDir/stdlib") {
|
|
include("*.pkl")
|
|
}
|
|
}
|
|
}
|
|
|
|
tasks.compileJava {
|
|
options.generatedSourceOutputDirectory.set(file("generated/truffle"))
|
|
}
|
|
|
|
tasks.compileKotlin {
|
|
enabled = false
|
|
}
|
|
|
|
tasks.test {
|
|
inputs.dir("src/test/files/LanguageSnippetTests/input")
|
|
inputs.dir("src/test/files/LanguageSnippetTests/input-helper")
|
|
inputs.dir("src/test/files/LanguageSnippetTests/output")
|
|
|
|
useJUnitPlatform {
|
|
excludeEngines("MacAmd64LanguageSnippetTestsEngine")
|
|
excludeEngines("MacAarch64LanguageSnippetTestsEngine")
|
|
excludeEngines("LinuxAmd64LanguageSnippetTestsEngine")
|
|
excludeEngines("LinuxAarch64LanguageSnippetTestsEngine")
|
|
excludeEngines("AlpineLanguageSnippetTestsEngine")
|
|
}
|
|
}
|
|
|
|
val testJavaExecutable by tasks.registering(Test::class) {
|
|
inputs.dir("src/test/files/LanguageSnippetTests/input")
|
|
inputs.dir("src/test/files/LanguageSnippetTests/input-helper")
|
|
inputs.dir("src/test/files/LanguageSnippetTests/output")
|
|
|
|
testClassesDirs = files(tasks.test.get().testClassesDirs)
|
|
classpath =
|
|
// compiled test classes
|
|
sourceSets.test.get().output +
|
|
// java executable
|
|
javaExecutableConfiguration +
|
|
// test-only dependencies
|
|
// (test dependencies that are also main dependencies must already be contained in java executable;
|
|
// to verify that we don't want to include them here)
|
|
(configurations.testRuntimeClasspath.get() - configurations.runtimeClasspath.get())
|
|
|
|
useJUnitPlatform {
|
|
includeEngines("LanguageSnippetTestsEngine")
|
|
}
|
|
}
|
|
|
|
tasks.check {
|
|
dependsOn(testJavaExecutable)
|
|
}
|
|
|
|
val testMacExecutableAmd64 by tasks.registering(Test::class) {
|
|
enabled = buildInfo.os.isMacOsX && buildInfo.graalVm.isGraal22
|
|
dependsOn(":pkl-cli:macExecutableAmd64")
|
|
|
|
inputs.dir("src/test/files/LanguageSnippetTests/input")
|
|
inputs.dir("src/test/files/LanguageSnippetTests/input-helper")
|
|
inputs.dir("src/test/files/LanguageSnippetTests/output")
|
|
|
|
testClassesDirs = files(tasks.test.get().testClassesDirs)
|
|
classpath = tasks.test.get().classpath
|
|
|
|
useJUnitPlatform {
|
|
includeEngines("MacAmd64LanguageSnippetTestsEngine")
|
|
}
|
|
}
|
|
|
|
val testMacExecutableAarch64 by tasks.registering(Test::class) {
|
|
enabled = buildInfo.os.isMacOsX && !buildInfo.graalVm.isGraal22
|
|
dependsOn(":pkl-cli:macExecutableAarch64")
|
|
|
|
inputs.dir("src/test/files/LanguageSnippetTests/input")
|
|
inputs.dir("src/test/files/LanguageSnippetTests/input-helper")
|
|
inputs.dir("src/test/files/LanguageSnippetTests/output")
|
|
|
|
testClassesDirs = files(tasks.test.get().testClassesDirs)
|
|
classpath = tasks.test.get().classpath
|
|
|
|
useJUnitPlatform {
|
|
includeEngines("MacAarch64LanguageSnippetTestsEngine")
|
|
}
|
|
}
|
|
|
|
val testLinuxExecutableAmd64 by tasks.registering(Test::class) {
|
|
enabled = buildInfo.os.isLinux && buildInfo.arch == "amd64"
|
|
dependsOn(":pkl-cli:linuxExecutableAmd64")
|
|
|
|
inputs.dir("src/test/files/LanguageSnippetTests/input")
|
|
inputs.dir("src/test/files/LanguageSnippetTests/input-helper")
|
|
inputs.dir("src/test/files/LanguageSnippetTests/output")
|
|
|
|
testClassesDirs = files(tasks.test.get().testClassesDirs)
|
|
classpath = tasks.test.get().classpath
|
|
|
|
useJUnitPlatform {
|
|
includeEngines("LinuxAmd64LanguageSnippetTestsEngine")
|
|
}
|
|
}
|
|
|
|
val testLinuxExecutableAarch64 by tasks.registering(Test::class) {
|
|
enabled = buildInfo.os.isLinux && buildInfo.arch == "aarch64"
|
|
dependsOn(":pkl-cli:linuxExecutableAarch64")
|
|
|
|
inputs.dir("src/test/files/LanguageSnippetTests/input")
|
|
inputs.dir("src/test/files/LanguageSnippetTests/input-helper")
|
|
inputs.dir("src/test/files/LanguageSnippetTests/output")
|
|
|
|
testClassesDirs = files(tasks.test.get().testClassesDirs)
|
|
classpath = tasks.test.get().classpath
|
|
|
|
useJUnitPlatform {
|
|
includeEngines("LinuxAarch64LanguageSnippetTestsEngine")
|
|
}
|
|
}
|
|
|
|
val testAlpineExecutableAmd64 by tasks.registering(Test::class) {
|
|
enabled = buildInfo.os.isLinux && buildInfo.arch == "amd64" && buildInfo.hasMuslToolchain
|
|
dependsOn(":pkl-cli:alpineExecutableAmd64")
|
|
|
|
inputs.dir("src/test/files/LanguageSnippetTests/input")
|
|
inputs.dir("src/test/files/LanguageSnippetTests/input-helper")
|
|
inputs.dir("src/test/files/LanguageSnippetTests/output")
|
|
|
|
testClassesDirs = files(tasks.test.get().testClassesDirs)
|
|
classpath = tasks.test.get().classpath
|
|
|
|
useJUnitPlatform {
|
|
includeEngines("AlpineLanguageSnippetTestsEngine")
|
|
}
|
|
}
|
|
|
|
tasks.testNative {
|
|
dependsOn(testLinuxExecutableAmd64)
|
|
dependsOn(testLinuxExecutableAarch64)
|
|
dependsOn(testMacExecutableAmd64)
|
|
dependsOn(testMacExecutableAarch64)
|
|
dependsOn(testAlpineExecutableAmd64)
|
|
}
|
|
|
|
tasks.clean {
|
|
delete("generated/")
|
|
delete("$buildDir/test-packages")
|
|
}
|
|
|
|
spotless {
|
|
antlr4 {
|
|
licenseHeaderFile(rootProject.file("buildSrc/src/main/resources/license-header.star-block.txt"))
|
|
target(files("src/main/antlr/PklParser.g4", "src/main/antlr/PklLexer.g4"))
|
|
}
|
|
}
|