lucene/gradle/generation/jflex.gradle

200 lines
5.8 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.
*/
// Add a top-level pseudo-task to which we will attach individual regenerate tasks.
configure(rootProject) {
configurations {
jflex
}
dependencies {
jflex "de.jflex:jflex:${scriptDepVersions['jflex']}"
}
}
// We always regenerate, no need to declare outputs.
class JFlexTask extends DefaultTask {
@Input
File jflexFile
@Input
File skeleton
@Optional
String heapSize
JFlexTask() {
dependsOn(project.rootProject.configurations.jflex)
}
@TaskAction
def generate() {
if (!jflexFile || !jflexFile.exists()) {
throw new RuntimeException("JFlex file does not exist: ${jflexFile}")
}
def targetDir = jflexFile.parentFile
def target = jflexFile.absolutePath.replace(".jflex", ".java")
logger.lifecycle("Regenerating JFlex:\n from: ${jflexFile}\n to: ${target}")
project.javaexec {
classpath {
project.rootProject.configurations.jflex
}
main = "jflex.Main"
args += [
"-nobak",
"--quiet",
"--encoding", "UTF-8",
]
if (heapSize) {
maxHeapSize = heapSize
}
if (skeleton) {
args += ["--skel", skeleton.absolutePath]
}
args += [
"-d", targetDir.absolutePath,
jflexFile
]
}
// Correct line endings for Windows.
project.ant.fixcrlf(
file: target,
encoding: "UTF-8",
eol: "lf"
)
}
}
configure(project(":lucene:core")) {
task jflexStandardTokenizerImpl(type: JFlexTask) {
description "Regenerate StandardTokenizerImpl.java"
group "generation"
jflexFile = file('src/java/org/apache/lucene/analysis/standard/StandardTokenizerImpl.jflex')
skeleton = file("src/data/jflex/skeleton.disable.buffer.expansion.txt")
doLast {
ant.replace(
file: file('src/java/org/apache/lucene/analysis/standard/StandardTokenizerImpl.java'),
encoding: "UTF-8",
token: "private static final int ZZ_BUFFERSIZE =",
value: "private int ZZ_BUFFERSIZE ="
)
}
}
}
configure(project(":lucene:analysis:common")) {
task jflexWikipediaTokenizerImpl(type: JFlexTask) {
description "Regenerate WikipediaTokenizerImpl.java"
group "generation"
jflexFile = file('src/java/org/apache/lucene/analysis/wikipedia/WikipediaTokenizerImpl.jflex')
skeleton = project(":lucene:core").file("src/data/jflex/skeleton.default")
}
task jflexClassicTokenizerImpl(type: JFlexTask) {
description "Regenerate ClassicTokenizerImpl.java"
group "generation"
jflexFile = file('src/java/org/apache/lucene/analysis/classic/ClassicTokenizerImpl.jflex')
skeleton = project(":lucene:core").file("src/data/jflex/skeleton.default")
}
task jflexUAX29URLEmailTokenizerImpl(type: JFlexTask) {
description "Regenerate UAX29URLEmailTokenizerImpl.java"
group "generation"
jflexFile = file('src/java/org/apache/lucene/analysis/email/UAX29URLEmailTokenizerImpl.jflex')
skeleton = project(":lucene:core").file("src/data/jflex/skeleton.disable.buffer.expansion.txt")
heapSize = "12g"
doFirst {
logger.lifecycle("Regenerating UAX29URLEmailTokenizerImpl. This may take a long time (and requires tons of memory).")
}
doLast {
ant.replace(
file: file('src/java/org/apache/lucene/analysis/email/UAX29URLEmailTokenizerImpl.java'),
encoding: "UTF-8",
token: "private static final int ZZ_BUFFERSIZE =",
value: "private int ZZ_BUFFERSIZE ="
)
}
}
task jflexHTMLStripCharFilter(type: JFlexTask) {
description "Regenerate HTMLStripCharFilter.java"
group "generation"
jflexFile = file('src/java/org/apache/lucene/analysis/charfilter/HTMLStripCharFilter.jflex')
skeleton = project(":lucene:core").file("src/data/jflex/skeleton.default")
doFirst {
// Regenerate HTMLCharacterEntities.jflex first.
def target = file('src/java/org/apache/lucene/analysis/charfilter/HTMLCharacterEntities.jflex')
target.withOutputStream { output ->
project.exec {
executable = project.externalTool("python3")
workingDir = target.parentFile
standardOutput = output
args += [
"-B", // don't write any bytecode cache
"htmlentity.py"
]
}
}
project.ant.fixcrlf(
file: target,
encoding: "UTF-8",
eol: "lf"
)
}
}
task regenerate() {
description "Regenerate any generated sources"
group "generation"
// Run regeneration tasks.
dependsOn jflexUAX29URLEmailTokenizerImpl
dependsOn jflexHTMLStripCharFilter
dependsOn jflexClassicTokenizerImpl
dependsOn jflexWikipediaTokenizerImpl
// Clean up and reformat the generated sources after generation.
dependsOn "tidy"
}
// Make sure tidy runs after generation, if they're defined.
tasks.matching { it.name == "tidy" }.configureEach {
mustRunAfter jflexUAX29URLEmailTokenizerImpl,
jflexHTMLStripCharFilter,
jflexClassicTokenizerImpl,
jflexWikipediaTokenizerImpl
}
}