import org.gradle.internal.os.OperatingSystem apply plugin: 'java' def generatedJNIHeaderLoc = '../build/include' sourceSets { main { java { srcDirs = ['../java/src'] } } } jar { description = 'Generates NetworkTables jar, with the JNI shared libraries embedded' baseName = 'ntcore' classifier = "$buildPlatform" dependsOn { classes } binaries.withType(SharedLibraryBinary) { binary -> from(file(binary.sharedLibraryFile)) { into getPlatformPath(binary) } } } project.tasks.whenTaskAdded { task-> if (isArm) { if (task.name == 'ntcoreSharedLibrary') jar.dependsOn task } else { if (task.name == 'x64NtcoreSharedLibrary' || task.name == 'x86NtcoreSharedLibrary') jar.dependsOn task } } task networktablesJavaSource(type: Jar, dependsOn: classes) { description = 'Generates the source jar for NetworkTables java' group = 'WPILib' baseName = 'ntcore' classifier = "sources" from sourceSets.main.allJava } task networktablesJavadoc(type: Jar, dependsOn: javadoc) { description = 'Generates the javadoc jar for NetworkTables java' group = 'WPILib' baseName = 'ntcore' classifier = "javadoc" from javadoc.destinationDir } build.dependsOn networktablesJavaSource build.dependsOn networktablesJavadoc /** * Generates the JNI headers */ task jniHeadersNetworkTables { description = 'Generates JNI headers from edu.wpi.first.wpilibj.networktables.*' group = 'WPILib' def outputFolder = file(generatedJNIHeaderLoc) inputs.files sourceSets.main.output outputs.file outputFolder doLast { outputFolder.mkdirs() exec { executable org.gradle.internal.jvm.Jvm.current().getExecutable('javah') args '-d', outputFolder args '-classpath', sourceSets.main.output.classesDir args 'edu.wpi.first.wpilibj.networktables.NetworkTablesJNI' } } } clean { delete generatedJNIHeaderLoc } compileJava { options.compilerArgs << '-Xlint:unchecked' } javadoc { options.addStringOption('Xdoclint:none', '-quiet') } // This creates a lambda that the main build.gradle can access, which sets up the JNI includes for the // target build platform. This lambda is exposed as a property in the main build.gradle. ext.setupJniIncludes = { binaries -> def platformSpecificIncludeFlag = { loc, cppCompiler -> if (OperatingSystem.current().isWindows()) { cppCompiler.args "/I$loc" } else { cppCompiler.args '-I', loc } } binaries.all { tasks.withType(CppCompile) { if (buildPlatform == 'arm') { cppCompiler.args '-I', file('../java/arm-linux').absolutePath cppCompiler.args '-I', file('../java/arm-linux/linux').absolutePath } else { def jdkLocation = org.gradle.internal.jvm.Jvm.current().javaHome platformSpecificIncludeFlag("${jdkLocation}/include", cppCompiler) if (targetPlatform.operatingSystem.macOsX) { platformSpecificIncludeFlag("${jdkLocation}/include/darwin", cppCompiler) } else if (targetPlatform.operatingSystem.linux) { platformSpecificIncludeFlag("${jdkLocation}/include/linux", cppCompiler) } else if (targetPlatform.operatingSystem.windows) { platformSpecificIncludeFlag("${jdkLocation}/include/win32", cppCompiler) } else if (targetPlatform.operatingSystem.freeBSD) { platformSpecificIncludeFlag("${jdkLocation}/include/freebsd", cppCompiler) } else if (file("$jdkLocation/include/darwin").exists()) { // TODO: As of Gradle 2.8, targetPlatform.operatingSystem.macOsX returns false // on El Capitan. We therefore manually test for the darwin folder and include it // if it exists platformSpecificIncludeFlag("${jdkLocation}/include/darwin", cppCompiler) } } jniHeadersNetworkTables.outputs.files.each { file -> if (buildPlatform == 'arm') { cppCompiler.args '-I', file.getPath() } else { platformSpecificIncludeFlag(file.getPath(), cppCompiler) } } dependsOn jniHeadersNetworkTables } } }