mirror of
https://github.com/apple/pkl.git
synced 2026-01-11 22:30:54 +01:00
This adds logic to build and publish the other executables related to Pkl. These are: * pkl-doc * pkl-codegen-kotlin * pkl-codegen-java pkl-codegen-kotlin and pkl-codegen-java are published as executable JARs, whereas pkldoc is published both as an executable JAR, and also native executables (matching the set of os/arch supported by Pkl). The reason this only publishes executable JARs for pkl-codegen-kotlin and pkl-codegen-java is because we expect that the Java requirement is not a problem for these users, and that the native executable provides negligible added value. As part of this, the following changes are made: * Introduce `pklJavaExecutable` plugin, which sets up building and publishing of executable JAR. * Introduce `pklNativeExecutable` plugin, which sets up building and publishing of native executables. * Introduce `NativeImageBuild` Gradle task, which knows how to build native-image executables. * Introduce `ExecutableSpec` extension, for projects that publish executables to configure how those executables should be published. * `./griddles buildNative`, by default, will only build the executable of the host OS/Arch, and will no longer cross-build. * The target arch of `./gradlew buildNative` can be changed using `-Dpkl.targetArch=<aarch64|amd64>`. * On linux/amd64 only, with `./gradlew buildNative`, a statically linked executable can be built using `-Dpkl.musl=true` * Make `javaExecutable` a dependency of `assemble` * Make `testStartJavaExecutable` a dependency of `check` * Change name `pklNativeBuild` to `pklNativeLifecycle` to better match the plugin's purpose * Remove Truffle SVM classes from main source set (don't publish these classes as part of the pkl-cli JAR) * Change CircleCI definition to publish new executables * Change CircleCI definition to call `buildNative` instead of individual task names
169 lines
4.5 KiB
Plaintext
169 lines
4.5 KiB
Plaintext
//===----------------------------------------------------------------------===//
|
|
// Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// https://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//===----------------------------------------------------------------------===//
|
|
// File gets rendered to .circleci/config.yml via git hook.
|
|
amends "package://pkg.pkl-lang.org/pkl-project-commons/pkl.impl.circleci@1.2.0#/PklCI.pkl"
|
|
|
|
import "jobs/BuildNativeJob.pkl"
|
|
import "jobs/GradleCheckJob.pkl"
|
|
import "jobs/DeployJob.pkl"
|
|
import "jobs/SimpleGradleJob.pkl"
|
|
|
|
local prbJobs: Listing<String> = gradleCheckJobs.keys.toListing()
|
|
|
|
local buildAndTestJobs = (prbJobs) {
|
|
"bench"
|
|
"gradle-compatibility"
|
|
...buildNativeJobs.keys.filter((it) -> it.endsWith("snapshot"))
|
|
}
|
|
|
|
local releaseJobs = (prbJobs) {
|
|
"bench"
|
|
"gradle-compatibility"
|
|
...buildNativeJobs.keys.filter((it) -> it.endsWith("release"))
|
|
}
|
|
|
|
prb {
|
|
jobs = prbJobs
|
|
}
|
|
|
|
main {
|
|
jobs {
|
|
...buildAndTestJobs
|
|
new {
|
|
["deploy-snapshot"] {
|
|
requires = buildAndTestJobs
|
|
context = "pkl-maven-release"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
release {
|
|
jobs {
|
|
...releaseJobs
|
|
// do GitHub release first because we can overwrite the tag.
|
|
// publishing to Maven Central is final.
|
|
new {
|
|
["github-release"] {
|
|
requires = releaseJobs
|
|
context = "pkl-github-release"
|
|
}
|
|
}
|
|
new {
|
|
["deploy-release"] {
|
|
requires { "github-release" }
|
|
context = "pkl-maven-release"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
releaseBranch {
|
|
jobs = releaseJobs
|
|
}
|
|
|
|
triggerDocsBuild = "both"
|
|
|
|
triggerPackageDocsBuild = "release"
|
|
|
|
local buildNativeJobs: Mapping<String, BuildNativeJob> = new {
|
|
for (_dist in List("release", "snapshot")) {
|
|
for (_project in List("pkl-cli", "pkl-doc")) {
|
|
for (_arch in List("amd64", "aarch64")) {
|
|
for (_os in List("macOS", "linux")) {
|
|
["\(_project)-\(_os)-\(_arch)-\(_dist)"] {
|
|
arch = _arch
|
|
os = _os
|
|
isRelease = _dist == "release"
|
|
project = _project
|
|
}
|
|
}
|
|
}
|
|
["\(_project)-linux-alpine-amd64-\(_dist)"] {
|
|
arch = "amd64"
|
|
os = "linux"
|
|
musl = true
|
|
isRelease = _dist == "release"
|
|
project = _project
|
|
}
|
|
["\(_project)-windows-amd64-\(_dist)"] {
|
|
arch = "amd64"
|
|
os = "windows"
|
|
isRelease = _dist == "release"
|
|
project = _project
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
local gradleCheckJobs: Mapping<String, GradleCheckJob> = new {
|
|
["gradle-check"] {
|
|
javaVersion = "21.0"
|
|
isRelease = false
|
|
os = "linux"
|
|
}
|
|
["gradle-check-windows"] {
|
|
javaVersion = "21.0"
|
|
isRelease = false
|
|
os = "windows"
|
|
}
|
|
}
|
|
|
|
jobs {
|
|
for (jobName, job in buildNativeJobs) {
|
|
[jobName] = job.job
|
|
}
|
|
for (jobName, job in gradleCheckJobs) {
|
|
[jobName] = job.job
|
|
}
|
|
["bench"] = new SimpleGradleJob { command = "bench:jmh" }.job
|
|
["gradle-compatibility"] = new SimpleGradleJob {
|
|
name = "gradle compatibility"
|
|
command = #"""
|
|
:pkl-gradle:build \
|
|
:pkl-gradle:compatibilityTestReleases
|
|
"""#
|
|
}.job
|
|
["deploy-snapshot"] = new DeployJob { command = "publishToSonatype" }.job
|
|
["deploy-release"] = new DeployJob {
|
|
isRelease = true
|
|
command = "publishToSonatype closeAndReleaseSonatypeStagingRepository"
|
|
}.job
|
|
["github-release"] {
|
|
docker {
|
|
new { image = "maniator/gh:v2.40.1" }
|
|
}
|
|
steps {
|
|
new AttachWorkspaceStep { at = "." }
|
|
new RunStep {
|
|
name = "Publish release on GitHub"
|
|
command = #"""
|
|
# exclude build_artifacts.txt from publish
|
|
rm -f */build/executable/*.build_artifacts.txt
|
|
find */build/executable/* -type d | xargs rm -rf
|
|
gh release create "${CIRCLE_TAG}" \
|
|
--title "${CIRCLE_TAG}" \
|
|
--target "${CIRCLE_SHA1}" \
|
|
--verify-tag \
|
|
--notes "Release notes: https://pkl-lang.org/main/current/release-notes/changelog.html#release-${CIRCLE_TAG}" \
|
|
--repo "${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}" \
|
|
*/build/executable/*
|
|
"""#
|
|
}
|
|
}
|
|
}
|
|
}
|