Squashed 'third_party/ntcore_2016/' content from commit d8de5e4
Change-Id: Id4839f41b6a620d8bae58dcf1710016671cc4992
git-subtree-dir: third_party/ntcore_2016
git-subtree-split: d8de5e4f19e612e7102172c0dbf152ce82d3d63a
diff --git a/toolchains/arm.gradle b/toolchains/arm.gradle
new file mode 100644
index 0000000..144a8bd
--- /dev/null
+++ b/toolchains/arm.gradle
@@ -0,0 +1,94 @@
+def compilerPrefix = 'arm-frc-linux-gnueabi-'
+model {
+ toolChains {
+ gcc(Gcc) {
+ target("arm"){
+ // 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
+ 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' << '-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
+ }
+ }
+ // Workaround for OS X. Macs for some reason want to use Xcode's gcc
+ // (which just wraps Clang), so we have to explicitly make it so
+ // that trying to compile with Clang will call gcc instead
+ macGcc(Clang) {
+ target('arm') {
+ // 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
+ cppCompiler.executable = compilerPrefix + 'g++'
+ linker.executable = compilerPrefix + 'g++'
+ assembler.executable = compilerPrefix + 'gcc'
+ // 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' << '-O0' << '-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 + 'ar'
+ }
+ }
+ }
+}
+
+ext.setupReleaseDefines = { cppCompiler, linker ->
+ cppCompiler.args '-O2', '-g'
+}
+
+ext.setupDebugDefines = { cppCompiler, linker ->
+ cppCompiler.args '-g', '-O0'
+}
+
+ext.releaseSetup = { releaseTasks ->
+ binaries.withType(SharedLibraryBinarySpec) { binary ->
+ if (!project.hasProperty('debug')) {
+ def library = binary.sharedLibraryFile.absolutePath
+ def debugLibrary = binary.sharedLibraryFile.absolutePath + ".debug"
+ if (project.tasks.findByName("firstObjcopy${binary.name}") == null) {
+ def firstObjcopy = project.tasks.create("firstObjcopy${binary.name}", Exec) { task ->
+ task.commandLine "${compilerPrefix}objcopy", '--only-keep-debug', library, debugLibrary
+ }
+ def strip = project.tasks.create("strip${binary.name}", Exec) { task ->
+ task.commandLine "${compilerPrefix}strip", '-g', library
+ }
+ def secondObjcopy = project.tasks.create("secondObjcopy${binary.name}", Exec) { task ->
+ task.commandLine "${compilerPrefix}objcopy", "--add-gnu-debuglink=$debugLibrary", library
+ }
+ secondObjcopy.dependsOn strip
+ strip.dependsOn firstObjcopy
+ binary.tasks.whenObjectAdded { task ->
+ if (task.name.contains('link')) {
+ firstObjcopy.dependsOn task
+ }
+ }
+ }
+ releaseTasks.each { it.dependsOn project.tasks.getByName("secondObjcopy${binary.name}") }
+ }
+ }
+}