Rename our allwpilib (which is now 2020) to not have 2019 in the name

Change-Id: I3c07f85ed32ab8b97db765a9b43f2a6ce7da964a
diff --git a/wpiutil/build.gradle b/wpiutil/build.gradle
new file mode 100644
index 0000000..a79bae4
--- /dev/null
+++ b/wpiutil/build.gradle
@@ -0,0 +1,309 @@
+apply from: "${rootDir}/shared/resources.gradle"
+
+ext {
+    noWpiutil = true
+    baseId = 'wpiutil'
+    groupId = 'edu.wpi.first.wpiutil'
+
+    nativeName = 'wpiutil'
+    devMain = 'edu.wpi.first.wpiutil.DevMain'
+    def generateTask = createGenerateResourcesTask('main', 'WPI', 'wpi', project)
+
+    splitSetup = {
+        it.tasks.withType(CppCompile) {
+            dependsOn generateTask
+        }
+        it.sources {
+            libuvCpp(CppSourceSet) {
+                source {
+                    srcDirs 'src/main/native/libuv/src'
+                    include '*.cpp'
+                }
+                exportedHeaders {
+                    srcDirs 'src/main/native/include', 'src/main/native/libuv/include', 'src/main/native/libuv/src'
+                }
+            }
+            resourcesCpp(CppSourceSet) {
+                source {
+                    srcDirs "$buildDir/generated/main/cpp", "$rootDir/shared/singlelib"
+                    include '*.cpp'
+                }
+                exportedHeaders {
+                    srcDirs 'src/main/native/include'
+                }
+            }
+        }
+        if (!it.targetPlatform.operatingSystem.isWindows()) {
+            it.cppCompiler.define '_GNU_SOURCE'
+            it.sources {
+                libuvUnixCpp(CppSourceSet) {
+                    source {
+                        srcDirs 'src/main/native/libuv/src/unix'
+                        includes = [
+                            'async.cpp',
+                            'core.cpp',
+                            'dl.cpp',
+                            'fs.cpp',
+                            'getaddrinfo.cpp',
+                            'getnameinfo.cpp',
+                            'loop-watcher.cpp',
+                            'loop.cpp',
+                            'pipe.cpp',
+                            'poll.cpp',
+                            'process.cpp',
+                            'signal.cpp',
+                            'stream.cpp',
+                            'tcp.cpp',
+                            'thread.cpp',
+                            'timer.cpp',
+                            'tty.cpp',
+                            'udp.cpp',
+                        ]
+                    }
+                    exportedHeaders {
+                        srcDirs 'src/main/native/include', 'src/main/native/libuv/include', 'src/main/native/libuv/src'
+                    }
+                }
+                wpiutilUnixCpp(CppSourceSet) {
+                    source {
+                        srcDirs 'src/main/native/unix'
+                        include '**/*.cpp'
+                    }
+                    exportedHeaders {
+                        srcDirs 'src/main/native/include', 'src/main/native/cpp'
+                        include '**/*.h'
+                    }
+                }
+            }
+        }
+        if (it.targetPlatform.operatingSystem.isWindows()) {
+            if (it in SharedLibraryBinarySpec) {
+                it.cppCompiler.define 'BUILDING_UV_SHARED'
+            }
+            it.sources {
+                libuvWindowsCpp(CppSourceSet) {
+                    source {
+                        srcDirs 'src/main/native/libuv/src/win'
+                        include '*.cpp'
+                    }
+                    exportedHeaders {
+                        srcDirs 'src/main/native/include', 'src/main/native/libuv/include', 'src/main/native/libuv/src'
+                    }
+                }
+                wpiutilWindowsCpp(CppSourceSet) {
+                    source {
+                        srcDirs 'src/main/native/windows'
+                        include '**/*.cpp'
+                    }
+                    exportedHeaders {
+                        srcDirs 'src/main/native/include', 'src/main/native/cpp'
+                        include '**/*.h'
+                    }
+                }
+            }
+        } else if (it.targetPlatform.operatingSystem.isMacOsX()) {
+            it.sources {
+                libuvMacCpp(CppSourceSet) {
+                    source {
+                        srcDirs 'src/main/native/libuv/src/unix'
+                        includes = [
+                            'bsd-ifaddrs.cpp',
+                            'darwin.cpp',
+                            'darwin-proctitle.cpp',
+                            'fsevents.cpp',
+                            'kqueue.cpp',
+                            'proctitle.cpp'
+                        ]
+                    }
+                    exportedHeaders {
+                        srcDirs 'src/main/native/include', 'src/main/native/libuv/include', 'src/main/native/libuv/src'
+                    }
+                }
+            }
+        } else {
+            it.sources {
+                libuvLinuxCpp(CppSourceSet) {
+                    source {
+                        srcDirs 'src/main/native/libuv/src/unix'
+                        includes = [
+                            'linux-core.cpp',
+                            'linux-inotify.cpp',
+                            'linux-syscalls.cpp',
+                            'procfs-exepath.cpp',
+                            'proctitle.cpp',
+                            'sysinfo-loadavg.cpp',
+                        ]
+                    }
+                    exportedHeaders {
+                        srcDirs 'src/main/native/include', 'src/main/native/libuv/include', 'src/main/native/libuv/src'
+                    }
+                }
+            }
+        }
+    }
+}
+
+def examplesMap = [:];
+file("$projectDir/examples").list(new FilenameFilter() {
+    @Override
+    public boolean accept(File current, String name) {
+        return new File(current, name).isDirectory();
+    }
+}).each {
+    examplesMap.put(it, [])
+}
+
+apply from: "${rootDir}/shared/jni/setupBuild.gradle"
+
+nativeUtils.exportsConfigs {
+    wpiutil {
+        x86ExcludeSymbols = ['_CT??_R0?AV_System_error', '_CT??_R0?AVexception', '_CT??_R0?AVfailure',
+                            '_CT??_R0?AVruntime_error', '_CT??_R0?AVsystem_error', '_CTA5?AVfailure',
+                            '_TI5?AVfailure', '_CT??_R0?AVout_of_range', '_CTA3?AVout_of_range',
+                            '_TI3?AVout_of_range', '_CT??_R0?AVbad_cast']
+        x64ExcludeSymbols = ['_CT??_R0?AV_System_error', '_CT??_R0?AVexception', '_CT??_R0?AVfailure',
+                            '_CT??_R0?AVruntime_error', '_CT??_R0?AVsystem_error', '_CTA5?AVfailure',
+                            '_TI5?AVfailure', '_CT??_R0?AVout_of_range', '_CTA3?AVout_of_range',
+                            '_TI3?AVout_of_range', '_CT??_R0?AVbad_cast']
+    }
+}
+
+cppHeadersZip {
+    from('src/main/native/libuv/include') {
+        into '/'
+    }
+    from('src/main/native/eigeninclude') {
+        into '/'
+    }
+}
+
+model {
+    components {
+        all {
+            it.sources.each {
+                it.exportedHeaders {
+                    srcDirs 'src/main/native/include', 'src/main/native/libuv/include', 'src/main/native/libuv/src', 'src/main/native/eigeninclude'
+                }
+            }
+        }
+    }
+}
+
+model {
+    components {
+        examplesMap.each { key, value ->
+            "${key}"(NativeExecutableSpec) {
+                targetBuildTypes 'debug'
+                binaries.all {
+                    lib library: 'wpiutil', linkage: 'shared'
+                }
+                sources {
+                    cpp {
+                        source {
+                            srcDirs 'examples/' + "${key}"
+                            include '**/*.cpp'
+                        }
+                    }
+                }
+            }
+        }
+        netconsoleServer(NativeExecutableSpec) {
+            targetBuildTypes 'release'
+            sources {
+                cpp {
+                    source {
+                        srcDirs = ['src/netconsoleServer/native/cpp']
+                        includes = ['**/*.cpp']
+                    }
+                }
+            }
+            binaries.all { binary ->
+                lib project: ':wpiutil', library: 'wpiutil', linkage: 'static'
+                if (binary.targetPlatform.operatingSystem.isLinux()) {
+                    linker.args "-lutil"
+                }
+            }
+        }
+        netconsoleTee(NativeExecutableSpec) {
+            targetBuildTypes 'release'
+            sources {
+                cpp {
+                    source {
+                        srcDirs = ['src/netconsoleTee/native/cpp']
+                        includes = ['**/*.cpp']
+                    }
+                }
+            }
+            binaries.all { binary ->
+                lib project: ':wpiutil', library: 'wpiutil', linkage: 'static'
+            }
+        }
+    }
+}
+
+dependencies {
+    api "org.ejml:ejml-simple:0.38"
+    api "com.fasterxml.jackson.core:jackson-annotations:2.10.0"
+    api "com.fasterxml.jackson.core:jackson-core:2.10.0"
+    api "com.fasterxml.jackson.core:jackson-databind:2.10.0"
+}
+
+def wpilibNumberFileInput = file("src/generate/GenericNumber.java.in")
+def natFileInput = file("src/generate/Nat.java.in")
+def natGetterInput = file("src/generate/NatGetter.java.in")
+def wpilibNumberFileOutputDir = file("$buildDir/generated/java/edu/wpi/first/wpiutil/math/numbers")
+def wpilibNatFileOutput = file("$buildDir/generated/java/edu/wpi/first/wpiutil/math/Nat.java")
+def maxNum = 20
+
+task generateNumbers() {
+    description = "Generates generic number classes from template"
+    group = "WPILib"
+
+    inputs.file wpilibNumberFileInput
+    outputs.dir wpilibNumberFileOutputDir
+
+    doLast {
+        if(wpilibNumberFileOutputDir.exists()) {
+            wpilibNumberFileOutputDir.delete()
+        }
+        wpilibNumberFileOutputDir.mkdirs()
+
+        for(i in 0..maxNum) {
+            def outputFile = new File(wpilibNumberFileOutputDir, "N${i}.java")
+            def read = wpilibNumberFileInput.text.replace('${num}', i.toString())
+            outputFile.write(read)
+        }
+    }
+}
+
+task generateNat() {
+    description = "Generates Nat.java"
+    group = "WPILib"
+    inputs.files([natFileInput, natGetterInput])
+    outputs.file wpilibNatFileOutput
+    dependsOn generateNumbers
+
+    doLast {
+        if(wpilibNatFileOutput.exists()) {
+            wpilibNatFileOutput.delete()
+        }
+
+        def template = natFileInput.text + "\n"
+
+        def importsString = "";
+
+        for(i in 0..maxNum) {
+            importsString += "import edu.wpi.first.wpiutil.math.numbers.N${i};\n"
+            template += natGetterInput.text.replace('${num}', i.toString()) + "\n"
+        }
+        template += "}\n" // Close the class body
+
+        template = template.replace('{{REPLACEWITHIMPORTS}}', importsString)
+
+        wpilibNatFileOutput.write(template)
+    }
+}
+
+sourceSets.main.java.srcDir "${buildDir}/generated/java"
+compileJava.dependsOn generateNumbers
+compileJava.dependsOn generateNat