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