mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-23 01:21:42 +00:00
* Modify halsim to be able to load extension libraries if they are available. It will read the list of libraries to try from the HALSIM_EXTENSIONS environment variable. Multiple libraries can be given if separated by ';' (Windows) or ':' (Unix). The library must have an 'HALSIM_InitExtension' method that returns >= 0 on success. The library is expected to use the interface expressed by hal/src/src/main/native/include/MockData * Add a simple halsim library that just prints robot values. This makes a good test bed for cross platform purposes, and provides the ultimate in light weight simulators. This initial version only prints PWM values.
209 lines
7.7 KiB
Groovy
209 lines
7.7 KiB
Groovy
apply plugin: 'cpp'
|
|
apply plugin: 'google-test'
|
|
apply plugin: 'visual-studio'
|
|
apply plugin: 'edu.wpi.first.NativeUtils'
|
|
|
|
apply from: '../config.gradle'
|
|
|
|
ext.addHalCompilerArguments = { binary->
|
|
if (binary.targetPlatform.architecture.name == 'athena') {
|
|
tasks.withType(CppCompile) {
|
|
binary.cppCompiler.args "-DCONFIG_ATHENA"
|
|
}
|
|
}
|
|
tasks.withType(CppCompile) {
|
|
binary.cppCompiler.args "-DNAMESPACED_PRIORITY"
|
|
}
|
|
}
|
|
|
|
ext.addHalToLinker = { binary->
|
|
if (binary.targetPlatform.architecture.name == 'athena') {
|
|
binary.lib project: ':hal', library: 'halAthena', linkage: 'shared'
|
|
} else {
|
|
binary.lib project: ':hal', library: 'halSim', linkage: 'shared'
|
|
}
|
|
}
|
|
|
|
model {
|
|
dependencyConfigs {
|
|
wpiutil(DependencyConfig) {
|
|
groupId = 'edu.wpi.first.wpiutil'
|
|
artifactId = 'wpiutil-cpp'
|
|
headerClassifier = 'headers'
|
|
ext = 'zip'
|
|
version = '3.+'
|
|
sharedConfigs = [ halAthena: [], halSim: [], halDev: [], halSimTestingBaseTest: [] ]
|
|
staticConfigs = [ halSimStaticDeps: [] ]
|
|
}
|
|
}
|
|
// Exports config is a utility to enable exporting all symbols in a C++ library on windows to a DLL.
|
|
// This removes the need for DllExport on a library. However, the gradle C++ builder has a bug
|
|
// where some extra symbols are added that cannot be resolved at link time. This configuration
|
|
// lets you specify specific symbols to exlude from exporting.
|
|
exportsConfigs {
|
|
halSim(ExportsConfig) {
|
|
x86ExcludeSymbols = [ '_CT??_R0?AV_System_error', '_CT??_R0?AVexception', '_CT??_R0?AVfailure',
|
|
'_CT??_R0?AVbad_cast',
|
|
'_CT??_R0?AVruntime_error', '_CT??_R0?AVsystem_error', '_CTA5?AVfailure',
|
|
'_TI5?AVfailure' ]
|
|
x64ExcludeSymbols = [ '_CT??_R0?AV_System_error', '_CT??_R0?AVexception', '_CT??_R0?AVfailure',
|
|
'_CT??_R0?AVbad_cast',
|
|
'_CT??_R0?AVruntime_error', '_CT??_R0?AVsystem_error', '_CTA5?AVfailure',
|
|
'_TI5?AVfailure' ]
|
|
}
|
|
halSimStaticDeps(ExportsConfig) {
|
|
x86SymbolFilter = { symbols->
|
|
def retList = []
|
|
symbols.each { symbol->
|
|
if (symbol.startsWith('HAL_')) {
|
|
retList << symbol
|
|
}
|
|
}
|
|
return retList
|
|
}
|
|
x64SymbolFilter = { symbols->
|
|
def retList = []
|
|
symbols.each { symbol->
|
|
if (symbol.startsWith('HAL_')) {
|
|
retList << symbol
|
|
}
|
|
}
|
|
return retList
|
|
}
|
|
}
|
|
}
|
|
components {
|
|
if (!project.hasProperty('skipAthena')) {
|
|
halAthena(NativeLibrarySpec) {
|
|
baseName = 'wpiHal'
|
|
sources {
|
|
cpp {
|
|
source {
|
|
srcDirs = [ 'src/main/native/shared', 'src/main/native/athena' ]
|
|
includes = ["**/*.cpp"]
|
|
}
|
|
exportedHeaders {
|
|
srcDirs = ["src/main/native/include"]
|
|
}
|
|
}
|
|
}
|
|
binaries.all { binary->
|
|
if (binary.targetPlatform.architecture.name != 'athena') {
|
|
binary.buildable = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (!project.hasProperty('onlyAthena')) {
|
|
halSim(NativeLibrarySpec) {
|
|
baseName = 'wpiHal'
|
|
sources {
|
|
cpp {
|
|
source {
|
|
srcDirs = [ 'src/main/native/shared', 'src/main/native/sim' ]
|
|
includes = ["**/*.cpp"]
|
|
}
|
|
exportedHeaders {
|
|
srcDirs = ["src/main/native/include"]
|
|
}
|
|
}
|
|
}
|
|
binaries.all { binary ->
|
|
if (binary.targetPlatform.operatingSystem.linux) {
|
|
linker.args "-ldl"
|
|
}
|
|
}
|
|
}
|
|
if (project.hasProperty('buildHalStaticDeps')) {
|
|
halSimStaticDeps(NativeLibrarySpec) {
|
|
baseName = 'wpiHal'
|
|
binaries {
|
|
withType(StaticLibraryBinarySpec) {
|
|
buildable = false
|
|
}
|
|
}
|
|
sources {
|
|
cpp {
|
|
source {
|
|
srcDirs = [ 'src/main/native/shared', 'src/main/native/sim' ]
|
|
includes = ["**/*.cpp"]
|
|
}
|
|
exportedHeaders {
|
|
srcDirs = ["src/main/native/include"]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// The TestingBase library is a workaround for an issue with the GoogleTest plugin.
|
|
// The plugin by default will rebuild the entire test source set, which increases
|
|
// build time. By testing an empty library, and then just linking the already built component
|
|
// into the test, we save the extra build
|
|
halSimTestingBase(NativeLibrarySpec) { }
|
|
// By default, a development executable will be generated. This is to help the case of
|
|
// testing specific functionality of the library.
|
|
if (!project.hasProperty('skipDevExe')) {
|
|
halDev(NativeExecutableSpec) {
|
|
binaries.all {
|
|
project.addHalToLinker(it)
|
|
}
|
|
sources {
|
|
cpp {
|
|
source {
|
|
srcDirs 'src/dev/native/cpp'
|
|
include '**/*.cpp'
|
|
}
|
|
exportedHeaders {
|
|
srcDirs 'src/dev/native/include'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
testSuites {
|
|
halSimTestingBaseTest {
|
|
sources {
|
|
cpp.source.srcDir 'src/test/native/cpp'
|
|
cpp.exportedHeaders.srcDir 'src/test/native/include'
|
|
}
|
|
}
|
|
}
|
|
binaries {
|
|
all {
|
|
project.addHalCompilerArguments(it)
|
|
project(':ni-libraries').addNiLibrariesToLinker(it)
|
|
}
|
|
withType(GoogleTestTestSuiteBinarySpec) {
|
|
if (it.component.testedComponent.name.contains('TestingBase') && !project.hasProperty('onlyAthena')) {
|
|
project(':gmock').addGmockToLinker(it)
|
|
project.addHalToLinker(it)
|
|
} else {
|
|
it.buildable = false
|
|
}
|
|
}
|
|
}
|
|
tasks {
|
|
runCpp(Exec) {
|
|
def found = false
|
|
$.components.each {
|
|
if (it in NativeExecutableSpec && it.name == 'halDev') {
|
|
it.binaries.each {
|
|
if (!found) {
|
|
def arch = it.targetPlatform.architecture.name
|
|
if (arch == 'x86-64' || arch == 'x86') {
|
|
dependsOn it.tasks.install
|
|
commandLine it.tasks.install.runScript
|
|
found = true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
apply from: 'publish.gradle'
|