Files
allwpilib/wpilibjExamples/build.gradle
sciencewhiz 21d921184a [examples] Add compilable code snippets (#7909)
This enables frc-docs to use RLIs for things that are currently in-line
code blocks, and ensures they compile, which is important with the 2027
breaking changes coming. They are kept separate from the examples to
ensure they don't polute the VSCode examples finder.

Adds the Encoder snippets used in the frc-docs Encoder article as the
first instance of this.
2025-04-22 15:26:26 -06:00

263 lines
13 KiB
Groovy

import edu.wpi.first.toolchain.NativePlatforms
apply plugin: 'java'
apply plugin: 'jacoco'
ext {
useJava = true
useCpp = false
skipDev = true
}
apply from: "${rootDir}/shared/opencv.gradle"
dependencies {
implementation project(':wpilibj')
implementation project(':apriltag')
implementation project(':wpimath')
implementation project(':hal')
implementation project(':wpiutil')
implementation project(':wpinet')
implementation project(':ntcore')
implementation project(':cscore')
implementation project(':cameraserver')
implementation project(':wpilibNewCommands')
implementation project(':romiVendordep')
implementation project(':xrpVendordep')
implementation project(':epilogue-runtime')
annotationProcessor project(':epilogue-processor')
testImplementation 'org.junit.jupiter:junit-jupiter:5.10.1'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
jacoco {
toolVersion = "0.8.10"
}
jacocoTestReport {
reports {
xml.required = true
html.required = true
}
}
if (!project.hasProperty('skipJavaFormat')) {
apply plugin: 'pmd'
pmd {
consoleOutput = true
reportsDir = file("$project.buildDir/reports/pmd")
ruleSetFiles = files(new File(rootDir, "styleguide/pmd-ruleset.xml"))
ruleSets = []
}
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" << "-Werror"
}
}
tasks.register('buildDesktopJava') {
it.dependsOn tasks.withType(JavaCompile)
}
apply from: 'publish.gradle'
ext {
templateDirectory = new File("$projectDir/src/main/java/edu/wpi/first/wpilibj/templates/")
templateFile = new File("$projectDir/src/main/java/edu/wpi/first/wpilibj/templates/templates.json")
exampleDirectory = new File("$projectDir/src/main/java/edu/wpi/first/wpilibj/examples/")
exampleFile = new File("$projectDir/src/main/java/edu/wpi/first/wpilibj/examples/examples.json")
commandDirectory = new File("$projectDir/src/main/java/edu/wpi/first/wpilibj/commands/")
commandFile = new File("$projectDir/src/main/java/edu/wpi/first/wpilibj/commands/commands.json")
snippetsDirectory = new File("$projectDir/src/main/java/edu/wpi/first/wpilibj/snippets/")
snippetsFile = new File("$projectDir/src/main/java/edu/wpi/first/wpilibj/snippets/snippets.json")
}
apply plugin: 'cpp'
apply plugin: 'edu.wpi.first.NativeUtils'
apply from: '../shared/config.gradle'
model {
components {
wpilibjExamplesDev(NativeExecutableSpec) {
targetBuildTypes 'debug'
sources {
cpp {
source {
srcDirs 'src/dev/native/cpp'
include '**/*.cpp'
}
exportedHeaders {
srcDirs 'src/dev/native/include'
}
}
}
binaries.all { binary ->
lib project: ':apriltag', library: 'apriltag', linkage: 'shared'
lib project: ':apriltag', library: 'apriltagJNIShared', linkage: 'shared'
lib project: ':wpimath', library: 'wpimath', linkage: 'shared'
lib project: ':wpimath', library: 'wpimathJNIShared', linkage: 'shared'
project(':ntcore').addNtcoreDependency(binary, 'shared')
project(':ntcore').addNtcoreJniDependency(binary)
lib project: ':cscore', library: 'cscore', linkage: 'shared'
lib project: ':cscore', library: 'cscoreJNIShared', linkage: 'shared'
project(':hal').addHalDependency(binary, 'shared')
project(':hal').addHalJniDependency(binary)
lib project: ':wpiutil', library: 'wpiutil', linkage: 'shared'
lib project: ':wpiutil', library: 'wpiutilJNIShared', linkage: 'shared'
lib project: ':wpinet', library: 'wpinet', linkage: 'shared'
lib project: ':wpinet', library: 'wpinetJNIShared', linkage: 'shared'
if (binary.targetPlatform.name == nativeUtils.wpi.platforms.roborio) {
nativeUtils.useRequiredLibrary(binary, 'ni_link_libraries', 'ni_runtime_libraries')
} else {
def systemArch = getCurrentArch()
if (binary.targetPlatform.name == systemArch) {
lib project: ":simulation:halsim_gui", library: 'halsim_gui', linkage: 'shared'
}
}
nativeUtils.useRequiredLibrary(binary, 'opencv_shared')
}
}
}
tasks {
def c = $.components
def found = false
c.each {
if (it in NativeExecutableSpec && it.name == "wpilibjExamplesDev") {
it.binaries.each {
if (!found) {
def arch = it.targetPlatform.name
if (arch == NativePlatforms.desktop) {
found = true
def filePath = it.tasks.install.installDirectory.get().toString() + File.separatorChar + 'lib'
def doFirstTask = { task ->
def extensions = ''
it.tasks.install.installDirectory.get().getAsFile().eachFileRecurse {
def name = it.name
if (!(name.endsWith('.dll') || name.endsWith('.so') || name.endsWith('.dylib'))) {
return
}
def file = it
if (name.startsWith("halsim_gui") || name.startsWith("libhalsim_gui".toString())) {
extensions += file.absolutePath + File.pathSeparator
}
}
if (extensions != '') {
task.environment 'HALSIM_EXTENSIONS', extensions
}
}
project.tasks.create("runCpp", Exec) { task ->
dependsOn it.tasks.install
commandLine it.tasks.install.runScriptFile.get().asFile.toString()
test.dependsOn it.tasks.install
test.systemProperty 'java.library.path', filePath
}
new groovy.json.JsonSlurper().parseText(exampleFile.text).each { entry ->
project.tasks.create("run${entry.foldername}", JavaExec) { run ->
run.group "run examples"
run.mainClass = "edu.wpi.first.wpilibj.examples." + entry.foldername + "." + entry.mainclass
run.classpath = sourceSets.main.runtimeClasspath
run.dependsOn it.tasks.install
run.systemProperty 'java.library.path', filePath
doFirst { doFirstTask(run) }
if (org.gradle.internal.os.OperatingSystem.current().isMacOsX()) {
run.jvmArgs = ['-XstartOnFirstThread']
}
}
project.tasks.create("test${entry.foldername}", Test) { testTask ->
testTask.group "verification"
testTask.useJUnitPlatform()
testTask.filter {
includeTestsMatching("edu.wpi.first.wpilibj.examples.${entry.foldername}.*")
// armsimulation regularly fails on CI Win64Debug
if (project.hasProperty('ciDebugOnly')) {
excludeTestsMatching("edu.wpi.first.wpilibj.examples.armsimulation.*")
}
setFailOnNoMatchingTests(false)
}
test.filter {
excludeTestsMatching("edu.wpi.first.wpilibj.examples.${entry.foldername}.*")
setFailOnNoMatchingTests(false)
}
testTask.testClassesDirs = sourceSets.test.output.classesDirs
testTask.classpath = sourceSets.test.runtimeClasspath
testTask.dependsOn it.tasks.install
testTask.systemProperty 'junit.jupiter.extensions.autodetection.enabled', 'true'
testTask.testLogging {
events "failed"
exceptionFormat "full"
}
testTask.systemProperty 'java.library.path', filePath
if (project.hasProperty('onlylinuxathena') || project.hasProperty('onlylinuxarm32') || project.hasProperty('onlylinuxarm64') || project.hasProperty('onlywindowsarm64')) {
testTask.enabled = false
}
test.dependsOn(testTask)
}
}
new groovy.json.JsonSlurper().parseText(snippetsFile.text).each { entry ->
project.tasks.create("runSnippet${entry.foldername}", JavaExec) { run ->
run.group "run snippets"
run.mainClass = "edu.wpi.first.wpilibj.snippets." + entry.foldername + "." + entry.mainclass
run.classpath = sourceSets.main.runtimeClasspath
run.dependsOn it.tasks.install
run.systemProperty 'java.library.path', filePath
doFirst { doFirstTask(run) }
if (org.gradle.internal.os.OperatingSystem.current().isMacOsX()) {
run.jvmArgs = ['-XstartOnFirstThread']
}
}
project.tasks.create("testSnippet${entry.foldername}", Test) { testTask ->
testTask.group "verification"
testTask.useJUnitPlatform()
testTask.filter {
includeTestsMatching("edu.wpi.first.wpilibj.snippets.${entry.foldername}.*")
setFailOnNoMatchingTests(false)
}
test.filter {
excludeTestsMatching("edu.wpi.first.wpilibj.snippets.${entry.foldername}.*")
setFailOnNoMatchingTests(false)
}
testTask.testClassesDirs = sourceSets.test.output.classesDirs
testTask.classpath = sourceSets.test.runtimeClasspath
testTask.dependsOn it.tasks.install
testTask.systemProperty 'junit.jupiter.extensions.autodetection.enabled', 'true'
testTask.testLogging {
events "failed"
exceptionFormat "full"
}
testTask.systemProperty 'java.library.path', filePath
if (project.hasProperty('onlylinuxathena') || project.hasProperty('onlylinuxarm32') || project.hasProperty('onlylinuxarm64') || project.hasProperty('onlywindowsarm64')) {
testTask.enabled = false
}
test.dependsOn(testTask)
}
}
found = true
}
}
}
}
}
}
}
ext {
isCppCommands = false
}
apply from: "${rootDir}/shared/examplecheck.gradle"