blob: c10f193705de7ea87aeab11a26770fff3b36a08f [file] [log] [blame]
/*
* 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.
*/
group = "org.apache.sis"
// The version is specified in `gradle.properties`.
/*
* This project uses a custom Gradle plugin for building a project with Module Source Hierarchy.
* See the Gradle build script in the `endorsed` directory for more information.
*/
plugins {
antlr
`java-library`
`maven-publish` // For local deployment only. Not to be published on Maven Central.
id("net.linguica.maven-settings") version "0.5"
id("org.apache.sis.buildtools")
}
/*
* All JAR files that may potentially be used by a module.
* For each Apache SIS module, the dependencies actually
* used are declared in the `module-info.java` file.
*/
dependencies {
// Mandatory dependencies
api(libs.units)
api(libs.geoapi)
api(libs.jaxb.api) // Transitive dependency.
api(libs.jts.core) // Should be an optional dependency.
api(libs.esri.geometry) // Idem.
api(libs.yasson)
api(files("../endorsed/build/classes/java/main/org.apache.sis.util"))
api(files("../endorsed/build/classes/java/main/org.apache.sis.metadata"))
api(files("../endorsed/build/classes/java/main/org.apache.sis.referencing"))
api(files("../endorsed/build/classes/java/main/org.apache.sis.feature"))
api(files("../endorsed/build/classes/java/main/org.apache.sis.storage"))
api(files("../endorsed/build/classes/java/main/org.apache.sis.portrayal"))
// Test dependencies
testImplementation(tests.junit5)
testRuntimeOnly (tests.jupiter)
/*
* Dependencies used only by incubated modules. The dependencies are not declared
* in the global `settings.gradle.kts` because incubated modules are not released.
*/
implementation(group = "org.antlr", name = "antlr4-maven-plugin", version = "4.11.1")
compileOnly (group = "jakarta.servlet", name = "jakarta.servlet-api", version = "6.0.0")
compileOnly (group = "org.osgi", name = "osgi.core", version = "8.0.0")
antlr (group = "org.antlr", name = "antlr4", version = "4.11.1")
}
/*
* Generate ANTLR4 source files, then compile main and tests classes from Module Source Hierarchy.
* The test classes require some additional dependencies declared in the `org.apache.sis.test.incubator` module.
*
* Note: as of Gradle 8.2, the ANTLR task does not work well with arbitrary source directories.
* We have to keep default convention even if it does not fit well in Module Source Hierarchy.
* Another problem is that we didn't found the right compiler options for combining a directory
* of generated sources with the main sources in a Module Source Hierarchy, so we have to write
* the output directly in main source directory. This is hopefully temporary, since we hope to
* replace ANTLR generated code by hand-written code in a future version.
*/
var srcDir = file("src") // Must be the same as the hard-coded value in `BuildHelper.java`.
tasks.generateGrammarSource {
setOutputDirectory(file("${srcDir}/org.apache.sis.cql/main"))
}
tasks.compileJava {
dependsOn(":endorsed:compileJava")
options.release.set(11) // The version of both Java source code and compiled byte code.
}
tasks.compileTestJava {
options.compilerArgs.add("-source") // "source", not "release", because we accept any target version.
options.compilerArgs.add("16") // For consistency with the value set in the `endorsed` modules.
srcDir.list().forEach {
addRead(options.compilerArgs, it, "org.apache.sis.test.incubator,org.junit.jupiter.api")
}
addExportForTests(options.compilerArgs)
}
/*
* Adds a JVM argument for adding dependencies to a module.
* This is for dependencies not declared in `module-info`
* but needed for test compilation or test execution.
*/
fun addRead(args : MutableList<String>, module : String, dependencies : String) {
args.add("--add-reads")
args.add(module + '=' + dependencies)
}
/*
* Adds a JVM argument for making an internal package accessible to another module.
* This is for making internal packages accessible to JUnit or to some test classes
* defined in other modules.
*/
fun addExport(args : MutableList<String>, module : String, pkg : String, consumers : String) {
args.add("--add-exports")
args.add(module + '/' + pkg + '=' + consumers)
}
/*
* Add compiler and runtime options for patching the Apache SIS main modules with the test classes.
* The same options are required for both compiling and executing the tests.
*/
fun addExportForTests(args : MutableList<String>) {
/*
* Some test classes need access to more internal packages than requested by the main classes.
* The following lines may need to be edited when export statements are added or removed in a
* module-info.java file of main source code, or when a test class starts using or stop using
* an internal API.
*/
// ――――――――――――― Module name ――――――――――――――――――――――― Package to export ―――――――――――――――
addExport(args, "org.apache.sis.feature", "org.apache.sis.geometry.wrapper.jts",
"org.apache.sis.portrayal.map")
addExport(args, "org.apache.sis.storage", "org.apache.sis.storage.base",
"org.apache.sis.portrayal.map")
}
/*
* Discover and execute JUnit-based tests.
*/
tasks.test {
val args = mutableListOf("-enableassertions")
addExportForTests(args)
addExport(args, "org.apache.sis.cql", "org.apache.sis.cql", "ALL-UNNAMED")
setAllJvmArgs(args)
testLogging {
events("FAILED", "STANDARD_OUT", "STANDARD_ERROR")
setExceptionFormat("FULL")
}
systemProperty("junit.jupiter.execution.parallel.enabled", "true")
systemProperty("junit.jupiter.execution.parallel.mode.default", "concurrent")
systemProperty("junit.jupiter.execution.parallel.mode.classes.default", "concurrent")
}
/*
* Configuration of the modules to deploy as Maven artifacts.
*/
publishing {
publications {
create<MavenPublication>("cql") {
var module = "org.apache.sis.cql"
groupId = "org.apache.sis.core"
artifactId = "sis-cql"
artifact(layout.buildDirectory.file("libs/${module}.jar"))
artifact(layout.buildDirectory.file("docs/${module}-sources.jar")) {classifier = "sources"}
artifact(layout.buildDirectory.file("docs/${module}-javadoc.jar")) {classifier = "javadoc"}
pom {
name = "Apache SIS CQL"
description = "CQL parser."
}
}
create<MavenPublication>("storage.shapefile") {
var module = "org.apache.sis.storage.shapefile"
groupId = "org.apache.sis.storage"
artifactId = "sis-shapefile"
artifact(layout.buildDirectory.file("libs/${module}.jar"))
artifact(layout.buildDirectory.file("docs/${module}-sources.jar")) {classifier = "sources"}
artifact(layout.buildDirectory.file("docs/${module}-javadoc.jar")) {classifier = "javadoc"}
pom {
name = "Apache SIS Shapefile storage"
description = "Read and write files in the Shapefile format."
}
}
create<MavenPublication>("storage.coveragejson") {
var module = "org.apache.sis.storage.coveragejson"
groupId = "org.apache.sis.storage"
artifactId = "sis-coveragejson"
artifact(layout.buildDirectory.file("libs/${module}.jar"))
artifact(layout.buildDirectory.file("docs/${module}-sources.jar")) {classifier = "sources"}
artifact(layout.buildDirectory.file("docs/${module}-javadoc.jar")) {classifier = "javadoc"}
pom {
name = "Apache SIS JSON Coverage storage"
description = "Read and write files in the JSON Coverage format."
}
}
create<MavenPublication>("portrayal.map") {
var module = "org.apache.sis.portrayal.map"
groupId = "org.apache.sis.core"
artifactId = "sis-portrayal-map"
artifact(layout.buildDirectory.file("libs/${module}.jar"))
artifact(layout.buildDirectory.file("docs/${module}-sources.jar")) {classifier = "sources"}
artifact(layout.buildDirectory.file("docs/${module}-javadoc.jar")) {classifier = "javadoc"}
pom {
name = "Apache SIS portrayal"
description = "Symbology and map representations, together with a rendering engine for display."
}
}
create<MavenPublication>("webapp") {
var module = "org.apache.sis.webapp"
groupId = "org.apache.sis.application"
artifactId = "sis-webapp"
artifact(layout.buildDirectory.file("libs/${module}.jar"))
artifact(layout.buildDirectory.file("docs/${module}-sources.jar")) {classifier = "sources"}
artifact(layout.buildDirectory.file("docs/${module}-javadoc.jar")) {classifier = "javadoc"}
pom {
name = "Apache SIS web services layer"
description = "Placeholder for future developments."
}
}
}
/* Following block is currently repeated in all sub-projects. */
repositories {
maven {
val stage = if (version.toString().endsWith("SNAPSHOT")) "snapshots" else "releases"
name = providers.gradleProperty("${stage}Id").get()
url = uri(providers.gradleProperty("${stage}URL").get())
}
}
}