mirror of
https://github.com/PhotonVision/photonvision
synced 2026-06-20 00:51:41 +00:00
Fixes GPL violation, the license has been missing since 2024. This also puts licenses in as many JARs and native library archives as possible (for good measure.)
227 lines
8.2 KiB
Groovy
227 lines
8.2 KiB
Groovy
ext {
|
|
nativeName = "photontargeting"
|
|
}
|
|
|
|
apply plugin: 'cpp'
|
|
apply plugin: 'google-test-test-suite'
|
|
apply plugin: 'edu.wpi.first.NativeUtils'
|
|
apply plugin: 'edu.wpi.first.WpilibTools'
|
|
apply plugin: 'edu.wpi.first.GradleJni'
|
|
|
|
ext.licenseFile = file("$rootDir/LICENSE")
|
|
apply from: "${rootDir}/shared/config.gradle"
|
|
apply from: "${rootDir}/shared/javacommon.gradle"
|
|
|
|
apply from: "${rootDir}/versioningHelper.gradle"
|
|
|
|
nativeUtils {
|
|
exportsConfigs {
|
|
"${nativeName}" {}
|
|
}
|
|
}
|
|
|
|
sourceSets.main.java.srcDir "${projectDir}/src/generated/main/java"
|
|
|
|
// Folder whose contents will be included in the final jar
|
|
def outputsFolder = file("$buildDir/extra_resources")
|
|
|
|
// Sync task: like the copy task, but all files that exist in the destination directory will be deleted before copying files
|
|
task syncOutputsFolder(type: Sync) {
|
|
into outputsFolder
|
|
}
|
|
|
|
// And package our outputs folder into the final jar
|
|
jar {
|
|
from outputsFolder
|
|
dependsOn syncOutputsFolder
|
|
}
|
|
|
|
model {
|
|
components {
|
|
"${nativeName}"(NativeLibrarySpec) {
|
|
sources {
|
|
cpp {
|
|
source {
|
|
srcDirs 'src/main/native/cpp', "$buildDir/generated/source/proto/main/cpp", 'src/generated/main/native/cpp'
|
|
include '**/*.cpp', '**/*.cc'
|
|
}
|
|
exportedHeaders {
|
|
srcDirs 'src/main/native/include', 'src/generated/main/native/include', "$buildDir/generated/source/proto/main/cpp", 'src/generated/main/native/include'
|
|
if (project.hasProperty('generatedHeaders')) {
|
|
srcDir generatedHeaders
|
|
}
|
|
include "**/*.h"
|
|
}
|
|
}
|
|
}
|
|
|
|
binaries.all {
|
|
it.tasks.withType(CppCompile) {
|
|
it.dependsOn generateProto
|
|
}
|
|
}
|
|
|
|
nativeUtils.useRequiredLibrary(it, "wpiutil_shared")
|
|
nativeUtils.useRequiredLibrary(it, "wpimath_shared")
|
|
nativeUtils.useRequiredLibrary(it, "wpinet_shared")
|
|
nativeUtils.useRequiredLibrary(it, "wpilibc_shared")
|
|
nativeUtils.useRequiredLibrary(it, "ntcore_shared")
|
|
}
|
|
"${nativeName}JNI"(JniNativeLibrarySpec) {
|
|
|
|
enableCheckTask project.hasProperty('doJniCheck')
|
|
javaCompileTasks << compileJava
|
|
jniCrossCompileOptions << JniCrossCompileOptions(nativeUtils.wpi.platforms.roborio)
|
|
jniCrossCompileOptions << JniCrossCompileOptions(nativeUtils.wpi.platforms.linuxarm32)
|
|
jniCrossCompileOptions << JniCrossCompileOptions(nativeUtils.wpi.platforms.linuxarm64)
|
|
|
|
sources {
|
|
cpp {
|
|
source {
|
|
srcDirs 'src/main/native/jni'
|
|
include '**/*.cpp', '**/*.cc'
|
|
}
|
|
}
|
|
}
|
|
|
|
binaries.all {
|
|
lib library: nativeName, linkage: 'shared'
|
|
}
|
|
|
|
nativeUtils.useRequiredLibrary(it, "wpiutil_shared")
|
|
nativeUtils.useRequiredLibrary(it, "wpinet_shared")
|
|
nativeUtils.useRequiredLibrary(it, "ntcore_shared")
|
|
nativeUtils.useRequiredLibrary(it, "wpimath_shared")
|
|
}
|
|
|
|
all {
|
|
binaries.withType(SharedLibraryBinarySpec) { binary ->
|
|
// check that we're building for the platform (per PArchOverride/wpilib plat detection)
|
|
def platName = jniPlatform
|
|
def realWpilibName = wpilibNativeName;
|
|
|
|
if (jniPlatform.equals("osxarm64") || jniPlatform.equals("osxx86-64")) {
|
|
// native-utils calls this osxuniversal
|
|
platName = "osxuniversal";
|
|
realWpilibName = "osxuniversal";
|
|
}
|
|
|
|
if (binary.targetPlatform.name == platName) {
|
|
|
|
|
|
// only include release binaries (hard coded for now)
|
|
def isDebug = binary.buildType.name.contains('debug')
|
|
if (!isDebug) {
|
|
syncOutputsFolder {
|
|
// Just shove the shared library into the root of the jar output by photon-targeting:jar
|
|
from(binary.sharedLibraryFile) {
|
|
into "nativelibraries/${realWpilibName}/"
|
|
}
|
|
// And (not sure if this is a hack) make the jar task depend on the build task
|
|
dependsOn binary.identifier.projectScopedName
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
testSuites {
|
|
"${nativeName}Test"(GoogleTestTestSuiteSpec) {
|
|
for(NativeComponentSpec c : $.components) {
|
|
if (c.name == nativeName) {
|
|
testing c
|
|
break
|
|
}
|
|
}
|
|
sources {
|
|
cpp {
|
|
source {
|
|
srcDirs 'src/test/native/cpp'
|
|
include '**/*.cpp'
|
|
}
|
|
exportedHeaders {
|
|
srcDirs 'src/test/native/include', "$buildDir/generated/source/proto/main/cpp"
|
|
}
|
|
}
|
|
}
|
|
|
|
binaries.all {
|
|
it.tasks.withType(CppCompile) {
|
|
it.dependsOn generateProto
|
|
}
|
|
}
|
|
|
|
nativeUtils.useRequiredLibrary(it, "wpilib_executable_shared")
|
|
nativeUtils.useRequiredLibrary(it, "googletest_static")
|
|
nativeUtils.useRequiredLibrary(it, "apriltag_shared")
|
|
}
|
|
}
|
|
|
|
tasks {
|
|
def c = $.testSuites
|
|
project.tasks.create('runCpp', Exec) {
|
|
description = "Run the photon-lib executable"
|
|
def found = false
|
|
def systemArch = getCurrentArch()
|
|
c.each {
|
|
if (it in GoogleTestTestSuiteSpec && it.name == "${nativeName}Test") {
|
|
it.binaries.each {
|
|
if (!found) {
|
|
def arch = it.targetPlatform.name
|
|
if (arch == systemArch) {
|
|
dependsOn it.tasks.install
|
|
commandLine it.tasks.install.runScriptFile.get().asFile.toString()
|
|
def filePath = it.tasks.install.installDirectory.get().toString() + File.separatorChar + 'lib'
|
|
test.dependsOn it.tasks.install
|
|
test.systemProperty 'java.library.path', filePath
|
|
test.environment 'LD_LIBRARY_PATH', filePath
|
|
test.environment 'DYLD_LIBRARY_PATH', filePath
|
|
test.workingDir filePath
|
|
|
|
found = true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
apply from: "${rootDir}/shared/javacpp/publish.gradle"
|
|
|
|
// Add photon serde headers to our published sources
|
|
cppHeadersZip {
|
|
from('src/generated/main/native/include') {
|
|
into '/'
|
|
}
|
|
}
|
|
|
|
// make sure native libraries can be loaded in tests
|
|
test {
|
|
classpath += files(outputsFolder)
|
|
dependsOn syncOutputsFolder
|
|
}
|
|
|
|
// setup wpilib bundled native libs
|
|
wpilibTools.deps.wpilibVersion = wpi.versions.wpilibVersion.get()
|
|
|
|
def nativeConfigName = 'wpilibNatives'
|
|
def nativeConfig = configurations.create(nativeConfigName)
|
|
|
|
def nativeTasks = wpilibTools.createExtractionTasks {
|
|
configurationName = nativeConfigName
|
|
}
|
|
|
|
nativeTasks.addToSourceSetResources(sourceSets.test)
|
|
|
|
nativeConfig.dependencies.add wpilibTools.deps.wpilib("wpilibc")
|
|
nativeConfig.dependencies.add wpilibTools.deps.wpilib("wpiutil")
|
|
nativeConfig.dependencies.add wpilibTools.deps.wpilib("wpimath")
|
|
nativeConfig.dependencies.add wpilibTools.deps.wpilib("wpinet")
|
|
nativeConfig.dependencies.add wpilibTools.deps.wpilib("ntcore")
|
|
nativeConfig.dependencies.add wpilibTools.deps.wpilib("hal")
|
|
nativeConfig.dependencies.add wpilibTools.deps.wpilib("cscore")
|
|
nativeConfig.dependencies.add wpilibTools.deps.wpilibOpenCv("frc" + openCVYear, wpi.versions.opencvVersion.get())
|
|
nativeConfig.dependencies.add wpilibTools.deps.wpilib("apriltag")
|