lucene/gradle/java/memorysegment-mrjar.gradle

90 lines
2.9 KiB
Groovy

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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
*
* http://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.
*/
// Produce an MR-JAR with Java 19 MemorySegment implementation for MMapDirectory
configure(project(":lucene:core")) {
plugins.withType(JavaPlugin) {
sourceSets {
main19 {
java {
srcDirs = ['src/java19']
}
}
}
configurations {
// Inherit any dependencies from the main source set.
main19Implementation.extendsFrom implementation
}
dependencies {
// We need the main classes to compile our Java 19 pieces.
main19Implementation sourceSets.main.output
}
def patchClassFiles = { DirectoryProperty destinationDirectory, int expectedMajor ->
destinationDirectory.getAsFileTree().matching(new PatternSet().include('**/*.class')).visit{ details ->
if (!details.directory) {
logger.info("Patching: ${details.file}")
new RandomAccessFile(details.file, 'rw').withCloseable { f ->
int magic = f.readInt();
if (magic != (int)0xCAFEBABE) {
throw new GradleException("Invalid Java class file magic ${String.format("0x%08X", magic)}: ${details.file}")
}
f.seek(6L)
short major = f.readShort()
if (major != expectedMajor) {
throw new GradleException("Invalid Java class file version ${major}: ${details.file}")
}
// patch the minor version to 0 (remove preview flag):
f.seek(4L)
f.writeShort(0)
}
}
}
}
tasks.named('compileMain19Java').configure {
javaCompiler = javaToolchains.compilerFor {
languageVersion = JavaLanguageVersion.of(19)
}
// undo alternative JDK support:
options.forkOptions.javaHome = null
sourceCompatibility = 19
targetCompatibility = 19
options.compilerArgs += ["--release", 19 as String, "--enable-preview"]
doLast {
patchClassFiles(destinationDirectory, 63)
}
}
tasks.named('jar').configure {
into('META-INF/versions/19') {
from sourceSets.main19.output
}
manifest.attributes(
'Multi-Release': 'true'
)
}
}
}