Squashed 'third_party/allwpilib_2019/' changes from 99e4f7dd2..c36bbcc9a

936627bd9 wpilibc: Remove direct CameraServer dependency (#1989)
8e333c0aa Use FPGA Time instead of wall clock time for odometry (#1996)
d4430b765 Gearsbot example: Use standard argument order (#1995)
75438ab2c Add RamseteCommand (#1951)
989df1b46 Bump Native Utils and OpenCV dependencies (#1993)
dbc33b61e Fix Timer usage in TrapezoidProfileCommand (#1992)
79f8c5644 Add TrapezoidProfileCommand (#1962)
9440edf2b Refactor TrajectoryGenerator (#1972)
73a30182c Add frc2::Timer (#1968)
36ea865ed Add toString for geometry and trajectory classes (#1991)
cbe05e7e8 Update ProfiledPIDController API (#1967)
d04eb3546 Deprecate old PID classes (#1964)
02264db69 Add JNI dependencies to myRobotCpp (#1980)
2a76c996e Use VID/PID detection for PS3Eye (#1977)
a3820bbdf Remove HAL_BaseInitialize (#1981)
a83fb4793 Update to 2020v5 image (#1983)
4b0ed910e Make SwerveDriveKinematics.toChassisSpeeds() public (#1976)
103c1b121 Remove DS caching from the HAL level (#1971)
6635ea75e Fix NPE in SendableRegistry.foreachLiveWindow() (#1974)
cfe23c5cd Fix grammar error in comment for configureButtonBindings (#1969)
4bde2654e Fix mac azure build (#1973)
4f034e6c1 generateTrajectory: default reversed param to false (#1953)
acf960f72 Sim GUI: Add option to disable outputs on DS disable
2d3dac99f Sim GUI: Handle low resolutions and scale default window positions
07c86e0cd Sim GUI: Support High DPI monitors
46ad95512 SimDeviceData: Add missing null check
5bce489b9 Add ProggyDotted font to imgui (both cmake and gradle)
55af553ac Simulation GUI: Map gamepad the same way as DS
c59f9cea5 CameraServer: Add VID/PID support for Linux USB devices (#1960)
3fc89c84d Make splinePointsFromSplines public (#1963)
2c5093797 Fix implicitly deleted move constructors (#1954)
f3ad927f4 Update Java SmartDashboard and LiveWindow to match C++
05c25deb7 Fix move handling of C++ Sendable in SmartDashboard and LiveWindow
d726591ce Fix Gazebo sim plugin build (#1959)
2ff694fa4 Unbreak gradle build when other compilers installed (#1958)
53816155b Improve command decorator names (#1945)
a38f183a9 Fix GenResources.cmake so it's usable in a submodule (#1956)
b3398dca3 Set gradlebase correctly for all examples (#1950)
2c311013d Add Aarch64Bionic platform detection (#1922)
c10f2003c Add generateTrajectory overload (#1944)
63cfa64fb Add getters for pose in odometry classes (#1943)
2402c2bad Fix C++ command group recursive constructor bug (#1941)
f4eedf597 Fix ConcurrentModificationException in CommandScheduler (#1938)
bb0b207d2 Fix array out of bounds exception caused by parallel race group (#1935)
7bd69e591 Fix typo in temperature (#1940)
ec9738245 Bump to 2020 v4 image (#1931)
46303a822 Add messaging to extension loading in the HAL (#1926)
d169d6be9 Set extract_static for Doxygen config so that static members show up (#1930)
4e183eb10 Bump to 2020 v3 image (#1929)
84c185803 LiveWindow: catch errors in callback/builder functions (#1921)
0e3b0f3da Remove deprecated free() calls (#1925)
7f839b87c Remove timeouts from azure builds (#1924)
45b766a5d Fix main thread ID being potentially incorrect for simulation (#1923)
56d782b16 Add secondary camera name for PS3Eye (#1920)
2b4894038 Add simulation GUI plugin
f97d16073 Add imgui build to cmake
55a844a3e HAL sim: Add encoder channel B access
10deba854 Remove sendables from SendableRegistry when close() is called (#1917)
a9f0e4668 Implement sim devices for ADXL345, ADXL362, ADXRS450, Ultrasonic
aa9064586 Add ability to associate other devices with a SimDevice
81c2c8a7d Add simulation generic device/value support
e8d6f8a2c Move mockdata/HAL_Value.h to hal/Value.h
1b266717a Add simulation module support to cmake build (#1906)
fb8f3bd06 Add testbench yaml file (#1915)
846d8def0 Update to 2020 v2 image (#1913)
d6ac6e512 Fix PortForwarder package declaration (#1912)
227157086 Fix PS3Eye exposure setting (#1911)
885744d7e Add myRobot C++ version to cmake build (#1907)
366091fa8 Document that ConditionalCommand requires all subsystems (#1909)
c58b072c8 Fix Drive usage reporting order (#1908)
762c88adb Update compiler versions in readme (#1905)
af8ce568d Add Ramsete unicycle controller (#1790)
b2c2934d0 Fix javadoc warnings about invalid usage of ">" (#1904)
cce26ec78 Replace CRLF line endings with LF (#1902)
cb54602d4 Add support for writing RTR CAN Frames to the CAN API (#1900)
9f740e590 Use OS for serial port instead of NI VISA (#1875)
b23baf611 Add ability to run robot main loop in a separate thread (#1895)
457f94ba2 Add trajectory generation using hermite splines (#1843)
fd612052f Update native utils to use new frchome directory (#1884)
8858ec55c Remove periodic can read call (#1868)
41efb8015 Update CANAPITypes.h (#1860)
c93be1b2d Remove LabVIEW HAL support (#1901)
680f8919e Remove eigen, units and libuv from doxygen generation (#1898)
c5812524f Bump GradleJNI plugin version (#1899)
971303da8 Add PortForwarder class (#1890)
50db77bf2 Fix wpiutil cmake eigen install source directory (#1891)
85d42c199 C++ PIDCommand: Add GetMeasurement() and UseOutput() (#1892)
2dfbb855d wpilibj: Fix SwerveDriveKinematics ctor parameter name (#1889)
471f375a3 Simplify Sendable interface (#1864)
1d8c4d016 Replace ::value and ::type with _v and _t suffixes (#1885)
a5650b943 Add Units Utility class for Java (#1829)
904479ad4 Deprecate GearTooth class for removal (#1878)
86b666bba Add equality comparator to geometry classes (#1882)
62f07c182 Make one-arg Rotation2d constructor implicit (#1883)
f405582f8 Add kinematics suite (#1787)
561cbbd14 Deprecate Filter class for removal (#1876)
84e2973aa Remove unused include from Filesystem.h (#1877)
f49859ebf Remove NI VISA headers, as they are now included in NI Libraries (#1879)
bc59db5e6 Rename DEBUG macro to DEBUG0 (#1871)
dd928b4cb Remove JNI logging (#1872)
3e0f7d099 Use units for new NotifierCommand (#1869)
5ffe15d5f Remove ability to build all combined artifacts (#1867)
516cbef2c  Remove RoboRIO ifdef from simulation headers (#1859)
9b6ffc201 Replace SetOutputRange() with SetIntegratorRange()
ff8b8f0a8 Remove percent tolerance from PID controller
0ca8d667d Clean up AutoCloseable and other Java warnings (#1866)
7112add67 Watchdog: use units::second_t instead of double (#1863)
761bc3ef8 Change C++ WaitCommand to use units (#1865)
1fb301123 Add MathUtils.clamp() for Java (#1861)
eb3e0c9c9 Fix cmake Eigen include directory (#1862)
2250b7fbe Rename GearsBotNew example to GearsBot
c9f9feff1 Replace deprecated API usage in C++ examples
d6b9c7e14 CONTRIBUTING.md: Point to frc-docs instead of screensteps (#1858)
d10a1a797 Fix eigen build in vcpkg (#1856)
2bdb44325 Add frc2 includes to list of "other lib" regexes (#1855)
4b2b21d24 Replace outdated Java collections (#508)
8993ce5bf Move Eigen headers out of main include folder (#1854)
0f532a117 Add PWMSparkMax (#1751)
f7ad363d8 Add jni cross compile options for aarch64 (#1853)
9afea3340 Add support for aarch64 jetson bionic builds (#1844)
d787b5d60 Add more items to .gitignore (#1850)
5dd0d1b7d Use units in SPI
07ac711b3 Fix units deprecated warning in IterativeRobot
decfd858b Correctly report -1 for POV on disconnected joystick (#1852)
076ed7770 Add new C++ Command framework (#1785)
a0be07c37 Refactor HAL handle move construction/assignment (#1845)
558c38308 Add new Java Command framework (#1682)
1379735af Delete RobotState and SensorUtil constructors (#1847)
e3d86fee4 Move circular buffer class from wpilib to wpiutil (#1840)
4cd8a5667 TimedRobot.cpp: Fix deprecation warning (#1846)
b2861f894 Use 2020 artifacts and artifactory server (#1838)
98cc32703 Update to use artifactory to publish artifacts (#1833)
fa0640300 Move drive integration tests into wpilibj/src/test (#1836)
e716c36b8 Fix Nat.java generation to be incremental (#1831)
9fd2b5e3f Fix MSVC builds on cmake windows in vcpkg (#1835)
7e95010a2 Add compile-time EJML matrix wrapper to wpiutil (#1804)
3ebc5a6d3 Add ProfiledPIDController
fc98a79db Clean up PIDController interface in preparation for ProfiledPIDController
fdc098267 Fix compilation error in elevator trapezoid profile example (#1826)
a3dd84e85 Make XBoxController Button enum public (#1823)
a216b9e9e Add TrapezoidProfile example (#1814)
8f386f6bb wpilibc: Add unit-safety to C++ geometry classes (#1811)
c07ac2353 wpilibc: Add overloads for units (#1815)
f1d71da8a Move GetStackTrace and Demangle to wpiutil, add Windows support (#1819)
ef037457e Make LinearFilter copyable and moveable (#1789)
76930250c Remove objective-cpp support (#1816)
1c246418f Move TrapezoidProfileTest to trajectory folder (#1812)
95a54a0f2 Add java arcade drive example (#1810)
a4530243e HAL sim: Fix incorrectly setting dio port to initialized on cleanup (#1813)
09d00a622 Update Java examples to use new PIDController (#1809)
ba9b51742 Add missing Java examples (#841)
6411bd79c InterruptableSensorBase: Fix callback function deletion (#1807)
810e58ea8 I2C: Add tip about writeBulk() to transaction() (#1806)
607d6c148 Fix wpilibj integration tests jar name (#1808)
c9873e81b Remove PIDControllerRunner and mutex from new PIDController (#1795)
98d0706de Fix cscore build with OpenCV 4 (#1803)
fbe67c90c Make Sendable setters synchronous (#1799)
c67a488a0 Format SendableBuilderImpl javadocs (#1802)
8e93ce892 Fix PIDControllerRunner member destruction order (#1801)
c98ca7310 Add EJML dependency to wpiutil (#1769)
3b12276bc SendableBase: remove unnecessary synchronization (#1797)
e6d348f38 Fix missing default name in Java PIDController (#1792)
df12fc2a8 Java cleanups (#1776)
39561751f Update GradleVSCode version (#1786)
37d316aa0 Add C++20 std::math constants shim (#1788)
dd4310959 Deprecate frc/WPILib.h (#1779)
823174f30 Update native utils to 2020.0.4 (#1783)
37c695266 Squelch -Wdeprecated-copy for Eigen with GCC >= 9
04c9b000f Revert "Fix build of Eigen 3.3.7 with GCC 9"
ca3e71e21 wpiutil: Fix Process::Spawn() (#1778)
d946d5a2b Fix Eigen compilation errors and add tests (#1777)
8b1b9ac75 Fix build of Eigen 3.3.7 with GCC 9
2f680ba99 Add Eigen linear algebra library
a885db7d4 Make MotorEncoderTest use LinearFilter (#1775)
ee2410169 Add geometry classes (#1766)
48fe54271 Add HALSIM_SetSendError implementation (#1773)
dff58c87f Fix unused warning in release build (#1771)
dde61aad3 Remove TimerEventHandler typedef from Notifier class (#1767)
0f6ef80ab Add RobotState#IsEStopped and DriverStation#IsEStopped (#952)
e48886187 Move unit tests from integration test suite (#1170)
dffa1a5cb Make null checks more descriptive (#1688)
fe59d854d Notifier: add null check (#1684)
10731f3d6 Update uv Udp wrapper for latest features
89f7b72b6 Update libuv to 1.30.1 release
85f2f8740 wpiutil: Add unique_function (#1761)
73ec94078 Remove SampleRobot (#1658)
62be0392b Replace std::lock_guard and std::lock with std::scoped_lock (#1758)
24d31df55 Make sure move constructor is generated for TrapezoidProfile (#1757)
841ef5d73 Remove template types from lock RAII wrapper usages (#1756)
e582518ba Fix some move constructors (#1754)
8757bc471 Remove pre-C++17 shims (#1752)
ea9512977 Add replacement PIDController class (#1300)
9b798d228 Add TrapezoidProfile class (#1673)
804926fb5 Unconditionally skip athena builds for sim (#1748)
118e9d29d Add C++14 units library (#1749)
c705953d7 Add usage reporting to LinearFilter (#1750)
852d1b9ca Don't cross-build gazebo for raspbian (#1747)
eedb3a1ad Fix GCC 9 warnings (#1730)
60dce66a4 Remove wpi::ArrayRef std::initializer_list constructor (#1745)
9e19b29c3 Use base azure image for primary wpilib build (#1744)
299425071 Update jni library, fix cross builds of the jni symbol check (#1742)
a6b0e9b85 Only disable execution of cross compile google tests (#1741)
3c2093119 Use docker container to run wpiformat (#1740)
5fe2eebce Revert "Don't build halsim_gazebo on raspbian (#1737)" (#1743)
4b1b92bb7 Replace wpi::optional with C++17 std::optional (#1732)
0fbb0d989 Update to 2020 compilers (#1733)
2dc94e605 Disable google tests on cross compilers (#1738)
d9cb57a42 Don't build halsim_gazebo on raspbian (#1737)
f7cfdd7ce Replace crlf line endings with lf (#1731)
b6d5d90d9 Add JaCoCo Support (#1734)
c7ab2baa6 Add way to disable the jni check tasks from a property (#1736)
0c45c5b7e Fix skip athena and skip raspbian flags (#1735)
3dfb01d45 Update to new Native Utils (#1696)
30e936837 Clean up LinearDigitalFilter class (#782)
311e2de4c Remove deprecated Joystick constants (#1715)
c08fd6682 Update CAN manufacturer list (#1706)
258bba0c2 ErrorBase and WPIError improvements (#1727)
372ca4f45 cmake: Enable googletest unit tests (#1720)
223d47af0 HALSIM: support mocking of HAL_SendError() (#1728)
55cb683db Change compiler flags to C++17 (#1723)
ee8a33c56 wpiutil: SafeThread: Add thread id, support getting shared_ptr (#1722)
61426d08d wpiutil: Signal: make operator() const (#1721)
b630b63ef Remove functions in LiveWindow deprecated since 2018 (#1716)
1d0c05d4f Styleguide fixes for #1718 (#1719)
f07569df1 Fix newer GCC/clang compiler warnings (#1718)
0120f3124 C++ SPI: Fix SetClockRate to take int (#1717)
c2829ed98 Configure gradle to ignore unresolved headers (#1711)
221e66f46 Allow disabling static init of JNI libraries (#1672)
738852e11 cmake: Add cross toolchain files for Rio and Pi (#1710)
27b697b08 Remove frc directory include shims (#1714)
9e45373a7 Remove functions and classes deprecated for 2018 season (#1059)
eeb1025ac SPI: Report port as instance for usage reporting (#1704)
bc6f1e246 Windows compiler options improvements (#1709)
bb48ae391 cmake: Move example programs into folders (#1654)
221011494 Update for C++17 and fix MSVC warnings (#1694)
fb1239a2a Add raw sources and sinks to cscore (#1670)
7de947734 Add lambda overloads for interrupts (#1636)
90957aeea Move libuv to its own subfolder in build (#1661)
47aae502a Styleguide fixes (#1702)
0bff98b5e Correct DifferentialDrive::ArcadeDrive param docs (#1698)
b52e40b80 Allow widgets to be added by passing value suppliers (#1690)
4a00cd77b Add usage reporting for the Shuffleboard API (#1685)
e25e515f2  Publish artifacts on azure (#1678)
322ef9b96 Force Java 11, fix javadoc generation (#1695)
d42ef5df0 Fix Watchdog print formatting (#1693)
f432f65be Update copyright year in license to 2019 (#1524)
1726b77ac wpiutil: uv: Remove copy from SimpleBufferPool (#1680)
620bec9ca wpiutil: uv: Add LoopClosing status to Handle (#1647)
7cd6e2e7f UsbCamera: Solve race in windows initialization (#1638)
7732836bd Completely disable watchdog tests on mac (#1679)
698edfda9 Remove framework load, disable mac timeout test (#1676)
1c454b000 Add Shuffleboard calls to IterativeRobotBase in C++ (#1607)
f42905b32 Include missing headers in HAL.h (#1660)
bdc822fad Only generate passthrough URLs for RoboRIO (#1624)
d3affb16b Make failure of HAL_GetFPGATime() more descriptive (#1633)
2de3bf7f5 Update LLVM from stable upstream (#1653)
3cf4f38f5 Fix build on macos10.14.4 (#1648)
4e0c10f48 Fix CAN Clean using wrong ID (#1668)
3b0631324 Fix Gray to BGR conversion in CameraServer (#1665)
6cd1c73ef Fix GUID comparison creating weird symbol (#1659)
063bbab6f MavenArtifacts.md: update links to HTTPS (#1674)
aab4c494d Fix type in build.gradle (#1604)
bf46af260 Disable extraneous data warnings in libjpeg (#1630)
655763a9a Limit length of message sent to DS SendError call (#1618)
a095ec2d8 Fix linker errors with free functions in Threads.h (#1625)
12ab035aa Fix receive side of LabVIEW USB streams (#1621)

Change-Id: Ibd382e1a48925c200850cf90a8121e35c0fcffe3
git-subtree-dir: third_party/allwpilib_2019
git-subtree-split: c36bbcc9a9095489fc078229db4fba3ecd0f9b78
diff --git a/shared/config.gradle b/shared/config.gradle
index 02c2b68..0173097 100644
--- a/shared/config.gradle
+++ b/shared/config.gradle
@@ -1,251 +1,39 @@
-import edu.wpi.first.nativeutils.*
 import org.gradle.internal.os.OperatingSystem
 
-def windowsCompilerArgs = ['/EHsc', '/DNOMINMAX', '/Zi', '/FS', '/Zc:inline', '/MP4']
-def windowsCCompilerArgs = ['/Zi', '/FS', '/Zc:inline']
-def windowsReleaseCompilerArgs = ['/O2', '/MD']
-def windowsDebugCompilerArgs = ['/Od', '/MDd']
-def windowsLinkerArgs = ['/DEBUG:FULL']
-def windowsReleaseLinkerArgs = ['/OPT:REF', '/OPT:ICF']
-
-def linuxCrossCompilerArgs = ['-std=c++14', '-Wformat=2', '-Wall', '-Wextra', '-Werror', '-pedantic', '-Wno-psabi', '-g',
-                         '-Wno-unused-parameter', '-Wno-error=deprecated-declarations', '-fPIC', '-rdynamic',
-                         '-pthread']
-def linuxCrossCCompilerArgs = ['-Wformat=2', '-Wall', '-Wextra', '-Werror', '-pedantic', '-Wno-psabi', '-g',
-                          '-Wno-unused-parameter', '-fPIC', '-rdynamic', '-pthread']
-def linuxCrossLinkerArgs = ['-rdynamic', '-pthread', '-ldl']
-def linuxCrossReleaseCompilerArgs = ['-O2']
-def linuxCrossDebugCompilerArgs = ['-Og']
-
-def linuxCompilerArgs = ['-std=c++14', '-Wformat=2', '-Wall', '-Wextra', '-Werror', '-pedantic', '-Wno-psabi', '-g',
-                         '-Wno-unused-parameter', '-Wno-error=deprecated-declarations', '-fPIC', '-rdynamic',
-                         '-pthread']
-def linuxCCompilerArgs = ['-Wformat=2', '-Wall', '-Wextra', '-Werror', '-pedantic', '-Wno-psabi', '-g',
-                          '-Wno-unused-parameter', '-fPIC', '-rdynamic', '-pthread']
-def linuxLinkerArgs = ['-rdynamic', '-pthread', '-ldl']
-def linuxReleaseCompilerArgs = ['-O2']
-def linuxDebugCompilerArgs = ['-O0']
-def linux32BitArg = '-m32'
-
-def macCompilerArgs = ['-std=c++14', '-Wall', '-Wextra', '-Werror', '-pedantic-errors', '-fPIC', '-g',
-                       '-Wno-unused-parameter', '-Wno-error=deprecated-declarations', '-Wno-missing-field-initializers',
-                       '-Wno-unused-private-field', '-Wno-unused-const-variable', '-pthread']
-def macCCompilerArgs = ['-Wall', '-Wextra', '-Werror', '-pedantic-errors', '-fPIC', '-g',
-                        '-Wno-unused-parameter', '-Wno-missing-field-initializers', '-Wno-unused-private-field']
-def macObjCLinkerArgs = ['-std=c++14', '-stdlib=libc++','-fobjc-arc', '-g', '-fPIC', '-Wall', '-Wextra', '-Werror']
-def macReleaseCompilerArgs = ['-O2']
-def macDebugCompilerArgs = ['-O0']
-def macLinkerArgs = ['-framework', 'CoreFoundation', '-framework', 'AVFoundation', '-framework', 'Foundation', '-framework', 'CoreMedia', '-framework', 'CoreVideo']
-def mac32BitArg = '-m32'
-
-def buildAll = project.hasProperty('buildAll')
-
-def windows64PlatformDetect = {
-    def arch = System.getProperty("os.arch")
-    def isWin = OperatingSystem.current().isWindows()
-    if (buildAll) {
-        return isWin
-    } else {
-        return isWin && arch == 'amd64'
+nativeUtils.addWpiNativeUtils()
+nativeUtils.withRoboRIO()
+nativeUtils.withRaspbian()
+nativeUtils.withBionic()
+nativeUtils {
+  wpi {
+    configureDependencies {
+      wpiVersion = "-1"
+      niLibVersion = "2020.5.1"
+      opencvVersion = "3.4.7-2"
+      googleTestVersion = "1.9.0-3-437e100"
+      imguiVersion = "1.72b-2"
     }
+  }
 }
 
-def windows32PlatformDetect = {
-    def arch = System.getProperty("os.arch")
-    def isWin = OperatingSystem.current().isWindows()
-    if (buildAll) {
-        return isWin
-    } else {
-        return isWin && arch == 'x86'
-    }
-}
+nativeUtils.wpi.addWarnings()
+nativeUtils.wpi.addWarningsAsErrors()
 
-def linux32IntelPlatformDetect = {
-    def arch = System.getProperty("os.arch")
-    def isLinux = OperatingSystem.current().isLinux()
-    def isIntel = (arch == 'amd64' || arch == 'i386')
-    if (buildAll) {
-        return isLinux && isIntel
-    } else {
-        return isLinux && arch == 'i386'
-    }
-}
+nativeUtils.setSinglePrintPerPlatform()
 
-def linux64IntelPlatformDetect = {
-    def arch = System.getProperty("os.arch")
-    def isLinux = OperatingSystem.current().isLinux()
-    def isIntel = (arch == 'amd64' || arch == 'i386')
-    if (buildAll) {
-        return isLinux && isIntel
-    } else {
-        return isLinux && arch == 'amd64'
-    }
-}
-
-def linuxArmPlatformDetect = {
-    def arch = System.getProperty("os.arch")
-    def isIntel = (arch == 'amd64' || arch == 'i386')
-    return OperatingSystem.current().isLinux() && !isIntel
-}
-
-def mac64PlatformDetect = {
-    def arch = System.getProperty("os.arch")
-    def isMac = OperatingSystem.current().isMacOsX()
-    if (buildAll) {
-        return isMac
-    } else {
-        return isMac && arch == 'x86_64'
-    }
-}
-
-def mac32PlatformDetect = {
-    def arch = System.getProperty("os.arch")
-    def isMac = OperatingSystem.current().isMacOsX()
-    if (buildAll) {
-        return isMac
-    } else {
-        return isMac && arch == 'x86'
-    }
-}
-
-if (!project.hasProperty('skipAthena') && !project.hasProperty('onlyRaspbian')) {
-    model {
-        buildConfigs {
-            roboRio(CrossBuildConfig) {
-                architecture = 'athena'
-                operatingSystem = 'linux'
-                toolChainPrefix = 'arm-frc2019-linux-gnueabi-'
-                compilerArgs = linuxCrossCompilerArgs
-                CCompilerArgs = linuxCrossCCompilerArgs
-                linkerArgs = linuxCrossLinkerArgs
-                debugCompilerArgs = linuxCrossDebugCompilerArgs
-                releaseCompilerArgs = linuxCrossReleaseCompilerArgs
-                stripBuildTypes = ['debug', 'release']
-                compilerFamily = 'Gcc'
-            }
+model {
+    components {
+        all {
+            nativeUtils.useAllPlatforms(it)
         }
     }
-}
-
-if (!project.hasProperty('skipRaspbian') && !project.hasProperty('onlyAthena')) {
-    model {
-        buildConfigs {
-            raspbian(CrossBuildConfig) {
-                architecture = 'raspbian'
-                operatingSystem = 'linux'
-                toolChainPrefix = 'arm-raspbian9-linux-gnueabihf-'
-                compilerArgs = linuxCrossCompilerArgs
-                CCompilerArgs = linuxCrossCCompilerArgs
-                linkerArgs = linuxCrossLinkerArgs
-                debugCompilerArgs = linuxCrossDebugCompilerArgs
-                releaseCompilerArgs = linuxCrossReleaseCompilerArgs
-                stripBuildTypes = ['debug', 'release']
-                compilerFamily = 'Gcc'
-            }
+    binaries {
+        withType(NativeBinarySpec).all {
+            nativeUtils.usePlatformArguments(it)
         }
     }
 }
 
-if (!project.hasProperty('onlyAthena') && !hasProperty('onlyRaspbian')) {
-    model {
-        buildConfigs {
-            winX86(BuildConfig) {
-                architecture = 'x86'
-                operatingSystem = 'windows'
-                compilerArgs = windowsCompilerArgs
-                CCompilerArgs = windowsCCompilerArgs
-                linkerArgs = windowsLinkerArgs
-                releaseCompilerArgs = windowsReleaseCompilerArgs
-                releaseLinkerArgs = windowsReleaseLinkerArgs
-                debugCompilerArgs = windowsDebugCompilerArgs
-                compilerFamily = 'VisualCpp'
-                detectPlatform = windows32PlatformDetect
-            }
-            winX64(BuildConfig) {
-                architecture = 'x86-64'
-                operatingSystem = 'windows'
-                compilerArgs = windowsCompilerArgs
-                CCompilerArgs = windowsCCompilerArgs
-                linkerArgs = windowsLinkerArgs
-                releaseCompilerArgs = windowsReleaseCompilerArgs
-                releaseLinkerArgs = windowsReleaseLinkerArgs
-                debugCompilerArgs = windowsDebugCompilerArgs
-                compilerFamily = 'VisualCpp'
-                detectPlatform = windows64PlatformDetect
-            }
-            linuxX64(BuildConfig) {
-                architecture = 'x86-64'
-                operatingSystem = 'linux'
-                compilerArgs = linuxCompilerArgs
-                CCompilerArgs = linuxCCompilerArgs
-                linkerArgs = linuxLinkerArgs
-                debugCompilerArgs = linuxDebugCompilerArgs
-                releaseCompilerArgs = linuxReleaseCompilerArgs
-                stripBuildTypes = ['debug', 'release']
-                compilerFamily = 'Gcc'
-                detectPlatform = linux64IntelPlatformDetect
-            }
-            macX64(BuildConfig) {
-                architecture = 'x86-64'
-                operatingSystem = 'osx'
-                compilerArgs = macCompilerArgs
-                CCompilerArgs = macCCompilerArgs
-                debugCompilerArgs = macDebugCompilerArgs
-                releaseCompilerArgs = macReleaseCompilerArgs
-                objCppCompilerArgs = macObjCLinkerArgs
-                linkerArgs = macLinkerArgs
-                compilerFamily = 'Clang'
-                detectPlatform = mac64PlatformDetect
-            }
-        }
-    }
-}
-
-if (project.hasProperty('linuxCross')) {
-    model {
-        buildConfigs {
-            linuxArm(CrossBuildConfig) {
-                architecture = 'nativearm'
-                operatingSystem = 'linux'
-                toolChainPrefix = 'PLEASE_PROVIDE_A_COMPILER_NAME'
-                compilerArgs = linuxCompilerArgs
-                CCompilerArgs = linuxCCompilerArgs
-                linkerArgs = linuxLinkerArgs
-                debugCompilerArgs = linuxDebugCompilerArgs
-                releaseCompilerArgs = linuxReleaseCompilerArgs
-                stripBuildTypes = ['debug', 'release']
-                skipByDefault = true
-                compilerFamily = 'Gcc'
-            }
-        }
-    }
-} else {
-    model {
-        buildConfigs {
-            linuxArm(BuildConfig) {
-                architecture = 'nativearm'
-                operatingSystem = 'linux'
-                compilerArgs = linuxCompilerArgs
-                CCompilerArgs = linuxCCompilerArgs
-                linkerArgs = linuxLinkerArgs
-                debugCompilerArgs = linuxDebugCompilerArgs
-                releaseCompilerArgs = linuxReleaseCompilerArgs
-                stripBuildTypes = ['debug', 'release']
-                compilerFamily = 'Gcc'
-                detectPlatform = linuxArmPlatformDetect
-            }
-        }
-    }
-}
-
-ext.getPublishClassifier = { binary ->
-    return NativeUtils.getPublishClassifier(binary)
-}
-
-ext.getPlatformPath = { binary ->
-    return NativeUtils.getPlatformPath(binary)
-}
-
 ext.appendDebugPathToBinaries = { binaries->
     binaries.withType(StaticLibraryBinarySpec) {
         if (it.buildType.name.contains('debug')) {
@@ -287,7 +75,7 @@
         if (it in NativeLibrarySpec && stringNames.contains(it.name)) {
             it.binaries.each {
                 if (!it.buildable) return
-                def target = getPublishClassifier(it)
+                def target = nativeUtils.getPublishClassifier(it)
                 if (configMap.containsKey(target)) {
                     configMap.get(target).add(it)
                 } else {
@@ -325,71 +113,32 @@
     return taskList
 }
 
-ext.createAllCombined = { list, name, base, type, project ->
-    def outputsFolder = file("$project.buildDir/outputs")
-
-    def task = project.tasks.create(base + "-all", type) {
-        description = "Creates component archive for all classifiers"
-        destinationDir = outputsFolder
-        classifier = "all"
-        baseName = base
-        duplicatesStrategy = 'exclude'
-
-        list.each {
-            if (it.name.endsWith('debug')) return
-            from project.zipTree(it.archivePath)
-            dependsOn it
-        }
-    }
-
-    project.build.dependsOn task
-
-    project.artifacts {
-        task
-    }
-
-    return task
-
-}
-
 ext.includeStandardZipFormat = { task, value ->
     value.each { binary ->
         if (binary.buildable) {
             if (binary instanceof SharedLibraryBinarySpec) {
                 task.dependsOn binary.tasks.link
                 task.from(new File(binary.sharedLibraryFile.absolutePath + ".debug")) {
-                    into getPlatformPath(binary) + '/shared'
+                    into nativeUtils.getPlatformPath(binary) + '/shared'
                 }
                 def sharedPath = binary.sharedLibraryFile.absolutePath
                 sharedPath = sharedPath.substring(0, sharedPath.length() - 4)
 
                 task.from(new File(sharedPath + '.pdb')) {
-                    into getPlatformPath(binary) + '/shared'
+                    into nativeUtils.getPlatformPath(binary) + '/shared'
                 }
                 task.from(binary.sharedLibraryFile) {
-                    into getPlatformPath(binary) + '/shared'
+                    into nativeUtils.getPlatformPath(binary) + '/shared'
                 }
                 task.from(binary.sharedLibraryLinkFile) {
-                    into getPlatformPath(binary) + '/shared'
+                    into nativeUtils.getPlatformPath(binary) + '/shared'
                 }
             } else  if (binary instanceof StaticLibraryBinarySpec) {
                 task.dependsOn binary.tasks.createStaticLib
                 task.from(binary.staticLibraryFile) {
-                    into getPlatformPath(binary) + '/static'
+                    into nativeUtils.getPlatformPath(binary) + '/static'
                 }
             }
         }
     }
 }
-
-ext.getCurrentArch = {
-    def arch = System.getProperty('os.arch');
-
-    if (arch.equals("x86") || arch.equals("i386")) {
-        return 'x86'
-    } else if (arch.equals("amd64") || arch.equals("x86_64")) {
-        return 'x86-64'
-    } else {
-        return arch
-    }
-}
diff --git a/shared/googletest.gradle b/shared/googletest.gradle
index 736d886..ab3b51f 100644
--- a/shared/googletest.gradle
+++ b/shared/googletest.gradle
@@ -1,13 +1,7 @@
 model {
-    dependencyConfigs {
-        googletest(DependencyConfig) {
-            groupId = 'edu.wpi.first.thirdparty.frc2019'
-            artifactId = 'googletest'
-            headerClassifier = 'headers'
-            ext = 'zip'
-            version = '1.8.0-4-4e4df22'
-            sharedConfigs = [:]
-            staticConfigs = project.staticGtestConfigs
+    binaries {
+        withType(GoogleTestTestSuiteBinarySpec).all {
+            nativeUtils.useRequiredLibrary(it, 'googletest_static')
         }
     }
 }
diff --git a/shared/java/javacommon.gradle b/shared/java/javacommon.gradle
index 6595223..4ade369 100644
--- a/shared/java/javacommon.gradle
+++ b/shared/java/javacommon.gradle
@@ -1,13 +1,7 @@
 apply plugin: 'maven-publish'
 apply plugin: 'java'
 //apply plugin: 'net.ltgt.errorprone'
-
-def pubVersion
-if (project.hasProperty("publishVersion")) {
-    pubVersion = project.publishVersion
-} else {
-    pubVersion = WPILibVersion.version
-}
+apply plugin: 'jacoco'
 
 def baseArtifactId = project.baseId
 def artifactGroupId = project.groupId
@@ -73,7 +67,7 @@
 
             artifactId = "${baseArtifactId}-java"
             groupId artifactGroupId
-            version pubVersion
+            version wpilibVersioning.version.get()
         }
     }
 }
@@ -85,9 +79,10 @@
         events "failed"
         exceptionFormat "full"
     }
+    finalizedBy jacocoTestReport
 }
 
-if (project.hasProperty('onlyAthena') || project.hasProperty('onlyRaspbian')) {
+if (project.hasProperty('onlylinuxathena') || project.hasProperty('onlylinuxraspbian') || project.hasProperty('onlylinuxaarch64bionic')) {
     test.enabled = false
 }
 
@@ -101,13 +96,13 @@
 }
 
 tasks.withType(JavaCompile).configureEach {
-    options.compilerArgs = ['--release', '8']
+    options.compilerArgs = ['--release', '11']
 }
 
 dependencies {
-    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.2.0'
-    testImplementation 'org.junit.jupiter:junit-jupiter-params:5.2.0'
-    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.2.0'
+    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.4.2'
+    testImplementation 'org.junit.jupiter:junit-jupiter-params:5.4.2'
+    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.4.2'
 
     devCompile sourceSets.main.output
 
@@ -122,3 +117,14 @@
 }
 
 build.dependsOn devClasses
+
+jacoco {
+    toolVersion = "0.8.4"
+}
+
+jacocoTestReport {
+    reports {
+        xml.enabled true
+        html.enabled true
+    }
+}
diff --git a/shared/java/javastyle.gradle b/shared/java/javastyle.gradle
index e091988..6e4e261 100644
--- a/shared/java/javastyle.gradle
+++ b/shared/java/javastyle.gradle
@@ -1,6 +1,5 @@
 
 apply plugin: 'checkstyle'
-apply plugin: 'pmd'
 
 checkstyle {
     toolVersion = "8.12"
@@ -8,10 +7,14 @@
     config = resources.text.fromFile(new File(configDir, "checkstyle.xml"))
 }
 
-pmd {
-    toolVersion = '6.7.0'
-    consoleOutput = true
-    reportsDir = file("$project.buildDir/reports/pmd")
-    ruleSetFiles = files(new File(rootDir, "styleguide/pmd-ruleset.xml"))
-    ruleSets = []
+if (!project.hasProperty('skipPMD')) {
+    apply plugin: 'pmd'
+
+    pmd {
+        toolVersion = '6.7.0'
+        consoleOutput = true
+        reportsDir = file("$project.buildDir/reports/pmd")
+        ruleSetFiles = files(new File(rootDir, "styleguide/pmd-ruleset.xml"))
+        ruleSets = []
+    }
 }
diff --git a/shared/javacpp/publish.gradle b/shared/javacpp/publish.gradle
index 854a996..1dafcbb 100644
--- a/shared/javacpp/publish.gradle
+++ b/shared/javacpp/publish.gradle
@@ -1,12 +1,5 @@
 apply plugin: 'maven-publish'
 
-def pubVersion
-if (project.hasProperty("publishVersion")) {
-    pubVersion = project.publishVersion
-} else {
-    pubVersion = WPILibVersion.version
-}
-
 def outputsFolder = file("$buildDir/outputs")
 
 def baseArtifactId = nativeName
@@ -65,7 +58,7 @@
 
                 artifactId = "${baseArtifactId}-cpp"
                 groupId artifactGroupId
-                version pubVersion
+                version wpilibVersioning.version.get()
             }
         }
     }
diff --git a/shared/javacpp/setupBuild.gradle b/shared/javacpp/setupBuild.gradle
index d2cdd1d..4e6dba7 100644
--- a/shared/javacpp/setupBuild.gradle
+++ b/shared/javacpp/setupBuild.gradle
@@ -103,11 +103,7 @@
     }
     binaries {
         withType(GoogleTestTestSuiteBinarySpec) {
-            if (!project.hasProperty('onlyAthena') && !project.hasProperty('onlyRaspbian')) {
-                lib library: nativeName, linkage: 'shared'
-            } else {
-                it.buildable = false
-            }
+            lib library: nativeName, linkage: 'shared'
         }
     }
     tasks {
@@ -121,7 +117,7 @@
                 if (it in NativeExecutableSpec && it.name == "${nativeName}Dev") {
                     it.binaries.each {
                         if (!found) {
-                            def arch = it.targetPlatform.architecture.name
+                            def arch = it.targetPlatform.name
                             if (arch == systemArch) {
                                 dependsOn it.tasks.install
                                 commandLine it.tasks.install.runScriptFile.get().asFile.toString()
diff --git a/shared/jni/publish.gradle b/shared/jni/publish.gradle
index a6a1abe..e50f87e 100644
--- a/shared/jni/publish.gradle
+++ b/shared/jni/publish.gradle
@@ -1,13 +1,6 @@
 import java.security.MessageDigest
 apply plugin: 'maven-publish'
 
-def pubVersion
-if (project.hasProperty("publishVersion")) {
-    pubVersion = project.publishVersion
-} else {
-    pubVersion = WPILibVersion.version
-}
-
 def outputsFolder = file("$buildDir/outputs")
 
 def baseArtifactId = nativeName
@@ -82,24 +75,19 @@
                         task.outputs.file(hashFile)
                         task.inputs.file(binary.sharedLibraryFile)
                         task.from(hashFile) {
-                            into getPlatformPath(binary)
+                            into nativeUtils.getPlatformPath(binary)
                         }
                         task.doFirst {
                             hashFile.text = MessageDigest.getInstance("MD5").digest(binary.sharedLibraryFile.bytes).encodeHex().toString()
                         }
                         task.from(binary.sharedLibraryFile) {
-                            into getPlatformPath(binary)
+                            into nativeUtils.getPlatformPath(binary)
                         }
                     }
                 }
             }
         })
 
-        def allJniTask
-        if (!project.hasProperty('jenkinsBuild')) {
-            allJniTask = createAllCombined(jniTaskList, "${nativeName}JNI", jniBaseName, Jar, project)
-        }
-
         publications {
             cpp(MavenPublication) {
                 taskList.each {
@@ -110,20 +98,16 @@
 
                 artifactId = "${baseArtifactId}-cpp"
                 groupId artifactGroupId
-                version pubVersion
+                version wpilibVersioning.version.get()
             }
             jni(MavenPublication) {
                 jniTaskList.each {
                     artifact it
                 }
 
-                if (!project.hasProperty('jenkinsBuild')) {
-                    artifact allJniTask
-                }
-
                 artifactId = "${baseArtifactId}-jni"
                 groupId artifactGroupId
-                version pubVersion
+                version wpilibVersioning.version.get()
             }
         }
     }
diff --git a/shared/jni/setupBuild.gradle b/shared/jni/setupBuild.gradle
index a22a67d..35f4cf2 100644
--- a/shared/jni/setupBuild.gradle
+++ b/shared/jni/setupBuild.gradle
@@ -16,8 +16,10 @@
 apply from: "${rootDir}/shared/java/javacommon.gradle"
 
 dependencies {
-    compile project(':wpiutil')
-    devCompile project(':wpiutil')
+    if (!project.hasProperty('noWpiutil')) {
+        compile project(':wpiutil')
+        devCompile project(':wpiutil')
+    }
 }
 
 project(':').libraryBuild.dependsOn build
@@ -69,7 +71,9 @@
                     it.buildable = false
                     return
                 }
-                lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared'
+                if (!project.hasProperty('noWpiutil')) {
+                    lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared'
+                }
                 if (project.hasProperty('splitSetup')) {
                     splitSetup(it)
                 }
@@ -93,8 +97,10 @@
                     }
                 }
             }
-            binaries.all {
-                lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared'
+            if (!project.hasProperty('noWpiutil')) {
+                binaries.all {
+                    lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared'
+                }
             }
             appendDebugPathToBinaries(binaries)
         }
@@ -104,10 +110,12 @@
             } else {
                 baseName = nativeName + 'jni'
             }
+
             enableCheckTask true
             javaCompileTasks << compileJava
-            jniCrossCompileOptions << JniCrossCompileOptions('athena')
-            jniCrossCompileOptions << JniCrossCompileOptions('raspbian')
+            jniCrossCompileOptions << JniCrossCompileOptions(nativeUtils.wpi.platforms.roborio)
+            jniCrossCompileOptions << JniCrossCompileOptions(nativeUtils.wpi.platforms.raspbian)
+            jniCrossCompileOptions << JniCrossCompileOptions(nativeUtils.wpi.platforms.aarch64bionic)
             sources {
                 cpp {
                     source {
@@ -130,7 +138,9 @@
                     return
                 }
                 lib library: "${nativeName}", linkage: 'shared'
-                lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared'
+                if (!project.hasProperty('noWpiutil')) {
+                    lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared'
+                }
                 if (project.hasProperty('jniSplitSetup')) {
                     jniSplitSetup(it)
                 }
@@ -142,10 +152,12 @@
             } else {
                 baseName = nativeName + 'jni'
             }
+
             enableCheckTask true
             javaCompileTasks << compileJava
-            jniCrossCompileOptions << JniCrossCompileOptions('athena')
-            jniCrossCompileOptions << JniCrossCompileOptions('raspbian')
+            jniCrossCompileOptions << JniCrossCompileOptions(nativeUtils.wpi.platforms.roborio)
+            jniCrossCompileOptions << JniCrossCompileOptions(nativeUtils.wpi.platforms.raspbian)
+            jniCrossCompileOptions << JniCrossCompileOptions(nativeUtils.wpi.platforms.aarch64bionic)
             sources {
                 cpp {
                     source {
@@ -166,7 +178,9 @@
                     it.buildable = false
                     return
                 }
-                lib project: ':wpiutil', library: 'wpiutil', linkage: 'static'
+                if (!project.hasProperty('noWpiutil')) {
+                    lib project: ':wpiutil', library: 'wpiutil', linkage: 'static'
+                }
                 if (project.hasProperty('jniSplitSetup')) {
                     jniSplitSetup(it)
                 }
@@ -194,7 +208,9 @@
             binaries.all {
                 lib library: nativeName, linkage: 'shared'
                 lib library: "${nativeName}JNIShared", linkage: 'shared'
-                lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared'
+                if (!project.hasProperty('noWpiutil')) {
+                    lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared'
+                }
             }
         }
     }
@@ -224,11 +240,9 @@
     }
     binaries {
         withType(GoogleTestTestSuiteBinarySpec) {
-            if (!project.hasProperty('onlyAthena') && !project.hasProperty('onlyRaspbian')) {
-                lib library: nativeName, linkage: 'shared'
+            lib library: nativeName, linkage: 'shared'
+            if (!project.hasProperty('noWpiutil')) {
                 lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared'
-            } else {
-                it.buildable = false
             }
         }
     }
@@ -243,7 +257,7 @@
                 if (it in NativeExecutableSpec && it.name == "${nativeName}Dev") {
                     it.binaries.each {
                         if (!found) {
-                            def arch = it.targetPlatform.architecture.name
+                            def arch = it.targetPlatform.name
                             if (arch == systemArch) {
                                 dependsOn it.tasks.install
                                 commandLine it.tasks.install.runScriptFile.get().asFile.toString()
diff --git a/shared/nilibraries.gradle b/shared/nilibraries.gradle
index 937abbf..efb9cfc 100644
--- a/shared/nilibraries.gradle
+++ b/shared/nilibraries.gradle
@@ -1,37 +1,10 @@
-def netCommLibConfigs = [:];

-def chipObjectConfigs = [:];

-

-project.chipObjectComponents.each { String s->

-  chipObjectConfigs[s] = ['linux:athena']

-}

-

-project.netCommComponents.each { String s->

-  netCommLibConfigs[s] = ['linux:athena']

-}

-

-def niLibrariesVersion = '2019.12.1'

-

-model {

-  dependencyConfigs {

-    chipobject(DependencyConfig) {

-      groupId = 'edu.wpi.first.ni-libraries'

-      artifactId = 'chipobject'

-      headerClassifier = 'headers'

-      ext = 'zip'

-      version = niLibrariesVersion

-      sharedConfigs = chipObjectConfigs

-      staticConfigs = [:]

-      compileOnlyShared = true

-    }

-    netcomm(DependencyConfig) {

-      groupId = 'edu.wpi.first.ni-libraries'

-      artifactId = 'netcomm'

-      headerClassifier = 'headers'

-      ext = 'zip'

-      version = niLibrariesVersion

-      sharedConfigs = netCommLibConfigs

-      staticConfigs = [:]

-      compileOnlyShared = true

-    }

-  }

-}

+model {
+  binaries {
+    all {
+      if (it.targetPlatform.name == nativeUtils.wpi.platforms.roborio) {
+        nativeUtils.useRequiredLibrary(it, 'netcomm_shared', 'chipobject_shared')
+      }
+
+    }
+  }
+}
diff --git a/shared/opencv.gradle b/shared/opencv.gradle
index ee9403c..7a1dd0f 100644
--- a/shared/opencv.gradle
+++ b/shared/opencv.gradle
@@ -1,17 +1,20 @@
-def opencvVersion = '3.4.4-4'
+def opencvVersion = '3.4.7-2'
 
 if (project.hasProperty('useCpp') && project.useCpp) {
     model {
-        dependencyConfigs {
-            opencv(DependencyConfig) {
-                groupId = 'edu.wpi.first.thirdparty.frc2019.opencv'
-                artifactId = 'opencv-cpp'
-                headerClassifier = 'headers'
-                ext = 'zip'
-                version = opencvVersion
-                sharedConfigs = project.sharedCvConfigs
-                staticConfigs = project.staticCvConfigs
-                linkExcludes = ['**/*java*']
+        binaries {
+            withType(NativeBinarySpec).all {
+                def binary = it
+                project.sharedCvConfigs.each {
+                    if (binary.component.name == it.key) {
+                        nativeUtils.useRequiredLibrary(binary, 'opencv_shared')
+                    }
+                }
+                project.staticCvConfigs.each {
+                    if (binary.component.name == it.key) {
+                        nativeUtils.useRequiredLibrary(binary, 'opencv_static')
+                    }
+                }
             }
         }
     }
@@ -19,12 +22,12 @@
 
 if (project.hasProperty('useJava') && project.useJava) {
     dependencies {
-        compile "edu.wpi.first.thirdparty.frc2019.opencv:opencv-java:${opencvVersion}"
+        compile "edu.wpi.first.thirdparty.frc2020.opencv:opencv-java:${opencvVersion}"
         if (!project.hasProperty('skipDev') || !project.skipDev) {
-            devCompile "edu.wpi.first.thirdparty.frc2019.opencv:opencv-java:${opencvVersion}"
+            devCompile "edu.wpi.first.thirdparty.frc2020.opencv:opencv-java:${opencvVersion}"
         }
         if (project.hasProperty('useDocumentation') && project.useDocumentation) {
-            javaSource "edu.wpi.first.thirdparty.frc2019.opencv:opencv-java:${opencvVersion}:sources"
+            javaSource "edu.wpi.first.thirdparty.frc2020.opencv:opencv-java:${opencvVersion}:sources"
         }
     }
 }
diff --git a/shared/plugins/publish.gradle b/shared/plugins/publish.gradle
index a9ba538..6f318b7 100644
--- a/shared/plugins/publish.gradle
+++ b/shared/plugins/publish.gradle
@@ -1,12 +1,5 @@
 apply plugin: 'maven-publish'
 
-def pubVersion = ''
-if (project.hasProperty("publishVersion")) {
-    pubVersion = project.publishVersion
-} else {
-    pubVersion = WPILibVersion.version
-}
-
 def baseArtifactId = pluginName
 def artifactGroupId = 'edu.wpi.first.halsim'
 def zipBaseName = "_GROUP_edu_wpi_first_halsim_ID_${pluginName}_CLS"
@@ -56,7 +49,7 @@
                     if (binary instanceof SharedLibraryBinarySpec) {
                         task.dependsOn binary.buildTask
                         task.from(binary.sharedLibraryFile) {
-                            into getPlatformPath(binary) + '/shared'
+                            into nativeUtils.getPlatformPath(binary) + '/shared'
                         }
                     }
                 }
@@ -75,7 +68,7 @@
 
                 artifactId = baseArtifactId
                 groupId artifactGroupId
-                version pubVersion
+                version wpilibVersioning.version.get()
             }
         }
     }
diff --git a/shared/plugins/setupBuild.gradle b/shared/plugins/setupBuild.gradle
index ba4c6f0..4feb8a9 100644
--- a/shared/plugins/setupBuild.gradle
+++ b/shared/plugins/setupBuild.gradle
@@ -10,8 +10,8 @@
 
 apply from: "${rootDir}/shared/nilibraries.gradle"
 
-if (!project.hasProperty('onlyAthena')) {
-    ext.skipAthena = true
+if (!project.hasProperty('onlylinuxathena')) {
+    ext.skiplinuxathena = true
     apply from: "${rootDir}/shared/config.gradle"
 
     model {
@@ -57,7 +57,7 @@
                     }
                 }
                 binaries.all {
-                    if (!project.hasProperty('onlyAthena') && !project.hasProperty('onlyRaspbian')) {
+                    if (!project.hasProperty('onlylinuxathena') && !project.hasProperty('onlylinuxraspbian')  && !project.hasProperty('onlylinuxaarch64bionic')) {
                         project(':hal').addHalDependency(it, 'shared')
                         lib library: pluginName
                         if (project.hasProperty('includeNtCore')) {
@@ -78,7 +78,7 @@
 model {
     tasks {
         def c = $.components
-        if (!project.hasProperty('onlyAthena') && !project.hasProperty('onlyRaspbian')) {
+        if (!project.hasProperty('onlylinuxathena') && !project.hasProperty('onlylinuxraspbian') && !project.hasProperty('onlylinuxaarch64bionic')) {
             project.tasks.create('runCpp', Exec) {
                 group = 'WPILib'
                 description = "Run the ${pluginName}Dev executable"
@@ -88,7 +88,7 @@
                     if (it in NativeExecutableSpec && it.name == "${pluginName}Dev") {
                         it.binaries.each {
                             if (!found) {
-                                def arch = it.targetPlatform.architecture.name
+                                def arch = it.targetPlatform.name
                                 if (arch == systemArch) {
                                     dependsOn it.tasks.install
                                     commandLine it.tasks.install.runScriptFile.get().asFile.toString()