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 }
+ }
+ }
+ }
+ }
+ }
+ }
+}