Squashed 'third_party/allwpilib_2017/' content from commit 35ac87d

Change-Id: I7bb6f5556c30d3f5a092e68de0be9c710c60c9f4
git-subtree-dir: third_party/allwpilib_2017
git-subtree-split: 35ac87d6ff8b7f061c4f18c9ea316e5dccd4888a
diff --git a/cppSettings.gradle b/cppSettings.gradle
new file mode 100644
index 0000000..a0197b2
--- /dev/null
+++ b/cppSettings.gradle
@@ -0,0 +1,243 @@
+// These add the nilibraries shared library to the linker args
+def niLibraryPath = file('ni-libraries/lib').path
+def niLibrary = niLibraryPath + "/libnilibraries.so"
+
+configurations.create('armDeps')
+
+dependencies {
+    armDeps ntcoreDep('cpp', 'arm', 'zip')
+    armDeps wpiUtilDep('arm')
+    armDeps cscoreDep('cpp', 'athena-uberzip', 'zip')
+}
+
+def depLocation = "$buildDir/dependencies"
+
+configurations.armDeps.files.each { file ->
+    def depName = file.name.substring(0, file.name.indexOf('-'))
+    def t = tasks.create("downloadArm${depName.capitalize()}", Copy) {
+        description = "Downloads and unzips the $depName dependency."
+        group = 'Dependencies'
+        from zipTree(file)
+        into "$depLocation/${depName.toLowerCase()}"
+    }
+}
+
+task downloadNetworkTables {
+    description = 'Downloads all needed versions of networktables.'
+    group = 'Dependencies'
+    dependsOn downloadArmNetworkTables
+}
+
+task downloadWpiutil {
+    description = 'Downloads all needed versions of WPIUtil.'
+    group = 'Dependencies'
+    dependsOn downloadArmWpiutil
+}
+
+task downloadCscore {
+    description = 'Downloads all needed versions of cscore.'
+    group = 'Dependencies'
+    dependsOn downloadArmCscore
+}
+
+if (enableSimulation) {
+    configurations.create('nativeDeps')
+
+    dependencies {
+        nativeDeps ntcoreDep('cpp', 'desktop', 'zip')
+        nativeDeps wpiUtilDep('desktop')
+    }
+
+    configurations.nativeDeps.files.each { file ->
+        def depName = file.name.substring(0, file.name.indexOf('-'))
+        def t = tasks.create("downloadNative${depName.capitalize()}", Copy) {
+            description = "Downloads and unzips the $depName dependency."
+            group = 'Dependencies'
+            from zipTree(file)
+            into "$depLocation/${depName.toLowerCase()}"
+        }
+    }
+
+    downloadNetworkTables.dependsOn downloadNativeNetworkTables
+    downloadWpiutil.dependsOn downloadNativeWpiutil
+}
+
+def netTablesUnzipLocation = "$depLocation/networktables"
+def wpiUtilUnzipLocation = "$depLocation/wpiutil"
+def csCoreUnzipLocation = "$depLocation/cscore"
+
+task clean(type: Delete) {
+    description = "Deletes the build directory"
+    group = "Build"
+    delete buildDir
+}
+
+if (!hasProperty("toolChainPath")) {
+    ext.toolChainPath = null
+}
+
+subprojects {
+    ext.defineWpiUtilProperties = {
+        ext.wpiUtil = wpiUtilUnzipLocation
+        ext.wpiUtilInclude = "$wpiUtilUnzipLocation/include"
+        ext.wpiUtilLibArmLocation = "$wpiUtilUnzipLocation/Linux/arm"
+        if (enableSimulation) {
+            ext.wpiUtilLibDesktopLocation = "$wpiUtilUnzipLocation/Linux/amd64"
+        }
+        ext.wpiUtilSharedLib = "$wpiUtilLibArmLocation/libwpiutil.so"
+        ext.wpiUtilSharedLibDebug = "$wpiUtilLibArmLocation/libwpiutil.so.debug"
+        ext.wpiUtilStaticLib = "$wpiUtilLibArmLocation/libwpiutil.a"
+
+        ext.addWpiUtilLibraryLinks = { compileTask, linker, targetPlatform ->
+            compileTask.dependsOn project(':').downloadWpiutil
+            String architecture = targetPlatform.architecture
+            if (architecture.contains('arm')) {
+                linker.args wpiUtilSharedLib
+            }
+        }
+
+        ext.addStaticWpiUtilLibraryLinks = { compileTask, linker, targetPlatform ->
+            compileTask.dependsOn project(':').downloadWpiutil
+            String architecture = targetPlatform.architecture
+            if (architecture.contains('arm')) {
+                linker.args wpiUtilStaticLib
+            }
+        }
+    }
+
+    // This defines a project property that projects depending on network tables can use to setup that dependency.
+    ext.defineNetworkTablesProperties = {
+        ext.netTables = netTablesUnzipLocation
+        ext.netTablesInclude = "$netTablesUnzipLocation/include"
+        ext.netLibArmLocation = "$netTablesUnzipLocation/Linux/arm"
+        if (enableSimulation) {
+            ext.netLibDesktopLocation = "$netTablesUnzipLocation/Linux/amd64"
+        }
+        ext.netSharedLib = "$netLibArmLocation/libntcore.so"
+        ext.netSharedLibDebug = "$netLibArmLocation/libntcore.so.debug"
+        ext.netStaticLib = "$netLibArmLocation/libntcore.a"
+
+        ext.addNetworkTablesLibraryLinks = { compileTask, linker, targetPlatform ->
+            compileTask.dependsOn project(':').downloadNetworkTables
+            String architecture = targetPlatform.architecture
+            if (architecture.contains('arm')) {
+                linker.args netSharedLib
+            }
+            addWpiUtilLibraryLinks(compileTask, linker, targetPlatform)
+        }
+
+        ext.addStaticNetworkTablesLibraryLinks = { compileTask, linker, targetPlatform ->
+            compileTask.dependsOn project(':').downloadNetworkTables
+            String architecture = targetPlatform.architecture
+            if (architecture.contains('arm')) {
+                linker.args netStaticLib
+            }
+            addStaticWpiUtilLibraryLinks(compileTask, linker, targetPlatform)
+        }
+    }
+
+    // This defines a project property that projects depending on cscore can use to setup that dependency.
+    ext.defineCsCoreProperties = {
+        ext.csCore = csCoreUnzipLocation
+        ext.csCoreInclude = "$csCoreUnzipLocation/include"
+        ext.csLibArmLocation = "$csCoreUnzipLocation/lib"
+        ext.csSharedLib = "$csLibArmLocation/libcscore.so"
+        ext.cvSharedLib = "$csLibArmLocation/libopencv.so"
+
+        ext.addCsCoreLibraryLinks = { compileTask, linker, targetPlatform ->
+            compileTask.dependsOn project(':').downloadCscore
+            String architecture = targetPlatform.architecture
+            if (architecture.contains('arm')) {
+                linker.args << '-L' + csLibArmLocation
+                linker.args csSharedLib
+                linker.args cvSharedLib
+            }
+        }
+    }
+
+    ext.defineCrossCompilerProperties = {
+        // We use a custom-built cross compiler with the prefix arm-frc-linux-gnueabi-<util name>
+        // If this ever changes, the prefix will need to be changed here
+        ext.compilerPrefix = 'arm-frc-linux-gnueabi-'
+    }
+
+    plugins.withType(CppPlugin).whenPluginAdded {
+        defineCrossCompilerProperties()
+        model {
+            buildTypes {
+                debug
+            }
+            // Adds a custom toolchain for our compiler prefix and options
+            toolChains {
+                roborioGcc(Gcc) {
+                    if (toolChainPath != null)
+                        path toolChainPath
+                    target('roborio-arm') {
+                        cCompiler.executable = compilerPrefix + cCompiler.executable
+                        cppCompiler.executable = compilerPrefix + cppCompiler.executable
+                        linker.executable = compilerPrefix + linker.executable
+                        assembler.executable = compilerPrefix + assembler.executable
+                        // Gradle auto-adds the -m32 argument to the linker and compiler. Our compiler only supports
+                        // arm, and doesn't understand this flag, so it is removed from both
+                        cppCompiler.withArguments { args ->
+                            args << '-std=c++1y' << '-Wformat=2' << '-Wall' << '-Wextra' << '-Werror' << '-pedantic'
+                            args << '-Wno-psabi' << '-Wno-unused-parameter' << '-fPIC' << '-Og' << '-g3' << '-rdynamic'
+                            //TODO: When the compiler allows us to actually call deprecated functions from within
+                            // deprecated function, remove this line (this will cause calling deprecated functions
+                            // to be treated as a warning rather than an error).
+                            args << '-Wno-error=deprecated-declarations'
+                            args.remove('-m32')
+                        }
+                        linker.withArguments { args ->
+                            args << '-rdynamic'
+                            args.remove('-m32')
+                        }
+                        staticLibArchiver.executable = compilerPrefix + staticLibArchiver.executable
+                    }
+                }
+            }
+
+            platforms {
+                'roborio-arm' {
+                    architecture 'arm'
+                    operatingSystem 'linux'
+                }
+            }
+        }
+
+        ext.niLibraryHeadersRoot = "${rootDir}/ni-libraries/include"
+        ext.niLibraryHeadersChipObject = "${rootDir}/ni-libraries/include/FRC_FPGA_ChipObject"
+
+        ext.binTool = { tool ->
+            if (toolChainPath != null) return "${toolChainPath}/${compilerPrefix}${tool}"
+            return "${compilerPrefix}${tool}"
+        }
+
+        // This task adds the appropriate linker flags for the NI libraries
+        ext.addNiLibraryLinks = { linker, targetPlatform ->
+            String architecture = targetPlatform.architecture
+            if (architecture.contains('arm')){
+                linker.args << '-L' + niLibraryPath
+                linker.args niLibrary
+            }
+        }
+
+        // This task sets up the shared libraries to be stripped
+        ext.debugStripSetup = { project->
+            if (!project.hasProperty('debug')) {
+                project.tasks.whenObjectAdded { task ->
+                    def name = task.name.toLowerCase()
+                    if (name.contains('link') && name.contains('sharedlibrary')) {
+                        def library = task.outputFile.absolutePath
+                        def debugLibrary = task.outputFile.absolutePath + ".debug"
+                        task.doLast {
+                            exec { commandLine binTool('objcopy'), '--only-keep-debug', library, debugLibrary }
+                            exec { commandLine binTool('strip'), '-g', library }
+                            exec { commandLine binTool('objcopy'), "--add-gnu-debuglink=$debugLibrary", library }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}