mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-19 00:41:43 +00:00
347 lines
12 KiB
Groovy
347 lines
12 KiB
Groovy
import groovy.json.JsonSlurper;
|
|
import com.hubspot.jinjava.Jinjava;
|
|
import com.hubspot.jinjava.JinjavaConfig;
|
|
|
|
def ntcoreTypesInputFile = file("src/generate/types.json")
|
|
def ntcoreJavaTypesInputDir = file("src/generate/java")
|
|
def ntcoreJavaTypesOutputDir = file("$buildDir/generated/main/java/edu/wpi/first/networktables")
|
|
|
|
task ntcoreGenerateJavaTypes() {
|
|
description = "Generates ntcore Java type classes"
|
|
group = "WPILib"
|
|
|
|
inputs.file ntcoreTypesInputFile
|
|
inputs.dir ntcoreJavaTypesInputDir
|
|
outputs.dir ntcoreJavaTypesOutputDir
|
|
|
|
doLast {
|
|
def jsonSlurper = new JsonSlurper()
|
|
def jsonTypes = jsonSlurper.parse(ntcoreTypesInputFile)
|
|
|
|
ntcoreJavaTypesOutputDir.deleteDir()
|
|
ntcoreJavaTypesOutputDir.mkdirs()
|
|
|
|
def config = new JinjavaConfig()
|
|
def jinjava = new Jinjava(config)
|
|
|
|
ntcoreJavaTypesInputDir.listFiles().each { File file ->
|
|
def template = file.text
|
|
def outfn = file.name.substring(0, file.name.length() - 6)
|
|
if (file.name.startsWith("NetworkTable") || file.name.startsWith("Generic")) {
|
|
def replacements = new HashMap<String,?>()
|
|
replacements.put("types", jsonTypes)
|
|
def output = jinjava.render(template, replacements)
|
|
new File(ntcoreJavaTypesOutputDir, outfn).write(output)
|
|
} else {
|
|
jsonTypes.each { Map<String,?> replacements ->
|
|
def output = jinjava.render(template, replacements)
|
|
def typename = replacements.get("TypeName")
|
|
File outfile
|
|
if (outfn == "Timestamped.java") {
|
|
outfile = new File(ntcoreJavaTypesOutputDir, "Timestamped${typename}.java")
|
|
} else {
|
|
outfile = new File(ntcoreJavaTypesOutputDir, "${typename}${outfn}")
|
|
}
|
|
outfile.write(output)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
def ntcoreCppTypesInputDir = file("src/generate/include/networktables")
|
|
def ntcoreCppTypesOutputDir = file("$buildDir/generated/main/native/include/networktables")
|
|
|
|
task ntcoreGenerateCppTypes() {
|
|
description = "Generates ntcore C++ type classes"
|
|
group = "WPILib"
|
|
|
|
inputs.file ntcoreTypesInputFile
|
|
inputs.dir ntcoreCppTypesInputDir
|
|
outputs.dir ntcoreCppTypesOutputDir
|
|
|
|
doLast {
|
|
def jsonSlurper = new JsonSlurper()
|
|
def jsonTypes = jsonSlurper.parse(ntcoreTypesInputFile)
|
|
|
|
ntcoreCppTypesOutputDir.deleteDir()
|
|
ntcoreCppTypesOutputDir.mkdirs()
|
|
|
|
def config = new JinjavaConfig()
|
|
def jinjava = new Jinjava(config)
|
|
|
|
ntcoreCppTypesInputDir.listFiles().each { File file ->
|
|
def template = file.text
|
|
def outfn = file.name.substring(0, file.name.length() - 6)
|
|
jsonTypes.each { Map<String,?> replacements ->
|
|
def output = jinjava.render(template, replacements)
|
|
def typename = replacements.get("TypeName")
|
|
def outfile = new File(ntcoreCppTypesOutputDir, "${typename}${outfn}")
|
|
outfile.write(output)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
def ntcoreCppHandleSourceInputFile = file("src/generate/cpp/ntcore_cpp_types.cpp.jinja")
|
|
def ntcoreCppHandleSourceOutputFile = file("$buildDir/generated/main/native/cpp/ntcore_cpp_types.cpp")
|
|
|
|
task ntcoreGenerateCppHandleSource() {
|
|
description = "Generates ntcore C++ handle source"
|
|
group = "WPILib"
|
|
|
|
inputs.files([
|
|
ntcoreTypesInputFile,
|
|
ntcoreCppHandleSourceInputFile
|
|
])
|
|
outputs.file ntcoreCppHandleSourceOutputFile
|
|
|
|
doLast {
|
|
def jsonSlurper = new JsonSlurper()
|
|
def jsonTypes = jsonSlurper.parse(ntcoreTypesInputFile)
|
|
|
|
ntcoreCppHandleSourceOutputFile.delete()
|
|
|
|
def config = new JinjavaConfig()
|
|
def jinjava = new Jinjava(config)
|
|
|
|
def template = ntcoreCppHandleSourceInputFile.text
|
|
def replacements = new HashMap<String,?>()
|
|
replacements.put("types", jsonTypes)
|
|
def output = jinjava.render(template, replacements)
|
|
ntcoreCppHandleSourceOutputFile.write(output)
|
|
}
|
|
}
|
|
|
|
def ntcoreCppHandleHeaderInputFile = file("src/generate/include/ntcore_cpp_types.h.jinja")
|
|
def ntcoreCppHandleHeaderOutputFile = file("$buildDir/generated/main/native/include/ntcore_cpp_types.h")
|
|
|
|
task ntcoreGenerateCppHandleHeader() {
|
|
description = "Generates ntcore C++ handle header"
|
|
group = "WPILib"
|
|
|
|
inputs.files([
|
|
ntcoreTypesInputFile,
|
|
ntcoreCppHandleHeaderInputFile
|
|
])
|
|
outputs.file ntcoreCppHandleHeaderOutputFile
|
|
|
|
doLast {
|
|
def jsonSlurper = new JsonSlurper()
|
|
def jsonTypes = jsonSlurper.parse(ntcoreTypesInputFile)
|
|
|
|
ntcoreCppHandleHeaderOutputFile.delete()
|
|
|
|
def config = new JinjavaConfig()
|
|
def jinjava = new Jinjava(config)
|
|
|
|
def template = ntcoreCppHandleHeaderInputFile.text
|
|
def replacements = new HashMap<String,?>()
|
|
replacements.put("types", jsonTypes)
|
|
def output = jinjava.render(template, replacements)
|
|
ntcoreCppHandleHeaderOutputFile.write(output)
|
|
}
|
|
}
|
|
|
|
def ntcoreCHandleSourceInputFile = file("src/generate/cpp/ntcore_c_types.cpp.jinja")
|
|
def ntcoreCHandleSourceOutputFile = file("$buildDir/generated/main/native/cpp/ntcore_c_types.cpp")
|
|
|
|
task ntcoreGenerateCHandleSource() {
|
|
description = "Generates ntcore C handle source"
|
|
group = "WPILib"
|
|
|
|
inputs.files([
|
|
ntcoreTypesInputFile,
|
|
ntcoreCHandleSourceInputFile
|
|
])
|
|
outputs.file ntcoreCHandleSourceOutputFile
|
|
|
|
doLast {
|
|
def jsonSlurper = new JsonSlurper()
|
|
def jsonTypes = jsonSlurper.parse(ntcoreTypesInputFile)
|
|
|
|
ntcoreCHandleSourceOutputFile.delete()
|
|
|
|
def config = new JinjavaConfig()
|
|
def jinjava = new Jinjava(config)
|
|
|
|
def template = ntcoreCHandleSourceInputFile.text
|
|
def replacements = new HashMap<String,?>()
|
|
replacements.put("types", jsonTypes)
|
|
def output = jinjava.render(template, replacements)
|
|
ntcoreCHandleSourceOutputFile.write(output)
|
|
}
|
|
}
|
|
|
|
def ntcoreCHandleHeaderInputFile = file("src/generate/include/ntcore_c_types.h.jinja")
|
|
def ntcoreCHandleHeaderOutputFile = file("$buildDir/generated/main/native/include/ntcore_c_types.h")
|
|
|
|
task ntcoreGenerateCHandleHeader() {
|
|
description = "Generates ntcore C handle header"
|
|
group = "WPILib"
|
|
|
|
inputs.files([
|
|
ntcoreTypesInputFile,
|
|
ntcoreCHandleHeaderInputFile
|
|
])
|
|
outputs.file ntcoreCHandleHeaderOutputFile
|
|
|
|
doLast {
|
|
def jsonSlurper = new JsonSlurper()
|
|
def jsonTypes = jsonSlurper.parse(ntcoreTypesInputFile)
|
|
|
|
ntcoreCHandleHeaderOutputFile.delete()
|
|
|
|
def config = new JinjavaConfig()
|
|
def jinjava = new Jinjava(config)
|
|
|
|
def template = ntcoreCHandleHeaderInputFile.text
|
|
def replacements = new HashMap<String,?>()
|
|
replacements.put("types", jsonTypes)
|
|
def output = jinjava.render(template, replacements)
|
|
ntcoreCHandleHeaderOutputFile.write(output)
|
|
}
|
|
}
|
|
|
|
def ntcoreJniSourceInputFile = file("src/generate/cpp/jni/types_jni.cpp.jinja")
|
|
def ntcoreJniSourceOutputFile = file("$buildDir/generated/main/native/cpp/jni/types_jni.cpp")
|
|
|
|
task ntcoreGenerateJniSource() {
|
|
description = "Generates ntcore JNI types source"
|
|
group = "WPILib"
|
|
|
|
inputs.files([
|
|
ntcoreTypesInputFile,
|
|
ntcoreJniSourceInputFile
|
|
])
|
|
outputs.file ntcoreJniSourceOutputFile
|
|
|
|
doLast {
|
|
def jsonSlurper = new JsonSlurper()
|
|
def jsonTypes = jsonSlurper.parse(ntcoreTypesInputFile)
|
|
|
|
ntcoreJniSourceOutputFile.delete()
|
|
|
|
def config = new JinjavaConfig()
|
|
def jinjava = new Jinjava(config)
|
|
|
|
def template = ntcoreJniSourceInputFile.text
|
|
def replacements = new HashMap<String,?>()
|
|
replacements.put("types", jsonTypes)
|
|
def output = jinjava.render(template, replacements)
|
|
ntcoreJniSourceOutputFile.write(output)
|
|
}
|
|
}
|
|
|
|
ext {
|
|
addNtcoreDependency = { binary, shared->
|
|
binary.tasks.withType(AbstractNativeSourceCompileTask) {
|
|
it.dependsOn ntcoreGenerateCppTypes
|
|
it.dependsOn ntcoreGenerateCppHandleHeader
|
|
it.dependsOn ntcoreGenerateCHandleHeader
|
|
}
|
|
binary.lib project: ':ntcore', library: 'ntcore', linkage: shared
|
|
}
|
|
|
|
addNtcoreJniDependency = { binary->
|
|
binary.tasks.withType(AbstractNativeSourceCompileTask) {
|
|
it.dependsOn ntcoreGenerateCppTypes
|
|
it.dependsOn ntcoreGenerateCppHandleHeader
|
|
it.dependsOn ntcoreGenerateCHandleHeader
|
|
}
|
|
binary.lib project: ':ntcore', library: 'ntcoreJNIShared', linkage: 'shared'
|
|
}
|
|
|
|
nativeName = 'ntcore'
|
|
devMain = 'edu.wpi.first.ntcore.DevMain'
|
|
generatedSources = "$buildDir/generated/main/native/cpp"
|
|
generatedHeaders = "$buildDir/generated/main/native/include"
|
|
jniSplitSetup = {
|
|
it.tasks.withType(CppCompile) {
|
|
it.dependsOn ntcoreGenerateCppTypes
|
|
it.dependsOn ntcoreGenerateCppHandleSource
|
|
it.dependsOn ntcoreGenerateCppHandleHeader
|
|
it.dependsOn ntcoreGenerateCHandleSource
|
|
it.dependsOn ntcoreGenerateCHandleHeader
|
|
it.dependsOn ntcoreGenerateJniSource
|
|
}
|
|
}
|
|
splitSetup = {
|
|
it.tasks.withType(CppCompile) {
|
|
it.dependsOn ntcoreGenerateCppTypes
|
|
it.dependsOn ntcoreGenerateCppHandleSource
|
|
it.dependsOn ntcoreGenerateCppHandleHeader
|
|
it.dependsOn ntcoreGenerateCHandleSource
|
|
it.dependsOn ntcoreGenerateCHandleHeader
|
|
it.dependsOn ntcoreGenerateJniSource
|
|
it.includes 'src/main/native/cpp'
|
|
}
|
|
}
|
|
exeSplitSetup = {
|
|
it.tasks.withType(CppCompile) {
|
|
it.dependsOn ntcoreGenerateCppTypes
|
|
it.dependsOn ntcoreGenerateCppHandleSource
|
|
it.dependsOn ntcoreGenerateCppHandleHeader
|
|
it.dependsOn ntcoreGenerateCHandleSource
|
|
it.dependsOn ntcoreGenerateCHandleHeader
|
|
}
|
|
}
|
|
}
|
|
|
|
apply from: "${rootDir}/shared/jni/setupBuild.gradle"
|
|
|
|
model {
|
|
components {}
|
|
binaries {
|
|
all {
|
|
if (!it.buildable || !(it instanceof NativeBinarySpec)) {
|
|
return
|
|
}
|
|
if (it.component.name == "${nativeName}JNI") {
|
|
lib project: ':wpinet', library: 'wpinet', linkage: 'static'
|
|
lib project: ':wpiutil', library: 'wpiutil', linkage: 'static'
|
|
} else {
|
|
lib project: ':wpinet', library: 'wpinet', linkage: 'shared'
|
|
lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
sourceSets.main.java.srcDir "${buildDir}/generated/main/java"
|
|
compileJava.dependsOn ntcoreGenerateJavaTypes
|
|
|
|
cppHeadersZip {
|
|
dependsOn ntcoreGenerateCppTypes
|
|
dependsOn ntcoreGenerateCppHandleHeader
|
|
dependsOn ntcoreGenerateCHandleHeader
|
|
from(generatedHeaders) {
|
|
into '/'
|
|
}
|
|
}
|
|
|
|
Action<List<String>> symbolFilter = { symbols ->
|
|
symbols.removeIf({ !it.startsWith('NT_') })
|
|
} as Action<List<String>>;
|
|
|
|
nativeUtils.exportsConfigs {
|
|
ntcore {
|
|
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'
|
|
]
|
|
}
|
|
ntcoreJNI {
|
|
x64SymbolFilter = symbolFilter
|
|
}
|
|
}
|