def javaResourceFile = file("$buildDir/generated/java/edu/wpi/first/hal/FRCNetComm.java") def cppResourceFile = file("$buildDir/generated/headers/hal/FRCUsageReporting.h") def generateUsageReporting = tasks.register('generateUsageReporting') { def javaBase = file('src/generate/FRCNetComm.java.in') def cppBase = file('src/generate/FRCUsageReporting.h.in') def instances = file('src/generate/Instances.txt') def resourceType = file('src/generate/ResourceType.txt') inputs.file(javaBase) inputs.file(cppBase) inputs.file(instances) inputs.file(resourceType) outputs.file(javaResourceFile) outputs.file(cppResourceFile) doLast { def instanceTextJava = instances as String[] def instanceTextCpp = instances as String[] def resourceTextJava = resourceType as String[] def resourceTextCpp = resourceType as String[] instanceTextJava = instanceTextJava.collect { " public static final int ${it};" }.join('\n') instanceTextCpp = instanceTextCpp.collect { " ${it}," }.join('\n') resourceTextJava = resourceTextJava.collect { " public static final int ${it};" }.join('\n') resourceTextCpp = resourceTextCpp.collect { " ${it}," }.join('\n') javaResourceFile.text = javaBase.text.replace('${usage_reporting_types}', resourceTextJava).replace('${usage_reporting_instances}', instanceTextJava) cppResourceFile.text = cppBase.text.replace('${usage_reporting_types_cpp}', resourceTextCpp).replace('${usage_reporting_instances_cpp}', instanceTextCpp) } } ext { addHalDependency = { binary, shared-> binary.tasks.withType(AbstractNativeSourceCompileTask) { it.dependsOn generateUsageReporting } binary.lib project: ':hal', library: 'hal', linkage: shared } addHalJniDependency = { binary-> binary.tasks.withType(AbstractNativeSourceCompileTask) { it.dependsOn generateUsageReporting } binary.lib project: ':hal', library: 'halJNIShared', linkage: 'shared' } nativeName = 'hal' setBaseName = 'wpiHal' devMain = 'edu.wpi.first.hal.DevMain' niLibraries = true generatedHeaders = "$buildDir/generated/headers" jniSplitSetup = { it.tasks.withType(AbstractNativeSourceCompileTask) { it.dependsOn generateUsageReporting } } splitSetup = { it.tasks.withType(AbstractNativeSourceCompileTask) { it.dependsOn generateUsageReporting } if (it.targetPlatform.name == nativeUtils.wpi.platforms.roborio) { it.sources { athenaCpp(CppSourceSet) { source { srcDirs = ['src/main/native/athena'] include '**/*.cpp' } exportedHeaders { srcDir 'src/main/native/include' srcDir generatedHeaders } } } } else { it.sources { simCpp(CppSourceSet) { source { srcDirs 'src/main/native/sim' include '**/*.cpp' } exportedHeaders { srcDir 'src/main/native/include' srcDir generatedHeaders } } } } } exeSplitSetup = { if (it.targetPlatform.name == nativeUtils.wpi.platforms.roborio) { nativeUtils.useRequiredLibrary(it, 'ni_link_libraries', 'ni_runtime_libraries') } } } apply from: "${rootDir}/shared/jni/setupBuild.gradle" sourceSets.main.java.srcDir "${buildDir}/generated/java/" compileJava { dependsOn generateUsageReporting } cppSourcesZip { from('src/main/native/athena') { into '/athena' } from('src/main/native/sim') { into '/sim' } } cppHeadersZip { dependsOn generateUsageReporting from(generatedHeaders) { into '/' } } Action> symbolFilter = { symbols -> symbols.removeIf({ !it.startsWith('HAL_') && !it.startsWith('HALSIM_') }) } as Action>; nativeUtils.exportsConfigs { hal { x64ExcludeSymbols = [ '_CT??_R0?AV_System_error', '_CT??_R0?AVexception', '_CT??_R0?AVfailure', '_CT??_R0?AVruntime_error', '_CT??_R0?AVsystem_error', '_CTA5?AVfailure', '_TI5?AVfailure', '_CT??_R0?AVout_of_range', '_CTA3?AVout_of_range', '_TI3?AVout_of_range', '_CT??_R0?AVbad_cast' ] } halJNI { x64SymbolFilter = symbolFilter } } model { binaries { all { it.tasks.withType(AbstractNativeSourceCompileTask) { it.dependsOn generateUsageReporting } if (!(it instanceof NativeBinarySpec)) return if (it.component.name != 'hal' && it.component.name != 'halBase') return if (it.targetPlatform.name != nativeUtils.wpi.platforms.roborio) return nativeUtils.useRequiredLibrary(it, 'ni_link_libraries') } } }