diff --git a/.gitignore b/.gitignore index 1590721785..105d2be86f 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ .vs/ *.def !ntcore.def +!ntcore-jni.def *.opensdf *.vcxproj *.vcxproj.user diff --git a/build.gradle b/build.gradle index 66211491a3..dac4d8db8a 100644 --- a/build.gradle +++ b/build.gradle @@ -19,6 +19,7 @@ if (!hasProperty('repo')) { } ext.buildArm = !project.hasProperty('skipArm') +ext.includeJava = !project.hasProperty('skipJava') if (hasProperty('makeDesktop')) { println 'Making desktop classifier jar. NOTE: This desktop version should only be used for local testing.' + @@ -52,211 +53,28 @@ ext.getPlatformPath = { binary -> } } -def includeJava = !hasProperty('skipJava') - -// This is a closure to set up the model for compiling a c++ build. In order to run the tests only on the -// native build, we have two pseudoprojects, native and arm. Native compiles for x86/x64, and arm compiles -// for arm. This closure takes two parameters: -// project - the project to configure -// isArm - whether the project should use arm include files or not. -def setupModel = { project, isArm -> - project.model { - platforms { - if (isArm) { - arm { - architecture 'arm' - operatingSystem 'linux' - } - } else { - x86 { - architecture 'x86' - } - x64 { - architecture 'x86_64' - } - } - } - - components { - ntcore(NativeLibrarySpec) { - if (isArm) { - targetPlatform 'arm' - } else { - targetPlatform 'x86' - targetPlatform 'x64' - } - binaries.all { - if (project.hasProperty('debug')) { - project.setupDebugDefines(cppCompiler, linker) - } else { - project.setupReleaseDefines(cppCompiler, linker) - } - } - - if (includeJava) { - project.setupJniIncludes(binaries) - } - - sources { - cpp { - source { - srcDirs = ['../src'] - if (includeJava) { - srcDirs "../java/lib" - } - includes = ['**/*.cpp'] - } - exportedHeaders { - srcDirs = ['../include', '../src'] - if (includeJava) { - project.jniHeadersNetworkTables.outputs.files.each { file -> - srcDirs file.getPath() - } - } - includes = ['**/*.h'] - } - } - } - } - } +ext.setupDefines = { project, binaries -> + binaries.all { + if (project.hasProperty('debug')) { + project.setupDebugDefines(cppCompiler, linker) + } else { + project.setupReleaseDefines(cppCompiler, linker) + } } } -def ntcoreZipTask = { project -> - project.ext.ntcoreZip = project.tasks.create("${project.isArm ? 'arm' : 'native'}NtcoreZip", Zip) { - description = 'Creates platform-specific zip of the desktop ntcore libraries.' - group = 'WPILib' - destinationDir = project.buildDir - baseName = 'ntcore' - classifier = "${project.buildPlatform}" +apply from: "ntcore.gradle" +apply from: "wpiutil.gradle" - from(file('include')) { - into 'include' - } - - if (!hasProperty('skipJava')) { - project.jniHeadersNetworkTables.outputs.each { - from(it) { - into 'include' - } - } - } - - project.model { - binaries { - withType(StaticLibraryBinarySpec) { binary -> - from(binary.staticLibraryFile) { - into getPlatformPath(binary) - } - } - withType(SharedLibraryBinarySpec) { binary -> - from(binary.sharedLibraryFile) { - into getPlatformPath(binary) - } - } - } - } - } - - project.build.dependsOn project.ntcoreZip - - def releaseTasks = [project.ntcoreZip] - - if (includeJava) { - releaseTasks.add(project.jar) - } - - project.releaseSetup(releaseTasks) - - project.tasks.whenTaskAdded { task -> - def name = task.name.toLowerCase() - if (name.contains("ntcoresharedlibrary") || name.contains("ntcorestaticlibrary") || name.contains("ntcoretest")) { - project.ntcoreZip.dependsOn task - } - } -} - -if (buildArm) { - project(':arm') { - apply plugin: 'cpp' - - ext.buildPlatform = 'arm' - ext.isArm = true - - apply from: '../toolchains/arm.gradle' - if (includeJava) { - apply from: '../java/java.gradle' - } - - setupModel(project, true) - ntcoreZipTask(project) - } -} - -project(':native') { - apply plugin: 'cpp' - task check - - ext.buildPlatform = OperatingSystem.current().getFamilyName() - ext.isArm = false - - if (OperatingSystem.current().isLinux()) { - apply from: '../toolchains/linux.gradle' - } else if (OperatingSystem.current().isMacOsX()) { - apply from: '../toolchains/mac.gradle' - } else if (OperatingSystem.current().isWindows()) { - apply from: '../toolchains/windows.gradle' - } else { - throw new GradleException("ntcore does not support building on ${OperatingSystem.current().getFamilyName()}.") - } - - if (!project.hasProperty("withoutTests")) { - apply from: '../test/tests.gradle' - } - - if (includeJava) { - apply from: '../java/java.gradle' - } - - setupModel(project, false) - ntcoreZipTask(project) -} - -task ntcoreSourceZip(type: Zip) { - description = 'Creates a sources-zip of the ntcore source files' - group = 'WPILib' - destinationDir = project.buildDir - baseName = 'ntcore' - classifier = "sources" - - from('src') { - into 'src' - } - - from('include') { - into 'include' - } - - if (includeJava) { - from('java/lib') { - into 'src' - } - - project(':native').jniHeadersNetworkTables.outputs.each { - from(it) { - into 'include' - } - } - } -} - -// Empty task for build so that ntcoreSourceZip will be build when running ./gradlew build +// Empty task for build so that ntcoreSourceZip and wpiutilSourceZip will be +// built when running ./gradlew build task build build.dependsOn ntcoreSourceZip +build.dependsOn wpiutilSourceZip apply from: 'publish.gradle' task wrapper(type: Wrapper) { - gradleVersion = '2.14.1' + gradleVersion = '2.14' } diff --git a/java/java.gradle b/java/java.gradle index 05fb7eed41..2b4b958c12 100644 --- a/java/java.gradle +++ b/java/java.gradle @@ -11,12 +11,12 @@ configurations.errorprone { resolutionStrategy.force 'com.google.errorprone:error_prone_core:2.0.9' } -def generatedJNIHeaderLoc = '../build/include' +def generatedJNIHeaderLoc = "${buildDir}/include" sourceSets { main { java { - srcDirs = ['../java/src'] + srcDirs = ["${rootDir}/java/src"] } } } @@ -111,8 +111,8 @@ ext.setupJniIncludes = { binaries -> 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 + cppCompiler.args '-I', file("${rootDir}/java/arm-linux").absolutePath + cppCompiler.args '-I', file("${rootDir}/java/arm-linux/linux").absolutePath } else { def jdkLocation = org.gradle.internal.jvm.Jvm.current().javaHome platformSpecificIncludeFlag("${jdkLocation}/include", cppCompiler) diff --git a/ntcore-jni.def b/ntcore-jni.def new file mode 100644 index 0000000000..821120186a --- /dev/null +++ b/ntcore-jni.def @@ -0,0 +1,163 @@ +LIBRARY NTCORE +EXPORTS +NT_GetEntryValue @1 +NT_SetEntryValue @2 +NT_SetEntryTypeValue @3 +NT_SetEntryFlags @4 +NT_GetEntryFlags @5 +NT_DeleteEntry @6 +NT_DeleteAllEntries @7 +NT_GetEntryInfo @8 +NT_Flush @9 +NT_AddEntryListener @10 +NT_RemoveEntryListener @11 +NT_AddConnectionListener @12 +NT_RemoveConnectionListener @13 +NT_SetNetworkIdentity @18 +NT_StartServer @19 +NT_StopServer @20 +NT_StartClient @21 +NT_StopClient @22 +NT_SetUpdateRate @23 +NT_GetConnections @24 +NT_SavePersistent @25 +NT_LoadPersistent @26 +NT_DisposeValue @27 +NT_InitValue @28 +NT_DisposeString @29 +NT_InitString @30 +NT_DisposeConnectionInfoArray @31 +NT_Now @32 +NT_SetLogger @33 +NT_CreateRpc @34 +NT_CreatePolledRpc @35 +NT_PollRpc @36 +NT_PostRpcResponse @37 +NT_CallRpc @38 +NT_GetRpcResult @39 +NT_PackRpcDefinition @40 +NT_UnpackRpcDefinition @41 +NT_PackRpcValues @42 +NT_UnpackRpcValues @43 +NT_DisposeRpcDefinition @44 +NT_DisposeRpcCallInfo @45 +NT_GetType @46 +NT_AllocateDoubleArray @47 +NT_AllocateBooleanArray @48 +NT_AllocateStringArray @49 +NT_FreeDoubleArray @51 +NT_FreeBooleanArray @52 +NT_FreeStringArray @53 +NT_GetValueType @54 +NT_GetValueBoolean @55 +NT_GetValueDouble @56 +NT_GetValueString @57 +NT_GetValueRaw @58 +NT_GetValueBooleanArray @59 +NT_GetValueDoubleArray @60 +NT_GetValueStringArray @61 +NT_GetEntryBoolean @62 +NT_GetEntryDouble @63 +NT_GetEntryString @64 +NT_GetEntryRaw @65 +NT_GetEntryBooleanArray @66 +NT_GetEntryDoubleArray @67 +NT_GetEntryStringArray @68 +NT_SetEntryDouble @69 +NT_SetEntryBoolean @70 +NT_SetEntryString @71 +NT_SetEntryRaw @72 +NT_SetEntryBooleanArray @73 +NT_SetEntryDoubleArray @74 +NT_SetEntryStringArray @75 +NT_DisposeEntryInfoArray @76 +NT_AllocateCharArray @77 +NT_FreeCharArray @78 +NT_NotifierDestroyed @79 +NT_StopRpcServer @80 +NT_StopNotifier @81 +NT_SetListenerOnStart @82 +NT_SetListenerOnExit @83 +NT_SetRpcServerOnStart @84 +NT_SetRpcServerOnExit @85 +NT_StartClientMulti @86 + +NT_SetDefaultEntryValue @87 +NT_SetDefaultEntryBoolean @88 +NT_SetDefaultEntryDouble @89 +NT_SetDefaultEntryString @90 +NT_SetDefaultEntryRaw @91 +NT_SetDefaultEntryBooleanArray @92 +NT_SetDefaultEntryDoubleArray @93 +NT_SetDefaultEntryStringArray @94 + +; JNI functions +JNI_OnLoad +JNI_OnUnload +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_containsKey +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getType +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putBoolean +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putDouble +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putString +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putRaw__Ljava_lang_String_2_3B +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putRaw__Ljava_lang_String_2Ljava_nio_ByteBuffer_2I +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putBooleanArray +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putDoubleArray +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putStringArray +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutBoolean +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutDouble +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutString +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutRaw__Ljava_lang_String_2_3B +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutRaw__Ljava_lang_String_2Ljava_nio_ByteBuffer_2I +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutBooleanArray +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutDoubleArray +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutStringArray +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getValue__Ljava_lang_String_2 +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getBoolean__Ljava_lang_String_2 +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getDouble__Ljava_lang_String_2 +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getString__Ljava_lang_String_2 +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getRaw__Ljava_lang_String_2 +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getBooleanArray__Ljava_lang_String_2 +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getDoubleArray__Ljava_lang_String_2 +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getStringArray__Ljava_lang_String_2 +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getValue__Ljava_lang_String_2Ljava_lang_Object_2 +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getBoolean__Ljava_lang_String_2Z +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getDouble__Ljava_lang_String_2D +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getString__Ljava_lang_String_2Ljava_lang_String_2 +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getRaw__Ljava_lang_String_2_3B +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getBooleanArray__Ljava_lang_String_2_3Z +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getDoubleArray__Ljava_lang_String_2_3D +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getStringArray__Ljava_lang_String_2_3Ljava_lang_String_2 +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setEntryFlags +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getEntryFlags +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_deleteEntry +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_deleteAllEntries +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getEntries +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_flush +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_addEntryListener +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_removeEntryListener +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_addConnectionListener +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_removeConnectionListener +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getRpc__Ljava_lang_String_2 +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getRpc__Ljava_lang_String_2_3B +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_callRpc__Ljava_lang_String_2_3B +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_callRpc__Ljava_lang_String_2Ljava_nio_ByteBuffer_2I +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setNetworkIdentity +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_startServer +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_stopServer +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_startClient__Ljava_lang_String_2I +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_startClient___3Ljava_lang_String_2_3I +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_stopClient +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setUpdateRate +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getConnections +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_savePersistent +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_loadPersistent +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_now +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setLogger +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultBoolean +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultDouble +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultString +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultRaw +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultBooleanArray +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultDoubleArray +Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultStringArray diff --git a/ntcore.def b/ntcore.def index 821120186a..6ba2ae3ae2 100644 --- a/ntcore.def +++ b/ntcore.def @@ -90,74 +90,3 @@ NT_SetDefaultEntryRaw @91 NT_SetDefaultEntryBooleanArray @92 NT_SetDefaultEntryDoubleArray @93 NT_SetDefaultEntryStringArray @94 - -; JNI functions -JNI_OnLoad -JNI_OnUnload -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_containsKey -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getType -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putBoolean -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putDouble -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putString -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putRaw__Ljava_lang_String_2_3B -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putRaw__Ljava_lang_String_2Ljava_nio_ByteBuffer_2I -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putBooleanArray -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putDoubleArray -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_putStringArray -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutBoolean -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutDouble -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutString -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutRaw__Ljava_lang_String_2_3B -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutRaw__Ljava_lang_String_2Ljava_nio_ByteBuffer_2I -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutBooleanArray -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutDoubleArray -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_forcePutStringArray -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getValue__Ljava_lang_String_2 -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getBoolean__Ljava_lang_String_2 -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getDouble__Ljava_lang_String_2 -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getString__Ljava_lang_String_2 -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getRaw__Ljava_lang_String_2 -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getBooleanArray__Ljava_lang_String_2 -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getDoubleArray__Ljava_lang_String_2 -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getStringArray__Ljava_lang_String_2 -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getValue__Ljava_lang_String_2Ljava_lang_Object_2 -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getBoolean__Ljava_lang_String_2Z -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getDouble__Ljava_lang_String_2D -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getString__Ljava_lang_String_2Ljava_lang_String_2 -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getRaw__Ljava_lang_String_2_3B -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getBooleanArray__Ljava_lang_String_2_3Z -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getDoubleArray__Ljava_lang_String_2_3D -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getStringArray__Ljava_lang_String_2_3Ljava_lang_String_2 -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setEntryFlags -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getEntryFlags -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_deleteEntry -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_deleteAllEntries -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getEntries -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_flush -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_addEntryListener -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_removeEntryListener -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_addConnectionListener -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_removeConnectionListener -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getRpc__Ljava_lang_String_2 -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getRpc__Ljava_lang_String_2_3B -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_callRpc__Ljava_lang_String_2_3B -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_callRpc__Ljava_lang_String_2Ljava_nio_ByteBuffer_2I -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setNetworkIdentity -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_startServer -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_stopServer -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_startClient__Ljava_lang_String_2I -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_startClient___3Ljava_lang_String_2_3I -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_stopClient -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setUpdateRate -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_getConnections -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_savePersistent -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_loadPersistent -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_now -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setLogger -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultBoolean -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultDouble -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultString -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultRaw -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultBooleanArray -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultDoubleArray -Java_edu_wpi_first_wpilibj_networktables_NetworkTablesJNI_setDefaultStringArray diff --git a/ntcore.gradle b/ntcore.gradle new file mode 100644 index 0000000000..6e6c00adb3 --- /dev/null +++ b/ntcore.gradle @@ -0,0 +1,166 @@ +def ntcoreSetupModel = { project -> + project.model { + components { + ntcore(NativeLibrarySpec) { + if (project.isArm) { + targetPlatform 'arm' + } else { + targetPlatform 'x86' + targetPlatform 'x64' + } + setupDefines(project, binaries) + + if (includeJava) { + project.setupJniIncludes(binaries) + binaries.all { + project.setupDef(linker, "${rootDir}/ntcore-jni.def") + } + } else { + binaries.all { + project.setupDef(linker, "${rootDir}/ntcore.def") + } + } + + sources { + cpp { + source { + srcDirs = ["${rootDir}/src"] + if (includeJava) { + srcDirs "${rootDir}/java/lib" + } + includes = ['**/*.cpp'] + } + exportedHeaders { + srcDirs = ["${rootDir}/include"] + if (includeJava) { + project.jniHeadersNetworkTables.outputs.files.each { file -> + srcDirs file.getPath() + } + } + includes = ['**/*.h'] + } + if (project.isArm) { + lib project: ':arm:wpiutil', library: 'wpiutil', linkage: 'static' + } else { + lib project: ':native:wpiutil', library: 'wpiutil', linkage: 'static' + } + } + } + } + } + } +} + +def ntcoreZipTask = { project -> + project.ext.ntcoreZip = project.tasks.create("${project.isArm ? 'arm' : 'native'}NtcoreZip", Zip) { + description = 'Creates platform-specific zip of the desktop ntcore libraries.' + group = 'WPILib' + destinationDir = project.buildDir + baseName = 'ntcore' + classifier = "${project.buildPlatform}" + + from(file('include')) { + into 'include' + } + + if (!project.hasProperty('skipJava')) { + project.jniHeadersNetworkTables.outputs.each { + from(it) { + into 'include' + } + } + } + + project.model { + binaries { + withType(StaticLibraryBinarySpec) { binary -> + from(binary.staticLibraryFile) { + into getPlatformPath(binary) + } + } + withType(SharedLibraryBinarySpec) { binary -> + from(binary.sharedLibraryFile) { + into getPlatformPath(binary) + } + } + } + } + } + + project.build.dependsOn project.ntcoreZip + + def releaseTasks = [project.ntcoreZip] + + if (includeJava) { + releaseTasks.add(project.jar) + } + + project.releaseSetup(releaseTasks) + + project.tasks.whenTaskAdded { task -> + def name = task.name.toLowerCase() + if (name.contains("ntcoresharedlibrary") || name.contains("ntcorestaticlibrary") || name.contains("ntcoretest")) { + project.ntcoreZip.dependsOn task + } + } +} + +if (buildArm) { + project(':arm:ntcore') { + apply plugin: 'cpp' + + apply from: "${rootDir}/toolchains/arm.gradle" + if (includeJava) { + apply from: "${rootDir}/java/java.gradle" + } + + ntcoreSetupModel(project) + ntcoreZipTask(project) + } +} + +project(':native:ntcore') { + apply plugin: 'cpp' + task check + + apply from: "${rootDir}/toolchains/native.gradle" + + if (!project.hasProperty("withoutTests")) { + apply from: "${rootDir}/test/tests.gradle" + } + + if (includeJava) { + apply from: "${rootDir}/java/java.gradle" + } + + ntcoreSetupModel(project) + ntcoreZipTask(project) +} + +task ntcoreSourceZip(type: Zip) { + description = 'Creates a sources-zip of the ntcore source files' + group = 'WPILib' + destinationDir = project.buildDir + baseName = 'ntcore' + classifier = "sources" + + from('src') { + into 'src' + } + + from('include') { + into 'include' + } + + if (includeJava) { + from('java/lib') { + into 'src' + } + + project(':native:ntcore').jniHeadersNetworkTables.outputs.each { + from(it) { + into 'include' + } + } + } +} diff --git a/publish.gradle b/publish.gradle index 1886ecad04..08e43859b7 100644 --- a/publish.gradle +++ b/publish.gradle @@ -6,14 +6,14 @@ apply plugin: 'maven-publish' // release. This is set up in the main gradle file. publishing { publications { - def nat = project('native') + def nat = project('native:ntcore') if (!project.hasProperty('skipJava')) { java(MavenPublication) { artifact nat.jar artifact nat.networktablesJavaSource artifact nat.networktablesJavadoc if (project.buildArm) { - artifact project('arm').jar + artifact project('arm:ntcore').jar } if (project.hasProperty('makeDesktop')) { @@ -31,7 +31,7 @@ publishing { artifact nat.ntcoreZip artifact ntcoreSourceZip if (project.buildArm) { - artifact project(':arm').ntcoreZip + artifact project(':arm:ntcore').ntcoreZip } if (project.hasProperty('makeDesktop')) { @@ -44,6 +44,23 @@ publishing { artifactId 'NetworkTables' version '3.0.0-SNAPSHOT' } + wpiutil(MavenPublication) { + artifact project(':native:wpiutil').wpiutilZip + artifact wpiutilSourceZip + if (project.buildArm) { + artifact project(':arm:wpiutil').wpiutilZip + } + + if (project.hasProperty('makeDesktop')) { + artifact project(':native:wpiutil').wpiutilZip, { + classifier = 'desktop' + } + } + + groupId 'edu.wpi.first.wpilib' + artifactId 'wpiutil' + version '1.0.0-SNAPSHOT' + } } repositories { diff --git a/settings.gradle b/settings.gradle index 4f0101c9d4..1a4c2aabeb 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,5 +1,8 @@ -include 'native', 'gmock' +include 'native:ntcore' +include 'native:wpiutil' +include 'gmock' if (!hasProperty('skipArm')) { - include 'arm' + include 'arm:ntcore' + include 'arm:wpiutil' } diff --git a/test/tests.gradle b/test/tests.gradle index 4bb969bd6d..829336d1c8 100644 --- a/test/tests.gradle +++ b/test/tests.gradle @@ -9,11 +9,11 @@ model { sources { cpp { source { - srcDirs = ['../test/unit'] + srcDirs = ["${rootDir}/test/unit"] includes = ['**/*.cpp'] } exportedHeaders { - srcDirs = ['../include', '../src', '../gmock/include', '../gmock/gtest/include'] + srcDirs = ["${rootDir}/include", "${rootDir}/src", "${rootDir}/wpiutil/include", "${rootDir}/gmock/include", "${rootDir}/gmock/gtest/include"] includes = ['**/*.h'] } } diff --git a/toolchains/arm.gradle b/toolchains/arm.gradle index 14eca799ac..8cfeaeef11 100644 --- a/toolchains/arm.gradle +++ b/toolchains/arm.gradle @@ -1,5 +1,14 @@ +ext.isArm = true +ext.buildPlatform = 'arm' + def compilerPrefix = project.hasProperty('compilerPrefix') ? project.compilerPrefix : 'arm-frc-linux-gnueabi-' model { + platforms { + arm { + architecture 'arm' + operatingSystem 'linux' + } + } toolChains { gcc(Gcc) { target("arm") { @@ -65,6 +74,9 @@ ext.setupDebugDefines = { cppCompiler, linker -> cppCompiler.args '-g', '-O0' } +// Used only on Windows. +ext.setupDef = { linker, deffile -> } + ext.releaseSetup = { releaseTasks -> model { binaries { diff --git a/toolchains/linux.gradle b/toolchains/linux.gradle index 00823a8edc..f1206ade29 100644 --- a/toolchains/linux.gradle +++ b/toolchains/linux.gradle @@ -41,6 +41,9 @@ ext.setupDebugDefines = { cppCompiler, linker -> cppCompiler.args '-g', '-O0' } +// Used only on Windows. +ext.setupDef = { linker, deffile -> } + ext.releaseSetup = { releaseTasks -> model { binaries { diff --git a/toolchains/mac.gradle b/toolchains/mac.gradle index 8ad1a25b46..56bb1cb204 100644 --- a/toolchains/mac.gradle +++ b/toolchains/mac.gradle @@ -30,6 +30,9 @@ ext.setupDebugDefines = { cppCompiler, linker -> cppCompiler.args '-g', '-O0' } +// Used only on Windows. +ext.setupDef = { linker, deffile -> } + ext.releaseSetup = { releaseTasks -> model { binaries { diff --git a/toolchains/native.gradle b/toolchains/native.gradle new file mode 100644 index 0000000000..10d8b8a7f9 --- /dev/null +++ b/toolchains/native.gradle @@ -0,0 +1,25 @@ +import org.gradle.internal.os.OperatingSystem + +ext.isArm = false +ext.buildPlatform = OperatingSystem.current().getFamilyName() + +if (OperatingSystem.current().isLinux()) { + apply from: "${rootDir}/toolchains/linux.gradle" +} else if (OperatingSystem.current().isMacOsX()) { + apply from: "${rootDir}/toolchains/mac.gradle" +} else if (OperatingSystem.current().isWindows()) { + apply from: "${rootDir}/toolchains/windows.gradle" +} else { + throw new GradleException("${name} does not support building on ${ext.buildPlatform}.") +} + +model { + platforms { + x86 { + architecture 'x86' + } + x64 { + architecture 'x86_64' + } + } +} diff --git a/toolchains/windows.gradle b/toolchains/windows.gradle index 41d18ff60e..df31ee98b8 100644 --- a/toolchains/windows.gradle +++ b/toolchains/windows.gradle @@ -36,14 +36,17 @@ model { ext.setupReleaseDefines = { cppCompiler, linker -> cppCompiler.args '/O2', '/Zi', '/FS' - linker.args '/DEF:../ntcore.def' } ext.setupDebugDefines = { cppCompiler, linker -> cppCompiler.args '/Zi', '/FS' - linker.args '/DEBUG', '/DEF:../ntcore.def' + linker.args '/DEBUG' +} + +ext.setupDef = { linker, deffile -> + linker.args "/DEF:${deffile}" } // This is a noop on Windows. On gcc platforms, we strip the release binary and create a separate // debug library, but Windows already separates debug symbols into a .pdb file. -ext.releaseSetup = {} +ext.releaseSetup = { releaseTasks -> } diff --git a/wpiutil.gradle b/wpiutil.gradle new file mode 100644 index 0000000000..bd34177e6a --- /dev/null +++ b/wpiutil.gradle @@ -0,0 +1,112 @@ +def wpiutilSetupModel = { project -> + project.model { + components { + wpiutil(NativeLibrarySpec) { + if (project.isArm) { + targetPlatform 'arm' + } else { + targetPlatform 'x86' + targetPlatform 'x64' + } + setupDefines(project, binaries) + + sources { + cpp { + source { + srcDirs = ["${rootDir}/wpiutil/src"] + includes = ['**/*.cpp'] + } + exportedHeaders { + srcDirs = ["${rootDir}/wpiutil/include"] + includes = ['**/*.h'] + } + } + } + } + } + } +} + + +def wpiutilZipTask = { project -> + project.ext.wpiutilZip = project.tasks.create("${project.isArm ? 'arm' : 'native'}WpiutilZip", Zip) { + description = 'Creates platform-specific zip of the desktop wpiutil libraries.' + group = 'WPILib' + destinationDir = project.buildDir + baseName = 'wpiutil' + classifier = "${project.buildPlatform}" + + from(file('wpiutil/include')) { + into 'include' + } + + project.model { + binaries { + withType(StaticLibraryBinarySpec) { binary -> + from(binary.staticLibraryFile) { + into getPlatformPath(binary) + } + } + withType(SharedLibraryBinarySpec) { binary -> + from(binary.sharedLibraryFile) { + into getPlatformPath(binary) + } + } + } + } + } + + project.build.dependsOn project.wpiutilZip + + def releaseTasks = [project.wpiutilZip] + + project.releaseSetup(releaseTasks) + + project.tasks.whenTaskAdded { task -> + def name = task.name.toLowerCase() + if (name.contains("wpiutilsharedlibrary") || name.contains("wpiutilstaticlibrary") || name.contains("wpiutiltest")) { + project.wpiutilZip.dependsOn task + } + } +} + +if (buildArm) { + project(':arm:wpiutil') { + apply plugin: 'cpp' + + apply from: "${rootDir}/toolchains/arm.gradle" + + wpiutilSetupModel(project) + wpiutilZipTask(project) + } +} + +project(':native:wpiutil') { + apply plugin: 'cpp' + task check + + apply from: "${rootDir}/toolchains/native.gradle" + + if (!project.hasProperty("withoutTests")) { + apply from: "${rootDir}/wpiutil/unittest/unittest.gradle" + } + + wpiutilSetupModel(project) + wpiutilZipTask(project) +} + +task wpiutilSourceZip(type: Zip) { + description = 'Creates a sources-zip of the wpiutil source files' + group = 'WPILib' + destinationDir = project.buildDir + baseName = 'wpiutil' + classifier = "sources" + + from('wpiutil/src') { + into 'src' + } + + from('wpiutil/include') { + into 'include' + } +} diff --git a/wpiutil/src/dummy.cpp b/wpiutil/src/dummy.cpp new file mode 100644 index 0000000000..3d12903c98 --- /dev/null +++ b/wpiutil/src/dummy.cpp @@ -0,0 +1,3 @@ +namespace wpi { +void DummyFunction() {} +} diff --git a/wpiutil/unittest/main.cpp b/wpiutil/unittest/main.cpp new file mode 100644 index 0000000000..e380efdd59 --- /dev/null +++ b/wpiutil/unittest/main.cpp @@ -0,0 +1,15 @@ +/*----------------------------------------------------------------------------*/ +/* Copyright (c) FIRST 2015. All Rights Reserved. */ +/* Open Source Software - may be modified and shared by FRC teams. The code */ +/* must be accompanied by the FIRST BSD license file in the root directory of */ +/* the project. */ +/*----------------------------------------------------------------------------*/ + +#include "gtest/gtest.h" + +int main(int argc, char **argv) +{ + ::testing::InitGoogleTest(&argc, argv); + int ret = RUN_ALL_TESTS(); + return ret; +} diff --git a/wpiutil/unittest/unittest.gradle b/wpiutil/unittest/unittest.gradle new file mode 100644 index 0000000000..89fc2909d7 --- /dev/null +++ b/wpiutil/unittest/unittest.gradle @@ -0,0 +1,39 @@ +apply plugin: 'google-test' + +model { + testSuites { + wpiutilTest { + sources { + cpp { + source { + srcDirs = ["${rootDir}/wpiutil/unittest"] + includes = ['**/*.cpp'] + } + exportedHeaders { + srcDirs = ["${rootDir}/wpiutil/include", "${rootDir}/gmock/include", "${rootDir}/gmock/gtest/include"] + includes = ['**/*.h'] + } + } + } + binaries.all { + lib project: ':gmock', library: 'gmock', linkage: 'static' + lib library: 'wpiutil', linkage: 'static' + } + } + } +} + +model { + binaries { + withType(GoogleTestTestSuiteBinarySpec) { + lib project: ':gmock', library: "gmock", linkage: "static" + lib library: 'wpiutil', linkage: 'static' + if (targetPlatform.operatingSystem.windows) { + cppCompiler.args '/EHsc', '/DNOMINMAX', '/D_SCL_SECURE_NO_WARNINGS', '/D_WINSOCK_DEPRECATED_NO_WARNINGS' + } else { + cppCompiler.args '-pthread', '-std=c++1y' + linker.args '-pthread' + } + } + } +}