mirror of
https://github.com/apple/pkl.git
synced 2026-03-27 19:41:18 +01:00
Publish executables for pkldoc, pkl-codegen-java, pkl-codegen-kotlin (#1023)
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
This commit is contained in:
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
package org.pkl.cli.svm;
|
||||
|
||||
import org.graalvm.nativeimage.hosted.Feature;
|
||||
import org.pkl.core.runtime.BaseModule;
|
||||
|
||||
/**
|
||||
* This class is registered with native-image via a CLI option (see Gradle task `nativeExecutable`).
|
||||
*/
|
||||
@SuppressWarnings({"unused", "ResultOfMethodCallIgnored"})
|
||||
public final class InitFeature implements Feature {
|
||||
/**
|
||||
* Enforce that {@link BaseModule#getModule()}'s static initializer completes before depending
|
||||
* static initializers are invoked. This is necessary to avoid deadlocks in native-image's
|
||||
* multi-threaded execution of static initializers. It's not clear at this point if multi-threaded
|
||||
* initialization on the JVM could also deadlock, i.e., if this is a Pkl bug.
|
||||
*/
|
||||
public void duringSetup(DuringSetupAccess access) {
|
||||
BaseModule.getModule();
|
||||
}
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
package org.pkl.cli.svm;
|
||||
|
||||
import com.oracle.svm.core.annotate.Alias;
|
||||
import com.oracle.svm.core.annotate.RecomputeFieldValue;
|
||||
import com.oracle.svm.core.annotate.TargetClass;
|
||||
|
||||
/**
|
||||
* native-image can't determine how calls to {@link sun.misc.Unsafe#arrayBaseOffset(Class)} affect
|
||||
* static fields in msgpack's {@code MessageBuffer}.
|
||||
*
|
||||
* <p>This informs the compiler which field to re-compute.
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
@TargetClass(className = "org.msgpack.core.buffer.MessageBuffer")
|
||||
final class MessagePackRecomputations {
|
||||
@Alias
|
||||
@RecomputeFieldValue(kind = RecomputeFieldValue.Kind.ArrayBaseOffset, declClass = byte[].class)
|
||||
static int ARRAY_BYTE_BASE_OFFSET;
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
/*
|
||||
* Copyright © 2024-2025 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.
|
||||
*/
|
||||
package org.pkl.cli.svm;
|
||||
|
||||
import com.oracle.svm.core.annotate.Alias;
|
||||
import com.oracle.svm.core.annotate.RecomputeFieldValue;
|
||||
import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;
|
||||
import com.oracle.svm.core.annotate.TargetClass;
|
||||
import com.oracle.svm.truffle.TruffleFeature;
|
||||
import java.util.Map;
|
||||
import org.pkl.core.ast.builder.AstBuilder;
|
||||
|
||||
/**
|
||||
* Workaround to prevent the native-image build error "Detected a started Thread in the image
|
||||
* heap.". The cause of this error is the use of {@link org.graalvm.polyglot.Context} in the
|
||||
* (intentionally) statically reachable class {@link org.pkl.core.runtime.StdLibModule}.
|
||||
*
|
||||
* <p>A cleaner solution would be to have a separate {@link AstBuilder} for stdlib modules that
|
||||
* produces a fully initialized module object without executing any Truffle nodes.
|
||||
*
|
||||
* <p>This class is automatically discovered by native-image; no registration is required.
|
||||
*/
|
||||
@SuppressWarnings({"unused", "ClassName"})
|
||||
@TargetClass(
|
||||
className = "com.oracle.truffle.polyglot.PolyglotContextImpl",
|
||||
onlyWith = {TruffleFeature.IsEnabled.class})
|
||||
public final class PolyglotContextImplTarget {
|
||||
@Alias
|
||||
@RecomputeFieldValue(kind = Kind.NewInstance, declClassName = "java.util.HashMap")
|
||||
public Map<?, ?> threads;
|
||||
|
||||
@Alias
|
||||
@RecomputeFieldValue(kind = Kind.Reset)
|
||||
public WeakAssumedValueTarget singleThreadValue;
|
||||
|
||||
@Alias
|
||||
@RecomputeFieldValue(kind = Kind.Reset)
|
||||
public PolyglotThreadInfoTarget cachedThreadInfo;
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
package org.pkl.cli.svm;
|
||||
|
||||
import com.oracle.svm.core.annotate.TargetClass;
|
||||
import com.oracle.svm.truffle.TruffleFeature;
|
||||
|
||||
/** Makes non-public class PolyglotThreadInfo usable above. */
|
||||
@TargetClass(
|
||||
className = "com.oracle.truffle.polyglot.PolyglotThreadInfo",
|
||||
onlyWith = {TruffleFeature.IsEnabled.class})
|
||||
public final class PolyglotThreadInfoTarget {}
|
||||
@@ -1,33 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
package org.pkl.cli.svm;
|
||||
|
||||
import com.oracle.svm.core.annotate.Alias;
|
||||
import com.oracle.svm.core.annotate.RecomputeFieldValue;
|
||||
import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;
|
||||
import com.oracle.svm.core.annotate.TargetClass;
|
||||
import com.oracle.svm.truffle.TruffleFeature;
|
||||
import java.util.Map;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@TargetClass(
|
||||
className = "com.oracle.truffle.api.impl.ThreadLocalHandshake",
|
||||
onlyWith = {TruffleFeature.IsEnabled.class})
|
||||
public final class ThreadLocalHandshakeTarget {
|
||||
@Alias
|
||||
@RecomputeFieldValue(kind = Kind.NewInstance, declClassName = "java.util.HashMap")
|
||||
static Map<?, ?> SAFEPOINTS;
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
package org.pkl.cli.svm;
|
||||
|
||||
import com.oracle.svm.core.annotate.TargetClass;
|
||||
import com.oracle.svm.truffle.TruffleFeature;
|
||||
|
||||
/** Makes non-public class WeakAssumedValue usable. */
|
||||
@TargetClass(
|
||||
className = "com.oracle.truffle.polyglot.WeakAssumedValue",
|
||||
onlyWith = {TruffleFeature.IsEnabled.class})
|
||||
public final class WeakAssumedValueTarget {}
|
||||
Reference in New Issue
Block a user