blob: a3e260a86e19dfc6dce53832d28ed2616202c803 [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.
*/
import java.nio.file.*
import java.nio.file.attribute.BasicFileAttributes
plugins {
id 'java'
id 'idea'
id 'com.google.protobuf' version '0.8.3'
id 'maven'
id 'maven-publish'
id 'project-report'
id 'net.researchgate.release' version '2.6.0'
id "io.spring.dependency-management" version "1.0.4.RELEASE"
}
repositories {
mavenCentral()
mavenLocal()
}
ext {
genDirectory = "$projectDir/gen"
distDirectory = "$projectDir/distribution"
pythonBuildDirPath = "${file(buildDir.path + '/python/nexusproto').path}"
}
dependencyManagement {
imports {
mavenBom 'org.apache:apache:18'
}
}
protobuf {
generatedFilesBaseDir = genDirectory
// Configure the protoc executable
protoc {
// Download from repositories
artifact = 'com.google.protobuf:protoc:3.4.0'
}
plugins {
// Define a plugin with name 'grpc'
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java:1.9.0'
}
}
generateProtoTasks {
all().each { task ->
task.builtins {
python {
outputSubDir = 'python'
}
}
}
}
}
task writeNewPom {
doLast {
pom {}.writeTo(file(buildDir.path + "/poms/${project.name}-${project.version}.xml"))
}
}
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
}
}
}
assemble.doLast {
File pythonbuilddir = file(pythonBuildDirPath)
File pythonsource = file('src/main/python')
Files.walkFileTree(pythonsource.toPath(), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(final Path dir, final BasicFileAttributes attrs) throws IOException {
Files.createDirectories(pythonbuilddir.toPath().resolve(pythonsource.toPath().relativize(dir)))
return FileVisitResult.CONTINUE
}
@Override
public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) throws IOException {
Files.copy(file, pythonbuilddir.toPath().resolve(pythonsource.toPath().relativize(file)), StandardCopyOption.REPLACE_EXISTING)
return FileVisitResult.CONTINUE
}
})
setVersionInPythonModule(pythonbuilddir)
Files.move(file(pythonbuilddir.path + '/nexusproto/setup.py').toPath(), file(pythonbuilddir.path + '/setup.py').toPath(), StandardCopyOption.REPLACE_EXISTING)
File generatedPython = file("$genDirectory/main/python/DataTile_pb2.py")
Files.copy(generatedPython.toPath(), file(pythonbuilddir.path + '/nexusproto/DataTile_pb2.py').toPath(), StandardCopyOption.REPLACE_EXISTING)
}
updateVersion.doLast {
setVersionInPythonModule(file(pythonBuildDirPath))
}
task checkPython {
checkPython.ext.python = null
checkPython.ext.pip = null
doLast {
def pythonExecutable = ['python', 'python3', 'python2.7'].find { python ->
try {
def check = "import sys; sys.exit(0 if sys.version_info >= (2,7) else 1)"
return [python, "-c", check].execute().waitFor() == 0
} catch (IOException ignored) {
return false
}
}
def pipExecutable = ['pip', 'pip3'].find { pip ->
try {
return [pip, "-v"].execute().waitFor() == 0
} catch (IOException ignored) {
return false
}
}
if (pythonExecutable == null || pipExecutable == null) {
throw new GradleException('Build requires Python and Pip.')
} else {
checkPython.ext.python = pythonExecutable
checkPython.ext.pip = pipExecutable
}
}
}
task tarPython(type: Tar, dependsOn: [assemble]) {
destinationDir = file(project.ext.distDirectory)
archiveName = "nexusproto-${project.version}.tar.gz"
compression = Compression.GZIP
from(file(buildDir.path + '/python')) {
include '**/*'
}
}
task pythonInstall(dependsOn: [checkPython, tarPython]){
doLast {
def installed
def installCommand = [checkPython.ext.pip, 'install', tarPython.archivePath, '--force']
try{
def process = installCommand.execute()
process.waitFor()
logger.debug("Standard out from executing \"${installCommand.join(" ")}\"\n" + process.in.readLines().collect{line -> " $line"}.join("\n"))
def stderrOut = process.err.text
if(stderrOut) {
logger.error("Standard err from executing \"${installCommand.join(" ")}\"\n" + stderrOut.split("\n").collect { line -> " $line"}.join("\n"))
}
installed = process.exitValue() == 0
}catch (IOException e){
throw new GradleException("Failed to install", e)
}
if(!installed){
throw new GradleException("Failed to install ${tarPython.archivePath}")
}
}
}
clean.doLast {
file(genDirectory).deleteDir()
file(distDirectory).deleteDir()
}
dependencies {
compile 'com.google.protobuf:protobuf-java:3.4.0'
}
void setVersionInPythonModule(pythonbuilddir){
def setupPy = file(pythonbuilddir.path + '/nexusproto/setup.py').text
setupPy = setupPy.replaceAll(/GRADLE_PROJECT_VERSION/, "$project.version")
file(pythonbuilddir.path + '/nexusproto/setup.py').write(setupPy)
}